在一台服务器上使用docker搭建redis四个主从复制模式和三个哨兵集群

文章目录

  • 安装docker (自行百度)
  • 安装redis镜像(可能会报错,自行百度)
  • 1.创建主从复制模式
  • 2.创建三个Redis哨兵容器。运行以下命令来创建三个Redis哨兵容器,并配置它们来监控主节点(运行 Sentinel 时必须使用配置文件):
  • 一些常见问题
  • 使用以下命令来查看容器的运行状态:
  • 查看哨兵模式是否生效

安装docker (自行百度)

安装redis镜像(可能会报错,自行百度)

docker pull redis

1.创建主从复制模式

  • 创建一个用于Redis集群的Docker网络。打开终端并运行以下命令:
docker network create redis-net
  • 创建Redis主节点容器。运行以下命令来创建一个Redis主节点容器:
docker run -d --name redis-master --network redis-net redis
  • 创建三个Redis从节点容器。运行以下命令来创建三个Redis从节点容器,并将它们连接到主节点:
docker run -d --name redis-slave1 --network redis-net redis redis-server --slaveof redis-master 6379
 
docker run -d --name redis-slave2 --network redis-net redis redis-server --slaveof redis-master 6379
 
docker run -d --name redis-slave3 --network redis-net redis redis-server --slaveof redis-master 6379

2.创建三个Redis哨兵容器。运行以下命令来创建三个Redis哨兵容器,并配置它们来监控主节点(运行 Sentinel 时必须使用配置文件):

需要将config文件挂载到主系统上便于更改:

  • 创建三个config文件,确保权限第一个用户是rwx
-rwxr-xr-x 1 root root 490 May 26 22:18 sentinel1.conf

-rwxr-xr-x 1 root root 490 May 26 22:17 sentinel2.conf

-rwxr-xr-x 1 root root 490 May 26 22:17 sentinel3.conf
  • 标准config内容:
 # 哨兵监听的IP和端口
bind 0.0.0.0
port 26379

# 哨兵监控的主节点
sentinel monitor <master-name> <master-ip> <master-port> <quorum>

 - <master-name>: 主节点的名称,你可以自定义一个标识符。 
 
 - 易错点:
 <master-ip>: 主节点的 IP 地址(如果在一个机器里创建多个容器,ip为进入容器使用ifconfig查看的ip,如果在不同机器上,则为机器的ip地址) 
 	进入容器使用ifconfig查看的ip步骤:
	 	docker exec -it redis-master bash
		apt-get update
		apt-get install -y net-tools
	 	ifconfig
 
   <master-port>: 主节点的端口号。 <quorum>: 哨兵达成一致所需的最少数量,通常设置为主节点数量的一半加一。   
   <milliseconds>: 故障检测和故障转移的时间设置,以毫秒为单位。 <password>:   
   如果有设置密码认证,需要提供相应的密码。

# 主节点故障后的故障转移配置
sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel failover-timeout <master-name> <milliseconds>
sentinel parallel-syncs <master-name> <num>

# 哨兵通信的认证密码(如果有)
sentinel auth-pass <master-name> <password>

# 哨兵的日志文件路径
logfile "/var/log/redis/sentinel.log"

# 日志级别
loglevel notice

# 哨兵进程保持存活的最低数量
protected-mode no

# 是否在哨兵模式下运行
sentinel yes
  • 我的config内容
 # 哨兵监听的IP和端口
bind 0.0.0.0
port 26379

#哨兵监控的主节点
sentinel monitor redis-master 172.19.0.2 6379 2

#主节点故障后的故障转移配置
sentinel down-after-milliseconds redis-master 3000
sentinel failover-timeout redis-master 18000
sentinel parallel-syncs redis-master 1
 
  • 创建哨兵,并且挂载配置文件
    模板
docker run -d --name redis-sentinel1 --network redis-net -v /path/to/sentinel.conf:/path/to/sentinel.conf redis redis-sentinel /path/to/sentinel.conf

我的创建实例

docker run -d --name redis-sentinel1 --network redis-net -v /home/wanglei/02_dockerFile/sentinel1.conf:/usr/local/
etc/redis/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel.conf`

参数解释

docker run: 运行容器的命令。

-d: 后台运行容器。

--name redis-sentinel1: 指定容器的名称为 redis-sentinel1。

--network redis-net: 将容器连接到名为 redis-net 的网络。

-v /home/wanglei/02_dockerFile/sentinel1.conf:/usr/local/etc/redis/sentinel.conf: 将主机上的 sentinel1.conf 文件映射到容器内的 /usr/local/etc/redis/sentinel.conf 路径。这样可以将配置文件传递给容器使用。
redis: 使用的 Redis 镜像。

redis-sentinel: 启动容器时执行的命令。

/usr/local/etc/redis/sentinel.conf: 指定配置文件的路径。

容器将在后台运行,并将 sentinel1.conf 配置文件映射到容器内部的指定路径。此命令中的 /usr/local/etc/redis/sentinel.conf 是容器内 Redis Sentinel 的配置文件路径。

我的三个创建实例

docker run -d --name redis-sentinel1 --network redis-net -v /home/wanglei/02_dockerFile/sentinel1.conf:/usr/local/
etc/redis/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel.conf
 
docker run -d --name redis-sentinel2 --network redis-net -v /home/wanglei/02_dockerFile/sentinel2.conf:/usr/local/
etc/redis/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel.conf
 
dd'd

一些常见问题

  1. 哨兵刚创建就下线
    原因:配置文件内容不正确,或者路径不对。
    解决方案:根据以上步骤进行排查。很好解决
  2. Could not rename tmp config file (Device or resource busy) 。Sentinel was not able to save the new configuration on disk!!!: Device or
    resource busy。(很难解决,不过不影响)
    原因:其他进程占用文件
    查看原因:进入容器,使用lsof 文件路径
    解决方案:技术能力有限,大佬可以在评论区指点一下。
redis-sen   1 root  mem    REG  252,1          1328225 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (path dev=0,108)
redis-sen   1 root  mem    REG  252,1          1328268 /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (path dev=0,108)
redis-sen   1 root  mem    REG  252,1          1327502 /lib/x86_64-linux-gnu/libdl-2.31.so (path dev=0,108)
redis-sen   1 root  mem    REG  252,1          1327515 /lib/x86_64-linux-gnu/libm-2.31.so (path dev=0,108)
redis-sen   1 root  mem    REG  252,1          1327482 /lib/x86_64-linux-gnu/ld-2.31.so (path dev=0,108)
bash       13 root  cwd    DIR  252,1     4096 1322154 /data
bash       13 root  mem    REG  252,1          1323303 /bin/bash (path dev=0,108)
bash       13 root  mem    REG  252,1          1327526 /lib/x86_64-linux-gnu/libnss_files-2.31.so (path dev=0,108)
............

使用以下命令来查看容器的运行状态:

docker ps 
docker logs 容器名称 #查看日志发现错误

查看哨兵模式是否生效

 docker logs redis-sentinel3

正常监视主节点和从节点

+monitor master redis-master 172.19.0.2 6379 quorum 2
+slave slave 172.19.0.3:6379 172.19.0.3 6379 @ redis-master 172.19.0.2 6379 
+slave slave 172.19.0.4:6379 172.19.0.4 6379 @ redis-master 172.19.0.2 6379 
+slave slave 172.19.0.5:6379 172.19.0.5 6379 @ redis-master 172.19.0.2 6379  

停止主节点

docker stop redis-master

成功进行故障自动转移

1:X 26 May 2023 15:21:44.018 # +sdown master redis-master 172.19.0.2 6379  						
				主观下线

1:X 26 May 2023 15:21:44.171 # +new-epoch 1 									
				每当主从切换发生时,哨兵会引入一个新的纪元来标记切换事件。
				纪元的目的是在集群中确保唯一的事件序列,以便进行故障切换和领导者选举。

1:X 26 May 2023 15:21:44.173 # +vote-for-leader 799810385543eafc5eee5c813bad53ac6b8f6db9 1 		
				投票
1:X 26 May 2023 15:21:45.139 # +odown master redis-master 172.19.0.2 6379 #quorum 3/2  			
				主观下线
1:X 26 May 2023 15:21:45.139 # Next failover delay: I will not start a failover before Fri May 26 15:22:20 2023
1:X 26 May 2023 15:21:45.294 # +config-update-from sentinel 799810385543eafc5eee5c813bad53ac6b8f6db9 172.19.0.8 26379 @ redis-master 172.19.0.2 6379  																		
				配置转移
1:X 26 May 2023 15:21:45.294 # +switch-master redis-master 172.19.0.2 6379 172.19.0.5 6379 		
				转换主节点
1:X 26 May 2023 15:21:45.294 * +slave slave 172.19.0.3:6379 172.19.0.3 6379 @ redis-master 172.19.0.5 6379
1:X 26 May 2023 15:21:45.294 * +slave slave 172.19.0.4:6379 172.19.0.4 6379 @ redis-master 172.19.0.5 6379
1:X 26 May 2023 15:21:45.294 * +slave slave 172.19.0.2:6379 172.19.0.2 6379 @ redis-master 172.19.0.5 6379

你可能感兴趣的:(redis,服务器,docker)