将Redis配置为冗余结构(构建故障转移环境-第二部分)

这是在 CentOS 6.x 上构建 Redis 备份和故障转移环境的步骤。本文将分为三个部分,其中本节涉及 Redis 的冗長化。

1. Redis安装
2. Redis冗余化
3. 使用Redis-Sentinel搭建故障转移环境

Redis冗余备份的概述

我会启动3个 Redis 实例,并在多个 Redis 之间进行复制(数据同步)。

为避免混乱,我们不使用在(第一步)中构建的 Redis。我们将复制各种文件,并准备三个新的实例。

起動ファイルポート設定ファイル説明redis63796379.conf停止させます。利用しませんredis_163816381.confMasterredis_263826382.confSlave1redis_363836383.confSlave2

构建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 不再响应时自动进行故障转移。

這就是以上的內容。