docker搭建Redis6.2哨兵集群

Posted 快乐崇拜234

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker搭建Redis6.2哨兵集群相关的知识,希望对你有一定的参考价值。

环境准备

搭建docker环境

参考 docker/k8s(1):docker安装使用

下载Redis最新镜像

$ docker pull redis
$ docker images
REPOSITORY                           TAG                                                     IMAGE ID       CREATED         SIZE
redis                                latest                                                  02c7f2054405   2 weeks ago     105MB

搭建Redis主从集群


上面是我的目录结构。其中server/data是自动默认生成的。
redis-master.conf内容:

# 监听端口
port 6379

# 设定密码认证
requirepass 123456

# 禁用KEYS命令
rename-command KEYS ""

# 设定连接主节点所使用的密码  
# 注意这里要加密码,很多博客没加,如果不加的话,宕机的maser重启后无法加入集群
masterauth "123456"

redis-slave1内容:

# 监听端口
port 6380

# 设定密码认证
requirepass 123456

# 禁用KEYS命令
rename-command KEYS ""

# 配置master节点信息
# 格式:
#slaveof <masterip> <masterport>
# 此处masterip所指定的redis-server-master是运行master节点的容器名
# Docker容器间可以使用容器名代替实际的IP地址来通信
slaveof 127.0.0.1 6379

# 设定连接主节点所使用的密码
masterauth "123456"

redis-slave2 内容:

# 监听端口
port 6381

# 设定密码认证
requirepass 123456

# 禁用KEYS命令
rename-command KEYS ""

# 配置master节点信息
# 格式:
#slaveof <masterip> <masterport>
# 此处masterip所指定的redis-server-master是运行master节点的容器名
# Docker容器间可以使用容器名代替实际的IP地址来通信
slaveof 127.0.0.1 6379

# 设定连接主节点所使用的密码
masterauth "123456"

docker-compose.yml:

---

version: '3'

services:
  # 主节点的容器
  redis-server-master:
    image: redis
    container_name: redis-server-master
    restart: always
    # 为了规避Docker中端口映射可能带来的问题
    # 这里选择使用host网络
    network_mode: host
    # 指定时区,保证容器内时间正确
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      # 映射配置文件和数据目录
      - ./redis-master.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-master:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # 从节点1的容器
  redis-server-slave-1:
    image: redis
    container_name: redis-server-slave-1
    restart: always
    network_mode: host
    depends_on:
      - redis-server-master
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./redis-slave1.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-slave-1:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # 从节点2的容器
  redis-server-slave-2:
    image: redis
    container_name: redis-server-slave-2
    restart: always
    network_mode: host
    depends_on:
      - redis-server-master
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./redis-slave2.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-slave-2:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]

启动Redis集群

在docker-compose.yml所在目录下执行docker-compose up -d,即可启动Redis主从。

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS          PORTS     NAMES
1e3c9dcf42d1   redis     "docker-entrypoint.s…"   4 hours ago   Up 29 minutes             redis-server-slave-2
a14894df0fb4   redis     "docker-entrypoint.s…"   4 hours ago   Up 29 minutes             redis-server-slave-1
495975b40339   redis     "docker-entrypoint.s…"   4 hours ago   Up 26 minutes             redis-server-master
$ docker exec -it redis-servashmaster /bin/ba
root@docker-desktop:/data# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=68163,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=68300,lag=0
master_failover_state:no-failover
master_replid:722133a64e5fbf444161633b30d8045fb766ee3e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:68300
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:68300
127.0.0.1:6379> set a 9
OK

另一个从的info信息如下:

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:80851
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:722133a64e5fbf444161633b30d8045fb766ee3e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:80851
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:80851

注意这里连接命令redis-cli -p 6379后面的-p指定端口不是必须的,如果不加默认是连接master集群。如果访问从节点则需要添加指定端口。

登录其他两个redis可以看到数据已经同步过去了:

127.0.0.1:6380> get a
"9"

如果在从机器上修改数据会报错:

$ set a 90 
(error) READONLY You can't write against a read only replica.

搭建哨兵集群

redis-sentinel-1.conf:

# bind 127.0.0.1

# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26379

# 设定密码认证
requirepass 123456

# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000

sentinel deny-scripts-reconfig yes

redis-sentinel-2:

# bind 127.0.0.1

# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26380

# 设定密码认证
requirepass 123456

# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000

sentinel deny-scripts-reconfig yes

redis-sentinel-3:

# bind 127.0.0.1

# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26381

# 设定密码认证
requirepass 123456

# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000

sentinel deny-scripts-reconfig yes

docker-compose.yml:

---

version: '3'

services:
  redis-sentinel-1:
    image: redis
    container_name: redis-sentinel-1
    restart: always
    # 为了规避Docker中端口映射可能带来的问题
    # 这里选择使用host网络
    network_mode: host
    volumes:
      - ./redis-sentinel-1.conf:/usr/local/etc/redis/redis-sentinel.conf
    # 指定时区,保证容器内时间正确
    environment:
      TZ: "Asia/Shanghai"
    command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
  redis-sentinel-2:
    image: redis
    container_name: redis-sentinel-2
    restart: always
    network_mode: host
    volumes:
      - ./redis-sentinel-2.conf:/usr/local/etc/redis/redis-sentinel.conf
    environment:
      TZ: "Asia/Shanghai"
    command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
  redis-sentinel-3:
    image: redis
    container_name: redis-sentinel-3
    restart: always
    network_mode: host
    volumes:
      - ./redis-sentinel-3.conf:/usr/local/etc/redis/redis-sentinel.conf
    environment:
      TZ: "Asia/Shanghai"
    command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]

在docker-compose.yml所在目录下执行docker-compose up -d,即可启动哨兵。
启动后:

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS          PORTS     NAMES
3455266bcbb0   redis     "docker-entrypoint.s…"   4 hours ago   Up 29 minutes             redis-sentinel-2
6b38d849b958   redis     "docker-entrypoint.s…"   4 hours ago   Up 29 minutes             redis-sentinel-3
c234febfeb2b   redis     "docker-entrypoint.s…"   4 hours ago   Up 29 minutes             redis-sentinel-1
1e3c9dcf42d1   redis     "docker-entrypoint.s…"   4 hours ago   Up 29 minutes             redis-server-slave-2
a14894df0fb4   redis     "docker-entrypoint.s…"   4 hours ago   Up 29 minutes             redis-server-slave-1
495975b40339   redis     "docker-entrypoint.s…"   4 hours ago   Up 26 minutes             redis-server-master

查看日志,可以看到主是6379,两个从是6380,6381。
并且对另外两台机器成功添加sentinel。

故障切换测试

关掉Redis主

$ docker stop redis-server-master
redis-server-master

可以看到三个哨兵先投票选举出新的master,然后将主切换到新的master。这里新master是6381

然后再次启动6379服务,此时启动后会将其作为从加入集群。

以上是关于docker搭建Redis6.2哨兵集群的主要内容,如果未能解决你的问题,请参考以下文章

docker搭建Redis6.2哨兵集群

docker搭建Redis6.2哨兵集群

docker搭建Redis6.2哨兵集群

docker-compose搭建redis哨兵集群

docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot图文完整版

docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot图文完整版