共计 3184 个字符,预计需要花费 8 分钟才能阅读完成。
自动写代码机器人,免费开通
这篇文章主要介绍“Redis 中的 Cluster 集群介绍”,在日常操作中,相信很多人在 Redis 中的 Cluster 集群介绍问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis 中的 Cluster 集群介绍”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
Redis Cluster (Redis 集群)
Redis Cluster 是 Redis 的分布式实现。
当我们传输数据到 Redis Cluster,数据会自动分片,存储到各个 Redis 节点上。
Redis Cluster 相对于单点 Redis,可以在一些节点出现故障或无法通信时继续运行。但是,如果服务器出现较大故障(例如,超过一半以上的服务器不可用),群集将停止运行。
Redis Cluster TCP 端口
每个 Redis 群集节点都需要打开两个 TCP 连接。
一是用于服务客户端的常规 TCP 端口,默认为 6379。
第二个端口用于群集总线,默认设置 16379,二进制协议的节点到节点通信通道。节点利用群集总线用于故障检测,配置更新,故障转移授权等。
客户端永远不要尝试与群集总线端口进行通信,而应始终与普通的 Redis 命令端口进行通信,但是请确保同时打开防火墙中的两个端口,否则 Redis 群集节点将无法进行通信。命令端口和集群总线端口的偏移量是固定的,并且始终为 10000。
如果没有同时打开两个 TCP 端口,则群集将无法正常工作。
集群总线使用不同的二进制协议进行节点到节点的数据交换,它更适合于用很少的带宽和处理时间在节点之间交换信息。
Redis Cluster 数据分片
Redis Cluster 不使用一致性哈希,而是使用一种叫哈希槽 hash_slot 的东西。
Redis 群集中有 16384 个哈希槽,当我们在 Redis 中存储一对 Key-Value 时,要计算给定 Key 的哈希槽。方法是先计算 Key 的 CRC16,然后对计算出的结果取模 16384:
hash_slot = CRC16(key) mod 16384
Redis 群集中的每个 Redis 节点都负责哈希槽的子集,因此,如果有一个包含 3 个节点的群集,其中:
节点 A 包含从 0 到 5500 的哈希槽。
节点 B 包含从 5501 到 11000 的哈希槽。
节点 C 包含从 11001 到 16383 的哈希槽。
这样可以轻松添加和删除集群中的节点。例如,如果我想添加一个新节点 D,则需要将一些哈希槽从节点 A,B,C 移到 D。类似地,如果我想从群集中删除节点 A,则只需移动 A 所服务的哈希槽到 B 和 C。当节点 A 为空时,我可以将其从群集中完全删除。
因为将哈希槽从一个节点移动到另一个节点不需要停止操作,所以添加或删除或者更改节点持有的哈希槽的占比不需要任何停机时间。
接下来我们利用 docker 搭建一个三主三从的 Redis 集群。
使用 Docker 搭建 RedisCluster
Redis 配置
port ${PORT} ## 节点端口
protected-mode no ## 开启集群模式
cluster-enabled yes ##cluster 集群模式
cluster-config-file nodes.conf ## 集群配置名
cluster-node-timeout 5000 ## 超时时间
cluster-announce-ip 192.168.1.XX ## 实际为各节点网卡分配 ip 先用一个 ip 代替
cluster-announce-port ${PORT} ## 节点映射端口
cluster-announce-bus-port 1${PORT} ## 节点总线端口
appendonly yes ## 持久化模式
创建自定义 network
docker network create redis-net
自定义路径
mkdir -p /usr/redis_cluster
cd /usr/redis_cluster
在自定义路径下生成成 conf 和 data 目标,并生成配置信息
for port in `seq 6001 6006`; do
mkdir -p ./${port}/conf
touch ./${port}/conf/redis.conf
mkdir -p ./${port}/data
echo port ${port} ./${port}/conf/redis.conf
echo protected-mode no ./${port}/conf/redis.conf
echo cluster-enabled yes ./${port}/conf/redis.conf
echo cluster-config-file nodes.conf ./${port}/conf/redis.conf
echo cluster-node-timeout 5000 ./${port}/conf/redis.conf
echo cluster-announce-ip 192.168.1.XX ./${port}/conf/redis.conf
echo cluster-announce-port ${port} ./${port}/conf/redis.conf
echo cluster-announce-bus-port 1${port} ./${port}/conf/redis.conf
echo appendonly yes ./${port}/conf/redis.conf
done
cluster-announce-ip 192.168.1.XX 中的 IP 必须是容器间通信的 ip, 之后可以在之前新增的 network 中查看。
共生成 6 个文件夹,从 6001 到 6006,每个文件夹下包含 data 和 conf 文件夹,同时 conf 里面有 redis.conf 配置文件。
启动 Redis 容器
for port in `seq 6001 6006`; do \
docker run -d --privileged=true -p ${port}:${port} -p 1${port}:1${port}\
-v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v $PWD/${port}/data:/data \
--restart always --name redis-${port} --net redis-net \
redis:5.0.5 redis-server /usr/local/etc/redis/redis.conf; \
done
启动集群
# 进入任意 Redis 容器
docker exec -it redis-6001 /bin/bash
# 初始化 Redis 集群命令
redis-cli --cluster create 172.19.0.2:6601 172.19.0.3:6602 172.19.0.4:6603 172.19.0.5:6604 172.19.0.6:6605 172.19.0.7:6606 --cluster-replicas 1
创建成功后我们可以使用 redis-cli 命令连接到其中一个 Redis 服务.
# 单机模式启动
redis-cli -h 127.0.0.1 -p 6001
# 集群模式启动
redis-cli -c -h 127.0.0.1 -p 6001
之后通过 cluster nodes 命令可以查看节点信息,发现符合 3 主 3 从的预期
到此,关于“Redis 中的 Cluster 集群介绍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!
向 AI 问一下细节