redis 主从复制

redis主从复制官网介绍是一个Master可以有多个Slave,Slaves能过接口其他slave的链接,除了可以接受同一个master下面slaves的链接以外,还可以接受同一个结构图中的其他slaves的链接。Master是非阻塞的,在同步到其他slave的同时还可以进行查询等。可以进行命令设置master和slave,但是当丛机断开连接以后,redis会从新连接,这时断开连接的slave就会变成master,可以在redis.conf文件的SLAVEOF选项进行配置连接的时候就配置master和slave。slave为只读(这个行为由 redis.conf 文件中的 slave-read-only 选项控制,可以在运行时使用 CONFIG SET 来开启和关闭

配从不配主


准备3个redis,一个master(端口6379)和2个slave(端口6380和6381).并为了方便区分,将每个conf配置文件的pid文件名、端口、dump.rdb和日志文件都修改为对应的端口,并启动所有redis

redis 主从复制_第1张图片

redis 主从复制_第2张图片


现在都是master,info replication命令查看主从机是master还是slave等信息、将80和81配置成slave

redis 主从复制_第3张图片


redis 主从复制_第4张图片




现在向master(6379)添加数据集,6380和6381都可以获取到,不分时间片,无论何时连接上master,主要设置了master和slave,slave只要连上了master,slave连接后都会从头到尾获取master的所有数据集(全量复制),后面master添加数据集后,slave是进行增量同步

redis 主从复制_第5张图片





当主机(6379)挂了的时候,其余slave保持不变,不会篡位。还是slave

redis 主从复制_第6张图片

可以使用slaveof no one命令 将其中一个slave(6380)变成master,其余的slave(6381)可以跟随最新的master(6380)(图1),重新连接起来的master(6379)就会成为光杆司令,当然slave(6381)可以选择不跟随新的master(6380),待旧master(6379)连接起来后依然是master(6379)的slave

图1:

redis 主从复制_第7张图片redis 主从复制_第8张图片

redis 主从复制_第9张图片


sentinel哨兵机制

sentinel哨兵机制(实际工作中用的很多,监控master,一旦master挂掉,sentinel机制进行投票在slave中选择动态变换成master,全自动,博客其他文章中有介绍sentinel哨兵机制,需要配置sentinel.conf文件)

还是以6379为master为例:

在redis6379.conf同级目录创建sentinel.conf文件,简单配置一个:

sentinel monitor localhost6379 127.0.0.1 6381 1

 sentinel 去监视一个名为 localhost6379的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 1个 Sentinel 同意 (只要同意 sentinel 的数量不达标,自动故障迁移就不会执行)。

redis 主从复制_第10张图片

启动哨兵

运行sentinel有两种方式:

  • 第一种

    redis-sentinel /path/to/sentinel.conf
  • 第二种

    redis-server /path/to/sentinel.conf --sentinel

    以上两种方式,都必须指定一个sentinel的配置文件sentinel.conf,如果不指定,将无法启动sentinel。sentinel默认监听26379端口,所以运行前必须确定该端口没有被别的进程占用。

redis 主从复制_第11张图片

将6379挂掉,会看到上面的日志也会有所变化。

redis 主从复制_第12张图片

可见sentinel哨兵已将6381变成了master,整个过程全自动,也是实际工作中比较常用的。再来看看6379和6380

redis 主从复制_第13张图片


在哨兵选举master的中途,会有一个新的版本号,假如之前以6379为master的版本号是1,选举出新master(6381)的版本号绝对不会再是1,会是一个新的版本号,比如变成了2.然后在旧master(6379)在重新连接之后,会获取新版本号,以新版本号的master为准并更新版本号,确定新的master。

多个sentinel哨兵之间也会进行互相通信通讯,使用的是gossip协议






当其中一台slave(6380)挂了的时候,redis会重新连接,连接上后slave会从之前的slave变成master,因为加载配置文件没有设置master,这里是使用的命令设置master的,如果需要连接就设置成slave,在redis.conf配置文件进行配置即可(SLAVEOF选项)

redis 主从复制_第14张图片


如果我们同时向master和slave添加数据集会是什么结果呢?


说明slave是只读的。无法进行写入操作!



主从配置等其实简单,主要是遇到的问题需要时间!


你可能感兴趣的:(redis)