一、环境
基本环境
软件 版本 Redis 5.0.5 OS CentOS7 集群环境
角色 IP 端口 Master主节点1 192.168.1.186 6380 sentinel-哨兵1 192.168.1.186 16380 Slave从节点2 192.168.1.168 6380 sentinel-哨兵2 192.168.1.168 16380 Slave从节点3 192.168.1.102 6380 sentinel-哨兵3 192.168.1.102 16380 HA 192.168.1.186 26380 注:为了哨兵集群的健壮性,哨兵的节点数量建议是≥3的奇数。
哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。
二、安装Redis
1 | yum install -y gcc g++ gcc-c++ make tcl |
1 | mkdir -p /usr/local/redis/etc |
三、配置Redis主从复制
全节点优化
1 | echo 2048 > /proc/sys/net/core/somaxconn |
1 | echo never > /sys/kernel/mm/transparent_hugepage/enabled |
1.Master主节点1 + 哨兵
配置主redis - cat /usr/local/redis/etc/redis.conf
1 | port 6380 |
redis supervisor
1 | cat /etc/supervisord.d/redis.conf |
配置sentinel集群 - cat /usr/local/redis/etc/sentinel.conf
1 | bind 192.168.1.186 |
redis-sentinel supervisor
1 | [program:redis-sentinel] |
2.部署Redis从节点2 + 哨兵
配置从redis - cat /usr/local/redis/etc/redis.conf
1 | port 6380 |
supervisor
1 | [program:redis] |
配置sentinel集群 - cat /usr/local/redis/etc/sentinel.conf 只需修改Bind地址
1 | bind 192.168.1.168 |
redis-sentinel supervisor
1 | [program:redis-sentinel] |
3.部署Redis从节点2 + 哨兵
参考步骤2,注意修改bind地址
四、验证
1. 主从验证
1 | info Replication #查看主节点状态 |
1 | redis> info Replication #查看从节点状态 |
2. 哨兵 高可用验证
stop 主节点,观察sentinel哨兵日志
可以看到主从已经发生了转变
通过配置文件可以看到,原来的主节点,配置同步成了从节点
注:redis共3个节点情况下,如果master宕机后,架构将会变化为:一个master和一个slave
3. 主库与从库key过期同步–测试
1 | 主库创建测试key,并设置生效时间。当过期后,立即在从库get key测试 |
1 | 从库获取key情况 |
五、HA-Haproxy
使用虚VIP,代理后端的Redis主从。并且通过TCP监控redis master,这样就能保证数据一定会写到redis master了,即便是后端主从发生了变化亦是如此
1 | yum groupinstall -y "Development tools" |
1 | useradd -s /sbin/nologin -M haproxy |
vim /etc/haproxy/haproxy.cfg
1 | global |
启动测试
1 | /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg |
supervisor
1 | [program:haproxy] |
六、优化
1. [在所有节点] - 内存回收机制优化
1 | config set maxmemory-policy volatile-lru |
具体参考:https://www.jianshu.com/p/677930ffbff0
2. 哨兵sentinel主备切换导致的数据丢失问题
两种情况导致的数据丢失:
- 异步复制过程中导致的数据丢失
因为master –> slave的同步是异步的,所以有可能有部分数据还没复制到slave,master就down机了,此时这部分数据就丢失了。
- 脑裂导致的数据丢失
脑裂,也就是说某个master所在的机器突然脱离了网络,跟其他slave不能正常通信,但是实际上Master还运行着。此时哨兵会认为master已经宕机了,然后开始重新选举,将其他slave切换成了master。这个时候集群里出现了2个master。
如果某个slave被哨兵选举切换成了master,但是可能client还没来得及切换到新master,还会继续向旧master写数据。因此,旧master再次恢复的时候,会被作为一个slave挂到新的master上去,而自己的数据会被清空,重新从新的master复制数据。而新的master并没有后来client写入的数据,因此,这部分数据就丢失了
[所有节点]-数据丢失问题解决方案:
1 | control data loss |
减少异步复制数据丢失
min-slaves-max-lag这个参数,一旦slave复制数据和ack延时太长,就认为可能master宕机后损失的数据太多了,那么就拒绝写请求。从而把数据丢失降低到可控范围
减少脑裂的数据丢失
如果一个master出现了脑裂,跟其他slave断开了连接,如果不能给指定数量的slave发送数据,那么如果slave超过10秒没有给自己发送ack消息,则直接拒绝客户端的写请求。因此在脑裂环境下,最多就丢失10秒的数据。
3. 高并发环境ulimit优化 [需要重启系统]
修改limit是限制: /etc/security/limits.conf
1 | * soft nofile 65536 |
修改file-max文件句柄数量
1 | echo 6553560 > /proc/sys/fs/file-max |
解除linux系统最大进程数
1 | vim /etc/security/limits.d/20-nproc.conf #添加如下行: |
七、haproxy验证
基本连接验证
redis-cli -h 192.168.1.186 -p 26380 -a “test123”
后端主从切换后,proxy连接验证
QPS压力测试
(1) 模拟10万次请求
redis-benchmark -h 192.168.1.186 -p 26380 -a test123 -n 100000 -q
(2) 模拟10万次访问10万key
redis-benchmark -h 192.168.1.186 -p 26380 -a test123 -n 100000 -r 100000 -q
(3) 模拟万级用户的并发请求
redis-benchmark -h 192.168.1.186 -p 26380 -a test123 -c 10000 -n 100000 -r 100000 -q
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2019/09/19/Redis主从-sentinel哨兵高可用/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!