Reference: Portainer与Redis-Sentinel部署参考

部署portainer工具

  • docker-compose部署
tee portainer.yml <<"EOF"
version: "3"
services:
  portainer:
    image: portainer/portainer:latest
    container_name: portainer
    ports:
    - "9876:9000"
    volumes:
    - /app/portainer/data:/data
    - /var/run/docker.sock:/var/run/docker.sock
EOF
#后台启动
docker-compose -f portainer.yml up -d
#rocky linux中,docker-compose变成了docker compose
  • 访问宿主机IP:9876端口(username: admin, passwd: 26bN87:KP>?TzW:)
  • 点击local进行本地容器管理。更多文档参考:Portainer官方文档

portainer添加environment

  • 在rocky-1机器部署了portainer,想去监控rocky-2机器上的容器。可以在portainer UI上找到Settings - Environments - Add Environment - 选择docker Standalone - 进入environment wizard
  • 在被监控的rocky-2上pull一个agent镜像(根据wizard的提示)- 起一个agent容器 - name和environment address上填入rocky-2的地址,点击connect即可

基于Portainer安装redis-sentinel

环境准备

  • 基于一台服务器完成一主二从+三个哨兵的部署架构,最终效果是:
  • 当主节点更新数据之后,从节点数据也会进行同步。
  • 当我们将主节点手动停止之后,哨兵就会选举出新的master继续进行工作。

主从复制部署

  • 主从结构的部署,我们还是基于docker-compose创建一个名为redis-cluster.yml的文件配置一下主从信息,配置内容如下
  • 安全起见,建议尽可能不要使用6379作为对外暴露的端口号,就算使用6379也尽可能设置一个安全的密码,避免被人下挖矿程序。
tee redis-cluster.yml <<'EOF'
version: '3'
services:
  # 主节点
  master:
    image: redis
    # 主节点名称
    container_name: redis-master
    # 设置redis登录密码、从节点连接主节点的密码
    command: redis-server --requirepass 123456 --masterauth 123456
    ports:
    # 对外暴露端口号为16379
    - 16379:6379
  # 从节点
  slave1:
    image: redis
    container_name: redis-slave-1
    ports:
    # 对外暴露端口号为16380
    - 16380:6379
    # 启动redis 从属于容器名为 redis-master的redis,端口号为容器端口号而不是对外映射端口号,设置连接密码,连接主节点的密码
    command:  redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
  # 从节点2
  slave2:
    image: redis
    container_name: redis-slave-2
    ports:
    - 16381:6379
    command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
EOF
docker-compose -f redis-cluster.yml up -d
  • 容器启动后可以在portainer中查看master容器的log,可以直接用console功能connect进入容器,尝试设置一个键值对

(202408:docker 26版本与portainer 2.19版本不兼容,console用不了)

#用redis-cli认证
redis-cli
auth 123456
ping
set user_name xiaoming

#console进入从节点查看数据
keys *
get user_name

创建redis-sentinel专用网络驱动

为了确保redis-sentinel可以统一管理且和其他容器隔离,我们在部署sentinel之前需要基于Portainer创建一个自定义的brige网络。创建一个名为redis-sentinel的bridge网络将主从和哨兵节点关联起来,并且和docker中的其他容器隔离开。

image-20240814150337050

  • portainer -- network -- add network
  • 输入名称为redis-sentinel,其余默认 -- create network

  • 重点来了,我们的redis主从节点现在都处于默认的网络驱动中,我们必须手动将其配置到redis-sentinel网络中

  • 点击容器列表,找到我们的主从节点容器,然后分别进入他们的管理列表最下方,找到network选项,在network列表中找到redis-sentinel选择join network即可。

创建哨兵

  • 配置3个哨兵配置文件
mkdir -p /app/cloud/redis/sentinel/
cd /app/cloud/redis/sentinel/
#哨兵1
tee sentinel1.conf <<'EOF'
port 26379
dir /tmp
# master节点在bridge网络中的ip值
sentinel monitor redis-master 172.19.0.2 6379 2
# master节点密码
sentinel auth-pass redis-master 123456
sentinel down-after-milliseconds redis-master 30000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 180000
sentinel deny-scripts-reconfig yes
EOF

#哨兵2
tee sentinel2.conf <<'EOF'
port 26380
dir /tmp
# master节点在bridge网络中的ip值
sentinel monitor redis-master 172.19.0.2 6379 2
# master节点密码
sentinel auth-pass redis-master 123456
sentinel down-after-milliseconds redis-master 30000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 180000
sentinel deny-scripts-reconfig yes
EOF

#哨兵3
tee sentinel3.conf <<'EOF'
port 26381
dir /tmp
# master节点在bridge网络中的ip值
sentinel monitor redis-master 172.19.0.2 6379 2
# master节点密码
sentinel auth-pass redis-master 123456
sentinel down-after-milliseconds redis-master 30000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 180000
sentinel deny-scripts-reconfig yes
EOF

master节点IP地址来源

将master节点命名为redis-master,然后网络配置为172.19.0.2这个值是从哪里来的呢?

  • 我们点击redis-master即redis主节点容器管理界面,在ip address一栏看到master节点的容器ip地址,因为哨兵节点和主从节点都处于redis-sentinel这个网络中,所以172.19.0.x这个网络是互通的,在bridge模式下配置这个ip地址是完全没有问题的。
tee redis-sentinel.yml <<'EOF'
version: '3'
services:
  sentinel1:
    image: redis
    # 容器名称
    container_name: redis-sentinel-1
    ports:
    # 端口映射
    - 26379:26379
    # 启动redis哨兵
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    # 哨兵1的sentinel.conf和宿主文件位置映射
    - /app/cloud/redis/sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.conf
  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    ports:
    - 26380:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - /app/cloud/redis/sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.conf
  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
    - 26381:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - /app/cloud/redis/sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.conf
# 重点,将3个哨兵加入到redis-sentinel和主从节点建立联系
networks:
  default:
    external:
      name: redis-sentinel
EOF
  • 启动哨兵集群
docker-compose -f redis-sentinel.yml up -d

测试高可用

  • console进入maste节点:info replication查看是否为主节点(role:master);同理,进入从节点查看(role:slave)
  • 关闭master节点:portainer界面直接stop掉master的容器

  • 点入任意一个哨兵日志,可以看到它监控到主节点下线,并快速选举出一个新的节点作为master上线

+sdown slave 172.19.0.2:6379 172.19.0.2 6379 @ redis-master 172.19.0.4变成了master 6379
#172.19.0.4变成了master
  • 通过ip地址定位到容器,我们进入容器查看其身份,确实变为master