Redis主从复制

简介

单个redis支持的读写能力还是有限的。这时候我们可以使用多个redis来提高redis的并发处理能力。这些redis如何配合需要一定的架构设计。这里,我们先分析实现主/从架构

基本架构

redis主从架构如下图所示:

master负责读写,将数据同步到slave,slave节点负责读取

快速入门练习

基于Redis,设计了一个Master-Slave架构,包括一个Master和两个Slave。 Master负责Redis的读写和数据同步到Slave。 Slave 只负责读取。步骤如下:

首先复制redis01,例如:

cp -r redis01/ redis02

cp -r redis01/ redis03

第二步:如果已有redis服务,先停止所有原有的redis服务(docker rm -f redis容器名),重新启动一个redis容器,例如:

码头运行 -p 6379:6379 --name redis6379 \

-v /usr/local/docker/redis01/data:/data \

-v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf \

-d redis redis-server /etc/redis/redis.conf \

--appendonly 是

搬运工运行 -p 6380:6379 --name redis6380 \

-v /usr/local/docker/redis02/data:/data \

-v /usr/local/docker/redis02/conf/redis.conf:/etc/redis/redis.conf \

-d redis redis-server /etc/redis/redis.conf \

--appendonly 是

搬运工运行-p 6381:6379 --name redis6381 \

-v /usr/local/docker/redis03/data:/data \

-v /usr/local/docker/redis03/conf/redis.conf:/etc/redis/redis.conf \

-d redis redis-server /etc/redis/redis.conf \

--appendonly 是

第三步:查看redis服务角色

启动三个客户端,分别登录三个redis容器服务,通过info命令查看角色。默认情况下,新启动的三个redis服务角色都是master

127.0.0.1:6379> 信息复制

\# 复制

角色:主人

已连接_slaves:0

主_repl_offset:3860

repl_backlog_active:1

repl_backlog_size:1048576

repl\backlog\first\byte\offset:2

repl_backlog_histlen:3859

第四步:查看redis6379的ip设置

码头工人检查 redis6379

......

“网络”:{

“桥”:{

“IPAMConfig”:空,

“链接”:空,

“别名”:空,

“网络 ID”:“c33071765cb48acb1efed6611615c767b04b98e6e298caa0dc845420e6112b73”,

"端点 ID": "4c77e3f458ea64b7fc45062c5b2b3481fa32005153b7afc211117d0f7603e154",

“网关”:“172.17.0.1”,

"IP地址": "172.17.0.2",

“IPPrefixLen”:16,

"IPv6网关": "",

"全球 IPv6 地址": "",

"GlobalIPv6PrefixLen": 0,

"MacAddress": "02:42:ac:11:00:02",

“DriverOpts”:空

}

}

第五步:设置主/从架构

分别登录redis6380/redis6381,然后执行如下语句

slaveof ip port #ip:主节点的IP地址,port:主节点的端口号

从 172.17.0.2 6379

注意:如果master有密码,需要在slave的redis.conf配置文件中添加“masterauth your password”语句,重启redis,然后执行slaveof命令

第六步:再次登录redis 6379查看信息

[root@centos7964 ~]# docker exec -it redis6379 redis-cli

127.0.0.1:6379> 信息复制

\# 复制

角色:主人

已连接_slaves:2

slave0:ipu003d172.17.0.3,portu003d6379,stateu003donline,offsetu003d2004,lagu003d1

slave1:ipu003d172.17.0.4,portu003d6379,stateu003donline,offsetu003d2004,lagu003d1

主_故障转移_状态:无故障转移

主_replid:5baf174fd40e97663998abf5d8e89a51f7458488

主_replid2:0000000000000000000000000000000000000000

主_repl_offset:2004

第二_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl\backlog\first\byte\offset:1

repl_backlog_histlen:2004

第七步:登录redis 6379进行测试。主人可以读写

[root@centos7964 ~]# docker exec -it redis6379 redis-cli

127.0.0.1:6379> 设置角色 master6379

好的

127.0.0.1:6379> 获得角色

“master6379”

127.0.0.1:6379>

第八步:登录redis6380/6381进行测试。从机只能读不能写。

[root@centos7964 ~]# docker exec -it redis6380 redis-cli

127.0.0.1:6379> 获得角色

“master6379”

127.0.0.1:6379> 设置角色 slave6380

(error) READONLY 您不能针对只读副本进行写入。

127.0.0.1:6379>

Java中的读/写测试分析。代码如下:

包 com.jt;

导入 org.junit.Test;

导入 redis.clients.jedis.Jedis;

/**

* 主从架构分析

*/

公共类 MasterSlaveTests {

@Test //主节点(支持读写操作)

公共无效 testWriteRead(){

Jedis redis u003d new Redis("192.168.126.129",6379);

jedis.set("a1", "100");

字符串 a1 u003d jedis.get("a1");

System.out.println(a1);

绝地武士.close();

}

@Test //Slave 节点(只支持读操作)

公共无效 testRead(){

Jedis jedis u003d new Jedis("192.168.126.129",6380);

//jedis.set("a1", "200");//这里不允许写操作

字符串 a1 u003d jedis.get("a1");

System.out.println(a1);

绝地武士.close();

}

}

//可靠性

主从同步原理分析

Redis 主从结构可以采用一种主从结构。 Redis主从复制根据是否全量可以分为全量同步和增量同步。

  • Redis全同步

Redis 全量复制通常发生在 Slave 初始化阶段。这时,Slave 需要复制 Master 上的所有数据。具体步骤如下:

1)从服务器连接主服务器,发送同步命令;

2)主服务器收到sync命名后,开始执行bgsave命令生成rdb文件,并使用缓冲区记录此后执行的所有写命令;

3)主服务器bgsave执行后,向所有从服务器发送快照文件,并在发送过程中继续记录执行的写命令;

4)从服务器接收到快照文件后,丢弃所有旧数据并加载接收到的快照;

5)从主服务器发送快照后,开始向从服务器发送缓冲区中的写命令;

6)从服务器加载快照,接收命令请求,从主服务器缓冲区执行写命令;

  • Redis增量同步

Redis增量复制是指Slave初始化后,在Slave开始正常工作时,将Master服务器的写操作同步到Slave服务器的过程。增量复制的主要过程是主服务器每次执行写命令时向Slave服务器发送相同的写命令,Slave服务器接收并执行收到的写命令。

部分面试分析

  • 如果redis要支持100000+并发怎么办?

单个redis几乎不可能说QPS超过100000+,除非有一些特殊情况,比如你的机器性能特别好,配置特别高,物理机和维护特别好,你的整体操作不是太复杂。平均单机数万。要真正实现redis的高并发,需要读写分离。对于缓存,一般用于支持高读并发。写请求比较少,写请求可能每秒几千次。读取请求会相对较多,例如每秒 200000 次。因此,基于主从架构和读写分离机制,可以实现redis的高并发。

  • Redis的复制机制是什么?

(1)redis异步复制数据到从节点。

(2)一个主节点可以配置多个从节点。

(3) 从节点也可以连接到其他从节点。

(4) 当一个从节点被复制时,区块主节点将无法正常工作。

(5) 复制时,从节点不会阻塞自己的查询操作。它将使用旧数据集提供服务;但是,复制完成后,需要删除旧数据集并加载新数据集。此时,外部服务将被暂停。

(6) 从节点主要用于横向扩展和读写分离。扩展的从节点可以提高读取吞吐量。

Redis 哨兵模式

简介

Sentinel是Redis主从架构模式下实现高可用的一种机制。

由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监控任意数量的主服务器以及这些主服务器下的所有从服务器,并在被监控的主服务器进入主服务器时自动将离线主服务器下的一个从服务器升级为新的主服务器。离线状态,然后,新的主服务器继续处理命令请求,而不是离线的主服务器。

基本架构

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐