主从分离是什么

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

作用

  1. 读写分离, 读和写使用不同的服务器
  2. 容灾快速恢复, 某一个服务器宕机了, 其他的服务器可以补上, 不会影响业务, 一般是一主多从, 注意: 只能有一个主服务器. 解决一台主机问题”集群”

搭建一主多从

  1. 创建一个新的文件夹 /myredis
  2. 复制redis.conf到创建的文件夹中.
  3. 配置一主多从, 创建三个配置文件:
    1
    2
    3
    4
    include /myredis/redis.conf
    pidfile /var/run/redis_6379.pid
    port 6379
    dbfilename dump6379.rdb
  4. 启动三个redis服务
    1
    2
    3
    redis-server /myredis/redis6379.conf
    redis-server /myredis/redis6380.conf
    redis-server /myredis/redis6381.conf
    W1yPIK.png

info replication: 查看当前主机运行状况
redis-cli -p 6379: 通过端口号连接

W1yyQJ.md.png

  1. 配从库, 不配主库
    slaveof IP PORT: 成为某个库的从服务器.

挺有意思, 从服务器如果执行写操作会直接报错.

三种方式

一主二仆

如果一个从服务器坏了, 但是在此时主服务器依然有写操作, 会发生什么?
从服务器重启后变成了主服务器. 要再次将它设为从服务器.

如果主服务器挂了, 从服务器还是从服务器, 并且知道主服务器挂了, 参数master_link_status: down. 主服务器重启后, 一切如常.

薪火相传

主服务器一个从服务器, 从服务器还有从服务器.

反客为主

主服务器挂了, 某个从服务器晋升为主服务器.
slaveof no one: 不仅仅作为从服务器, 可以当作主服务器.

主从复制原理

  1. 从服务器连接上主服务器后, 从服务器向主服务器发送进行数据同步的消息.
  2. Master接收到Slaver发送过来的同步消息, 先把数据进行持久化rdb文件, 然后把rdb文件发送给Slaver, Slaver哪到rdb进行读取.
  3. 每次主服务器进行写操作之后, 和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上, 所以这个过程有一定的延迟.

新主登基

根据条件将从服务器升级为主服务器.

选择条件依次为:

  1. 选择优先级靠前的.
  2. 选择偏移量最大的.
  3. 选择runid最小的从服务器.
  • 优先级在redis.conf中默认: slave-priority 100, 数值越小优先级越高.
  • 偏移量最大是指获得原主服务器数据最全的.
  • 每个redis实例启动后都会随机生成一runid, 所以实际上就是随机选择了.
群仆俯首

挑选出新的主服务器之后, sentinel向原主服务的从服务发送slaveof命令.

旧主称臣

当已下线的主服务重新上线时, sentinel会向其发送slaveof命令, 让它成为新主的slaver.