redis笔记—-主从复制(windows10)

By | 2020年4月2日

前言

为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务

作用:

数据备份

扩展读性能(读写分离)

复制方式

全量复制

部分复制

 

实现方式

 

1、一主二扑 ABC) 一个Master两个Slave

2、薪火相传(去中心化) A-B-CB既是主节点(C的主节点),又是从节点(A的从节点)

3、反客为主(主节点down掉后,手动操作升级从节点为主节点)

4、哨兵模式(后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库)

 

一主多从

 

 

 配置:

Master:6379端口
requirepass 123456

slave1:  6380端口
port 6380
slaveof 127.0.0.1 6379
masterauth 123456

Slave2:  6381端口
port 6381
slaveof 127.0.0.1 6379
masterauth 123456

 

启动

开启Master

redis-server.exe redis.windows.conf

 

开启slave1

 

 

开启slave2

 

 

查看master

 

 

测试

 

连接三个redis

 

 

 

 

 

 

master写入数据

 

 

 

查看slave1

 

 

 

 

 

 

 

可能出现的问题

启动服务,127.0.0.1java.net.SocketTimeoutException:connect time out超时和ping不通端口
解决:关闭防火墙

 

 

哨兵模式sentinel

哨兵模式的任务:

监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否允许正常。

提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。

自动故障迁移(Automatic failover:

1)当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,他会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;

2)客户端试图连接失败的主服务器时,集群也会向客服端返回新主服务器的地址,是的集群可以使用新主服务器代替失效服务器

 

新建配置sentinel.conf

三个redis配置只有端口port不一样

#端口区别不同
#当前Sentinel服务运行的端口
port 26379
# 哨兵监听的主服务器 mymaster名称(可以自定义),1票
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel auth-pass mymaster 123456
# 10s内mymaster无响应,则认为master宕机了
sentinel down-after-milliseconds mymaster 10000
#如果20秒后,mysater仍没启动过来,则启动failover
sentinel failover-timeout mymaster 20000
# 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步,数字越小, 完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 1
bind 127.0.0.1
protected-mode yes

 

 

可能出现的问题

redis 主从切换失败

 


[12248] 31 Mar 17:09:26.726 # +try-failover master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:09:26.728 # +vote-for-leader 2fe3a13e25190364c193e71b6d89257323d694ce 11
[12248] 31 Mar 17:09:26.728 # +elected-leader master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:09:26.728 # +failover-state-select-slave master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:09:26.803 # -failover-abort-no-good-slave master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:09:26.864 # Next failover delay: I will not start a failover before Tue Mar 31 17:10:17 2020
[12248] 31 Mar 17:10:17.170 # +new-epoch 12
[12248] 31 Mar 17:10:17.171 # +try-failover master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:10:17.179 # +vote-for-leader 2fe3a13e25190364c193e71b6d89257323d694ce 12
[12248] 31 Mar 17:10:17.179 # +elected-leader master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:10:17.181 # +failover-state-select-slave master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:10:17.265 # -failover-abort-no-good-slave master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:10:17.349 # Next failover delay: I will not start a failover before Tue Mar 31 17:11:07 2020
[12248] 31 Mar 17:11:07.279 # +new-epoch 13
[12248] 31 Mar 17:11:07.279 # +try-failover master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:11:07.284 # +vote-for-leader 2fe3a13e25190364c193e71b6d89257323d694ce 13
[12248] 31 Mar 17:11:07.285 # +elected-leader master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:11:07.288 # +failover-state-select-slave master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:11:07.351 # -failover-abort-no-good-slave master mymaster 127.0.0.1 6379
[12248] 31 Mar 17:11:07.443 # Next failover delay: I will not start a failover before Tue Mar 31 17:11:57 2020

View Code

 

问题是:配置错误重新配置

 

 

 

分别启动三个哨兵

 

redis-server.exe sentinel.conf --sentinel

 

测试

关闭mster

 

查看

 

 slave2(6381)升为master

重新开启之前的master(6379),这时候master还是之前的slave2(6381)

 

 

 

 

配置源码地址

 

 

常见问题

 

读写分离

复制数据存在延迟(如果从节点发生阻塞)

从节点可能发生故障

 

主从配置不一致

例如maxmemory不一致,可能会造成丢失数据

例如数据结构优化参数不一致:造成主从内存不一致

 

规避全量复制

第一次全量复制不可避免,所以分片的maxmemory减小,同时选择在低峰(夜间)时,做全量复制。

复制积压缓冲区不足

增大复制缓冲区配置rel_backlog_size

例如如果网络中断的平均时间是60s,而主节点平均每秒产生的写命令(特定协议格式)所占的字节数为100KB,则复制积压缓冲区的平均需求为6MB,保险起见,可以设置为12MB,来保证绝大多数断线情况都可以使用部分复制。

 

复制风暴

master节点重启,master节点生成一份rdb文件,但是要给所有从节点发送rdb文件。对cpu,内存,带宽都造成很大的压力

 

 

 

 

参考:https://www.jianshu.com/p/4aa9591c3153

 

请关注公众号获取更多资料

发表评论