Redis-Cluster集群搭建

Redis Cluster 是 Redis 的一种部署模式,旨在提供水平扩展能力以及高可用性。不同于单实例的 Redis,Redis Cluster 可以在多个节点之间分配数据,并且能够容忍部分节点的故障。以下是关于 Redis Cluster 的一些关键概念和特性:

  1. 数据分片

    • Redis Cluster 使用哈希槽(Hash Slot)的概念来划分数据。整个集群共有16384个哈希槽,每个键(Key)会被分配到其中一个槽上,根据键的 CRC16 值对 16384 取模来决定键所属的槽。

    • 槽由集群中的不同节点负责管理,每个节点会负责一部分槽,从而实现数据的水平分割。

  2. 节点通信

    • 节点之间使用 Gossip 协议进行通信,定期交换状态信息,如节点状态、故障信息等,以维护集群元数据的一致性。
    • 节点间通信通常使用一个固定端口(默认为节点服务端口+10000),例如如果服务端口是7000,则节点间通信端口是17000。
  3. 客户端定位

    • 客户端如 Jedis Cluster API 使用智能定位(Smart Location)技术,维护一个本地的哈希槽到节点的映射表,以减少重定向操作,提高效率。
    • 当客户端需要操作一个键时,它会计算出对应的哈希槽,然后查找本地映射表,直接将请求发送到负责该槽的节点。
  4. 高可用性

    • Redis Cluster 支持主从复制,每个主节点可以有多个从节点,以实现读写分离和故障恢复。
    • 故障转移是自动化的,当检测到一个主节点不可用时,集群会自动选举一个从节点升级为主节点,以保持集群的可用性。
  5. 故障检测和选举

    • 故障检测通过 Gossip 协议实现,当多个节点认为一个节点失败时,会发生客观失败(Fail)。
    • 选举过程基于偏移量(Offset)和时间戳,偏移量较大的从节点有更高的选举优先级。
  6. 动态重新平衡

    • Redis Cluster 允许动态添加或删除节点,从而重新平衡数据负载。
    • 当集群状态发生变化时,如节点加入或离开,集群会自动重新分配哈希槽,以保持负载均衡。

Redis 集群的最小配置需要至少三个主节点。为了确保高可用性和数据的可靠性,推荐使用六个节点的配置,其中包含三个主节点和三个从节点。

官方文档原文:

Note that the minimal cluster that works as expected must contain at least three master nodes. For deployment, we strongly recommend a six-node cluster, with three masters and three replicas.

主机IP
redis-01192.168.246.100
redis-02192.168.246.101
redis-03192.168.246.102
redis-04192.168.246.103
redis-05192.168.246.104
redis-06192.168.246.105

bash

wget https://download.redis.io/releases/redis-7.0.6.tar.gz
tar zxf redis-7.0.6.tar.gz
cd redis-7.0.6

bash

apt install -y gcc pkg-config make

bash

make
make install

bash

mkdir /usr/local/redis
cp redis.conf /usr/local/redis/

分别修改配置

text

bind 0.0.0.0
daemonize yes
requirepass 123456
masterauth 123456
appendonly yes
# 集群相关设置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000

确保 masterauth 参数中的密码与主节点的 requirepass 参数中的密码一致。如果密码不匹配,从节点将无法成功连接到主节点。

将此配置文件保存后,复制到其他节点上,所有节点使用相同的配置文件.

然后分别启动各个服务器的redis服务

bash

tee > /usr/lib/systemd/system/redis.service <<-'EOF'
[Unit]
Description=Redis Service
After=network.target

[Install]
WantedBy=multi-user.target
Alias=redis.service

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
EOF

bash

systemctl enable redis --now

使用redis-cli命令创建集群

bash

redis-cli --cluster create \
192.168.246.100:6379 \
192.168.246.101:6379 \
192.168.246.102:6379 \
192.168.246.103:6379 \
192.168.246.104:6379 \
192.168.246.105:6379 \
--cluster-replicas 1 -a '123456'
  • --cluster-replicas 1: 指定每个主节点有 1 个从节点。这样在这个集群中会有 3 个主节点和 3 个从节点,形成一个副本集。
  • -a '123456': 这个参数指定了 Redis 实例的密码。如果你的 Redis 实例启用了密码保护,这个选项可以提供密码进行认证。

输入 yes

image-20240722144137010

查询 Redis 集群信息

bash

redis-cli -a 123456 cluster info

连接 redis 集群

bash

redis-cli -c -h 192.168.246.100 -a 123456
  • -c 选项表示以集群模式连接。
  • -a 选项表示Redis 实例的密码。

在 192.168.246.100 节点执行命令set hello world,执行结果如下:

image-20240722145057433

然后在另一个节点 192.168.246.101 端口,查看 key 为 hello 的内容,get hello,执行结果如下

image-20240722145224887

说明集群运作正常。