搭建Redis的故障转移环境(第三部分)
在 CentOS 6.x 上建立 Redis 多节点、故障转移环境的步骤分为三个部分。本文介绍了通过 Redis-Sentinel 来构建故障转移环境的步骤。
(1):安装Redis
(2):Redis的冗余配置
(3):通过Redis-Sentinel构建故障切换环境
Redis的故障转移环境概述
对于活动监视,将使用 Redis-Sentinel。
如果主服务器出现异常,将自动将从服务器提升为主服务器。
为了防止错误的晋升,我们还需要启动三个实例的 Redis-Sentinel 进行监控,并进行多数决策(2台/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
以上就是。