Redis搭建主从架构
使用Docker搭建主从
关于主从复制模式,注意如下要点。
- 第一, 一个主服务器可以带一个或多个从服务器,甚至从服务器也可以再带从服务器,但在复制数据时,只能把主服务器的数据复制到从服务器上,反之不能。
- 第二, 一台从服务器只能跟随一台主服务器,而不能出现一从多主的模式。
- 第三, 在 Redis 2.8以后的版本里,是采用异步的复制模式,即进行主从复制时,不会影响主服务器上的读写数据操作。
创建主机
前提是已经安装了docker及下载了redis镜像
下载redis.conf
wget https://raw.githubusercontent.com/redis/redis/7.0/redis.conf
如果网络不好,就多试几次
配置密码
配置密码为xxx
requirepass xxx
创建容器
docker run -d --name redis-master -p 6390:6379 -v /root/test_redis/redis-master.conf:/data/redis.conf redis redis-server /data/redis.conf
注意开启防火墙的端口号
查看主从信息
docker exec -it redis-master /bin/bash # 进入容器
redis-cli # 连接到服务器
info replication # 查看主从信息
# Replication
role:master # 表示当前为主机
connected_slaves:0 # 没有关联的从机
master_failover_state:no-failover
master_replid:767da0bb7679335f1a00fc05c1d51986ff3c595a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
创建从机
基本上和创建主机过程一致
docker run -d --name redis-slave1 -p 6391:6379 -v /root/test_redis/redis-slave1.conf:/data/redis.conf redis redis-server /data/redis.conf
将从机和主机关联起来
docker exec -it redis-slave1 /bin/bash # 进入容器
redis-cli # 连接到服务器
salveof master-host master-port # 关联主机 5.0之后可以使用 replicaof host port命令来代替,命令也可以提前写入到配置文件中
配置要关联主机的密码
修改 redis-slave1.conf
masterauth xxx
将新的配置文件拷贝到容器中
docker cp /root/test_redis/redis-slave1.conf redis-slave1:/data/redis.conf
因为之前没有配置关联主机的密码,这个时候从机在不停的尝试连接主机,系统繁忙,会拷贝失败,我们需要先将关联停止
salveof NO ONE # 停止关联主机
发现还是不行
Error response from daemon: Error processing tar file(exit status 1): unlinkat /data/redis.conf: device or resource busy
/data/redis.conf文件被占用,只能重新创建容器了
重新关联
停止并删除原来的容器
docker run -d --name redis-slave1 -p 6391:6379 -v /root/test_redis/redis-slave1.conf:/data/redis.conf redis redis-server /data/redis.conf
此时的配置文件已经配置了主机的密码,配置关联主机
docker exec -it redis-slave1 /bin/bash # 进入容器
redis-cli # 连接到服务器
salveof master-host master-port # 关联主机
查看主从信息
role:slave # 表示当前为从机
master_host:ip
master_port:6390
master_link_status:up # 已经连接成功 down表示失败
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:28
slave_repl_offset:28
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4fdc125c1f548f6e67e756b6a36b58e914c993c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
进入主机查看
role:master
connected_slaves:1 # 已经关联了从机
slave0:ip=42.192.20.119,port=6379,state=online,offset=308,lag=0
master_failover_state:no-failover
master_replid:4fdc125c1f548f6e67e756b6a36b58e914c993c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:308
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:308
验证
对主机进行操作
lpush names lisi
可以看到从机的数据也修改了,说明主从数据同步成功
set name lisi
在从机上执行,不能成功,READONLY You can't write against a read only replica.,从机默认是只读的,通过参数 slave-read-only=yes 来配置