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:
TZ: Asia/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:
TZ: Asia/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:
TZ: Asia/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:
TZ: Asia/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:
TZ: Asia/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:
TZ: Asia/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的基本过程
有好的建议,请在下方输入你的评论