侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 297 篇文章
  • 累计创建 134 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Docker教程-5-基于Docker的Redis主从复制

孔子说JAVA
2021-10-18 / 0 评论 / 0 点赞 / 113 阅读 / 7,453 字 / 正在检测是否收录...

1、基于Docker的Redis集群配置

1.1 创建集群配置目录

在 /usr/local/docker 目录下创建 redis-cluster/redis6-1 集群配置目录,命令:mkdir -p redis-cluster/redis6-1,redis6-1表示该目录存储redis集群redis6版本的一份配置。

image-1648997646226

  • 在 /usr/local/docker/redis-cluster/redis6-1/目录下创建6个文件夹,作为redis的6个节点,文件夹以端口(此端口指映射的宿主机端口)命名,文件夹名分别为7011 7012 7013 7014 7015 7016。命令:mkdir 701{1…6} 。

image-1648997664739

1.2 创建节点7011的配置

1)创建目录

进入 /usr/local/docker/redis-cluster/redis6-1/7011/ 目录下创建data、conf、logs目录,其中data目录用于存储redis的数据,conf目录用于存储配置文件录,log目录用于存储日志,命令:mkdir {data,conf,logs}。

image-1648997708879

2)进入conf目录,增加redis.conf配置文件。

  • 可以从其他已安装好的redis配置目录复制,也可以从官网上直接下载。
  • redis配置文件官网下载:wget -c http://download.redis.io/redis-stable/redis.conf
# cp /usr/local/docker/redis/redis6-1/conf/redis.conf到当前目录,注意最后的.
cp /usr/local/docker/redis/redis6-1/conf/redis.conf .

image-1648997748927

1.3 redis.conf 配置文件主要参数说明

# 端口
port 6379

# RDB相关配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes

# 数据目录
dir /data

# AOF相关配置
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 密码
requirepass 111111

1.4 创建节点7012-7016的配置

在7012-7016的5个目录内执行同7011目录一样的操作,可以直接复制7011目录为7012-7016的5个目录。

# 删除原有的7012 7013 7014 7015 7016目录
rm -rf {7012,7013,7014,7015,7016}

# 复制7011目录下所有文件到7012 7013 7014 7015 7016目录
cp -r 7011/ 7012
cp -r 7011/ 7013
cp -r 7011/ 7014
cp -r 7011/ 7015
cp -r 7011/ 7016

image-1649036529604

  • 查看其它配置目录下是否已复制到配置文件。

image-1649036538232

2、基于Docker的Redis主从复制

这里搭建1主2从的redis服务(需要的话也可以搭建多个从服务器),因此需要启动3个redis docker容器,从服务器连接到主服务器中。

2.1 创建 Redis 容器

2.1.1 创建启动主服务容器

使用步骤1中7011节点的配置作为主节点配置。下面的命令是启动主服务容器,容器名为docker-redis-master,挂载使用的是-v参数,若使用–mount 参数,则挂载的宿主机目录必须存在,否则会报错。若在命令最后加上 /bin/bash 参数则容器启动时会进入容器的伪终端。

docker run -it -p 7011:6379 -p 26379:26379 \
--name docker-redis-master \
--privileged=true \
--restart=always \
-v /usr/local/docker/redis-cluster/redis6-1/7011/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis-cluster/redis6-1/7011/data:/data \
-v /etc/localtime:/etc/localtime \
-e TZ="Asia/Shanghai" \
-d redis:6.2.6 redis-server /etc/redis/redis.conf
  • -p 7011:6379 前者7011是redis宿主机访问端口,后者6379是redis容器内部端口
  • -p 26379:26379 前者 26379 是redis哨兵宿主机访问端口,后者26379是redis哨兵内部端口,若不配置哨兵,主从服务不需要配置该项

通过 docker logs docker-redis-master 命令查看redis 日志。

image-1649036788522

2.2.2 创建启动从服务容器1

使用步骤1中7012节点的配置作为从节点1的配置。下面的命令是启动从服务容器1,容器名为docker-redis-slave1。

docker run -it -p 7012:6379 -p 26380:26379 \
--name docker-redis-slave1 \
--privileged=true \
--restart=always \
-v /usr/local/docker/redis-cluster/redis6-1/7012/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis-cluster/redis6-1/7012/data:/data \
-v /etc/localtime:/etc/localtime \
-e TZ="Asia/Shanghai" \
-d redis:6.2.6 redis-server /etc/redis/redis.conf
  • -p 7012:6379 前者7012是redis宿主机访问端口,后者6379是redis容器内部端口
  • -p 26380:26379 前者26380是redis哨兵宿主机访问端口,后者26379是redis哨兵内部端口,若不配置哨兵,主从服务不需要配置该项

2.2.3 创建启动从服务容器2

使用步骤1中7013节点的配置作为从节点2的配置。下面的命令是启动从服务容器2,容器名为docker-redis-slave2。

docker run -it -p 7013:6379 -p 26381:26379 \
--name docker-redis-slave2 \
--privileged=true \
--restart=always \
-v /usr/local/docker/redis-cluster/redis6-1/7013/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis-cluster/redis6-1/7013/data:/data \
-v /etc/localtime:/etc/localtime \
-e TZ="Asia/Shanghai" \
-d redis:6.2.6 redis-server /etc/redis/redis.conf
  • -p 7013:6379 前者7013是redis宿主机访问端口,后者6379是redis容器内部端口
  • -p 26381:26379 前者26381是redis哨兵宿主机访问端口,后者26379是redis哨兵内部端口,若不配置哨兵,主从服务不需要配置该项

2.2 查看 Redis 容器的IP等信息

可以通过docker ps查看启动的容器信息。

image-1649036923957

可以通过 docker inspect 容器id或容器名称 命令查看容器的详情信息,其中的IPAddress部分表示当前容器的IP。

image-1649036942719

也可以通过docker inspect --format '{{ .NetworkSettings.IPAddress }}' 容器id或容器名称 命令查看容器的IP,容器IP在redis的配置文件中会用到。执行该命令后,可返回主服务容器和从服务容器的IP。

docker inspect --format '{{ .NetworkSettings.IPAddress }}' docker-redis-master
docker inspect --format '{{ .NetworkSettings.IPAddress }}' docker-redis-slave1
docker inspect --format '{{ .NetworkSettings.IPAddress }}' docker-redis-slave2

image-1649036988959

从上图可以看到,3个容器的ip分别为172.17.0.9、172.17.0.10、172.17.0.11。

2.3 主从服务的redis配置

在创建容器的时候,我们已经将reids的配置文件(容器中) /etc/redis/redis.conf 挂载到了宿主机的 /usr/local/docker/redis-cluster/redis6-1/7011/conf/redis.conf 文件,进入容器(命令:docker exec -it docker-redis-master bash)后查看 /etc/redis/redis.conf 文件,看到的和宿主机的redis.conf是一致的。

2.3.1 宿主机中主服务容器的配置

进入宿主机 /usr/local/docker/redis-cluster/redis6-1/7011/conf目录,修改redis.conf 文件,增加bind参数,总的配置文件如下。

# port表示redis容器的端口
port 6379
# bind表示绑定主服务容器的IP, 配置的2个ip表示同时绑定了2个ip
bind 172.17.0.9 127.0.0.1
# bing 0.0.0.0 表示对ip没有限制
# bind 0.0.0.0 

# RDB相关配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes

# 数据目录
dir /data

# AOF相关配置
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 密码
requirepass 111111

2.3.2 宿主机中从服务容器1的配置

进入宿主机 /usr/local/docker/redis-cluster/redis6-1/7012/conf目录,修改redis.conf 文件如下。需要特别注意masterauth 配置,此为主从认证密码,若主服务器设置了密码,在从服务器的配置中没有该项则主从不能同步。增加bind、masterauth、slaveof 3个参数,总的配置文件如下:

# port表示redis容器的端口
port 6379
# bind表示绑定主服务容器的IP, 配置的2个ip表示同时绑定了2个ip
bind 172.17.0.10 127.0.0.1
# bing 0.0.0.0 表示对ip没有限制
# bind 0.0.0.0 


# RDB相关配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes

# 数据目录
dir /data
# AOF相关配置
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 密码
requirepass 111111
# 主从认证密码,否则主从不能同步(若主服务器没有密码,注释该项)
masterauth 111111

# slaveof master 6379表示从服务器,master为主服务容器的别名,在从服务容器的启动命令中连接主服务定义了别名,这里也可以用主服务容器的IP 172.17.0.9。
# 有些redis版本中没有 slaveof ,使用 replicaof
slaveof 172.17.0.9 6379

2.3.3 宿主机中从服务容器2的配置

进入宿主机 /usr/local/docker/redis-cluster/redis6-1/7013/conf目录,修改redis.conf 文件如下。需要特别注意masterauth 配置,此为主从认证密码,若主服务器设置了密码,在从服务器的配置中没有该项则主从不能同步。增加bind、masterauth、slaveof 3个参数,总的配置文件如下:

# port表示redis容器的端口
port 6379
# bind表示绑定主服务容器的IP, 配置的2个ip表示同时绑定了2个ip
bind 172.17.0.11 127.0.0.1
# bing 0.0.0.0 表示对ip没有限制
# bind 0.0.0.0 


# RDB相关配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes

# 数据目录
dir /data
# AOF相关配置
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 密码
requirepass 111111
# 主从认证密码,否则主从不能同步(若主服务器没有密码,注释该项)
masterauth 111111

# slaveof master 6379表示从服务器,master为主服务容器的别名,在从服务容器的启动命令中连接主服务定义了别名,这里也可以用主服务容器的IP 172.17.0.9。
# 有些redis版本中没有 slaveof ,使用 replicaof
slaveof 172.17.0.9 6379

2.4 重启redis主从容器

使用命令docker restart docker-redis-masterdocker restart docker-redis-slave1docker restart docker-redis-slave2重启主从容器。也可以使用 docker stop 容器id或名称 先停用容器,再使用 docker start 容器id或名称 启动容器。

# 重启docker主服务
docker restart docker-redis-master 
# 重启docker从服务1
docker restart docker-redis-slave1
# 重启docker从服务2
docker restart docker-redis-slave2

image-1649039610303

2.5 redis主从复制验证

2.5.1 主容器redis信息查看及设置值

通过 docker exec -it docker-redis-master bash 命令进入主容器,执行 redis-cli -h 172.17.0.9 -p 6379 命令连接redis服务,若有密码需要输入 auth 你的密码

  • 在容器中按ctrl+p,再按ctrl+q可从容器(也可以用exit命令)退出,并保持容器继续运行。
# 进入容器
docker exec -it docker-redis-master bash 
# 进入redis命令行
redis-cli -h 172.17.0.9 -p 6379
# 验证密码
auth 111111

image-1649039696514

1)info 命令查看 redis 信息

redis命令行输入info可以查看到redis服务器的信息,在 Replication 部分可以查看到主从节点相关信息,或直接使用 info replication 命令查看。

image-1649039725793

  • 可以看到role为master,连接的从节点数量(connected_slaves)有2个,2个从节点的ip、端口及状态等信息。

2)主容器redis中设置值

redis命令行执行set master 'master',存入一个master键。

image-1649039755189

2.5.2 从容器1的redis信息查看及获取值

1)从容器服务器1的redis中获取主容器设置的值

通过 docker exec -it docker-redis-slave1 bash 命令进入从容器1,执行redis-cli -h 172.17.0.10 -p 6379命令连接redis服务,若有密码需要输入auth 你的密码,然后执行get master,返回了 “master”,说明主服务器已经将数据同步到了从服务器1中。

  • 在容器中按ctrl+p,再按ctrl+q可从容器退出,并保持容器继续运行。
# 进入从容器1
docker exec -it docker-redis-slave1 bash
# 连接redis服务
redis-cli -h 172.17.0.10 -p 6379

image-1649046378183

2)info 命令查看从容器 redis 信息

redis命令行输入info replication查看redis的Replication信息,可以看到该节点为从节点(slave),对应的主节点的相关信息(host、port、status等)。

image-1649046400420

2.5.3 从容器2 redis 获取值

通过docker exec -it docker-redis-slave2 bash命令进入从容器2,执行redis-cli -h 172.17.0.11 -p 6379命令连接redis服务,若有密码需要输入auth 你的密码,然后执行get master,返回了 “master”,说明主服务器已经将数据同步到了从服务器中。

  • 在容器中按ctrl+p,再按ctrl+q可从容器退出,并保持容器继续运行。
docker exec -it docker-redis-slave2 bash
redis-cli -h 172.17.0.11 -p 6379

image-1649046463508

到此就搭建成了一个1主2从的redis docker服务器。

2.5.3 测试从节点是否可以存数据

在从节点执行set命令,可以看出从节点是没有写入权限的,只有读的权限,主节点有读写权限。这就是读写分离。一读一写。

从节点1写入测试

image-1649046512967

从节点2写入测试

image-1649046522103

附录:docker容器中更新依赖以及安装vim、ps命令

进入redis docker容器:docker exec -it 容器id/容器名称 /bin/bash,依次执行更新依赖、安装vim、安装ps的命令:

# 进入容器
docker exec -it docker-redis-master bash

# 更新依赖命令
apt-get update

# 安装vim命令
apt-get install -y vim

# 安装ps命令
apt-get install -y procps
0

评论区