Redis-Cluster集群搭建
1 基本介绍
Redis Cluster 是 Redis 的一种部署模式,旨在提供水平扩展能力以及高可用性。不同于单实例的 Redis,Redis Cluster 可以在多个节点之间分配数据,并且能够容忍部分节点的故障。以下是关于 Redis Cluster 的一些关键概念和特性:
数据分片:
Redis Cluster 使用哈希槽(Hash Slot)的概念来划分数据。整个集群共有16384个哈希槽,每个键(Key)会被分配到其中一个槽上,根据键的 CRC16 值对 16384 取模来决定键所属的槽。
槽由集群中的不同节点负责管理,每个节点会负责一部分槽,从而实现数据的水平分割。
节点通信:
- 节点之间使用 Gossip 协议进行通信,定期交换状态信息,如节点状态、故障信息等,以维护集群元数据的一致性。
- 节点间通信通常使用一个固定端口(默认为节点服务端口+10000),例如如果服务端口是7000,则节点间通信端口是17000。
客户端定位:
- 客户端如 Jedis Cluster API 使用智能定位(Smart Location)技术,维护一个本地的哈希槽到节点的映射表,以减少重定向操作,提高效率。
- 当客户端需要操作一个键时,它会计算出对应的哈希槽,然后查找本地映射表,直接将请求发送到负责该槽的节点。
高可用性:
- Redis Cluster 支持主从复制,每个主节点可以有多个从节点,以实现读写分离和故障恢复。
- 故障转移是自动化的,当检测到一个主节点不可用时,集群会自动选举一个从节点升级为主节点,以保持集群的可用性。
故障检测和选举:
- 故障检测通过 Gossip 协议实现,当多个节点认为一个节点失败时,会发生客观失败(Fail)。
- 选举过程基于偏移量(Offset)和时间戳,偏移量较大的从节点有更高的选举优先级。
动态重新平衡:
- 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.
2 环境准备
主机 | IP |
---|---|
redis-01 | 192.168.246.100 |
redis-02 | 192.168.246.101 |
redis-03 | 192.168.246.102 |
redis-04 | 192.168.246.103 |
redis-05 | 192.168.246.104 |
redis-06 | 192.168.246.105 |
3 Redis 安装
3.1 下载最新稳定版的 redis 解压
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
3.2 安装依赖
apt install -y gcc pkg-config make
3.3 编译安装
make
make install
4 修改配置
mkdir /usr/local/redis
cp redis.conf /usr/local/redis/
分别修改配置
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服务
5 创建 Redis 服务
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
6 启动服务
systemctl enable redis --now
7 创建集群
使用redis-cli
命令创建集群
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
8 验证集群状态
查询 Redis 集群信息
redis-cli -a 123456 cluster info
连接 redis 集群
redis-cli -c -h 192.168.246.100 -a 123456
-c
选项表示以集群模式连接。-a
选项表示Redis 实例的密码。
在 192.168.246.100 节点执行命令set hello world
,执行结果如下:
然后在另一个节点 192.168.246.101 端口,查看 key 为 hello 的内容,get hello
,执行结果如下
说明集群运作正常。