赞
踩
客户端向服务器发送SLAVEOF命令,将当前服务器转变为指定服务器的从属服务器(slave server),期间从服务器同步主服务器数据.
步骤如下:
redis2.8之后,使用PSYNC代替SYNC命令执行复制时的同步操作
分别提供2种模式:
部分重同步实现
从服务器连上主服务器后,会发送主服务器运行ID
主服务器查找运行ID是否与本机ID一致,找到则执行部分重同步,否则完全重同步.
连接成功后,slave向maste发送当前复制偏移量,若复制偏移量之后数据在master复制积压缓冲区中,则发送之后数据给slave.否则完全重同步.
在服务器同步slave时,会将命令放入复制积压队列缓冲区中.这个队列时固定的FIFO,也就是说当队列撑满后,后放入的数据会让first弹出去.
复制缓冲区构造
PSYNC执行流程:
在命令传播阶段,slave send commend to master 1s/time
REPLCONF ACK 从服务器当前偏移
具体功能如下:
通过主从复制,仅仅只能解决数据读压力和数据同步问题,但是当master宕机了,redis将不能提供写服务.解决办法sentinel进行主从切换.
当master down之后,可通过手工和sentinel配置新的master
sentinel会对于每个被监控的服务器分别创建命令连接和订阅连接
sentinel在与其他sentinel连接时,只会创建命令连接.
sentinel 10S/次 向被监控服务器发送INFO命令获取主服务器的从服务器当前信息,然后为这些从服务器创建相应实例.
sentinel 2s/次发送订阅消息,其他sentinel接收到然后创建新的实例sentinel对象,以及与sentinel命令连接.
选举策略如下:
通过sentinel弥补了主从的局限性,但是当数据量过大,会出现单台服务器存不下问题,解决办法分片.也就是集群模式.跟数据库分库分表差不多.解决容量上限问题.
配置文件设置cluster-enabled yes,表示是否开启服务器集群模式,并启动节点,
使用cluster meet连接其他节点加入集群.期间会将clusterNode(节点信息)加入clusterState.nodes中.然后使用流言协议散播其他集群其他节点,让其他节点与新加入节点握手.
通讯过程如下:
通过cluster addsloats 给每个节点指派槽,然后每个节点同步其他节点的槽信息,紧接着就上线了.
客户端使用集群方式访问
通过redis-trib软件负责
分片规则如下:
执行流程如下:
倘若这时,有客户端访问节点,流程如下:
具体判断是否在迁移槽如下:
cluster.h
typedef struct clusterState {
// 记录要从源节点迁移到本节点的槽,以及进行迁移的源节点
// importing_slots_from[i] = NULL 表示槽 i 未进行导入
// importing_slots_from[i] = clusterNode_A 表示正从节点 A 中导入槽 i
clusterNode *importing_slots_from[CLUSTER_SLOTS];
}
typedef struct clusterState {
// 记录要从当前节点迁移到目标节点的槽,以及迁移的目标节点
// migrating_slots_to[i] = NULL 表示槽 i 未被迁移
// migrating_slots_to[i] = clusterNode_A 表示槽 i 要从本节点迁移至节点 A
clusterNode *migrating_slots_to[CLUSTER_SLOTS];
}
CLUSTER REPLICATE node_id:将接收命令的节点称为node_id的从节点,并开始复制.
具体步骤如下:
一条消息由消息头+正文组成:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。