docker-compose一键搭建redis(一主两从三哨兵)服务

一、部署redis主从服务

1、目录结构

[root@sgpexchangemysql-192-168-8-61 rediscluster]# ls *
master:
data  docker-compose.yml  docker-compose.yml_bak

slave01:
data

slave02:
data

2、查看redis的docker-compose.yml文件内容

[root@sgpexchangemysql-192-168-8-61 rediscluster]# cat master/docker-compose.yml
version: '3.7'
services:
  master:
    image: redis
    container_name: redis-master
    restart: always
    command: redis-server --requirepass 123456 --masterauth 123456  
    ports:
      - 8001:6379
    volumes: 
      - /data/deploy/cluster/master/data:/data

  slave1:
    image: redis
    container_name: redis-slave01
    restart: always
    command: redis-server --slaveof redis-master 6379  --requirepass 123456 --masterauth 123456  
    ports:
      - 8002:6379
    volumes: 
      - /data/deploy/cluster/slave01/data:/data

  slave2:
    image: redis
    container_name: redis-slave02
    restart: always
    command: redis-server --slaveof redis-master 6379  --requirepass 123456 --masterauth 123456  
    ports:
      - 8003:6379
    volumes: 
      - /data/deploy/cluster/slave02/data:/data

3、启动redis集群

docker network create redis-sentinel
[root@sgpexchangemysql-192-168-8-61 master]# docker-compose up -d
Creating network "master_default" with the default driver
Creating redis-master  ... done
Creating redis-slave02 ... done
Creating redis-slave01 ... done

4、查看集群镜像

[root@sgpexchangemysql-192-168-8-61 master]# docker ps
CONTAINER ID   IMAGE                                       COMMAND                  CREATED         STATUS                  PORTS                                                                                                     NAMES
5f66fb12e0e4   redis                                       "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds            0.0.0.0:8002->6379/tcp, :::8002->6379/tcp                                                                 redis-slave01
a05dc32c58fc   redis                                       "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds            0.0.0.0:8003->6379/tcp, :::8003->6379/tcp                                                                 redis-slave02
2c35b7de7ec2   redis                                       "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds            0.0.0.0:8001->6379/tcp, :::8001->6379/tcp                                                                 redis-master

5、查看集群服务

[root@sgpexchangemysql-192-168-8-61 master]# docker-compose ps
    Name                   Command               State                    Ports                  
-------------------------------------------------------------------------------------------------
redis-master    docker-entrypoint.sh redis ...   Up      0.0.0.0:8001->6379/tcp,:::8001->6379/tcp
redis-slave01   docker-entrypoint.sh redis ...   Up      0.0.0.0:8002->6379/tcp,:::8002->6379/tcp
redis-slave02   docker-entrypoint.sh redis ...   Up      0.0.0.0:8003->6379/tcp,:::8003->6379/tcp

二、部署哨兵服务

1、目录结构

[root@sgpexchangemysql-192-168-8-61 rediscluster]# ls *

sentinel01:
docker-compose.yml  sentinel.conf

sentinel02:
sentinel.conf

sentinel03:
sentinel.conf

2、查看docker-compose.yml文件内容

[root@sgpexchangemysql-192-168-8-61 sentinel01]# cat docker-compose.yml 
version: '2'
services:
  sentinel1:
    image: redis       ## 镜像
    container_name: redis-sentinel01
    ports:
    - "26379:26379"
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - "/data/deploy/redisclouster/sentinel01/sentinel.conf:/usr/local/etc/redis/sentinel.conf"
  sentinel2:
    image: redis                ## 镜像
    container_name: redis-sentinel02
    ports:
    - "26380:26379"           
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - "/data/deploy/redisclouster/sentinel02/sentinel.conf:/usr/local/etc/redis/sentinel.conf"
  sentinel3:
    image: redis                ## 镜像
    container_name: redis-sentinel03
    ports:
    - "26381:26379"           
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - /data/deploy/redisclouster/sentinel03/sentinel.conf:/usr/local/etc/redis/sentinel.conf
networks:
  default:
    external:
      name: master_default    ##通过(docker inspect 主节点容器id)来查看,对应 NetworkMode

查看sentinel.conf文件

port 26379
dir /tmp
sentinel monitor mymaster redis-master 6379 2
#sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

 3、启动sentinel集群

[root@sgpexchangemysql-192-168-8-61 sentinel01]# docker-compose up -d
Creating redis-sentinel01 ... done
Creating redis-sentinel02 ... done
Creating redis-sentinel03 ... done

启动后我们重新查看下sentinel.conf配置文件内容

[root@sgpexchangeinetermediate-192-168-8-63 rediscluster]# vim sentinel01/sentinel.conf
port 26379
dir "/tmp"
# 自定义集群名,其中 192.168.8.188 为 redis-master 的 ip,6379 为 redis-master 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2)
sentinel myid c11eab918274b8076ebe9ff0a8e882dd187b49dc
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.8.63 8001 2
sentinel auth-pass mymaster test@dbuser2018
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-replica mymaster 172.25.0.4 6379
sentinel known-replica mymaster 172.25.0.3 6379
sentinel known-sentinel mymaster 172.26.0.2 26379 11d05befc16d866fe6a816c3bff6ae41500d6dea
sentinel known-sentinel mymaster 172.26.0.4 26379 229ab093218943a7ca800a8966bb513e66146fb6
sentinel current-epoch 0

4、查看集群

[root@sgpexchangemysql-192-168-8-61 sentinel01]# docker-compose ps
      Name                    Command               State                           Ports                         
------------------------------------------------------------------------------------------------------------------
redis-sentinel01   docker-entrypoint.sh redis ...   Up      0.0.0.0:26379->26379/tcp,:::26379->26379/tcp, 6379/tcp
redis-sentinel02   docker-entrypoint.sh redis ...   Up      0.0.0.0:26380->26379/tcp,:::26380->26379/tcp, 6379/tcp
redis-sentinel03   docker-entrypoint.sh redis ...   Up      0.0.0.0:26381->26379/tcp,:::26381->26379/tcp, 6379/tcp

三、演示故障转移

首先,进去之任意一个哨兵节点执行 info Sentinel 发现主节点IP为:1172.30.0.3:6379

[root@sgpexchangeinetermediate-192-168-8-63 rediscluster]# docker exec -it redis-sentinel01 /bin/bash
root@f79e1d030d51:/data# redis-cli -h redis-sentinel01 -p 26379
redis-sentinel01:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.30.0.3:6379,slaves=2,sentinels=3

使用docker-compose stop redis-master 命令停掉主节点 之后等待一会执行 info Sentinel 发现主节点IP变为 :

[root@sgpexchangeinetermediate-192-168-8-63 rediscluster]# docker stop redis-master
redis-master

使用docker stop redis-master 命令停掉主节点 之后等待一会执行 info Sentinel 发现主节点IP变为 :172.30.0.2:6379 

redis-sentinel01:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.30.0.2:6379,slaves=2,sentinels=3

但是同时可以发现,哨兵节点认为新的主节点仍然有2个从节点,这是因为哨兵在将从节点切换成主节点的同时,将之前master节点置为其从节点;虽然之前master节点已经挂掉,但是由于哨兵并不会对从节点进行客观下线,因此认为该从节点一直存在。当之前master节点重新启动后,会自动变成主节点的从节点。下面验证一下。

进 redis-slaves02 容器执行 info 发现 slaves数量变为1个

root@f79e1d030d51:/data# redis-cli -h redis-slave02 
redis-slave02:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.30.0.4,port=6379,state=online,offset=84227,lag=1
master_replid:ca6e7e3683772d86c96f375dbd6a058bc9f3007d
master_replid2:0f186241b2524a14fb5013cb3add1dc26790000c
master_repl_offset:84497
second_repl_offset:44505
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84497

重启master 可以看到从节点变为两个

[root@sgpexchangeinetermediate-192-168-8-63 rediscluster]# docker start redis-master
redis-master
redis-slave02:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.30.0.4,port=6379,state=online,offset=95660,lag=1
slave1:ip=172.30.0.3,port=6379,state=online,offset=95930,lag=1
master_replid:ca6e7e3683772d86c96f375dbd6a058bc9f3007d
master_replid2:0f186241b2524a14fb5013cb3add1dc26790000c
master_repl_offset:95930
second_repl_offset:44505
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:95930

哨兵还是认为一主两从

redis-sentinel01:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.30.0.2:6379,slaves=2,sentinels=3

注: redis 还有主从复制Cluster模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yunson_Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值