主从复制

Redis主从复制是 主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。

主要用途:

  • 读写分离,性能扩展
  • 容灾快速恢复

环境搭建

准备搭建一主二从环境, 环境有限, 三个redis server 在同一个环境, 端口号不同。准备主从redis.conf 配置文件, 这里只讲从机配置文件

include /usr/local/redis/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
replicaof *.*.*.* 6379
masterauth *********
protected-mode no

include 将主机的配置文件引入, 后续进行配置覆盖, 路径为绝对路径

pidfile port he dbfilename 都按照各自配置填写

replicaof 后面跟着ip 和 port 表示这个是这个主机的从机。如果不进行这个配置, 在三台机子启动后, 执行的slaveof ip port 命令的话, 只会在当前生效, 如果从机重启后会自动恢复成主机身份。所以这里进行配置文件配置, 让其以从机的身份启动。

masterauth 主机的鉴权密码

protected-mode 关闭保护模式, 方便自己进行测试

启动三个redis server

在主机执行info replication 命令

能够看到当前server的角色为 master, 下面有两个从机, 状态在线

能看到当前6380端口的角色是从机, 主机的ip 端口状态

主机新增一条数据, 能够在从机获取到, 但是从机无权修改数据, 从机只有读权限

复制原理

  • Slave 连接到master 后, 会发送一个sync命令。这个只有启动时执行一次
  • Master 接收到命令后, 启动后台的存盘进程, 同时收集所有接收到的用于修改数据集命令, 在后台执行完毕后, master传输整个数据文件到slave, 以完成一次全量同步
  • 全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
  • 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。
  • 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

一主二从

  • 新的从机slave加入进来, 会从头复制主机数据, 全量复制
  • 从机挂掉后, 重新启动, 从头全量复制主机数据
  • 主机挂点后, 从机还是从机, 不会谋权篡位

显示主机的状态变为 down状态

薪火相传

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

风险:

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

反客为主

当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。用 slaveof no one 将从机变为主机。这个需要手动执行命令, 下面说到的哨兵模式, 则是自动监控。

哨兵模式sentinel

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

创建sentinel.conf配置文件

sentinel monitor mymaster *.*.*.* 6379 1
sentinel auth-pass mymaster ********
protected-mode no

配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义, *.*.*.* 代表监控的主服务器,6379代表端口,1代表只有一个或一个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。

sentinel author-pass定义服务的密码,mymaster是服务名称,********是Redis服务器密码

执行 ./redis-sentinel ../sentinel.conf 启动哨兵, 然后将 6379 的shutdow

  • 启动时, 获取到主机的两个从机slave slave 123.60.34.168:6380 123.60.34.168 6380 @ mymaster 123.60.34.168 6379 slave slave 123.60.34.168:6381 123.60.34.168 6381 @ mymaster 123.60.34.168 6379
  • 监听到主机shutdown sdown master mymaster 123.60.34.168 6379
  • 重选主机 switch-master mymaster 123.60.34.168 6379 123.60.34.168 6381
  • 将原先的主机和从机置为现在master的从机 : slave slave 123.60.34.168:6380 123.60.34.168 6380 @ mymaster 123.60.34.168 6381 slave slave 123.60.34.168:6379 123.60.34.168 6379 @ mymaster 123.60.34.168 6381
  • 由于6379 已经shutdown, sdown slave 123.60.34.168:6379 123.60.34.168 6379 @ mymaster 123.60.34.168 6381
  • 6379 重启后, 则会将其置为master的从机

重选后, 看 sentinel.conf 的配置文件发生了变化, 监控的主服务器 和 端口发生了变化

重选标准

  • 选择优先级靠前的, redis.conf 配置文件 replica-priority 100 值越小优先级越高
  • 选择偏移量最大的, 偏移量是指获得原主机数据最全的
  • 选择runId 最小的从服务 每个redis实例启动后都会随机生成一个40位的runid

以上就是redis 6 主从复制和哨兵模式的简单介绍, 如有错误请指正!!


和光同尘,与时舒卷;戢鳞潜翼,思属风云