Chapter6 Redis主从复制
6.1 简介
6.1.1 定义
主机数据更新后根据配置和策略,自动同步到从机的master/slave机制, Master以写为主, Slave以读为主
6.1.2 用处
- 读写分离,性能扩展
- 容灾快速恢复
6.1.3 三种方式
- 一主二仆
- 薪火相传
- 反客为主
6.2 一主二从
6.2.1 原理
- 配从(库)不配主(库)
- 配从(库): slaveof 主库IP 主库端口
- 主写从读、读写分离
- 从连前后同
- 主断从待命、从断重新连
6.2.2 搭建步骤
一台服务器模拟三台主机:
- 将redis.conf 拷贝三份,名字分别是, redis6379.conf, redis6380.conf, redis6381.conf
- 修改三个文件的port端口, pid文件名(pidfile),日志文件名(logfile), rdb文件名(dbfilename)
- 分别使用三个配置文件启动三个 redis 服务器
查询主从信息: info replication
- 三台都是master
6379 写操作
set k1 v1
设置主从关系
6380和6381上执行:
127.0.0.1:6380> slaveof 127.0.0.1 6379 127.0.0.1:6381> slaveof 127.0.0.1 6379
方式二:在配置文件中加入
slaveof 127.0.0.1 6379
6.2.3 几个概念
全量复制:6380、6381把6379之前的内容也复制了过来
127.0.0.1:6380> get k1 "v1"
增量复制:6379此时进行写操作,6380、6381都会复制下来
127.0.0.1:6379> set k2 v2 OK
127.0.0.1:6380> get k2 "v2"
127.0.0.1:6381> get k2 "v2"
主写从读、读写分离: 从机写报错
127.0.0.1:6381> set k3 v3 (error) READONLY You can't write against a read only replica.
主机宕机:从机待命
主机shutdown
127.0.0.1:6379> shutdown
从机待命
127.0.0.1:6380> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:down ....
主机宕机后恢复:一切正常
从机宕机:必须重新连接, 除非写进配置文件
6.3 薪火相传
6.3.1 背景
- 一主多仆master服务器压力大
- 上一个slave可以作为下一个slave的master
- 中途变更转向:会清除之前的数据,重新拷贝最新的
6.3.2 操作
一台主机配多台从机,一台从机再配多台从机,从而实现了庞大的集群架构。同时也减轻了一台主机的压力
缺点是增加了服务器间的延迟
6381作为6380的从机,6380作为6379的从机\
127.0.0.1:6381> slaveof 127.0.0.1 6380 OK
6.3.3 概念
中间机6380:身份还是从机
127.0.0.1:6380> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 ...
主机写,从机逐次更新
127.0.0.1:6379> set k4 v4 OK
127.0.0.1:6380> get k4 "v4"
127.0.0.1:6381> get k4 "v4"
6.4 反客为主
6.4.1 操作
主机宕机
127.0.0.1:6379> shutdown
从机反客为主
127.0.0.1:6380> slaveof no one OK
其它从机转换主机
127.0.0.1:6381> slaveof 127.0.0.1 6380 OK
6.4.2 概念
- 主机恢复:已与它无关
6.5 哨兵模式(sentinel)
6.5.1 简介
- 哨兵模式是反客为主的自动版,后台监控主机是否故障,故障则根据投票自动将从库转为主库
- 一组 sentinel 可以同时监控多个 master
6.5.2 搭建
按之前的一主二仆方式启动 三台redis
新建 sentionel.conf 文件, 内容:
sentinel monitor mymaster 127.0.0.1 6379 1
- mymaster:给主服务器起的别名
- 127.0.0.1 6379 表示: 指定监控主机的 ip 地址, port 端口,
- 1:得票数多于 1 时需要切换主从关系
- 如果设置密码了,还需要设置密码:
sentinel auth-pass mymaster psw
启动哨兵
/usr/local/redis/bin/redis-sentinel sentinel.conf
6.5.3 操作
主机宕机
127.0.0.1:6379> shutdown
哨兵监控到,投票后某台从机成为主机
127.0.0.1:6381> info replication # Replication role:master connected_slaves:1
其它从机转向新主机
127.0.0.1:6380> info replication # Replication role:slave master_host:127.0.0.1 master_port:6381
主机重新上线
/usr/local/redis/bin/redis-server redis6379.conf /usr/local/redis/bin/redis-cli -p 6379
哨兵检测到后,该服务器成为从机
127.0.0.1:6379> info replication # Replication role:slave master_host:127.0.0.1 master_port:6381 master_link_status:up
6.5.4 总结
- 查看主从复制关系命令: info replication
- 设置主从关系命令: slaveof 主机 ip 主机 port
- 开启哨兵模式命令: ./redis-sentinel sentinel.conf
- 主从复制原则:开始是全量复制,之后是增量复制
- 哨兵模式三大任务:监控,提醒,自动故障迁移