docker(二十)docker部署redis-sentinel

270 阅读6分钟

Docker部署插件继续。

 

安装docker这部分我就不介绍了,具体请移步《docker(一)linux安装docker

 

安装redis就不需要使用dockerfile了,太麻烦了。这里直接使用docker命令来创建docker容器。

 

一:使用docker命令部署redis

1:redis配置文件

(1)主机配置文件:

# 开启密码验证(可选)
requirepass xxxxx
# 允许Redis外部连接,需要注释掉绑定的IP
bind 0.0.0.0 -::1
# 关闭保护模式(可选)
protected-mode no
# 注释掉daemonize yes,或者配置成daemonize no。因为该配置和docker run中的-d参数冲突,会导致容器一直启动失败
daemonize no
# 开启Redis数据持久化(可选)
appendonly yes
# 开放端口
port 6379

我这里的配置比较简单,能用的上的就是这些。其余的配置如果需要请自行添加。

(2)从机配置文件

# 开启密码验证(可选)
requirepass xxxxx
# 允许Redis外部连接,需要注释掉绑定的IP
bind 0.0.0.0 -::1
# 关闭保护模式(可选)
protected-mode no
# 注释掉daemonize yes,或者配置成daemonize no。因为该配置和docker run中的-d参数冲突,会导致容器一直启动失败
daemonize no
# 开启Redis数据持久化(可选)
appendonly yes
# 开放端口
port 6380
# 配置主机
replicaof 你的ip 6379
# 配置主机密码
masterauth xxxxx

这里需要注意两个注意点:

(1):daemonize 需要配置为no。因为该配置和docker run中的-d参数冲突,会导致容器一直启动失败

(2):从节点的配置文件有点坑,最好是不要使用同一个端口,比如master使用了6379,slave容器就需要使用其他端口(6380)。尽管容器是互相隔离的,但网络通信这一块,会有问题。

我开始都使用了6379,映射宿主机的不同端口上,主从同步时是没有问题的,但是当主节点下线,或者重新加入节点时,哨兵节点会无法区分各个容器的。

虽然各个容器分配的ip不同,但sentinel通信时都使用了容器内部的回环地址172.17.0.1,这里可能是个bug。容器内直接使用不同端口,可以规避这个问题。我这里直接使用6379,6380,6381

 

2:创建docker容器命令:

docker run -d -p 6379:6379 --name redis-master -v /opt/docker/redis/data/79:/data -v /opt/docker/redis/conf/redis79.conf:/etc/redis/redis.conf --privileged -d redis:7.4.0 redis-server /etc/redis/redis.conf
docker run -d -p 6380:6380 --name redis-slave-one -v /opt/docker/redis/data/80:/data -v /opt/docker/redis/conf/redis80.conf:/etc/redis/redis.conf --privileged -d redis:7.4.0 redis-server /etc/redis/redis.conf
docker run -d -p 6381:6381 --name redis-slave-two -v /opt/docker/redis/data/81:/data -v /opt/docker/redis/conf/redis81.conf:/etc/redis/redis.conf --privileged -d redis:7.4.0 redis-server /etc/redis/redis.conf

 

3:配置redis-sentinel容器

# 允许ip和端口
bind 0.0.0.0
port 26379
# 哨兵监听的ip和端口
sentinel announce-ip 127.0.0.1
# 后面的2  表示有2个哨兵认为主库挂了就是客观下线
# 主节点挂了 就会开始选举
sentinel monitor mymaster 127.0.0.1 6379 2
# 密码
sentinel auth-pass mymaster xxxxx
# 5000 表示每5秒钟检测一次主库是否挂掉
sentinel failover-timeout mymaster 5000
# linux中 解除redis保护 允许外部连接
protected-mode no
# 后台访问 这个参数 yes 会和docker run 命令冲突  导致redis 启动失败
daemonize no
# 主节点或副本在指定时间内没有回复PING,便认为该节点为主观下线 S_DOWN 状态。 默认是30秒
sentinel down-after-milliseconds mymaster 30000
# 安全
# 避免脚本重置,默认值yes
# 默认情况下,SENTINEL SET将无法在运行时更改notification-script和client-reconfig-script。
# 这避免了一个简单的安全问题,客户端可以将脚本设置为任何内容并触发故障转移以便执行程序。
sentinel deny-scripts-reconfig yes

 

4:创建docker-sentinel容器命令:

docker run -d -p 26379:26379 --name redis-sentinel-one -v /opt/docker/redis/conf/sentinel26379.conf:/etc/redis/sentinel.conf -v /opt/docker/redis/sentinel/26379:/data -d redis:7.4.0 redis-sentinel /etc/redis/sentinel.conf
docker run -d -p 26380:26380 --name redis-sentinel-two -v /opt/docker/redis/conf/sentinel26380.conf:/etc/redis/sentinel.conf -v /opt/docker/redis/sentinel/26380:/data -d redis:7.4.0 redis-sentinel /etc/redis/sentinel.conf
docker run -d -p 26381:26381 --name redis-sentinel-three -v /opt/docker/redis/conf/sentinel26381.conf:/etc/redis/sentinel.conf -v /opt/docker/redis/sentinel/26381:/data -d redis:7.4.0 redis-sentinel /etc/redis/sentinel.conf

我这里创建三个哨兵,redis高可用,redis-sentinel也要高可用。

 

5:测试一下哨兵是否好用

配置了6379端口是主机。6379的配置文件中就不需要配置主机信息:

# 配置主机
replicaof 39.99.144.212 6379
# 配置主机密码
masterauth xxxxxx

 

但是,现在将6379关机,哨兵会自动选取新的主机,这个时候,再将6379开机,就需要手动修改一下6379的配置文件,主机信息加入到配置文件中:

# 配置主机(假设哨兵选举的新主机是6381)
replicaof 39.99.144.212 6381
# 配置主机密码
masterauth xxxxx

 

二:使用docker-compose命令部署redis

Docker-compose.yml

version: "3.8"
services:
  redis-master:
    container_name: redis-master
    image: redis:7.4.0
    ports:
      - "6379:6379"
    environment:
      TZAsia/Shanghai
      # LANG: en_US.UTF-8  
    volumes:
      - /opt/docker/redis/data/79:/data
      - /opt/docker/redis/conf/redis79.conf:/etc/redis/redis.conf
    restart: always
    command: redis-server /etc/redis/redis.conf
  redis-slave-one:
    container_name: redis-slave-one
    image: redis:7.4.0
    ports:
      - "6380:6380"
    environment:
      TZAsia/Shanghai
      # LANG: en_US.UTF-8  
    volumes:
      - /opt/docker/redis/data/80:/data
      - /opt/docker/redis/conf/redis80.conf:/etc/redis/redis.conf
    restart: always
    command: redis-server /etc/redis/redis.conf
  redis-slave-two:
    container_name: redis-slave-two
    image: redis:7.4.0
    ports:
      - "6381:6381"
    environment:
      TZAsia/Shanghai
      # LANG: en_US.UTF-8  
    volumes:
      - /opt/docker/redis/data/81:/data
      - /opt/docker/redis/conf/redis81.conf:/etc/redis/redis.conf
    restart: always
    command: redis-server /etc/redis/redis.conf
  redis-sentinel-one:
    container_name: redis-sentinel-one
    image: redis:7.4.0
    ports:
      - "26379:26379"
    environment:
      TZAsia/Shanghai
      # LANG: en_US.UTF-8  
    volumes:
      - /opt/docker/redis/conf/sentinel26379.conf:/etc/redis/sentinel.conf
      - /opt/docker/redis/sentinel/26379:/data
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
  redis-sentinel-two:
    container_name: redis-sentinel-two
    image: redis:7.4.0
    ports:
      - "26380:26380"
    environment:
      TZAsia/Shanghai
      # LANG: en_US.UTF-8  
    volumes:
      - /opt/docker/redis/conf/sentinel26380.conf:/etc/redis/sentinel.conf
      - /opt/docker/redis/sentinel/26380:/data
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
  redis-sentinel-three:
    container_name: redis-sentinel-three
    image: redis:7.4.0
    ports:
      - "26381:26381"
    environment:
      TZAsia/Shanghai
      # LANG: en_US.UTF-8  
    volumes:
      - /opt/docker/redis/conf/sentinel26381.conf:/etc/redis/sentinel.conf
      - /opt/docker/redis/sentinel/26381:/data
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf

 

运行容器:

docker compose up -d

 

如果你修改了docker-compose.yml对应的参数之后,使用如下命令即可重启而不用删除已存在的容器:

docker compose up --force-recreate -d

 

启动报错:

WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, 
it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. 
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

 

暂时解决办法: 宿主执行

sysctl vm.overcommit_memory=1

 

永久解决办法: vm.overcommit_memory=1 添加到宿主 "/etc/sysctl.conf" 文件中

 

两种方法你用那个都行,推荐使用docker-compose。

以上大概就是docker部署redis-sentinel的基本过程

 

有好的建议,请在下方输入你的评论