docker 搭建 redis 主从模式
1:搜索redis 镜像(当前最新版本是6.2.6)
[root@localhost ~]# docker search redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store that… 10051 [OK] sameersbn/redis 83 [OK] grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0, 6.2 79 rediscommander/redis-commander Alpine image for redis-commander - Redis man… 66 [OK] redislabs/redisearch Redis With the RedisSearch module pre-loaded… 40 redislabs/redisinsight RedisInsight - The GUI for Redis 35 kubeguide/redis-master redis-master with "Hello World!" 33 redislabs/redis Clustered in-memory database engine compatib…
2:下载镜像
docker pull redis
3:创建Redis配置文件
下载redis 最新的redis.conf 文件(可以官网下载redis的tar 包,然后解压。使用其中的redis.conf 文件)
在物理机上创建 redis配置文件目录(自定义) /home/zhangxs/Documents/dockerdata/redis/config
(1)创建主从配置文件(从redis.conf中复制出多份文件即可)
[root@localhost config]# ll total 252 -rw-rw-r--. 1 polkitd zhangxs 83390 Oct 20 16:20 redis.conf // master节点6380 -rw-r--r--. 1 polkitd root 83413 Oct 20 16:21 slave6381.conf // 从节点,端口6381 -rw-r--r--. 1 polkitd root 83409 Oct 20 16:22 slave6382.conf //从节点,端口6382
(2)redis.conf 修改
bind 0.0.0.0 # 允许连接的客户端。默认是 127.0.0.1 。可以设置指定的客户端ip port 6380 # 设置访问端口
(3)slave6381.conf
bind 0.0.0.0 # 允许连接的客户端。默认是 127.0.0.1 。可以设置指定的客户端ip port 6381 # 设置访问端口 slaveof master 6380 # 设置master节点的ip 端口。因为容器重启ip可能会发生变化,所以这里没有硬编码ip。使用别名的方式。下面会讲到
(4)slave6382.conf
bind 0.0.0.0 # 允许连接的客户端。默认是 127.0.0.1 。可以设置指定的客户端ip port 6382 # 设置访问端口 slaveof master 6380 # 设置master节点的ip 端口。因为容器重启ip可能会发生变化,所以这里没有硬编码ip。使用别名的方式。下面会讲到
4:启动容器
(1)master节点(容器名 r-master)
docker run -v /home/zhangxs/Documents/dockerdata/redis/config:/data/etc/redis -d -p 6380:6380 --name r-master redis redis-server /data/etc/redis/redis.conf
- v(数据卷) : 映射物理机 与 容器目录共享
-d :让容器后台运行
-p:物理机的 6380 映射到 容器的 6380端口
- name:r-master masrer容器的名称
redis-server /data/etc/redis/redis.conf : 容器启动后执行的命令,这里是指定redis的配置文件
(2) 启动slave6381 和 6382 容器
docker run -v /home/zhangxs/Documents/dockerdata/redis/config:/data/etc/redis -d -p 6381:6381 --link r-master:master --name r-slave6381 redis redis-server /data/etc/redis/slave6381.conf
docker run -v /home/zhangxs/Documents/dockerdata/redis/config:/data/etc/redis -d -p 6382:6382 --link r-master:master --name r-slave6382 redis redis-server /data/etc/redis/slave6382.conf
slave 节点启动跟master 多了一个 --link 配置
link使用 格式
--link <name or id>:alias # name:源容器名称,id:源容器id
作用:可以连接两个容器,使两个容器可以相互通信。并且还可以接受源容器的环境变量等数据。当源容器重启会自动更新接收容器的/etc/hosts文件
5:查看两个 slave 容器的 hosts 配置,看下 --link 是否生效
[root@localhost config]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca4da15e431f redis "docker-entrypoint.s…" 50 minutes ago Up 50 minutes 6379/tcp, 0.0.0.0:6382->6382/tcp r-slave6382 25abe8e18d8a redis "docker-entrypoint.s…" 2 hours ago Up 55 minutes 6379/tcp, 0.0.0.0:6381->6381/tcp r-slave6381 b4e37ae6e33e redis "docker-entrypoint.s…" 2 hours ago Up 53 minutes 6379/tcp, 0.0.0.0:6380->6380/tcp r-master
[root@localhost config]# docker exec -it 25abe8e18d8a /bin/bash root@25abe8e18d8a:/data# more /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.18.0.2 master b4e37ae6e33e r-master # master节点 172.18.0.3 25abe8e18d8a # 当前容器 r-slave6381
[root@localhost config]# docker exec -it ca4da15e431f /bin/bash root@ca4da15e431f:/data# more /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.18.0.2 master b4e37ae6e33e r-master # master 节点 172.18.0.4 ca4da15e431f # 当前节点 r-slave6382
从slave节点的hosts 文件可以看到link 生效了。
6:登录master节点 查看两个从节点是否连接上来
[root@localhost config]# docker exec -it b4e37ae6e33e /bin/bash
root@b4e37ae6e33e:/data# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> info
# Replication
role:master # 表示当前节点的角色
connected_slaves:2 # slave 的数量。可以看到有 6381,6382两个节点
slave0:ip=172.18.0.3,port=6381,state=online,offset=5431,lag=1
slave1:ip=172.18.0.4,port=6382,state=online,offset=5431,lag=0
master_failover_state:no-failover
master_replid:ff6a639562d45268e55caf72d27cab9332f03bab
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5431
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5431
7:设置redis 数据卷
目前配置只有redis.conf 是存在物理机上,其他数据比如dump.rdb,日志文件等 都是存在容器中,如果容器删除,丢失 就会造成数据丢失
(2)创建dump存储目录(自定义) :/home/zhangxs/Documents/dockerdata/redis/dump
(2)修改 master的redis.conf 配置。
dbfilename dump.rdb # 改成 dbfilename dump6380.rdb dir ./ # 改成 dir ./dump/ (自定义)
(3)删除master 容器
(4)重新创建masrter 容器
docker run -v /home/zhangxs/Documents/dockerdata/redis/config:/data/etc/redis -v /home/zhangxs/Documents/dockerdata/redis/dump:/data/dump -d -p 6380:6380 --name r-master redis redis-server /data/etc/redis/redis.conf
新增了 -v /home/zhangxs/Documents/dockerdata/redis/dump:/data/dump 配置。 /data/dump 对应着[dir ./dump] 这个配置。[./]表示/data 目录
(5)在我们映射的dump已经存在了dump6380.rdb文件
[root@localhost dump]# ll total 4 -rw-r--r--. 1 polkitd input 175 Oct 21 09:54 dump6380.rdb [root@localhost dump]# pwd /home/zhangxs/Documents/dockerdata/redis/dump
其他节点同理