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

Posted 孔子-说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker教程-5-基于Docker的Redis主从复制相关的知识,希望对你有一定的参考价值。

目录

1、基于Docker的Redis集群配置

1.1 创建集群配置目录

1.2 创建节点7011的配置

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

1.4 创建节点7012-7016的配置

2、基于Docker的Redis主从复制

2.1 创建 Redis 容器

2.1.1 创建启动主服务容器

2.2.2 创建启动从服务容器1

2.2.3 创建启动从服务容器2

2.2 查看 Redis 容器的IP等信息

2.3 主从服务的redis配置

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

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

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

2.4 重启redis主从容器

2.5 redis主从复制验证

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

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

2.5.3 从容器2 redis 获取值

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

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


redis容器的安装参考 Docker教程-4-Redis容器的安装配置使用

1、基于Docker的Redis集群配置

1.1 创建集群配置目录

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

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

1.2 创建节点7011的配置

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

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 .

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

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

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 日志。

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查看启动的容器信息。

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

也可以通过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

从上图可以看到,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-master,  docker restart docker-redis-slave1,  docker 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

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

1)info 命令查看 redis 信息

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

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

2)主容器redis中设置值

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

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

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

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

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

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

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

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

从节点1写入测试

从节点2写入测试 

附录: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

以上是关于Docker教程-5-基于Docker的Redis主从复制的主要内容,如果未能解决你的问题,请参考以下文章

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

Github标星5.3K,docker菜鸟图解教程

如何基于 Docker 快速搭建 Springboot + Mysql + Redis 项目

Docker教程-4-Redis容器的安装配置使用

Docker教程-4-Redis容器的安装配置使用

Docker决战到底 基于Docker部署Redis服务