Redis--Redis分布式系统的原理与实操

发布时间:2026/7/6 3:47:41

Redis--Redis分布式系统的原理与实操 Redis分布式系统Redis分布式系统Redis集群很好的解决不同Redis节点存放不同数据并将用户请求方便地路由到不同Redis的问题。数据分区算法分布式数据库系统会根据不同的数据分区算法将数据分散存储到不同的服务器节点上每个节点管理整个数据集合的一个子集。常见的数据分区规则有两大类顺序分区和哈希分区。顺序分区顺序分区是将数据按照某种顺序平均分配到不同的节点。比如轮询分区算法、时间片轮转分区算法、数据块分区算法、业务主题分区算法等。轮询分区算法每产生一个数据就依次分配的不同的节点。该算法适合数据量不确定的场景。在数据量庞大的情况下每个节点的数据很平均。但生产者与节点间的连接要长时间保存。时间片轮转分区算法在一个固定长度的时间片内数据会分配到一个节点时间片结束新的数据就分配到下一个节点。该算法可能会出现节点数据不平均的情况每个时间片内产生的数据量不同。但生产者与节点间的连接只需一个正在使用的就行使用完毕后释放连接。数据块分区算法在数据总量确定的情况下根据各个节点的存储能力将某块数据分配到一个节点。业务主题分区算法不同的业务主题分配到不同节点。哈希分区哈希分区规则是充分利用数据的哈希值来完成分配对数据哈希值的不同使用方式产生了不同的哈希分区算法。常见的哈希分区算法如下节点取模哈希算法该算法的前提是每个节点都分配好了一个唯一序号对于N个节点的分布式系统序号范围是【0N-1】.然后选取数据本身作为key计算hashkey与节点N的模。计算结果就是该数据存储的节点的序号。该算法优点是简单缺点是如果分布式系统要扩容或缩容已存的数据需要根据新的节点数据N进行数据迁移否则根据key无法找到原来的数据。实际上一般采用翻倍扩容方式以减少扩容时数据迁移的比例。一致性哈希分区算法一致性哈希算法通过一致性hash环的数据结构实现。环的起点是0终点是232-1并且起点和终点重合环中间的整数按顺/逆时针分步。上图中o1、o2、o3、o4代表待分配的数据红色方框是这4个数据的hasho在hash环中的落点。m0、m1、m2代表三个节点绿色圆圈表示三个节点的hashm在hash环中的落点。数据的hasho按照顺/逆时针方向离哪个hashm最近就存在哪个节点上。该算法的优点是节点扩容或缩容时只对最近的节点有影响其他节点无影响。缺点是容易形成数据倾斜。且节点变化影响的数据量大所以不适合数据节点少的场景。虚拟槽分区算法该算法首先虚拟出一个固定数量的整数集合集合中的每个数称为一个slot槽。槽的数据一般远大于节点数量然后将槽瓶平均映射到各个节点上。例如Redis 分布式系统中虚拟了16384个槽范围是【016383】.假设有3个节点那么solt槽和节点的映射关系如下数据与槽有关系和节点没关系。数据通过hashkey映射到槽solthashkey%soltNums。该算法优点解耦数据和节点无需维护节点只需维护与solt槽的关系。Redis数据分区就是采用这个算法计算公式为soltCRC16%16384.系统搭建系统架构一个master配一个slave。master和slave的关系在搭建成功后会自动分配。删除持久化文件先将之前Redis主从集群在Redis安装目录下生成的RDB文件dump638*.conf和AOF持久化文件删除。因为Redis分布式系统要求创建在一个空的数据库之上。AOF持久化文件全部上appendonlydir目录中。然后再Redis安装目录中mkdir一个新目录 cluster-dis。将cluster 目录中的redis.conf 和redis6380.conf文件复制到cluster-dis 目录。修改redis.confdir指定工作目录为前面创建的cluster-dis目录。持久化文件、节点配置文件都在这个目录中生成。dir /opt/apps/redis/cluster-discluster-enabledcluster-enabled yes # 开启集群模式cluster-config-file指定集群节点的配置文件该文件会在每次节点启动时自动生成其在dir属性指定的目录。该属性仍然保持注释在后面的每个节点单独的配置文件中配置它。cluster-node-timeoutcluster-node-timeout 15000 # 指定集群节点间通信的超时阈值单位毫秒修改redis6380.conf复制5个配置文件redis6381.conf、redis6382.conf、redis6383.conf、redis6384.conf、redis6385.conf将端口号全部换为对应的端口号。系统的启动与关闭使用redis-server redis638*.conf 启动各个节点。此时在cluster-dis目录中生成了6个nodes的配置文件。这些节点启动后仍然时6个独立的Redis通过redis-cli --cluster create 命令将6个节点创建成一个分布式系统。redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385当询问是输入yes 即可创建完成。测试系统通过cluster nodes 命令可以查看各节点的关系及连接情况只要看到每个节点的connected说明系统搭建成功。对于命令redis-cli 需要注意redis-cli 带有参数-c 表示要连接的是一个集群而不是一个节点端口号可以使用6个中的任意一个。关系系统将各个节点shutdown 即可。redis-cli -p 5380 shutdown集群操作先连接集群redis-cli -c -p 6380写入数据单个key写入没有问题一次写入多个key会报错。当批量写入多个key时由于多个key会计算出多个solt。多个solt可能会对应多个节点而一次只能写入一个节点所有该操作会报错。不过系统提供了批量写入多个key的方案为这些key指定一个统一的group让这个group 作为计算slot的唯一值。mset name{emp} ali age{emp} 22集群查询查询key的slot通过cluser keyslot 查询指定key的slotcluster keyslot emp # 查询emp的slot查询slot中key的数量通过cluster countkeyinslot 查询指定slot中包含key的个数cluster countkeyinslot 13178查询slot中的key通过cluster getkeysinslot 查询指定slot中包含的keycluster getkeysinslot 13178故障转移分布式系统中某个master如果宕机那么对应的slave就会自动晋升为master如果原master又重新启动那么原master会自动变为新master的slave。全覆盖需求如果某slot范围对应的节点全部宕机那么分布式系统是否还可以对外提供服务取决于属性cluster-require-full-coverage的设置。该属性的取值有yes默认值要求所有slot节点必须全覆盖的情况下系统才能运行。noslot节点不全的情况下系统也可以提供查询服务。集群扩容这里新增两个新节点端口号为6386的master和端口号为6387的slave节点。复制并修改两个配置文件。使用redis6380.conf 复制出redis6386.conf 、redis6387.conf 并修改端口号。启动这两个节点。在这里先启动分布式系统执行下列命令./start-redis-cluster.sh启动这两个新节点后他们还是孤立节点和其他节点没有任何关系。添加master节点redis-cli -c --cluster add-node 127.0.0.1:6386 127.0.0.1:6380通过命令redis-cli -c --cluster add-node {newHost}:{newPort} {existHost}:{existPort}将新节点加入到系统中其中{newHost}:{newPort} 是新节点的地址{existHost}:{existPort} 是原系统中任意节点地址。添加完成后此时新master还没有对应的slot。分配slot。由于slot数量不变所以slot分配本质就是一个slot的移动过程。通过redis-cli -c --cluster reshard {existHost}:{existPort}命令开启slot分配流程。{existHost}:{existPort} 为分布式系统中的任意节点地址。

相关新闻