Redis 1主2从3哨兵集群部署手册

Redis 是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。它支持多种数据结构,如字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。以下是 Redis 的一些主要特性:

  1. 内存存储:Redis 将数据存储在内存中,因此读写速度非常快,适合对速度要求高的应用场景。
  2. 持久化:虽然数据存储在内存中,Redis 提供了持久化选项,可以将数据定期保存到磁盘中,以防数据丢失。
  3. 数据结构丰富:除了简单的字符串,Redis 还支持更复杂的数据结构,比如列表、集合、哈希和有序集合,这使得它在处理复杂数据需求时非常灵活。
  4. 事务支持:Redis 支持事务,可以保证一系列操作的原子性。
  5. 发布/订阅:Redis 支持发布/订阅模式,可以用于消息通知和实时消息系统。
  6. Lua 脚本:Redis 支持使用 Lua 语言编写脚本,可以在服务器端执行复杂的操作。
  7. 高可用性:通过 Redis Sentinel 提供高可用性解决方案,确保系统的持续运行。
  8. 分布式: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

关键配置项解释:

  1. port:从节点的 Redis 实例监听的端口。这里设置为 6380
  2. bind:允许从节点监听所有 IP 地址。
  3. dir:数据文件存储目录。
  4. appendonly:启用 AOF(Append-Only File)持久化。
  5. replicaof:指定主节点的 IP 地址和端口。
  6. masterauth:设置从节点连接主节点时使用的密码。
  7. 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.注意事项

  1. Quorum 值:在 sentinel monitor mymaster <master-ip> 6379 2 中,2 表示 quorum 值。你需要至少 2 个哨兵实例同意才能进行故障转移。根据你的环境和需求调整这个值。
  2. 主节点 IP 地址:在 sentinel monitor 配置项中替换 <master-ip> 为你的实际主节点 IP 地址。
  3. 网络模式:此示例使用了 --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

你应看到mymasteriprunid等信息发生变化,表示已经有新的主节点被选举出来。

#老
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哨兵集群的配置和故障转移功能,确保在主节点发生故障时,集群能够自动进行故障转移并保持高可用性。

posted @ 2024-05-24 11:18  iXiAo9  阅读(85)  评论(0编辑  收藏  举报