Redis搭建主从架构

使用Docker搭建主从

关于主从复制模式,注意如下要点。

  • 第一, 一个主服务器可以带一个或多个从服务器,甚至从服务器也可以再带从服务器,但在复制数据时,只能把主服务器的数据复制到从服务器上,反之不能。
  • 第二, 一台从服务器只能跟随一台主服务器,而不能出现一从多主的模式。
  • 第三, 在 Redis 2.8以后的版本里,是采用异步的复制模式,即进行主从复制时,不会影响主服务器上的读写数据操作。

创建主机

前提是已经安装了docker及下载了redis镜像

下载redis.conf

获取配置文件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 来配置

参考

用Docker搭建Redis主从复制的集群

posted @ 2023-09-23 10:39  strongmore  阅读(52)  评论(0编辑  收藏  举报