0.前言
之前我们部署了单节点的redis,并且讲解了redis基础用法,但在实际生产中,通常不会使用单节点的redis,因为一旦该节点出现异常,就会影响使用redis的系统,所以线上环境通常会使用redis的高可用模式。redis常用的高可用模式有主从模式、哨兵模式和集群模式,今天我们来部署一套主从模式的redis集群,看下是否好用。
1.资源准备
我们准备两台服务器,一台部署为redis主节点,一台为redis从节点,服务器配置如下:
操作系统 | IP地址 | CPU | 内存 | redis版本 | 节点 |
---|---|---|---|---|---|
rocky9 linux | 192.168.159.167 | 4核 | 8G | 7.4 | 主 |
rocky9 linux | 192.168.159.168 | 4核 | 8G | 7.4 | 从 |
用其他配置或者版本的redis也可以,能够正常部署redis即可。
2.部署redis节点
需要在两台服务器上分别部署redis,和部署单节点的redis步骤一样,可以参考我之前的博客:redis单节点部署操作手册
3.从节点处理
为了将主从节点关联在一起,我们需要修改redis从节点的配置,并且将服务运行起来。
3.1 修改配置文件
在从节点redis配置文件中添加如下内容:
replicaof 192.168.159.167 6379
其实就是在从节点中指定主节点。
3.2 启动从节点
配置修改完成之后,启动redis节点即可,命令如下:
systemctl start redis
3.3 检查redis服务
检查下redis服务运行情况,命令如下:
ps -ef |grep redis
root 1669248 1 0 18:49 ? 00:00:00 /usr/local/redis/bin/redis-server 0.0.0.0:6379
root 1669322 1658373 0 18:49 pts/1 00:00:00 grep --color=auto redis
可以看到redis服务正常运行。
4.集群使用
在redis主从集群默认情况下,主节点用来读写数据,而从节点只能读取数据,下面我们来简单测试下redis集群模式的功能。
4.1 查看集群信息
我们先来到集群主节点(192.168.159.167),查看下集群基本信息,命令如下:
cd /usr/local/redis/bin
./redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.159.168,port=6379,state=online,offset=56,lag=1
master_failover_state:no-failover
master_replid:7672078e5f197c6c19ea97b1898969b01ee56699
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
可以看到主从节点已经相互连接,组成了集群。
4.2 主节点操作
我们在主节点(192.168.159.167)执行读写操作,然后在从测点测试下是否能读取到主节点创建的数据。
(1)创建测试数据
cd /usr/local/redis/bin
./redis-cli
127.0.0.1:6379> mset x 1 y 2 z 3
OK
127.0.0.1:6379> keys *
1) "z"
2) "x"
3) "y"
(2)数据修改
127.0.0.1:6379> set x 5
(3)查看测试数据
127.0.0.1:6379> mget x y z
1) "5"
2) "2"
3) "3"
可以看到,主节点确实可以执行数据的添加,修改和查看操作。
4.3 从节点操作
我们到从节点执行读写操作试下,验证从节点是否能执行写操作以及能否读取主节点写入的数据。 (1)执行写入操作
cd /usr/local/redis/bin/
./redis-cli
127.0.0.1:6379> mset a 1 b 2 c 3
(error) READONLY You can't write against a read only replica.
可以看到报错了,错误信息是从节点只能读取数据。 (2)读取数据
127.0.0.1:6379> mget x y z
1) "5"
2) "2"
3) "3"
可以看到主节点的数据确实同步到了从节点。
5.主从复制原理
上面我们搭建了一个简单的主从集群,并且测试了主从集群的基本功能,下面我们讲一下redis主从复制的原理。
主从模式工作示意图:
为了方便,我这里仅部署了一个slave,但是工作模式是一样的,大家能理解就好。
主从复制又分为全量复制和增量复制:
- 全量复制:第一次同步时,主节点会将所有数据同步给从节点,为全量复制;
- 增量复制:当主从之间因为网络异常等原因出现连接断开的情况时,重新连接之后主库向从库同步数据时采用的是增量复制;
注意:在redis2.8版本之前只有全量复制
复制的过程:
- 第一阶段:主从节点之间建立连接,协商同步,主要是为全量同步做准备。这一过程中主库和从库建立起连接,之后从库告诉主库即将进行同步(发送psync命令和参数runID、offset,因为刚建立连接还没有这两个参数值,所以是"?"和"-1"),主库确认回复后(FULLSYNC命令并带有参数runID和offset,FULLSYNC表示全量复制),主从之间就开始同步了。
- 第二阶段:主库执行bgsave命令生成RDB文件,之后将文件发送给从库,也即将所有数据同步给从库。从库收到数据后,会先清理掉原本存在的数据,之后在本地执行数据加载。
- 第三阶段:主库会把第二阶段执行过程中新收到的写命令,再发送给从库。 经过以上三个阶段,新建立起连接的主从节点就完成了数据同步。
6.总结
主从模式就是将某个节点的redis数据复制到其他redis节点,前者被称为master节点,后者被称为slave节点,其中master节点可以读写数据,而slave节点只能读取数据。 主从模式的主要作用包括:
- 数据冗余:多个从节点以热备份的方式实现数据持久化;
- 故障恢复:当某个从节点异常时,并不影响redis的使用;
- 负载均衡:因为有多个从节点,读取数据时可以实现负载均衡;
- 高可用基石:主从模式是redis其他高可用模式实现的基础; 主从模式一定程度上实现了redis的高可用,提高了redis的稳定性,搭建起来也并不复杂,还是很好用的。