(005)Redis 原生方式搭建集群(cluster)

为什么需要集群?

单机 Redis 每秒查询率(QPS) 可达到10万次/秒,机器内存在 16 ~ 256G 之间。这已经可以满足大部分业务需求。

除了使用更高配置的服务器外,redis3.0以上的版本支持多台机子搭建集群架构!也就是利用叠加机器的方式解决大数据、大吞吐的需求!

怎么规定数据分别保存在哪台机子?

集群意味着有多台服务器,如何规定数据保存在哪台机子?这里涉及到 数据分区

顺序分布的数据划分为多个连续的部分,按一定策略分布到不同节点上,导致新旧数据会分别堆在一起,导致数据分布不均匀,无法使用负载均衡,而哈希分区利用节点取余的方式使得新旧数据混合一起,数据分散度高,但无法顺序查询。

节点取余

缺点:三个节点不再满足需求时需要添加节点导致需要数据迁移,数据迁移导致所有缓存的位置都会发生改变,由于大量缓存在同一时间失效,造成了缓存的雪崩!为了解决这些问题,一致性哈希算法诞生了。

一致性哈希

一致性哈希算法将value映射在一个32位的key值当中,那么把数轴首尾相接就会形成一个圆形,取值范围为0 ~ 2^32-1,新增的key值经过hash计算肯定会落在这范围之内;

一致性哈希在新增节点时受影响数据少,但会导致cache节点无法均匀的分部在环形hash空间上,为了解决Hash倾斜性的问题,redis引入了虚拟节点的概念;

详情参考:Redis分布式算法 — Consistent hashing(一致性哈希)

虚拟槽哈希

Redis Cluster槽的范围是0 ~ 16383,即一共16384个槽。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,每个节点(redis实例)负责一定数量的槽。

集群的原生安装

事实上,不会使用原生安装的方式搭建集群,甚至也不需要使用官方工具这种更简单的方式安装,现在已经存在一些可视化工具实现集群的搭建,但走一遍原生安装会更理解集群的基本过程和实现原理。

redis支持多实例的功能,我们在单机演示集群搭建,需要6个实例,三个是主节点,三个是从节点,数量为6个节点才能保证高可用的集群。(步骤:配置开启节点 、关联节点(meet)、分配哈希槽、主从节点分配)

准备节点

# redis-7000.conf配置
port 7000
daemonize yes
dir "/opt/redis-5.0.5/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes  
cluster-config-file nodes-7000.conf 
cluster-require-full-coverage no

# 区分端口同上配置另外5个文件
>> sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf
>> sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
>> sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
>> sed 's/7000/7004/g' redis-7000.conf > redis-7004.conf
>> sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf

# 启动服务
>> redis-server redis-7000.conf
>> redis-server redis-7001.conf
>> redis-server redis-7002.conf
>> redis-server redis-7003.conf
>> redis-server redis-7004.conf
>> redis-server redis-7005.conf

# 查看启动状态(可见是集群模式)
>> ps -ef | grep redis | grep 7000
root     15199     1  0 11:49 ?        00:00:00 redis-server *:7000 [cluster]
# 

# 进入该节点,设置数据(会报集群不可用的错误)
>> redis-cli -p 7000
127.0.0.1:7000> set hello world
(error) CLUSTERDOWN Hash slot not served

# 查看集群状态(可见集群未上线)
127.0.0.1:7000> cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0

关联节点(meet)

# meet 
>> redis-cli -p 7000 cluster meet 127.0.0.1 7001
>> redis-cli -p 7000 cluster meet 127.0.0.1 7002
>> redis-cli -p 7000 cluster meet 127.0.0.1 7003
>> redis-cli -p 7000 cluster meet 127.0.0.1 7004
>> redis-cli -p 7000 cluster meet 127.0.0.1 7005

# 查看节点关联关系
127.0.0.1:7000> cluster nodes
0b0923614ab390d065cc1ffc8b0b8bc2b07a1de1 127.0.0.1:7000@17000 myself,master - 0 1563252166000 1 connected
8616b9d74f4a87ca117cf1ee1caf176e5e5cc034 127.0.0.1:7001@17001 master - 0 1563252170350 2 connected
827617562c79e1180bca1c5a6a0d232a3216d1c6 127.0.0.1:7003@17003 master - 0 1563252168000 3 connected
f7a34174f71e9b51f88e698704c6fb7c4692b9a0 127.0.0.1:7002@17002 master - 0 1563252168000 0 connected
42ce1a0e9c4747dfe39e67bdc4f8e7ad0fe81be1 127.0.0.1:7005@17005 master - 0 1563252169347 5 connected
04bdd42ed34e5b78453579e10c7d1bc796d50493 127.0.0.1:7004@17004 master - 0 1563252168345 4 connected

指派槽(分配槽点)

# 添加槽点的命令只能一个个添加,而槽点有 16383 个,所以通过脚本实现
>> vi add-slots.sh
start=$1
end=$2
port=$3
for slot in `seq ${start} ${end}`
do
   echo "slot:${slot}"
   redis-cli -p ${port} cluster addslots ${slot}
done


# 执行脚本
>> sh add-slots.sh 0 5461 7000

# 查看槽是否添加成功
>> redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:5462
cluster_slots_ok:5462
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:1
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:2217
cluster_stats_messages_received:2217

# 给 7001 和 7002 也添加槽
>> sh add-slots.sh 5462 10922 7001
>> sh add-slots.sh 10923 16383 7002

# 查看分配结果
>> redis-cli -p 7000 cluster nodes
0b0923614ab390d065cc1ffc8b0b8bc2b07a1de1 127.0.0.1:7000@17000 myself,master - 0 1563252942000 1 connected 0-5461
8616b9d74f4a87ca117cf1ee1caf176e5e5cc034 127.0.0.1:7001@17001 master - 0 1563252944020 2 connected 5462-10922
827617562c79e1180bca1c5a6a0d232a3216d1c6 127.0.0.1:7003@17003 master - 0 1563252943019 3 connected
f7a34174f71e9b51f88e698704c6fb7c4692b9a0 127.0.0.1:7002@17002 master - 0 1563252943000 0 connected 10923-16383
42ce1a0e9c4747dfe39e67bdc4f8e7ad0fe81be1 127.0.0.1:7005@17005 master - 0 1563252943000 5 connected
04bdd42ed34e5b78453579e10c7d1bc796d50493 127.0.0.1:7004@17004 master - 0 1563252945022 4 connected

分配主从

# 设置主从
>> redis-cli -p 7003 cluster replicate 0b0923614ab390d065cc1ffc8b0b8bc2b07a1de1
OK
>> redis-cli -p 7004 cluster replicate 8616b9d74f4a87ca117cf1ee1caf176e5e5cc034
OK
>> redis-cli -p 7005 cluster replicate f7a34174f71e9b51f88e698704c6fb7c4692b9a0
OK

至此,原生搭建集群的方式已经走了一遍,但实战中不会使用这种方式安装。官方工具Ruby会更简单地实现以上过程!

发布了46 篇原创文章 · 获赞 42 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Phplayers/article/details/95459541