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 man66                                      [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

其他节点同理

posted @ 2021-10-21 10:15  卖臭豆腐喽  阅读(706)  评论(0编辑  收藏  举报