# 集群简介

# Sudis集群特点

  • 由Cluster Manager(Master/Slave) 负责创建管理集群,Cluster Manger Master管理事务由Cluster Manger Slave备份, 通过Agent服务进行集群的管理。
  • Cluster Manager Master和Cluster Manager Slave可部署在不同的物理机上,以确保高可用,故障恢复。
  • Agent service在物理机上一直启动,负责创建管理节点,创建cluster时负责拉起管理服务等,它一直处于活动状态,随时处理命令。
  • 所有的集群Node至少是一主一从(也可以是一主多从),客户端可以连接任何一个主节点进行读写,从节点不提供写服务,仅作为数据备用。
  • 数据按每个key的值HASH均衡分布在每个主节点Master上,每个主节点数据都存储部分数据值(如果只有一个Master主节点,则该节点存储所有数据值)
  • 不支持同时处理多个key(如MSET/MGET),因为Sudis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为。
  • 支持在线增加、删除节点。

# 集群架构示意图

SUDIS集群最少有两个节点,即一主一从,即主备复制模式,有如下特点:

  • Master数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给Slave数据库。
  • Slave数据库一般是只读的,并且只接收Master数据库同步过来的数据。
  • 一个master可以拥有多个slave,但是一个slave只能对应一个master。
  • slave出现故障宕机不影响其他slave的读和master的读和写,slave重新启动后会将数据从master同步过来。
  • master出现故障宕机以后,slave就会自动变成master.
  • 各主节点master之间没有数据交换,只有master和slaver数据同步。

# 与开源Redis对比优势

Sudis 开源Redis
产品架构
  • Sudis的数据均衡分散保存到各个主节点中,采用主从同步复制,访问从节点数据强一致。
  • Sudis 集群采用集中式管理机制,在集群规模增大时,效率随之增加,优势明显。
  • Sudis资源可弹性平滑扩缩容,业务几乎无感知。
  • 开源Redis的数据分散保存到各个独立节点本地内存中,一旦主备故障就会导致部分数据丢失。
  • 开源Redis采用主从异步复制,访问从节点数据会不一致。
  • Gossip协议在开源Redis集群规模过大时,效率显著下降。
  • 扩缩容开源Redis的容量实际上就是变更物理节点数量,对业务影响大。
  • 业务场景
  • 数据量小场景,Sudis提供更低成本。
  • 数据量大场景,开源Redis难以胜任,Sudis完美驾驭。
  • 对数据安全性要求低,接受核心数据丢失或被LRU挤出。
  • 对稳定性要求低,接受OOM宕机发生。
  • 接受多点访问数据不一致。往往只能用于数据量小、数据有效期短的业务。
  • 安全
  • Sudis采用纯自研架构,基本不存在开源Redis安全漏洞问题。
  • 开源Redis内核不定期会爆出安全漏洞问题,如CVE-2021-32761等。如版本升级不及时,随时有被恶意利用风险。
  • 数据可靠性
  • 可选毫秒级数据落盘到rockDB的时间,数据丢失风险低。
  • 内存数据秒级落盘,且主从异步复制不及时,存在数据丢失风险。
  • 数据一致性 强一致性
  • Sudis采用主从同步复制,多点访问数据一致性高。
  • 弱一致性
  • Redis采用主从异步复制,多点访问存在数据不一致问题。
  • # 基本原理

    ​ 当新建立一个集群时,先启动 Sudis Agent服务,从服务器将向主服务器发送SYNC命令,接收到SYNC命令后的主服务器会从内存中把存量和增量数据都发送给从服务器。此后每次主服务数据发生变动都会同步给从服务器。一个主服务器可以拥有多个从服务器,而从服务器不能有从服务器,从而形成树状结构,复制功能不会阻塞主服务器,即使有一个或多个同步请求,主服务器依然能处理命令请求。

    # 持久化开关

    ​ 当配置了主从复制模式时需要开启主服务器的持久化功能,如果将主服务器的持久化功能关闭,主服务器一旦重启,所有从服务器的数据将会丢失。

    # Slot(哈希槽)

    ​ 一个Sudis集群包含16384 个插槽(hash slot),数据库中的每个键都属于这16384个插槽中的一个。插槽用来把值平均分配到不同主服务器中,达到分担压力的效果。(比如在set k1 v1操作的时候,会计算K1所在hash slot值,根据各节管理的slot值范围,放到相应的节点中去)。

    集群使用公式 CRC16(key)%16384来计算键属于哪个slot。