将Redis配置为冗余结构(构建故障转移环境-第二部分)
这是在 CentOS 6.x 上构建 Redis 备份和故障转移环境的步骤。本文将分为三个部分,其中本节涉及 Redis 的冗長化。
1. Redis安装
2. Redis冗余化
3. 使用Redis-Sentinel搭建故障转移环境
Redis冗余备份的概述
我会启动3个 Redis 实例,并在多个 Redis 之间进行复制(数据同步)。
为避免混乱,我们不使用在(第一步)中构建的 Redis。我们将复制各种文件,并准备三个新的实例。
构建Redis的冗余配置
启动多个 Redis 实例,并将其中一个实例设置为主服务器(可读写)。
剩余的实例将配置为从服务器(只能参考)作为备份。
创建 Redis 配置文件
每个实例都需要一个配置文件。
复制构建Redis的设置文件(第1份)并使用。
$ sudo cp -p /etc/redis/6379.conf /etc/redis/6381.conf
$ sudo cp -p /etc/redis/6379.conf /etc/redis/6382.conf
$ sudo cp -p /etc/redis/6379.conf /etc/redis/6383.conf
根据端口号进行调整
重要提示
如果在主节点上设置了密码(requirepass),则从节点必须指定masterauth。
为了持久化冗长化,需要在从属端(6382.conf和6383.conf)中添加slaveof语句。
如果不指定的话,重新启动后,所有的实例都会以主服务器模式启动。
$ sudo vi /etc/redis/6381.conf
pidfile /var/run/redis/redis_6381.pid
port 6381
logfile /var/log/redis/6381.log
dbfilename 6381.rdb
requirepass hoge
$ sudo vi /etc/redis/6382.conf
pidfile /var/run/redis/redis_6382.pid
port 6382
logfile /var/log/redis/6382.log
dbfilename 6382.rdb
masterauth hoge
slaveof 127.0.0.1 6381
$ sudo vi /etc/redis/6383.conf
pidfile /var/run/redis/redis_6383.pid
port 6383
logfile /var/log/redis/6383.log
dbfilename 6383.rdb
masterauth hoge
slaveof 127.0.0.1 6381
创建Redis启动脚本。
也会将最初安装的Redis启动脚本复制到这里
$ sudo cp -p /etc/init.d/redis /etc/init.d/redis_1
$ sudo cp -p /etc/init.d/redis /etc/init.d/redis_2
$ sudo cp -p /etc/init.d/redis /etc/init.d/redis_3
每个实例都将被更改为具有不同端口和进程ID的文件。
$ sudo vi /etc/init.d/redis_1
REDISPORT=6381
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6381.pid"
REDIS_CONFIG="/etc/redis/6381.conf"
$ sudo vi /etc/init.d/redis_2
REDISPORT=6382
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6382.pid"
REDIS_CONFIG="/etc/redis/6382.conf"
$ sudo vi /etc/init.d/redis_3
REDISPORT=6383
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6383.pid"
REDIS_CONFIG="/etc/redis/6383.conf"
Redis自动启动(服务)注册和启动确认
我会将在服务部分(1)注册的服务取消,并确保其作为服务自动启动。
$ sudo chkconfig redis off
$ sudo chkconfig redis_1 on
$ sudo chkconfig redis_2 on
$ sudo chkconfig redis_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_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
等您完成注册后,请尝试启动。
同时,我们将关闭(1)的启动服务。
$ sudo /etc/init.d/redis_1 start
[ OK ]
$ sudo /etc/init.d/redis_2 start
[ OK ]
$ sudo /etc/init.d/redis_3 start
[ OK ]
$ sudo /etc/init.d/redis stop
redis-server を停止中: (error) NOAUTH Authentication required.
确保显示Redis执行进程
$ ps -ef | grep redis
redis 3387 1 0 07:26 ? 00:00:00 /usr/bin/redis-server 127.0.0.1:6381
redis 3402 1 0 07:26 ? 00:00:00 /usr/bin/redis-server 127.0.0.1:6382
redis 3417 1 0 07:26 ? 00:00:00 /usr/bin/redis-server 127.0.0.1:6383
coco 3422 3146 0 07:27 pts/0 00:00:00 grep redis
我也会检查日志文件
$ ls -l /var/log/redis/
-rw-r--r--. 1 root root 7781 2月 6 21:42 2016 6379.log
-rw-r--r--. 1 root root 3367 2月 6 21:42 2016 6381.log
-rw-r--r--. 1 root root 3247 2月 6 21:42 2016 6382.log
-rw-r--r--. 1 root root 3247 2月 6 21:42 2016 6383.log
我要确认是否创建了转储文件和进程文件。
$ ls -l /var/run/redis/
-rw-r--r--. 1 root root 18 2月 6 21:42 2016 6379.rdb
-rw-r--r--. 1 root root 18 2月 6 21:42 2016 6381.rdb
-rw-r--r--. 1 root root 18 2月 6 21:42 2016 6382.rdb
-rw-r--r--. 1 root root 18 2月 6 21:42 2016 6383.rdb
-rw-r--r--. 1 root root 5 2月 6 21:42 2016 redis_6381.pid
-rw-r--r--. 1 root root 5 2月 6 21:42 2016 redis_6382.pid
-rw-r--r--. 1 root root 5 2月 6 21:42 2016 redis_6383.pid
请确保可以连接到所有的 Redis 实例。如果设置了密码(requirepass),则需要使用 -a 参数来指定密码。
$ redis-cli -p 6381 -a hoge info | egrep 'role'
role:master
$ redis-cli -p 6382 -a hoge info | egrep 'role'
role:slave
$ redis-cli -p 6383 -a hoge info | egrep 'role'
role:slave
确认 Redis 的冗余备份。
确保将值设置到Master后,该值将被反映到Slave上。
当在6381端口更新数据时,数据将同步(冗余)到6382/6383端口上。
下面的代码将键”fuga”设置为值”on”。
$ redis-cli -p 6381 -a hoge set fuga on
OK
$ redis-cli -p 6382 -a hoge get fuga
"on"
$ redis-cli -p 6383 -a hoge get fuga
"on"
正在删除键fuga。
$ redis-cli -p 6381 -a hoge del fuga
(integer) 1
$ redis-cli -p 6382 -a hoge get fuga
(nil)
$ redis-cli -p 6383 -a hoge get fuga
(nil)
自动故障转移的需求
在这种配置中,即使 Master 结束运行,Slave 仍然保持 Slave 的状态。
可以在第三步中设置当 Master 不再响应时自动进行故障转移。
這就是以上的內容。