Redis多机数据库的实现(集群、复制、sentinel)

1.复制

Redis中,用户通过执行slaveof命令或者设置slaveof选项,让一个服务器去复制另外一个服务器,被复制的服务器为主服务器,对主服务器进行复制的服务器称为从服务器。
这里写图片描述
旧版本复制功能分为:1)同步:将从服务器的数据库状态更新至主服务器当前所处的数据库状态。2)命令传播:主服务器的数据库状态被修改,导致主从数据库的状态不一致,让主从服务器的数据库从新回到一致状态。
同步:从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令来完成。
这里写图片描述
这里写图片描述
命令传播:主服务器会将客户端对它执行的写命令,发送给从服务器,使主从服务器状态保持一致。
缺点:断线后重新复制,效率低下

新版本复制功能
使用PSYNC代替SYNC命令
PSYNC命令:完整重同步,部分同步。
完整重同步:类似SYNC的初始同步。
部分同步:处理断线后复制情况,将主从服务器断开期间执行的写命令发送给从服务器。通过复制偏移量、复制积压缓冲区、服务器运行ID

复制的实现
127.0.0.1:1212>slaveof 127.0.0.1 6379
1)设置主服务器的地址和端口,首先将主服务器的IP和端口保存到服务器状态的masterhost和masterport
2)建立套接字连接
3)发送ping命令
4)身份验证
5)发送端口信息
6)同步

心跳检测:从服务器想主服务器发送命令来进行心跳检测,以及命令丢失检测。
1、检测主从服务器的网络连接状态
从服务器发送 INFO replication,若主服务器超过一秒钟没有接收到REPLCONF ACK命令,说明连接有问题。
2、辅助实现min-slaves
作用:防止主服务器在不安全的情况下执行写命令
3、检测命令丢失

2.Sentinel(哨兵)

sentinel:是redis高可用的解决方案,由一个或者多个sentinel实例组成的sentinel系统可以监视任意多个主服务器,以及这些服务器属下的所有从服务器,并在被监视的主服务器下线的状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
这里写图片描述这里写图片描述

启动并初始化sentinel
启动命令: redissentinel/path/t/your/sentinel.conf redis-server /path/t/your/sentinel.conf

当sentinel 启动时,需要执行以下步骤:
1)初始化服务器
本质是运行在特殊模式下的redis服务器,不会载入RDB和AOF文件
2)将普通redis服务器使用的代码替换成sentinel专用代码
普通的redis服务器使用redis.h/redis_serverport作为端口,而sentinel使用redis_sentinel_port常量的值作为服务器端口。
两者的服务器命令不同。
3)初始化sentinel状态
4)根据给定的配置文件,初始化sentinel的监视主服务器列表
5)创建连向主服务器的网络连接

获取主服务器信息
sentinel会以默认十秒一次的频率,发送命令连接向北监视的主服务器发送INFO命令,通过分析INFO命令的回复来获取主服务器的当前状态。
sentinel发现主服务器有新的从服务器,sentinel除了会为新的从服务器创建相应的实例结构外,sentinel还会创建连接到从服务器的命令连接和订阅连接。

3.集群

Redis集群是redis提供分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。

节点:一个redis 集群通常有多个节点(node)组成,开始时每个节点相互独立,都处于找一个包含自己的集群中,要组建一个真正工作的集群,需要将各个独立的节点连接起来,构成一个多节点的集群。

cluster meet <ip> <port>
首先连接节点:
$redis -cli -c -p 127.0.0.1:7000
127.0.0.1:7000>cluster Nodes  //查看节点连接情况
127.0.0.1:7000>cluster meet 127.0.0.1:7001  //连接新的节点

启动节点
redis启动时会根据cluster-enabled配置选项是否yes来决定是否开启服务器集群模式。
这里写图片描述
集群数据结构:clusterNode结构保存了一个节点当前状态,比如节点的创建时间、节点的名称、节点当前的配置纪元、节点的IP地址和端口号。

槽指派:redis集群通过分片来保存数据库的键值对,集群的整个数据库被分成16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,每个节点都可以处理0个或者最多16384个槽。
当数据库中的16384个槽都有节点在处理时,集群处于上线状态,如果任何一个槽没有得到处理,则集群处于下线状态。

   通过cluster addslots命令可以将一个槽或者多个槽指派给节点节点复制
   127.0.0.17000>cluster addsolts 0 1 2 3 4 .... 5000
   127.0.0.17001>cluster addsolts  5000 5001 .....10000
  127.0.0.17002>cluster addsolts 10000 10001 .... 16383

//计算键属于哪个槽
 127.0.0.17000>cluster keyslot "data"
 2022

重新分片
Redis集群的重新分片操作可以将任意数量已经指派给某个节点的槽改为指派给另外一个节点,并且相关槽所属的键值对也会从源节点移动到目标节点。

//第一步 新增新节点
//向新节点分配槽

重新分片原理:分片操作由redis集群管理软件redis-triib负责执行的。
这里写图片描述

ASK错误
属于被迁移槽的一部分键对保存在源节点里面,而另一部分键值对则保存在目标节点里面。
复制转移
Redis集群的节点分为主节点和从节点,主节点主要用于处理槽,从节点主要用于复制某个主节点,并在被复制的主节点下线时,代替下线的主节点继续处理命令请求。
设置从节点:

cluster replicate<node_id>

可以让接受命令的节点称为node_id所指定的从节点,并开始对主节点进行复制。
故障检测
集群中的每个节点都会定期地向集群中的其他节点发送PING命令,以此来检查对方是否在线,如果接收ping消息的节点没有在规定的时间内,向发送ping消息的节点返回pong消息,那么将认为没有返回消息的节点标记为疑似下线。
如果半数以上处理槽的节点都将某节点x报告为疑似下线,那么这个主节点x将被标记为已下线。
故障转移
当一个节点发现自己真在复制的主节点进入已下线状态时,从节点将开始对下线主节点进行故障转移,一下是故障转移的执行步骤。
1.复制下线主节点的所有从节点将会有一个从节点被选中。
2.被选中的从节点会执行slaveof on one,成为新的主节点。
3.新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽指派给自己。
4.新的主节点向集群广播一条pong消息,这条pong消息可以让集群中的其他节点立即致电这个节点已经由从节点变为主节点了。
5.新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移完成。
集群中的节点通过发送和接受消息进行通信,节点的消息包括meet,ping,pong,publish,fail五种。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值