Docker容器技术–安装Redis集群
概念及原理
何为Redis集群
Redis集群是一个分布式系统,通过对Redis的水平扩容,实现了对大量数据的存储和高效处理。广泛应用于各种需要高性能、高可用性和高扩展性的场景中。
功能实现原理
-
Redis集群通过启动多个Redis节点,并将整个数据库分布存储在这些节点中,每个节点存储总数据的一部分。这种设计可以有效地避免单点故障,提高系统的可用性和容错性。
-
在集群中,每个节点都知道彼此之间的关系,并知道自己的角色和在集群环境中的位置。它们之间可以交互和通信,如通过ping pong等方式保持联系。客户端只需要和集群中的任意一个节点建立连接,就可以与整个集群进行交互。
-
Redis集群使用哈希槽机制来自动将数据分配到不同的节点上,保证每个节点上存储的数据量不会过大,并实现数据自动分片负载均衡等功能。这种机制可以有效地提高数据的处理效率,适用于实时计算、高并发队列和分布式锁等场景。
-
在搭建Redis集群时,常用的结构是三主三从,即三个主节点和三个从节点。每个主节点都配备一个从节点,用于在主节点出现故障时进行故障恢复。这种结构具有较好的容错性,能够确保系统的稳定运行。
集群安装
-
首先新建6个redis实例
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
-
进入容器redis-node-1,并为6台机器构建集群关系
进入容器
docker exec -it redis-node-1 /bin/bash
构建主从关系
redis-cli --cluster create 192.168.1.3:6381 192.168.1.3:6382 192.168.1.3:6383 192.168.1.3:6384 192.168.1.3:6385 192.168.1.3:6386 --cluster-replicas 1 192.168.1.3:宿主机IP --cluster-replicas 1:表示为每个master创建一个slave节点
-
查看集群状态
连接进入6381作为切入点redis-cli -p 6381
查看集群状态
cluster info //查看集群信息 cluster nodes //查看节点信息
验证Redis集群
主从扩容
- 新建两个节点
新建6387、6388两个节点docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
- 将新增的6387节点作为加入集群
docker exec -it redis-node-7 /bin/bash redis-cli --cluster add-node 192.168.1.3:6387 192.168.1.3:6381
- 重新分配槽号
为何要重新分配槽号
因为新加入的节点都是master,并且不会分配任何slot槽位,我们要手动为新节点分配hash槽。而且由于重新分配成本太高,所以前3个节点会各自匀出来一部分给新节点,例如:从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387redis-cli --cluster reshard 192.168.1.3:6381
- 为主节点分配从节点
为主节点6387分配从节点6388redis-cli --cluster add-node 192.168.1.3:6388 192.168.1.3:6387 --cluster-slave --cluster-master-id xxx xxx:6387的编号,按照实际情况填写
- 检查集群情况
redis-cli --cluster check 192.168.1.3:6381
主从缩容
- 目的:使一对主从节点下线
- 首先检查集群情况,获得6388节点ID
redis-cli --cluster check 192.168.1.3:6381
- 删除从节点
此时可再次检查一下集群,可发现6388节点已被删除redis-cli --cluster del-node 192.168.111.147:6388 xxx xxx:6388节点的ID
- 清空主节点槽号,并重新分配
将6387的槽号清空,并分配个节点6381redis-cli --cluster reshard 192.168.1.5:6381 --cluster-from “6387节点ID” --cluster-to ”6381节点ID“ --cluster-slots 8192 --cluster-slots 8192:6387节点上共有8192个槽位
- 删除主节点
redis-cli --cluster del-node 192.168.111.147:6387 xxx xxx:6387节点的ID
- 最后再检查一次集群清空,看是否已删除两个节点
redis-cli --cluster check 192.168.1.3:6381