redis 基础学习之主从复制
主动复制
主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
1、作用
- 读写分离,性能扩展
- 容灾快速恢复
2、常用三招
-
一主二从
- 从服务器挂掉以后,重新开启,不会自动变成从服务器,二是默认成为一个新的主服务器
- 当设置成为某个从服务器后,会把主服务器的所有内容复制过来
- 主服务器挂掉以后,从服务器还是认,等主服务器重新启动,回到原先的状态
- 薪火相传
上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。
用 slaveof <ip><port>
中途变更转向:会清除之前的数据,重新建立拷贝最新的
风险是一旦某个slave宕机,后面的slave都没法备份
主机挂了,从机还是从机,无法写数据了
- 反客为主
当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。
用 slaveof no one 将从机变为主机。
3、复制原理
-
Slave启动成功连接到master后会发送一个sync命令
-
Master接到命令,把主服务器的数据进行持久化RDB,将RDB文件发送给从服务器,从从服务器读取数据并加载
-
每次主服务器进行写操作,和从服务器进行同步
-
但是只要是重新连接master,一次完全同步,全量复制将被自动执行
4、哨兵模式
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
配置:
- 新建sentinel.conf文件,名字绝不能错
- 配置哨兵,填写内容
- sentinel monitor mymaster 127.0.0.1 6379 1
- 其中mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量。
- 启动哨兵
- redis做压测可以用自带的redis-benchmark工具
- 执行redis-sentinel /sentinel.conf
- 当主机挂掉,从机选举中产生新的主机
- 大概10秒左右可以看到哨兵窗口日志,切换了新的主机
- 哪个从机会被选举为主机呢?根据优先级别:slave-priority
- 原主机重启后会变为从机。
5、复制延时
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
6、故障恢复
- 优先级在redis.conf中默认:slave-priority 100,值越小优先级越高,后来的版本中叫做replica-priority
- 偏移量是指获得原主机数据最全的
- 每个redis实例启动后都会随机生成一个40位的runid