Redis 1主2从3哨兵集群部署手册
Redis 是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。它支持多种数据结构,如字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。以下是 Redis 的一些主要特性:
- 内存存储:Redis 将数据存储在内存中,因此读写速度非常快,适合对速度要求高的应用场景。
- 持久化:虽然数据存储在内存中,Redis 提供了持久化选项,可以将数据定期保存到磁盘中,以防数据丢失。
- 数据结构丰富:除了简单的字符串,Redis 还支持更复杂的数据结构,比如列表、集合、哈希和有序集合,这使得它在处理复杂数据需求时非常灵活。
- 事务支持:Redis 支持事务,可以保证一系列操作的原子性。
- 发布/订阅:Redis 支持发布/订阅模式,可以用于消息通知和实时消息系统。
- Lua 脚本:Redis 支持使用 Lua 语言编写脚本,可以在服务器端执行复杂的操作。
- 高可用性:通过 Redis Sentinel 提供高可用性解决方案,确保系统的持续运行。
- 分布式:Redis Cluster 提供了分布式实现,支持数据的自动分片和复制,适合大规模数据存储和访问。
Redis 常用于缓存、会话存储、实时分析、消息队列和数据流处理等场景。在这些场景中,Redis 的高性能和丰富的数据结构使其成为一种强大的工具。
环境说明
A 192.168.32.3 redis-master、sentinel
B 192.168.32.4 redis-slave、sentinel
C 192.168.32.5 redis-master、sentinel
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 5.0.9 987b553c835f 3 years ago 98.3MB
Linux d 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64 GNU/Linux
root@d:/home/qwq# docker version
Client: Docker Engine - Community
Version: 26.1.3
API version: 1.45
Go version: go1.21.10
Git commit: b72abbb
Built: Thu May 16 08:33:42 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.1.3
API version: 1.45 (minimum version 1.24)
Go version: go1.21.10
Git commit: 8e96db1
Built: Thu May 16 08:33:42 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.31
GitCommit: e377cd56a71523140ca6ae87e30244719194a521
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
在离线环境下使用 Docker 搭建 Redis 1主2从3哨兵模式,你需要在三台服务器上设置 Redis 主从复制和哨兵模式。以下是详细步骤:
搭建Redis主从
1. 配置 Redis 主节点
在服务器A上创建Redis配置文件:
使用docker volume创建一个目录来存放 Redis 配置文件和数据:
root@d:/home/qwq# docker volume create redis-A
创建 redis.conf
文件:
# vim /var/lib/docker/volumes/redis-A/_data/redis.conf
port 6379
bind 0.0.0.0
dir /data
appendonly yes
requirepass WocaoNiMa2024
masterauth WocaoNiMa2024
启动 Redis 容器:
docker run -d --name redis-A \
-v redis-A:/usr/local/etc/redis \
-v redis-A-data:/data \
--net host \
redis:5.0.9 redis-server /usr/local/etc/redis/redis.conf
确定容器运行
docker exec -it redis-A redis-cli -a 'WocaoNiMa2024' info replication | grep master
#下面是执行后输出样例
role:master
master_replid:c6310f1f9637084c19002378a21cb644a93e7f74
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
root@d:/home/qwq#
2. 配置 Redis 从节点
在服务器B和C上创建Redis配置文件:
C节点也是一样的流程,在C节点别忘记把B改为C。
使用docker volume创建一个目录来存放 Redis 配置文件和数据:
docker volume create redis-B
创建 redis.conf
文件:
# vim /var/lib/docker/volumes/redis-B/_data/redis.conf
port 6379
bind 0.0.0.0
dir /data
appendonly yes
requirepass WocaoNiMa2024
masterauth WocaoNiMa2024
replicaof 192.168.32.3 6379
关键配置项解释:
- port:从节点的 Redis 实例监听的端口。这里设置为
6380
。 - bind:允许从节点监听所有 IP 地址。
- dir:数据文件存储目录。
- appendonly:启用 AOF(Append-Only File)持久化。
- replicaof:指定主节点的 IP 地址和端口。
- masterauth:设置从节点连接主节点时使用的密码。
- requirepass:设置从节点本身的访问密码。
启动 Redis 从节点容器:
docker run -d --name redis-B \
-v redis-B:/usr/local/etc/redis \
-v redis-B-data:/data \
--net host \
redis:5.0.9 redis-server /usr/local/etc/redis/redis.conf
检查是否正常
docker exec -it redis-B redis-cli -a 'WocaoNiMa2024' info replication | grep slave
#下面是执行后输出样例
role:slave
slave_repl_offset:70
slave_priority:100
slave_read_only:1
connected_slaves:0
root@d:/home/qwq#
在服务器C上重复相同的步骤,不要忘记将上面的B改为C
部署完毕检查
192.168.32.3
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a82453bf6ed redis:5.0.9 "docker-entrypoint.s…" 5 minutes ago Up 5 minutes redis-A
192.168.32.4
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99c25ddc184e redis:5.0.9 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes redis-B
192.168.32.5
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e845ffe87048 redis:5.0.9 "docker-entrypoint.s…" 4 seconds ago Up 4 seconds redis-C
3.验证主从配置
在服务器A上检查主节点状态:
docker exec -it redis-A redis-cli -a 'WocaoNiMa2024' info replication
你应该看到类似以下输出,其中 role:master
表示它是主节点,并且 connected_slaves
显示连接的从节点数量。
# Replication
role:master
connected_slaves:2
slave0:ip=<B_IP>,port=6379,state=online,offset=12345,lag=0
slave1:ip=<C_IP>,port=6379,state=online,offset=12345,lag=0
在服务器B和C上检查从节点状态:
docker exec -it redis-B redis-cli -a 'WocaoNiMa2024' info replication
docker exec -it redis-C redis-cli -a 'WocaoNiMa2024' info replication
你应该看到类似以下输出,其中 role:slave
表示当节点是从节点,并且 master_host
显示主节点的IP地址。
# Replication
role:slave
master_host:<A_IP>
master_port:6379
master_link_status:up
搭建Sentinel哨兵
A 192.168.32.3 redis-master、sentinel
B 192.168.32.4 redis-slave、sentinel
C 192.168.32.5 redis-master、sentinel
依然按照ABC进行区分
1. 创建 Redis 哨兵配置文件
创建配置文件存储目录
#A节点执行
docker volume create redis-A-sentinel
#B节点执行
docker volume create redis-B-sentinel
#C节点执行
docker volume create redis-C-sentinel
ABC一样的的配置文件,唯独启动命令略有些修改
# vim /var/lib/docker/volumes/redis-A-sentinel/_data/sentinel.conf
port 26379
sentinel monitor mymaster 主节点IP地址 6379 2
sentinel auth-pass mymaster WocaoNiMa2024
dir /tmp
logfile ""
2. 部署 Redis 哨兵容器
在每台服务器上执行以下步骤:
docker run -d --name redis-A-sentinel \
--net host \
-v redis-A-sentinel:/etc/redis \
redis:5.0.9 redis-sentinel /etc/redis/sentinel.conf
3. 检查哨兵状态
在A服务器上检查哨兵的状态:
docker exec -it redis-A-sentinel redis-cli -p 26379 -a 'WocaoNiMa2024' --raw sentinel sentinels mymaster | grep 192.168
上面的命令只显示在当前节点其它redis哨兵节点,不显示自己哈。
root@d:/home/qwq# docker exec -it redis-A-sentinel redis-cli -p 26379 -a 'WocaoNiMa2024' --raw sentinel sentinels mymaster | grep 192.168
192.168.32.5
192.168.32.4
4.注意事项
- Quorum 值:在
sentinel monitor mymaster <master-ip> 6379 2
中,2
表示 quorum 值。你需要至少 2 个哨兵实例同意才能进行故障转移。根据你的环境和需求调整这个值。 - 主节点 IP 地址:在
sentinel monitor
配置项中替换<master-ip>
为你的实际主节点 IP 地址。 - 网络模式:此示例使用了
--net host
选项,这要求 Docker 容器与主机共享网络命名空间。如果不使用--net host
,你需要确保 Docker 容器能够通过正确的网络配置访问 Redis 实例。
通过上述步骤,你可以在三台服务器上使用 Docker 部署 Redis 哨兵,从而监控和管理你的 Redis 主从集群。
集群模拟验证
1. 检查当前集群状态
首先,确认当前集群的状态,确保所有节点正常运行并相互连接。
# 在A节点检查主节点信息
docker exec -it redis-A redis-cli -a 'WocaoNiMa2024' info replication
输出结果
role:master
connected_slaves:2
slave0:ip=192.168.32.4,port=6379,state=online,offset=69143,lag=1
slave1:ip=192.168.32.5,port=6379,state=online,offset=69282,lag=0
确认当前节点为role:master,并且可以看到两个从节点。
docker exec -it redis-A-sentinel redis-cli -p 26379 -a 'WocaoNiMa2024' --raw sentinel sentinels mymaster | grep 192.168
执行结果
root@d:/home/qwq# docker exec -it redis-A-sentinel redis-cli -p 26379 -a 'WocaoNiMa2024' --raw sentinel sentinels mymaster | grep 192.168
192.168.32.5
192.168.32.4
确认除自己外,另外两个哨兵存在。
2. 模拟主节点故障
在A主机停止主节点容器,观察哨兵是否能够检测到故障并进行故障转移。
# 停止主节点容器
docker stop redis-A
3. 检查故障转移情况
使用哨兵命令查看新的主节点信息,验证故障转移是否成功。
# 检查新的主节点信息
docker exec -it redis-A-sentinel redis-cli -p 26379 -a 'WocaoNiMa2024' SENTINEL masters
你应看到mymaster
的ip
和runid
等信息发生变化,表示已经有新的主节点被选举出来。
#老
1) 1) "name"
2) "mymaster"
3) "ip"
4) "192.168.32.3"
#新
1) 1) "name"
2) "mymaster"
3) "ip"
4) "192.168.32.5"
192.168.32.5对应C节点,过去看看。
# 在C节点检查主节点信息
docker exec -it redis-C redis-cli -a 'WocaoNiMa2024' info replication
输出结果
role:master
connected_slaves:1
slave0:ip=192.168.32.4,port=6379,state=online,offset=158033,lag=0
当前C节点为主节点。
4. 恢复并重新加入集群
重新启动旧的主节点,并将其作为从节点加入集群。
# 在A节点重新启动主节点容器
docker start redis-A
# 在C节点检查主节点信息
docker exec -it redis-C redis-cli -a 'WocaoNiMa2024' info replication
C节点输出结果
connected_slaves:2
slave0:ip=192.168.32.4,port=6379,state=online,offset=184509,lag=1
slave1:ip=192.168.32.3,port=6379,state=online,offset=184648,lag=1
在输出的信息中可以看到32.3也就是A节点回来了,并且成为了SLAVE节点。
5. A节点升级为主节点
#在当前的主节点上执行下面的命令,从节点A升级为主节点
docker exec -it redis-C redis-cli -a 'WocaoNiMa2024' SLAVEOF 192.168.32.3 6379
需要在当前的redis-master节点执行上面的命令,执行完毕后会出现OK。然后等待1分钟
王者归来
#在A节点执行
docker exec -it redis-C redis-cli -a 'WocaoNiMa2024' info replication
输出结果
role:master
connected_slaves:2
slave0:ip=192.168.32.5,port=6379,state=online,offset=237563,lag=0
slave1:ip=192.168.32.4,port=6379,state=online,offset=237563,lag=0
6.注意事项
- 确保所有哨兵和Redis节点使用相同的密码配置。
- 在进行故障转移测试时,确保有足够的从节点和哨兵节点以维持正常操作。
- 在实际生产环境中,测试操作需要谨慎进行,最好在测试环境中模拟。
通过以上步骤,你可以验证Redis哨兵集群的配置和故障转移功能,确保在主节点发生故障时,集群能够自动进行故障转移并保持高可用性。