主从分离是什么
主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制, Master以写为主, Slave以读为主
作用
- 读写分离, 读和写使用不同的服务器
- 容灾快速恢复, 某一个服务器宕机了, 其他的服务器可以补上, 不会影响业务, 一般是一主多从, 注意: 只能有一个主服务器. 解决一台主机问题”集群”
搭建一主多从
- 创建一个新的文件夹 /myredis
- 复制redis.conf到创建的文件夹中.
- 配置一主多从, 创建三个配置文件:
1
2
3
4include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb - 启动三个redis服务
1
2
3redis-server /myredis/redis6379.conf
redis-server /myredis/redis6380.conf
redis-server /myredis/redis6381.conf
info replication
: 查看当前主机运行状况redis-cli -p 6379
: 通过端口号连接
- 配从库, 不配主库
slaveof IP PORT
: 成为某个库的从服务器.
挺有意思, 从服务器如果执行写操作会直接报错.
三种方式
一主二仆
如果一个从服务器坏了, 但是在此时主服务器依然有写操作, 会发生什么?
从服务器重启后变成了主服务器. 要再次将它设为从服务器.
如果主服务器挂了, 从服务器还是从服务器, 并且知道主服务器挂了, 参数master_link_status: down. 主服务器重启后, 一切如常.
薪火相传
主服务器一个从服务器, 从服务器还有从服务器.
反客为主
主服务器挂了, 某个从服务器晋升为主服务器.slaveof no one
: 不仅仅作为从服务器, 可以当作主服务器.
主从复制原理
- 从服务器连接上主服务器后, 从服务器向主服务器发送进行数据同步的消息.
- Master接收到Slaver发送过来的同步消息, 先把数据进行持久化rdb文件, 然后把rdb文件发送给Slaver, Slaver哪到rdb进行读取.
- 每次主服务器进行写操作之后, 和Slaver进行数据同步.
全量复制: slaver收到rdb文件后, 将其加载到内存中.
增量复制: master继续将新的所有收集到的修改命令依次传给slaver, 完成同步.
哨兵模式
自动化的反客为主
在/myredis目录下新建sentinel.conf文件
1 | sentinel monitor mymaster 127.0.0.1 1 |
最后的1表示, 有多少个哨兵同意.
启动:redis-sentinel /myredis/sentinel.conf
根据优先级: slave-priority.
原主机重启后变为从机.
复制延时:
由于所有的写操作都是在master上进行, 然后同步到slaver上, 所以这个过程有一定的延迟.
新主登基
根据条件将从服务器升级为主服务器.
选择条件依次为:
- 选择优先级靠前的.
- 选择偏移量最大的.
- 选择runid最小的从服务器.
- 优先级在redis.conf中默认:
slave-priority 100
, 数值越小优先级越高. - 偏移量最大是指获得原主服务器数据最全的.
- 每个redis实例启动后都会随机生成一runid, 所以实际上就是随机选择了.
群仆俯首
挑选出新的主服务器之后, sentinel向原主服务的从服务发送slaveof命令.
旧主称臣
当已下线的主服务重新上线时, sentinel会向其发送slaveof命令, 让它成为新主的slaver.