Redis主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
相关知识链接
1. 安装redis
1.1 准备工作
角色 | IP | 端口 | 名称 |
主服务器 | 192.168.1.42 | 6371 | redis-master |
从服务器 | 192.168.1.42 | 6372 | redis-slave |
1.2 部署redis
相关知识链接
2.部署主服务器
2.1 修改配置
创建数据卷文件
[root@192 /]# mkdir -p /redis/master/data
[root@192 /]# mkdir -p /redis/master/conf/
[root@192 /]# cd /redis/master
[root@192 master]# ls
conf data
修改配置内容
vi /redis/master/conf/redis.conf
# 开启密码验证(可选)
# requirepass xxx
# 允许redis外地连接,需要注释掉绑定的IP
bind 0.0.0.0
# 关闭保护模式(可选)
protected-mode no
# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
# 开启redis数据持久化, (可选)
appendonly yes
# 设置主从复制密码
# redis auth与主从复制密码需要一致
# masterauth xxx
2.2 创建容器
docker run --name redis-master --privileged=true \
-p 6371:6379 \
-v /redis/master/data:/data \
-v /redis/master/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
2.3 测试成功
进入容器
[root@192 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e8e2a258de6 redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp redis-master
[root@192 /]# docker exec -it 0e8e2a258de6 /bin/bash
root@0e8e2a258de6:/data# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
查看配置文件
3.部署从服务器
3.1 修改配置
创建数据卷文件
[root@192 /]# mkdir -p /redis/slave/data
[root@192 /]# mkdir -p /redis/slave/conf
[root@192 /]# cd redis
[root@192 redis]# ls
master slave
[root@192 redis]# cd slave/
[root@192 slave]# ls
conf data
[root@192 slave]#
配置内容
vi /redis/slave/conf/redis.conf
# 开启密码验证(可选)
# requirepass xxx
# 允许redis外地连接,需要注释掉绑定的IP
bind 0.0.0.0
# 关闭保护模式(可选)
protected-mode no
# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
# 开启redis数据持久化, (可选)
appendonly yes
# 设置主从复制密码
# redis auth与主从复制密码需要一致
# masterauth xxx
# 主从配置 最为重要
replicaof 192.168.1.42 6371
3.2 创建容器
docker run --name redis-slave --privileged=true \
-p 6372:6379 \
-v /redis/slave/data:/data \
-v /redis/slave/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
3.3 测试成功
[root@192 conf]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09fc1a30508b redis "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp redis-slave
0e8e2a258de6 redis "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp redis-master
[root@192 conf]# docker exec -it 09fc1a30508b /bin/bash
root@09fc1a30508b:/data# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
查看配置文件
4.主从数据复制测试
主服务器查看复制信息
从服务器查看复制信息
数据测试
主服务器中设置数据
[root@192 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09fc1a30508b redis "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp redis-slave
0e8e2a258de6 redis "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp redis-master
[root@192 /]# docker exec -it 0e8e2a258de6 /bin/bash
root@0e8e2a258de6:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.1,port=6379,state=online,offset=434,lag=1
master_failover_state:no-failover
master_replid:778489c1f276992db977ae9d4c7e1b9ad6054c16
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:434
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:434
127.0.0.1:6379> set name wktime
OK
127.0.0.1:6379> get name
"wktime"
127.0.0.1:6379>
从服务器中查看是否存在主服务器中数据
[root@192 conf]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09fc1a30508b redis "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp redis-slave
0e8e2a258de6 redis "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp redis-master
[root@192 conf]# docker exec -it 09fc1a30508b /bin/bash
root@09fc1a30508b:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.1.42
master_port:6371
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_read_repl_offset:658
slave_repl_offset:658
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:778489c1f276992db977ae9d4c7e1b9ad6054c16
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:658
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:658
127.0.0.1:6379> get name
"wktime"
127.0.0.1:6379>
到此,redis主从复制搭建完毕。 一主多从原理一样,多部署几个从服务器就可以了。
5.最后
感谢大家,请大家多多支持!