
主从复制、集群环境搭建
更新: 2025/2/24 字数: 0 字 时长: 0 分钟
主从复制
主从复制,是指将一台Redis服务器的数据单向复制到其他的Redis服务器,前者称为主节点(master/leader)以写为主,后者称为从节点(salve/follower)以读为主。默认情况下,每台Redis服务器都是主节点,且一个主节点,每个主节点可以没有从节点或有多个从节点,但一个从节点只能有一个主节点。
主要作用
主从复制的主要作用包括:
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复,实际上是一种服务的冗余。
- 负载均衡:在主从复制的基础上,配合读写分离,即写Redis数据时连接主节点,读Redis数据时连接从节点,尤其是在写少读多的场景下,通过多个从节点分担读负载,大大提高Redis服务器的并发量;
- 高可用基石:主从复制还是哨兵和集群能够实施的基础,因此说主从复制时Redis高可用的基础。
工程项目
在工程项目中只是用一台Redis是万万不行的,因为一旦宕机整个服务就挂掉了,至少也得是一主二从的Redis集群,原因如下:
- 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
- 从容量上,单个Redis服务器内存容量有限,不能将所有内存用作Redis存储内存。一般来说,单台Redis最大使用内存不应该超过20G。
因此只要在公司中,主从复制就是必须使用的。
?> 提示:在日常的业务当中,80%的情况都是在进行读操作,因此主从复制,读写分离,可以减缓服务器的压力,架构中经常使用。
集群环境搭建
查看信息
info replication # 查看当前库的信息
修改配置文件
目前我们手上只有一台Redis服务器,接下来我们通过修改配置文件的方式来开启三台Redis服务器,搭建一个伪集群。
首先我们关闭Reids服务器,将Redis的配置文件拷贝为3份;
redis79.conf
文件修改的内容如下:
port 6379 # 端口
pidfile /var/run/redis_6379.pid # pid文件
logfile /var/log/redis/redis6379.log # 日志文件
dbfilename dump6379.rdb # rdb文件
redis80.conf
文件修改的内容如下:
port 6380 # 端口
pidfile /var/run/redis_6380.pid # pid文件
logfile /var/log/redis/redis6380.log # 日志文件
dbfilename dump6380.rdb # rdb文件
redis81.conf
文件修改的内容如下:
port 6381 # 端口
pidfile /var/run/redis_6381.pid # pid文件
logfile /var/log/redis/redis6381.log # 日志文件
dbfilename dump6381.rdb # rdb文件
通过 redis-server
启用三个配置文件:
/usr/bin/redis-server /etc/redis79.conf
/usr/bin/redis-server /etc/redis80.conf
/usr/bin/redis-server /etc/redis81.conf
通过命令 ps -ef|grep redis
查看Redis状态:可以看到开启了3个Redis的进程。
命令配置
现在我将6379定为主节点,6380、6381定为从节点,上面我们讲到,默认每台Redis服务器都是主节点,**因此我们不用配置主库,只配置从库。**命令如下:
# Redis的6380节点
127.0.0.1:6380> slaveof 127.0.0.1 6379 # 认本机的6379端口为主节点
这时,主节点6379的节点也发生了变化:
按照上面的命令继续将6381节点认6379节点为主节点,设置好以后,整个就搭建好了一个以6379为主节点,6380、6381为从节点的一主二从的Redis集群。
永久配置
上面的配置是通过命令去实现,这种方式实现的集群时暂时的,想实现永久的配置就需要修改配置文件内容如下:取消红框里面的注释,写上主节点的IP、主节点的端口信息,再重启Redis即可。
客户端配置
如果觉得上面的操作太过麻烦,可以使用客户端加 --slave
选项把当前客户端模拟成当前Redis节点的从节点,可以用来获取当前Redis节点的更新操作。效果如下:
redis-cli --slave
SYNC with master, discarding 72 bytes of bulk transfer...
SYNC done. Logging commands from master.
再开启另一个客户端做一些更新操作:
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> incr count
1
127.0.0.1:6379> get hello
"world"
第一个客户端会收到Redis节点的更新操作:
redis-cli --slave
SYNC with master, discarding 72 bytes of bulk transfer...
SYNC done. Logging commands from master.
"set","hello","world"
"set","a","b"
"PING"
"incr","count"
?> 提示:PING命令是由于主从复制产生的。
集群测试
主从测试
现在我们的Redis主从复制集群已经搭建好了,前面我们讲过主节点只负责写,从节点只负责读,现在我们测试一下:
6379主节点写入一个值:状态成功。
6381从节点读取一个值:状态成功。
6381从节点写入一个值:状态失败(从节点不能进行写操作)。
断开测试
下面的测试结果基于命令设置的Redis一主二从集群。
主节点断开:当主节点断开集群后,从节点依然是从节点,其状态不会发生变化,只是整个集群没有了写服务;当主节点又连上集群时,依然是主节点,依然可以进行写操作。
从节点断开:当一个从节点断开集群后,由于另一个从节点会提供读服务,所以整个集群的读服务依然存在,只是整个集群读服务性能降低了;当两个从节点都断开集群后,就相当于就变成了一个Redis单节点,它就必须要既提供读服务,也提供写服务。
数据复制
在Redis集群中的节点之间会进行数据复制,而数据复制方式有如下两种:全量复制、增量复制。
全量复制
全量复制:将所有的数据全部进行复制,与其他节点进行同步。
例如,目前整个集群有3个节点,一个6379主节点以及两个6380、6381从节点,假如这个时候群集增加了一个新的6382从节点,当它连接到主节点后,会向主节点发送一个同步命令,主节点就会启动后台的存盘进程,同时收集所有接收到的用于修改数据的命令集,在后台执行完毕之后,将传送整个数据文件传送到该从节点,完成一次完全同步。
?> 提示:从节点与主节点断开后,再重新连接主节点,都会进行一次完全同步,所以数据一定可以在从节点中看到。
增量复制
增量复制:主节点将后续所有的修改命令依次传递给从节点,完成同步。
例如,目前整个集群有3个节点,一个6379主节点以及两个6380、6381从节点,现在通过主节点写入了一个string类型的键值对,那么主节点就需要将该命令依次传递给两个从节点,让他们自己执行,完成同步。