Fork me on GitHub

Redis的主从复制

redis的主从复制

master以写为主,slave以读为主

是什么?

能干嘛?

怎么玩?

原则:

  • 配从(库)不配主(库)
  • 从库配置: slaveof 主库IP 主库端口
  • 修改配置文件细节
    1. copy 多个redis.conf 文件
    2. 开启daemonize yes
    3. 修改PID文件名字
    4. 指定端口
    5. Log文件名字
    6. Dump.rdb名字
  • 常用三招
    1. 一主二仆, 正常模式,利用slaveof IP port来指定为从机。
    2. 薪火相传,从机也可以接收其它从机的slaveof命令,从而形成A为主机,B slaveof A, 然后,C slaveof B。当A 写了数据,B会得到同步,同理,C也就会得到同步,这就构成了去中心化的方式。
    3. 反客为主,当主机挂掉后,从机默认会原地待命,这样性能不高,我们可以在其中的一个从机中,使用命令slave no one来停止与其它数据库的同步,转成主数据库,这样这个从机就反客为主了。

查看当前redis的复制身份,使用命令:info replication

默认情况下,我们启动redis-server后都是以master身份存在的,使用slaveof命令后就变成了slave身份,除非在配置文件中指定身份。

当主机挂掉后,所有从机待命,主机恢复后,一切照旧。
当从机挂掉后,重启从机,从机的身份会是master,还要再次使用 slaveof命令连接到主机后才会成为slave机。

复制原理

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

哨兵模式(sentinel)

现在是最主要的模式,相当于是自动版的反客为主,它的规则是当master挂掉后,哨兵会从所有的从机中进行投票,找出票数最多的从机,把它做为新的master,其它的从机会自动同步到这台主机上。

操作步骤:

  1. 把结构调整到1主多从模式
  2. 新建一个 sentinel.conf 文件,并加入如下内容
    1
    sentinel monitor 自定义主机名 127.0.0.1 6379 1

其中,主机名随便命名,127.0.0.1 和 6379 是要哨兵监控主机地址和端口。1 代表哪个从机的票数多,就选哪个做为新的主机。

  1. 调用redis-sentinel 命令启动哨兵

完成以上步骤后,如果被哨兵监控的主机挂起了,则哨兵会根据规则重新挑选出一个从机做为新的主机。以保证服务的稳定。

缺点:

复制的延迟,由于所有的写操作都是先在master上操作,然后同步更新到slave上,所以从master同步到slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,slave机器数量的增加也会使这个问题更加严重。