在生产环境中,Redis 架构使用最多的就是Sentinel主从架构, 因为单点容易产生故障, 分片集群又过于复杂. 笔者尝试在一台服务器上搭建一个一主两从, 三个哨兵监听的Redis 集群架构。由于哨兵也可能发生单点故障,所以笔者也使用了三个哨兵来监听. 对于学习而言,搭建一个伪集群即可.
1. 配置模板
笔者创建一个redis的配置模板文件: template-redis.conf,一个sentinel的配置模板: template-sentinel.conf, 用于复制配置.
1.1 创建Redis配置文件模板
- 从Redis 源码目录复制一个redis.conf 文件到/usr/local/etc/redis目录
- 创建redis 配置模板文件: /usr/local/etc/redis/template-redis.conf
- 复制模板时, 只需要替换配置文件中端口号即可,即只需要全局替换6379就可以把配置文件中端口号, 日志文件,pid文件等全部替换.
# 引入原配置
include /usr/local/etc/redis/redis.conf
######################################## 自定义配置 ########################################
# 修改绑定ip
bind 127.0.0.1
# 设置关闭保护模式
protected-mode no
# 设置端口号为6379
port 6379
# 设置后台启动为yes
daemonize yes
# 设置pid文件
pidfile /logs/redis/redis.pid.6379
# 设置日志文件
logfile /logs/redis/redis.log.6379
# 设置RDB dum文件名
dbfilename dump.rdb.6379
# 设置dump文件存放目录
dir /data/redis
# 设置主节点密码
masterauth 123456
# 设置从节点只读
replica-read-only yes
# 设置当前节点访问密码为
requirepass 123456
# 设置客户端最多连接数
maxclients 1000
# 设置最大内存
maxmemory 2GB
# 设置达到最大内存后策略,报错
maxmemory-policy noeviction
# 启动AOF持久化模式
appendonly yes
# 设置AOF文件名
appendfilename "appendonly.aof.6379"
# 设置AOF写入磁盘策略, 每秒写入一次
appendfsync everysec
1.2 创建sentinel 配置模板
- 从源码目录复制一个sentinel.conf配置文件, 或者新创建一个文件也行, 因为sentinel配置项比较少. 命名为: template-sentinel.conf
- 复制模板时, 只需要替换配置文件中端口号即可,即只需要全局替换6379就可以把配置文件中端口号, 日志文件,pid文件等全部替换.
# 设置ip
bind 127.0.0.1
# 绑定端口号
port 26379
# 设置后台运行
daemonize yes
# 指定pid文件
pidfile /logs/redis/sentinel.pid.26379
# 指定日志文件
logfile /logs/redis/sentinel.log.26379
# 指定启动目录
dir /tmp
# 监听
sentinel monitor redis.localhost 127.0.0.1 6480 2
# redis 密码
sentinel auth-pass redis.localhost 123456
# 指定sentinel认为redis宕机所需毫秒数, 指定为10秒
sentinel down-after-milliseconds redis.localhost 10000
# 指定故障转移时,最多多少个从节点向主节点进行数据同步
sentinel parallel-syncs redis.localhost 1
# 指定故障转移总耗时最多多少毫秒, 默认
sentinel failover-timeout redis.localhost 180000
# 故障转移时, 不能修改脚本配置
sentinel deny-scripts-reconfig yes
2. 创建配置文件
1.1 创建目录
创建配置之前应先创建相关目录, 笔者的目录规划如下:
- /usr/local/etc/redis: 存储相关配置文件
- /logs/redis: 存储redis 日志和pid文件
- /data/redis: redis 数据库RDB文件,AOF文件存储目录
mkdir -p /usr/local/etc/redis /logs/redis /data/redis
2.1 复制三份redis配置
使用redis配置模板创建三份redis 配置文件
# 复制三份新的配置文件
cp template-redis.conf /usr/local/etc/redis/redis.conf.6480
cp template-redis.conf /usr/local/etc/redis/redis.conf.6481
cp template-redis.conf /usr/local/etc/redis/redis.conf.6482
2.2 替换相关配置
使用sed命令, 将配置文件中所有需要区分的项(日志, 文件名等)进行全局替换
# 替换各配置文件
sed -i "s/6379/6480/g" /usr/local/etc/redis/redis.conf.6480
sed -i "s/6379/6481/g" /usr/local/etc/redis/redis.conf.6481
sed -i "s/6379/6482/g" /usr/local/etc/redis/redis.conf.6482
2.3 复制三份sentinel 配置
使用redis配置模板创建三份sentinel 配置文件
cp template-sentinel.conf /usr/local/etc/redis/sentinel.conf.26480
cp template-sentinel.conf /usr/local/etc/redis/sentinel.conf.26481
cp template-sentinel.conf /usr/local/etc/redis/sentinel.conf.26482
2.4 替换相关配置
使用sed命令, 将配置文件中所有需要区分的项(日志, 文件名等)进行全局替换
# 替换各配置文件
sed -i "s/6379/6480/g" /usr/local/etc/redis/sentinel.conf.26480
sed -i "s/6379/6481/g" /usr/local/etc/redis/sentinel.conf.26481
sed -i "s/6379/6482/g" /usr/local/etc/redis/sentinel.conf.26482
3. 启动集群
3.1 启动redis 集群
通过redis-server 命令依次启动redis服务器, 启动之后并未建立主从关系.
redis-server /usr/local/etc/redis/redis.conf.6480
redis-server /usr/local/etc/redis/redis.conf.6481
redis-server /usr/local/etc/redis/redis.conf.6482
3.2 设置主从关系
通过命令建立主从关系, 笔者认为这种方式比在配置文件中指定要更好一点儿.
redis-cli -p 6481 -a 123456 slaveof 127.0.0.1 6480
redis-cli -p 6482 -a 123456 slaveof 127.0.0.1 6480
3.3 启动sentinel 集群
使用redis-sentinel 依次启动sentinel集群, sentinel会自动建关系.
redis-sentinel /usr/local/etc/redis/sentinel.conf.26480
redis-sentinel /usr/local/etc/redis/sentinel.conf.26481
redis-sentinel /usr/local/etc/redis/sentinel.conf.26482
3.4 查看集群
- 可以登录sentinel客户端来查看相关消息,也可以直接在命令行查看sentinel集群关系。从输出结果可以看出:
- redis 集群名称: redis.localhost
- 主节点状态: ok
- 主节点地址:127.0.0.1:6480
- 从节点个数: 2个
- sentinel 个数: 3个
$ redis-cli -p 26481 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis.localhost,status=ok,address=127.0.0.1:6480,slaves=2,sentinels=3
4. 测试故障转移
4.1 关闭maste 服务器
$ redis-cli -a 123456 -p 6480 shutdown
4.2 通过sentinel查看集群状态
$ redis-cli -p 26481 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis.localhost,status=ok,address=127.0.0.1:6482,slaves=2,sentinels=3
4.3 查看sentinel 日志
5648:X 09 May 2019 10:52:10.288 # +sdown master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.340 # +odown master redis.localhost 127.0.0.1 6480 #quorum 3/2
5648:X 09 May 2019 10:52:10.340 # +new-epoch 1
5648:X 09 May 2019 10:52:10.340 # +try-failover master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.378 # +vote-for-leader e5acadd929ffd1feefdde0602d3a72172908fd90 1
5648:X 09 May 2019 10:52:10.445 # 156e8a353eea2e78bf16230e144086956e5c7c8e voted for e5acadd929ffd1feefdde0602d3a72172908fd90 1
5648:X 09 May 2019 10:52:10.445 # 2279bbefc80a9f66259f5d148a73638d92448653 voted for e5acadd929ffd1feefdde0602d3a72172908fd90 1
5648:X 09 May 2019 10:52:10.507 # +elected-leader master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.507 # +failover-state-select-slave master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.608 # +selected-slave slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.608 * +failover-state-send-slaveof-noone slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.699 * +failover-state-wait-promotion slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:11.496 # +promoted-slave slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:11.496 # +failover-state-reconf-slaves master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:11.505 * +slave-reconf-sent slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.549 # -odown master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.549 * +slave-reconf-inprog slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.549 * +slave-reconf-done slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.615 # +failover-end master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.615 # +switch-master redis.localhost 127.0.0.1 6480 127.0.0.1 6482
5648:X 09 May 2019 10:52:12.616 * +slave slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6482
5648:X 09 May 2019 10:52:12.616 * +slave slave 127.0.0.1:6480 127.0.0.1 6480 @ redis.localhost 127.0.0.1 6482
5648:X 09 May 2019 10:52:22.666 # +sdown slave 127.0.0.1:6480 127.0.0.1 6480 @ redis.localhost 127.0.0.1 6482