搭建Redis的故障转移环境(第三部分)

在 CentOS 6.x 上建立 Redis 多节点、故障转移环境的步骤分为三个部分。本文介绍了通过 Redis-Sentinel 来构建故障转移环境的步骤。

(1):安装Redis
(2):Redis的冗余配置
(3):通过Redis-Sentinel构建故障切换环境

Redis的故障转移环境概述

对于活动监视,将使用 Redis-Sentinel。
如果主服务器出现异常,将自动将从服务器提升为主服务器。

为了防止错误的晋升,我们还需要启动三个实例的 Redis-Sentinel 进行监控,并进行多数决策(2台/3台)来进行判断。

起動ファイルポート設定ファイル説明redis63796379.conf停止させます。利用しませんredis_163816381.confMasterredis_263826382.confSlave1redis_363836383.confSlave2sentinel26379-導入しません。利用しませんsentinel_12638126381.conf死活監視1sentinel_22638226382.conf死活監視2sentinel_32638326383.conf死活監視3

搭建容错环境

如果Redis-Sentinel与Redis一起安装,则会一同安装,但如果不存在,则会复制并使用。

$ which redis-sentinel
/usr/bin/redis-sentinel

表示されたらこの項はスキップしてください。
何も表示されない場合は以下のコマンドでコピーします

[ソースからインストールした場合]
$ sudo cp -p ~/Downloads/redis-3.0.*/src/redis-sentinel /usr/local/bin/

[パッケージからインストールした場合]
$ sudo ln -s /usr/bin/redis-server /usr/bin/redis-sentinel

另外,Redis-Sentinel 的实质是 Redis-Server。
可以通过复制 Redis-Server 并更改名称,然后创建符号链接。这样也可以。

Redis-Sentinel的配置文件

每个实例都需要一个配置文件
将现有的 Redis-Sentinel 配置文件复制并为每个实例进行设置。

与 Redis 主程序一样,文件名将使用端口号.conf。

[ソースインストールの場合]
$ sudo cp -p ~/Downloads/redis-3.0.*/sentinel.conf /etc/redis/26381.conf

[パッケージインストールの場合]
$ sudo cp -p /etc/redis-sentinel.conf /etc/redis/26381.conf

进行启动端口和故障转移设置。

如果Master在5秒内没有响应,以下示例将升级其中一个Slave为Master。

请注意,
如果要将 Redis 主体在其他服务器等分散运行,请确保将 sentinel monitor mymaster 127.0.0.1 6381 的 IP 地址和端口号设置为正确的值。
这里指的不是 Redis-Sentinel 的 IP 和端口。
请指定 Redis 主体的 Master 的 IP 地址和端口号。

如果您已指定密码,则还需要进行 sentinel auth-pass mymaster hoge 的设置。

$ sudo vi /etc/redis/26381.conf
daemonize yes
port 26381
pidfile sentinel_26381.pid
dir /var/run/redis
logfile /var/log/redis/26381.log
sentinel monitor mymaster 127.0.0.1 6381 2
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster hoge

“sentinel monitor mymaster 127.0.0.1 6381 2″的最后一个数字(=2)表示在3个实例中,有2个实例用于判定(=多数决定)。
如果要在5个实例中运行,并在其中的3个实例上进行判定,那么该数字将是”3″。

将刚刚创建的配置文件复制给剩余的 Redis-Sentinel。

$ sudo cp -p /etc/redis/26381.conf /etc/redis/26382.conf
$ sudo cp -p /etc/redis/26381.conf /etc/redis/26383.conf

进行第二个实例的设置。

仅修改与Sentinel启动端口相关的部分。sentinel monitor mymaster 127.0.0.1 6381 2是Redis主机的IP和端口,不需要修改。

$ sudo vi /etc/redis/26382.conf
port 26382
logfile /var/log/redis/26382.log
pidfile sentinel_26382.pid

我們將對第三個實例進行設定。

重要事項:仅需更改 Sentinel 端口和日志文件名。

$ sudo vi /etc/redis/26383.conf
port 26383
logfile /var/log/redis/26383.log
pidfile sentinel_26382.pid

当Redis-Sentinel正在运行时,会对配置文件进行写入操作,以更改所有者和写入权限。

$ sudo chmod 644 /etc/redis/26381.conf
$ sudo chmod 644 /etc/redis/26382.conf
$ sudo chmod 644 /etc/redis/26383.conf
$ sudo chown redis:redis /etc/redis/26381.conf
$ sudo chown redis:redis /etc/redis/26382.conf
$ sudo chown redis:redis /etc/redis/26383.conf

Redis-Sentinel的启动脚本

我們會提供 Redis-Sentinel 的啟動腳本。

如果选择安装软件包的情况下

$ sudo cp -p /etc/init.d/redis-sentinel /etc/init.d/redis-sentinel_1
$ sudo vi /etc/init.d/redis-sentinel_1
REDISPORT=26381
pidfile="/var/run/redis/redis_${REDISPORT}.pid"
SENTINEL_CONFIG="/etc/redis/${REDISPORT}.conf"

[如果是源代码安装]
没有为 Redis-Sentinel 准备启动脚本
所以将使用 Redis 主体的启动脚本进行复制并使用

$ sudo cp -p /etc/init.d/redis_1 /etc/init.d/redis-sentinel_1
$ sudo vi /etc/init.d/redis-sentinel_1
# chkconfig: 345 75 15
REDISPORT=26381
EXEC=/usr/local/bin/redis-sentinel
PIDFILE=/var/run/redis/sentinel_${REDISPORT}.pid

从这里开始,源代码安装和软件包安装都是相同的。
复制并编辑redis-sentinel_1。

$ sudo cp -p /etc/init.d/redis-sentinel_1 /etc/init.d/redis-sentinel_2
$ sudo cp -p /etc/init.d/redis-sentinel_1 /etc/init.d/redis-sentinel_3
$ sudo vi /etc/init.d/redis-sentinel_2
# chkconfig: 345 75 15
REDISPORT=26382
$ sudo vi /etc/init.d/redis-sentinel_3
# chkconfig: 345 75 15
REDISPORT=26383

确认Redis-Sentinel是否已启动。

使用启动脚本启动redis-sentinel_1。

$ sudo /etc/init.d/redis-sentinel_1 start

我会确认启动

$ ps -ef | grep redis-sentinel
coco       2359      1  0 00:02 ?        00:00:06 /usr/local/bin/redis-sentinel *:26381 [sentinel]

如果可以确认启动,请复制启动文件并准备剩余实例的数量。

sudo cp -p /etc/init.d/redis-sentinel_1 /etc/init.d/redis-sentinel_2
sudo cp -p /etc/init.d/redis-sentinel_1 /etc/init.d/redis-sentinel_3

为每个实例更改启动文件。

$ sudo vi /etc/init.d/redis-sentinel_2
REDISPORT=26382
$ sudo vi /etc/init.d/redis-sentinel_3
REDISPORT=26383

我将使用启动脚本启动 redis-sentinel_2 / redis-sentinel_3。

$ sudo /etc/init.d/redis-sentinel_2 start
$ sudo /etc/init.d/redis-sentinel_3 start

我要确认启动。

$ ps -ef | grep redis-sentinel
redis      3943      1  0 22:34 ?        00:00:02 /usr/bin/redis-sentinel *:26381 [sentinel]                                                               
redis      3993      1  0 22:38 ?        00:00:01 /usr/bin/redis-sentinel *:26382 [sentinel]                                                               
redis      4031      1  1 22:40 ?        00:00:00 /usr/bin/redis-sentinel *:26383 [sentinel]                                                               

Redis-Sentinel的自动启动设置

请确保在服务器重启时,Redis-Sentinel 可以自动启动和停止。

$ sudo chkconfig redis-sentinel_1 on
$ sudo chkconfig redis-sentinel_2 on
$ sudo chkconfig redis-sentinel_3 on
$ chkconfig --list | grep redis
redis           0:off   1:off   2:off   3:off   4:off   5:off   6:off
redis-sentinel  0:off   1:off   2:off   3:off   4:off   5:off   6:off
redis-sentinel_1    0:off   1:off   2:on    3:on    4:on    5:on    6:off
redis-sentinel_2    0:off   1:off   2:on    3:on    4:on    5:on    6:off
redis-sentinel_3    0:off   1:off   2:on    3:on    4:on    5:on    6:off
redis_1         0:off   1:off   2:on    3:on    4:on    5:on    6:off
redis_2         0:off   1:off   2:on    3:on    4:on    5:on    6:off
redis_3         0:off   1:off   2:on    3:on    4:on    5:on    6:off

自动启动的确认

请重新启动服务器,确保Redis和Redis-Sentinel能够自动启动。

$ reboot

服务器重新启动后,

$ ps -ef | grep redis
redis      2038      1  1 22:46 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6381                                                              
redis      2053      1  0 22:46 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6382                                                              
redis      2068      1  0 22:46 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6383                                                              
redis      2083      1  1 22:46 ?        00:00:00 /usr/bin/redis-sentinel *:26381 [sentinel]                                                               
redis      2098      1  0 22:46 ?        00:00:00 /usr/bin/redis-sentinel *:26382 [sentinel]                                                               
redis      2113      1  1 22:46 ?        00:00:00 /usr/bin/redis-sentinel *:26383 [sentinel]                                                               

故障切換 (gu4 zhang1 qie1 huan4) 的驗證

确认将 Redis 主节点关闭,并自动晋升从节点为新的主节点。

我要确认现在的状态
端口6381是主节点,其它是从节点

$ redis-cli -p 6381 -a hoge info | grep role
role:master
$ redis-cli -p 6382 -a hoge info | grep role
role:slave
$ redis-cli -p 6383 -a hoge info | grep role
role:slave

确保在关闭 Master 后,5秒后将 Slave 升级为 Master。

$ redis-cli -p 6381 -a hoge shutdown

5秒ほど待ってから

$ redis-cli -p 6381 -a hoge info | grep role
Could not connect to Redis at 127.0.0.1:6381: Connection refused
$ redis-cli -p 6382 -a hoge info | grep role
role:master
$ redis-cli -p 6383 -a hoge info | grep role
role:slave

请确保重新启动端口6381,并确认它以从属(slave)方式启动。

$ sudo service redis_1 start

在超过5秒之后

$ redis-cli -p 6381 -a hoge info | grep role
role:slave
$ redis-cli -p 6382 -a hoge info | grep role
role:master
$ redis-cli -p 6383 -a hoge info | grep role
role:slave

以上就是。

广告
将在 10 秒后关闭
bannerAds