Docker教程-5-基于Docker的Redis主从复制
Posted 孔子-说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker教程-5-基于Docker的Redis主从复制相关的知识,希望对你有一定的参考价值。
目录
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主从复制的主要内容,如果未能解决你的问题,请参考以下文章