【2023】Redis主从复制模式集群

资源有限,本文使用Docker部署

目录

  • 主从模式介绍
  • 搭建主从模式集群
    • 使用命令搭建主从集群
    • 通过配置文件搭建主从模式集群
  • 配置读写分离
  • 用心跳机制提高主从复制的可靠性
  • 用偏移量检查数据是否一致

主从模式介绍

主从模式中,由一个主服务器和多个从服务器组成,写入主节点的数据会被复制到从节点上,这样一旦主节点出现故障,应用系统就能切换到从节点去读写数据,提升系统的可用性。
再采用主从复制模式里默认的读写分离机制,就能提升系统的缓存读写性能。

总结:

  • 提高系统可用性
  • 提升读写性能

主从模式简述:

当有应用向一台Redis服务器中写数据时,这个数据可以复制同步到一台或多台Redis服务器,这个数据源服务器被称为主服务器(master),其他服务器被称为从服务器(slave)。

结构图:

  • 一主一从

【2023】Redis主从复制模式集群_第1张图片

  • 一主多从
    【2023】Redis主从复制模式集群_第2张图片

搭建主从模式集群

使用命令搭建主从集群

  • 运行一个容器作为master节点,端口为6379
docker run -itd --name redis-master -p 6379:6379 redis:6.0 
  • 再运行一个容器作为slave节点,端口为6380(注意:因为在同一台宿主机,所以端口不能重复)
docker run -itd --name redis-slave -p 6380:6380 redis:6.0 
  • 查看master容器信息,找到该容器的IP地址,可以看出IP地址为172.17.0.2
# docker inspect redis-master | grep "IPAddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
  • 进入master容器,连接客户端,查看当前主从模式状态
# docker exec -it redis-master /bin/bash
root@dd22f11d3b8c:/data# redis-cli 
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
  • 只需要信息的前几行能看到集群信息即可,可以看出此容器为主服务器,并且当前没有从服务器
  • 此时通过名称为从节点的容器进入查看集群状态应该是一样的,因为此时两者并没有关联
[root@localhost ~]# docker exec -it redis-slave /bin/bash
root@ff390708266d:/data# redis-cli 
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
  • 在从节点输入以下命令,指定该节点为从节点
127.0.0.1:6379> SLAVEOF 172.17.0.2 6379
OK
  • 再次查看集群信息,发现可以看到集群状态,该容器已成为从节点,主节点为172.17.0.2
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
  • 回到redis-master容器上查看状态,确认集群状态
[root@localhost ~]# docker exec -it redis-master /bin/bash
root@dd22f11d3b8c:/data# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.3,port=6379,state=online,offset=364,lag=1
  • 至此集群搭建成功

如果还有其他的从节点,操作步骤同上

通过配置文件搭建主从模式集群

注意:将上个实验的容器删除,重新部署,所以名称相同

  • 同样创建主redis容器一个
docker run -itd --name redis-master -p 6379:6379 redis:6.0 
  • 创建从服务器的配置文件,并启动从服务器容器指定该配置文件
[root@localhost ~]# mkdir /data/redis/redisConf -p
[root@localhost ~]# vim /data/redis/redisConf/redisslave.conf
[root@localhost ~]# cat /data/redis/redisConf/redisslave.conf 
port 6380
slaveof 172.17.0.2 6379
[root@localhost ~]# docker run -itd --name redis-slave -v /data/redis/redisConf:/redisConfig:rw -p 6380:6380 redis:6.0 redis-server /redisConfig/redisslave.conf
  • 进入到slave容器连接服务器查看redis集群状态
[root@localhost redisConf]# docker exec -it redis-slave /bin/bash
root@0fea9993d4e3:/data# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> INFO replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
slave_read_only:1

至此,通过配置文件的redis主从集群已经配置完成

配置读写分离

从主从服务器上通过info replication查看状态发现一行slave_read_only:1代表是只读的含义

在从服务器输入以下命令发现报错,也证明了是不可写的

127.0.0.1:6380> set test 100
(error) READONLY You can't write against a read only replica.

只需要在上例配置文件中加入slave-read-only no然后删除旧容器创建新容器即可生效,效果为可读可写

用心跳机制提高主从复制的可靠性

主从模式中,从服务器会默认以一秒一次的频率向主服务器发送REPLCONF ACK命令,依次来确保两者间连接通畅。
这种定时交互命令确保连接的机制就叫“心跳”机制。
可在主服务器通过以下命令查看到查看发送“心跳”间隔时间

[root@localhost redisConf]# docker exec -it redis-master /bin/bash
root@c9ced7408758:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.3,port=6380,state=online,offset=1666,lag=0

lag=0说明是实时的,没有数据延迟或失败情况

在配置文件中加入以下两行可增加可靠性:

min-slaves-to-write 2
min-slaves-max-lag 15
  • 第一行代表从服务器至少由两个
  • 第二行代表如果lag值大于15秒,则不执行主从服务
  • 两者为的关系

用偏移量检查数据是否一致

在主服务器中通过info replication可查看数据偏移量的master_repl_offset数据

master_repl_offset:1666

然后在从服务器上查看是否一致,如果一致,就说明主从服务器间的数据是同步的。

在主服务器上创建一个键值对,然后再次查看,如果主从服务器的master_repl_offset还是相同说明数据同步成功。

本文内从整理自基于Docker的Redis入门与实践

你可能感兴趣的:(Redis,redis,数据库,java,docker,容器)