下文介绍使用docker来创建redis的主从架构和哨兵模式
linux已经下载并安装了docker
从仓库中pull redis的镜像
docker pull redis:latest
确保主机中的镜像已经有了刚下载好的redis镜像
docker images
首先需要在宿主机方创建一个redis.conf文件,用于配置信息的填写
相关的配置文件如下:
protected-mode no
# master节点,这里我们规定端口为6379
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
# 设置为no,如果为yes,可能会与docker的-d后台命令产生冲突
daemonize no
# redis相关文件(如rdb、aof)的存放路径(这里我们要设置在容器内的路径,不是宿主机的路径)
dir "/docker/redis/data"
# 每个redis都会产生一个进程号,其保存在一个文件中,这里就记录了该文件的路径。当进行微服务架构时,都需要这个pid执行文件
pidfile "/docker/redis/data/6379.pid"
loglevel notice
# 日志文件保存位置
logfile "/docker/redis/data/logfile.log"
databases 16
always-show-logo no
set-proc-title yes
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
rdb-del-sync-files no
将上述文件存放在/docker/redis/redis1/conf/redis.conf中
docker run -d --privileged=true --name=redis1 -p 6379:6379 -v /docker/redis/redis1/:/docker/redis/ redis redis-server /docker/redis/conf/redis.conf
命令解析
–privileged=true :表示在容器中以root权限进行
–name=redis1 :我们这里对容器取名字,使用redis1表示这是master
-v /docker/redis/redis1/:/docker/redis/ :卷映射(需要现在主机创建目录/docker/redis/redis1/conf和/docker/redis/redis1/data)
redis-server /docker/redis/conf/redis.conf:指定配置文件启动redis服务。
启动成功后,使用命令
docker ps
查看对应的容器是否创建成功。
redis1对应的目录结构如下:
/docker/redis/redis1/conf/redis.conf
/docker/redis/redis1/data/
我们需要做的就是创建master对应的两个从主机redis2和redis3,所以这里我们在/docker/redis/目录下cp redis1形成redis2和redis3。如下:
/docker/redis/redis2/conf/redis.conf
/docker/redis/redis2/data
修改redis2中对应的配制文件redis.conf
protected-mode no
port 6380
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
dir /docker/redis/data
Pidfile /docker/redis/data/6380.pid
loglevel notice
logfile /docker/redis/data/logfile.log
databases 16
always-show-logo no
set-proc-title yes
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
replicaof 20.20.20.130 6379
replica-read-only yes
配制文件解析:
其实redis2的配制文件和redis1的配制文件差不多,需要修改的如下
port 6380
Pidfile /docker/redis/data/6380.pid
修改成对应的端口号,
另外还需要增加从redis的命令:
# 表示当前redis的主redis是谁
replicaof 20.20.20.130 6379
# 该节点是否只读(主从架构下,从节点是只读的)
replica-read-only yes
使用docker命令:
docker run -d --privileged=true --name=true -p 6380:6380 -v /docker/redis/redis2/:/docker/redis redis redis-server /docker/redis/conf/redis.conf
该命令和redis1启动命令类似。
即从主机的搭建,需要修改的基本上就是对应的主从redis中的配置文件,如port和repilca相关配置。
关于第三台主机redis3的启动方案和redis2启动方案差不多,这里就不在演示了。
前提:启动了master redis1和两台从机redis2和redis3
我们进入任意一台server,使用redis的客户端分别连接3个主机,使用info命令进行查看
docker exec -it redis1 /bin/bash
redis-cli -h 20.20.20.130 -p 6379
redis-cli -h 20.20.20.130 -p 6380
redis-cli -h 20.20.20.130 -p 6381
info
综上所述,我们可以看到6379是master,而6380和6381是slave。
对master 6379 进行更改命令,看看对应的slave 6380和6381是否能够收到同步命令
通常哨兵需要创建奇数个,这里我们创建3个
/docker/redis/sentinel1/data
/docker/redis/sentinel1/conf/sentinel.conf
/docker/redis/sentinel2/data
/docker/redis/sentinel2/conf/sentinel.conf
/docker/redis/sentinel3/data
/docker/redis/sentinel3/conf/sentinel.conf
sentinel1
port 26379
daemonize no
pidfile "/docker/redis/data/redis\xe2\x80\x90sentinel\xe2\x80\x9026379.pid"
logfile "/docker/redis/data/26379.log"
dir "/docker/redis/data"
# sentinel monitor
# quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效
# mymaster这个名字随便取,客户端访问时会用 到
sentinel monitor mymaster 20.20.20.130 6379 2
# Generated by CONFIG REWRITE
user default on nopass ~* &* +@all
sentinel myid b78a872e9e5aa86a2b50730177307e22856c7353
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel current-epoch 0
sentinel known-replica mymaster 172.17.0.1 6380
sentinel known-replica mymaster 172.17.0.1 6381
sentinel2
port 26380
daemonize no
pidfile "/docker/redis/data/redis‐sentinel‐26380.pid"
logfile "/docker/redis/data/26380.log"
dir "/docker/redis/data"
# sentinel monitor
# quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效
# mymaster这个名字随便取,客户端访问时会用 到
sentinel monitor mymaster 20.20.20.130 6379
sentinel3
port 26381
daemonize no
pidfile "/docker/redis/data/redis‐sentinel‐26381.pid"
logfile "/docker/redis/data/26381.log"
dir "/docker/redis/data"
# sentinel monitor
# quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效
# mymaster这个名字随便取,客户端访问时会用 到
sentinel monitor mymaster 20.20.20.130 6379 2
启动3个sentinel,因为命令大致都相同,这里就只展示一个命令
docker run --privileged=true --name=sentinel2 -it -d -p 26380:26380 -v /docker/redis/sentinel2/:/docker/redis/ redis redis-sentinel /docker/redis/conf/sentinel.conf
可以直接在哨兵的配置文件下查看信息
会发现配置文件末尾增加了几行数据,其数据就是相关的哨兵节点和主从节点
综上,我们通过docker成功搭建了简单版的主从架构和哨兵模式。