徒手实现Redis主从复制、薪火相传与哨兵模式

Redis主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主, Slave 以读为主。 这样做的优点 1 )读写分离,性能扩展 2 )容灾快速恢复

1. 主从配置

此次以一主二从(1个master,2个slave)为例进行主从配置,现实中需要三台机器,条件不允许我们在一台机器上进行配置,以实现主从复制。

1.1 拷贝三份 redis.conf

复制出三个redis.confredis-6379.confredis-6380.conf``redis-6381.conf
image.png

1.2 修改主从节点配置文件信息

修改6379主节点配置文件

cp /opt/master-slave/redis.conf /opt/master-slave/redis-6379.conf
vim redis-6379.conf

#设置当前redis后台运行,其实是设置为守护线程
daemonize yes
#本机IP
bind 127.0.0.1 172.30.165.18
#配置密码
requirepass 123456
#持久化文件的目录
dir  /datas/redis-6.2.4/master-slave/
#日志文件名称
logfile  /datas/redis-6.2.4/master-slave/log_6379.log
#端口
port 6379
#rdb文件
dbfilename dump_6379.rdb
#pid文件
pidfile /var/run/redis_6379.pid

修改6380和6381主节点配置文件

cp /opt/master-slave/redis.conf /opt/master-slave/redis-6380.conf
vim redis-6380.conf
# redis-6380.conf 配置文件需要修改的参数
daemonize yes
bind 127.0.0.1 172.30.165.18
requirepass 123456
dir /datas/redis-6.2.4/master-slave/
port 6380
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
logfile /datas/redis-6.2.4/master-slave/log_6380.log
#用来指定主机:旧版本:slaveof 主机ip 端口,新版本:replicaof 主机ip 端口 
replicaof 192.168.23.102 6379
#主机的密码
masterauth 123456

image.png

1.3 启动各节点的Redis服务

[root@10:48 src]# ./redis-server ../master-slave/redis-6379.conf 
[root@10:49 src]# ./redis-server ../master-slave/redis-6380.conf 
[root@10:49 src]# ./redis-server ../master-slave/redis-6381.conf 
  • 开启6379主节点查看副本集信息
    image.png

  • 开启6380从节点查看副本集信息

image.png

1.4 验证主从复制

  • 尝试从6379主节点添加一条数据,登录6380从节点可以查询到该条数据

image.png

  • 从节点只有读权限,无写权限

image.png

2. 主从复制原理

全量同步:salve服务在接收到master发送的RDB文件后,将其存盘并加载到内存中

增量同步:master继续将收集到的修改命令一次传给slave,完成同步

  1. slave启动成功连接master后,并向master发送sync命令,请求同步数据。
  2. master接收到slave发送的消息后,把主服务器的数据持久化到RDB文件,同时会收集接收到的修改数据命令,master将RDB文件传给slave,完成一次全量同步。
  3. slave每次连接master,都会进行一次全量同步。

image.png

缺点

  • 主master宕机,从slave会继续等待,除非设置了哨兵模式或手动进行切换

2.1 薪火相传

薪火相传:上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。

2.1.1 配置方法

修改上文中的redis-6381.conf配置文件,将主机配置为从节点6380即可实现。

#用来指定主机:旧版本:slaveof 主机ip 端口,新版本:replicaof 主机ip 端口 
replicaof 192.168.23.102 6380
#主机的密码
masterauth 123456

2.1.2 缺点

  • 一旦某个slave宕机,后面的slave都没法备份
  • 主机挂了,从机还是从机,无法写数据了

3. 哨兵模式

哨兵模式(Sentinel) 是反客为主的自动版,能够监听master是否发生了故障,发生故障后会根据投票数从slave中挑选一个master,其他的slave会自动转向同步新的master,实现故障自动转移。

3.1 原理

  • 创建奇数个哨兵(Sentinel),定时向master发送ping请求

  • master需在指定时间内做出正常响应,若有半数以上响应不正常,则认为master宕机

  • sentinel投票选举一个slave做为新的master,而其他失去master的slave则指向新的master

image.png

3.2 配置

3.2.1 拷贝三份 sentinel.conf

拷贝三份sentinel.conf分别以端口命名,放入到 sentinel 文件夹中。

image.png

3.2.1 修改配置文件

# 配置文件目录
dir /opt/sentinel/
# 日志文件位置
logfile "./sentinel-26379.log"
# pid文件
pidfile /var/run/redis-sentinel-26379.pid
# 是否后台运行
daemonize yes
# 端口
port 16380
# 监控主服务器master的名字:mymaster,IP:127.0.0.1,port:6379,最后的数字2表示当Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 127.0.0.1 6380 2
# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在60秒内,ping不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000
# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000
# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1
# 指定mymaster主的密码(没有就不指定)
sentinel auth-pass mymaster 123456

3.2.2 启动哨兵

image.png

3.2.3 查询哨兵信息

[root@15:58 src]# ./redis-cli -p 26379
127.0.0.1:26379> info sentinel

image.png

3.2.4 验证哨兵模式

  • 把当前master关闭,等待故障转移设定的时间(3min),再查看结果即可。

image.png

  • 再次查询6380的从节点发现已选举为主节点,登录哨兵也返现主节点地址为6380

image.png

  • 重启6379原主节点,已成为从节点,主节点仍为6380

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYbcyxaz' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片