docker部署redis集群(一主双从,哨兵模式)
一、一主多从模式
1、创建目录
mkdir -p /xjj/redis-master/conf
mkdir -p /xjj/redis-master/data
mkdir -p /xjj/redis-master/logs
mkdir -p /xjj/redis-slave1/conf
mkdir -p /xjj/redis-slave1/data
mkdir -p /xjj/redis-slave1/logs
mkdir -p /xjj/redis-slave2/conf
mkdir -p /xjj/redis-slave2/data
mkdir -p /xjj/redis-slave2/logs
2、拷贝redis.conf文件,放到master节点conf目录下
cd /xjj/redis-master/conf/
vi redis.conf
redis.conf内容如下:
#外部访问(要修改)
bind 0.0.0.0
# 是否启用保护模式
protected-mode no
#端口号
port 6379
#守护模式
daemonize no
#端口文件
pidfile /var/run/redis_6379.pid
#日志级别
loglevel notice
#日志文件地址
logfile "/var/log/redis/redis6379-server.log"
#数据库个数
databases 16
#rdb保存策略
save 5 2
#rdb保存文件的名称
dbfilename redis6379.rdb
#rdb和aop保存的文件目录
dir /data
#开启aof
appendonly yes
#aof的名称,可修改
appendfilename "appendonly6379.aof"
#aof保存的文件路径,和dir拼接 “/data/appendonlydir”,aof保存在/data/appendonlydir路径下
appenddirname "appendonlydir"
#aof保存策略,每秒写入一次
appendfsync everysec
#设置密码
requirepass 111111
masterauth 111111
3、创建网络
docker network create redis-net
4、运行容器
docker run -d --name redis-master \
--network redis-net \
-p 6379:6379 \
-v /xjj/redis-master/data:/data \
-v /xjj/redis-master/conf:/etc/redis \
-v /xjj/redis-master/logs/:/var/log/redis \
redis:latest redis-server /etc/redis/redis.conf
发现启动不起来,使用命令docker logs redis-master
,会报错如下:
没有权限,解决方法:
加权限:
chmod 777 /xjj/redis-master/logs/
在重新启动redis-master容器:
docker start redis-master
5、slave1从节点
编写redis.conf文件:
#外部访问(要修改)
bind 0.0.0.0
# 是否启用保护模式
protected-mode no
#端口号
port 6380
#守护模式
daemonize no
#端口文件
pidfile /var/run/redis_6380.pid
#日志级别
loglevel notice
#日志文件地址
logfile "/var/log/redis/redis6380-server.log"
#数据库个数
databases 16
#rdb保存策略
save 5 2
#rdb保存文件的名称
dbfilename redis6380.rdb
#rdb和aop保存的文件目录
dir /data
#开启aof
appendonly yes
#aof的名称,可修改
appendfilename "appendonly6380.aof"
#aof保存的文件路径,和dir拼接 “/data/appendonlydir”,aof保存在/data/appendonlydir路径下
appenddirname "appendonlydir"
#aof保存策略,每秒写入一次
appendfsync everysec
#设置密码
requirepass 111111
# replicaof 主节点ip 端口
replicaof 122.51.104.189 6379
#master节点密码
masterauth 111111
给logs目录加权限:
chmod 777 /xjj/redis-slave1/logs/
启动容器:
docker run -d --name redis-slave1 \
--network redis-net \
-p 6380:6380 \
-v /xjj/redis-slave1/data:/data \
-v /xjj/redis-slave1/conf:/etc/redis \
-v /xjj/redis-slave1/logs/:/var/log/redis \
redis:latest redis-server /etc/redis/redis.conf --replicaof redis-master 6379
6.slave2从节点
编写redis.conf文件:
#外部访问(要修改)
bind 0.0.0.0
# 是否启用保护模式
protected-mode no
#端口号
port 6381
#守护模式
daemonize no
#端口文件
pidfile /var/run/redis_6381.pid
#日志级别
loglevel notice
#日志文件地址
logfile "/var/log/redis/redis6381-server.log"
#数据库个数
databases 16
#rdb保存策略
save 5 2
#rdb保存文件的名称
dbfilename redis6381.rdb
#rdb和aop保存的文件目录
dir /data
#开启aof
appendonly yes
#aof的名称,可修改
appendfilename "appendonly6381.aof"
#aof保存的文件路径,和dir拼接 “/data/appendonlydir”,aof保存在/data/appendonlydir路径下
appenddirname "appendonlydir"
#aof保存策略,每秒写入一次
appendfsync everysec
#设置密码
requirepass 111111
# replicaof 主节点ip 端口
replicaof 122.51.104.189 6379
#master节点密码
masterauth 111111
给logs目录加权限:
chmod 777 /xjj/redis-slave2/logs/
启动容器:
docker run -d --name redis-slave2 \
--network redis-net \
-p 6381:6381 \
-v /xjj/redis-slave2/data:/data \
-v /xjj/redis-slave2/conf:/etc/redis \
-v /xjj/redis-slave2/logs/:/var/log/redis \
redis:latest redis-server /etc/redis/redis.conf --replicaof redis-master 6379
7.查看naster主节点日志文件
cat /xjj/redis-master/logs/redis6379-server.log
代表成功。
8、有一个问题,为什么我redis.conf配置文件中已经指定了
# replicaof 主节点ip 端口
replicaof 122.51.104.189 6379
但是不起作用,必须要在docker run 启动容器时指定
--replicaof redis-master 6379
才生效主从复制配置。
二、哨兵模式配置
1、新建目录
mkdir -p /xjj/sentinel26379/conf;
mkdir -p /xjj/sentinel26379/logs;
mkdir -p /xjj/sentinel26379/data;
mkdir -p /xjj/sentinel26380/conf;
mkdir -p /xjj/sentinel26380/logs;
mkdir -p /xjj/sentinel26380/data;
mkdir -p /xjj/sentinel26381/conf;
mkdir -p /xjj/sentinel26381/logs;
mkdir -p /xjj/sentinel26381/data;
2、直接写服务器ip地址,配置不会生效(注意)
查找主节点的ip地址(172.18.0.7)
docker inspect redis-master | grep IPAddress
sentinel.conf的配置文件都要修改
2、编辑配置/xjj/sentinel26379/conf/sentinel.conf文件
#外部访问(要修改)
bind 0.0.0.0
# 是否启用保护模式
protected-mode no
#哨兵端口号
port 26379
#守护模式
daemonize no
#pid文件
pidfile /var/run/redis-sentinel26379.pid
#日志级别
loglevel notice
#日志文件所在路径
logfile "/logs/sentinel26379.log"
#哨兵模式并不需要,配置了和redis实例一样
dir /data
#哨兵监听名为mymaster的主服务器,它的IP是122.51.104.189,端口是6379,至少需要多少2个哨兵同意这个主节点确实发生了故#障,才会触发故障转移。
#sentinel monitor mymaster 122.51.104.189 6379 2
sentinel monitor mymaster 172.18.0.7 6379 2
#连接到名为mymaster的主服务器时所需的密码
sentinel auth-pass mymaster 111111
#-----------------------------------------
#这条指令定义了哨兵认为主服务器或从服务器已下线的时间阈值。具体来说,如果哨兵在30000毫秒(即30秒)内没有收到主服务器#或从服务器的有效回复,则它会将该服务器标记为“主观下线”。如果足够数量的哨兵(由quorum决定)都认为同一个服务器已经下#线,则该服务器会被标记为“客观下线”,从而可能触发故障转移。
#-----------------------------------------
sentinel down-after-milliseconds mymaster 30000
4、编辑配置/xjj/sentinel26380/conf/sentinel.conf文件
#外部访问(要修改)
bind 0.0.0.0
# 是否启用保护模式
protected-mode no
#哨兵端口号
port 26380
#守护模式
daemonize no
#pid文件
pidfile /var/run/redis-sentinel26380.pid
#日志级别
loglevel notice
#日志文件所在路径
logfile "/logs/sentinel26380.log"
#哨兵模式并不需要,配置了和redis实例一样
dir /data
#哨兵监听名为mymaster的主服务器,它的IP是122.51.104.189,端口是6379,至少需要多少2个哨兵同意这个主节点确实发生了故#障,才会触发故障转移。
#sentinel monitor mymaster 122.51.104.189 6379 2
sentinel monitor mymaster 172.18.0.7 6379 2
#连接到名为mymaster的主服务器时所需的密码
sentinel auth-pass mymaster 111111
#-----------------------------------------
#这条指令定义了哨兵认为主服务器或从服务器已下线的时间阈值。具体来说,如果哨兵在30000毫秒(即30秒)内没有收到主服务器#或从服务器的有效回复,则它会将该服务器标记为“主观下线”。如果足够数量的哨兵(由quorum决定)都认为同一个服务器已经下#线,则该服务器会被标记为“客观下线”,从而可能触发故障转移。
#-----------------------------------------
sentinel down-after-milliseconds mymaster 30000
5、编辑配置/xjj/sentinel26381/conf/sentinel.conf文件
#外部访问(要修改)
bind 0.0.0.0
# 是否启用保护模式
protected-mode no
#哨兵端口号
port 26381
#守护模式
daemonize no
#pid文件
pidfile /var/run/redis-sentinel26381.pid
#日志级别
loglevel notice
#日志文件所在路径
logfile "/logs/sentinel26381.log"
#哨兵模式并不需要,配置了和redis实例一样
dir /data
#哨兵监听名为mymaster的主服务器,它的IP是122.51.104.189,端口是6379,至少需要多少2个哨兵同意这个主节点确实发生了故#障,才会触发故障转移。
#sentinel monitor mymaster 122.51.104.189 6379 2
sentinel monitor mymaster 172.18.0.7 6379 2
#连接到名为mymaster的主服务器时所需的密码
sentinel auth-pass mymaster 111111
#-----------------------------------------
#这条指令定义了哨兵认为主服务器或从服务器已下线的时间阈值。具体来说,如果哨兵在30000毫秒(即30秒)内没有收到主服务器#或从服务器的有效回复,则它会将该服务器标记为“主观下线”。如果足够数量的哨兵(由quorum决定)都认为同一个服务器已经下#线,则该服务器会被标记为“客观下线”,从而可能触发故障转移。
#-----------------------------------------
sentinel down-after-milliseconds mymaster 30000
6、运行容器redis-sentinel26379
docker run -d \
--privileged=true\
--network redis-net \
--name redis-sentinel26379 \
-v /xjj/sentinel26379/conf/sentinel.conf:/etc/redis/sentinel.conf \
-v /xjj/sentinel26379/logs/:/logs \
-v /xjj/sentinel26379/data/:/data \
-p 26379:26379 \
redis:latest redis-sentinel /etc/redis/sentinel.conf
7、运行容器redis-sentinel26380
docker run -d \
--privileged=true\
--network redis-net \
--name redis-sentinel26380 \
-v /xjj/sentinel26380/conf/sentinel.conf:/etc/redis/sentinel.conf \
-v /xjj/sentinel26380/logs/:/logs \
-v /xjj/sentinel26380/data/:/data \
-p 26380:26380 \
redis:latest redis-sentinel /etc/redis/sentinel.conf
8、运行容器redis-sentinel26381
docker run -d \
--privileged=true\
--network redis-net \
--name redis-sentinel26381 \
-v /xjj/sentinel26381/conf/sentinel.conf:/etc/redis/sentinel.conf \
-v /xjj/sentinel26381/logs/:/logs \
-v /xjj/sentinel26381/data/:/data \
-p 26381:26381 \
redis:latest redis-sentinel /etc/redis/sentinel.conf
9、测试哨兵模式是否搭建成功
进入master节点:
docker exec -it redis-master /bin/bash
redis-cli -a 111111
info replication
比方说,master节点挂了。
docker stop redis-master
登入 redis-slave1节点
docker exec -it redis-slave1 /bin/bash
redis-cli -p 6380 -a 111111
info replication
哨兵模式搭建成功。
我用的是一台服务器搭建的三个实例,和3台服务器,搭建集群差别不是很大。