docker搭建redis主从复制,首先我们应该先拉取redis镜像
docker pull redis
默认拉取最新版本就行,当我们把redis镜像拉取下来之后,就可以进行生成容器。
我们先在linux上面创建一个redis目录,用于存储redis的配置文件,这里我们创建三个不同端口的配置文件目录分别是:6396,6397,6398,
[root@VM-4-6-centos 6396]# ls
conf data这块是我们端口里面的目录
[root@VM-4-6-centos conf]# ls
redis.conf然后我们在conf里面创建一个redis.conf的配置文件
protected-mode no
#这下面的端口根据不同的目录进行修改这里拿6398做示例
port 6398
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
#这里也需要改
pidfile /var/run/redis_6398.pid
loglevel notice
logfile ""
databases 30
always-show-logo yes
save 900 1
save 300 10
save 60 10000stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush noappendonly yes
appendfilename "appendonly.aof"
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mbaof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100activerehashing yes
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
当我们给三个端口配完配置之后,我们开始分别给三个端口生成容器,下面是生成容器的命令
#这里的6397指的是你自己的三个端口
docker run -p 6397:6397 --name redis6397 --sysctl net.core.somaxconn=1024 -v /redis/6398/data:/data -v /redis/6396/conf:/usr/local/etc/redis/redis.conf -e TIME_ZONE="Asia/Shanghai" -e TZ="Asia/Shanghai" -d redis redis-server /usr/local/etc/redis/redis.conf/redis.conf --appendonly yes
--docker run (启动并创建容器容器)
-- -p 指定映射的端口 左边的是本地,右边是docker内
-- --name 指定容器的名字
-- --sysctl 指定给他分配的大小
-- 第一个-v 是指定他的数据文件指定挂载到我们的哪个目录下(就是我们上边自己手动建立的文件夹)
-- 第二个 -v 是指定他的配置文件挂载到我们本地的哪个文件夹。
-- 后边俩个-e 是指定他的时区
-- -d 是 指定他在后台运行
-- redis-sever 指定启动哪个目录下的redis文件
-- --appendonly yes 开启持久化
这里是我的创建好的三个容器
[root@VM-4-6-centos conf]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f2acbeb71c7 redis "docker-entrypoint.s…" 3 hours ago Up 3 hours 6379/tcp, 0.0.0.0:6398->6398/tcp, :::6398->6398/tcp redis6398
6bffb35dd4b1 redis "docker-entrypoint.s…" 3 hours ago Up About an hour 6379/tcp, 0.0.0.0:6397->6397/tcp, :::6397->6397/tcp redis6397
33cdf7599ffb redis "docker-entrypoint.s…" 3 hours ago Up 3 hours 6379/tcp, 0.0.0.0:6396->6396/tcp, :::6396->6396/tcp redis6396
容器创建好之后进行主从复制的配置
docker exec -it 容器id bash
#进入容器之后运行redis
[root@VM-4-6-centos conf]# docker exec -it 3f2 bash
root@3f2acbeb71c7:/data# redis-cli -h 服务器ip -p 6398
服务器ip:6398> slaveof 服务器ip 6396OK
-h 指的是自己服务器的ip 因为我用的linux下的docker所以直接使用服务器ip 如果是本地可以使用127.0.0.1
-p 指的是你自己刚刚配置的端口
docker exec -it 容器id bash
#进入容器之后运行redis
[root@VM-4-6-centos conf]# docker exec -it 3f2 bash
root@3f2acbeb71c7:/data# redis-cli -h 服务器ip -p 6397
服务器ip:6397> slaveof 服务器ip 6396OK
-h 指的是自己服务器的ip 因为我用的linux下的docker所以直接使用服务器ip 如果是本地可以使用127.0.0.1
-p 指的是你自己刚刚配置的端口
将两个redis从容器进行配置到主容器上,这里我们进入主容器里面看可以看见配置的两个从库
121.4.33.132:6396> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=121.4.33.132,port=6398,state=online,offset=14112,lag=1
slave1:ip=121.4.33.132,port=6397,state=online,offset=14126,lag=0
master_failover_state:no-failover
master_replid:c9e3b92b4adfbf1f52ad55c779ece1c64263186a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14126
121.4.33.132:6396>
然后我们进行存数据
[root@VM-4-6-centos conf]# docker exec -it 33c bash
root@33cdf7599ffb:/data# redis-cli -h 121.4.33.132 -p 6396
121.4.33.132:6396> set 22 hello
OK
然后从库进行取,可以看见我们已经将数据取出来,这样的话主从复制就配置成功了
root@3f2acbeb71c7:/data# redis-cli -h 121.4.33.132 -p 6398
121.4.33.132:6398> get 11
(nil)
121.4.33.132:6398> get 22
"hello"
121.4.33.132:6398>