搭建Redis简易集群实现主从复制和读写分离

redis不仅支持去中心化的集群模式,也可以实现主从复制集群。下面我将一步步搭建一套简易的主从复制集群,帮助大家理解主从复制和哨兵模式。

在开始正文之前,先把涉及到的几个概念解释一下,省下你们自己百度的时间。

集群,是指同一种组件的多个实例,形成的逻辑上的整体。

主从复制,是一种数据备份的方案。简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。

读写分离,是一种让数据库更稳定的的使用数据库的方法。
是在有从数据库的情况下使用,当主数据库进行对数据的增删改也就是写操作时,将查询的任务交给从数据库。实现读操作和写操作的分离,可以大大提升数据库并发承载量。

1. Redis的下载安装

请参考:Linux(centos7)安装配置并启动Redis全过程及make报错问题解决

2. 主从复制模型

在这里插入图片描述
我画了个草图,这是一个一主二从的简易集群模型,master用来写入,slave用来读数据,实现读写分离。我们接下来就是要实现这样一个集群系统。

3. 集群环境搭建

我这里使用了一台centos7的虚拟机来搭建这个demo,所需环境就是:
JDK,linux,Redis就够了。

复制多个redis.conf文件,启动redis服务端使用不同的配置文件启动,即可模拟多服务
1. 启动你的redis服务,输入info replication命令查看当前库的信息
127.0.0.1:6379> info replication
# Replication
role:master              //当前库为master
connected_slaves:0       //连接当前master的从机数目为0
master_replid:7b7cb8aa6a54e4fb2b717e59d6d626578c7b7f3f
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

集群部署后可以通过此命令查看信息。

2. 新建conf目录,将redis配置文件拷贝三次放进conf目录
[root@localhost bin]# mkdir conf
[root@localhost bin]# cp redis.conf conf/redis6380.conf
[root@localhost bin]# cp redis.conf conf/redis6381.conf
[root@localhost bin]# cp redis.conf conf/redis6382.conf

这样我们就得到了三份配置文件,下面我们对它们做一点更改

3. 更改主机配置文件

我们把redis6380.conf配置为主机(master)
进入conf目录,vim redis6380.conf编辑配置文件

  1. 首先我们需要更改端口号,与配置文件名称对应
    在这里插入图片描述
  2. 后台运行记得改成yes
    在这里插入图片描述
  3. 更改pid 文件名称,避免重复
    在这里插入图片描述
  4. 更改log文件名称避免重复
    在这里插入图片描述
  5. 更改rdb文件名,避免重复
    在这里插入图片描述
4. 更改从机配置文件,参考主机更改方式

和主机更改的地方全都是一样的,我们可以把端口分别设置成6381和6382。log文件和rdb文件同样改一下,避免重名。

如果你想直接通过配置文件配置主从复制,那么你在改从机配置文件的时候就应该加一条配置:slaveof 127.0.0.1 6380,指定他们的主机服务器地址。
这样他们就会直接以从机的身份启动,此时请忽略下面的输入slaveof步骤。

5. 分别启动

我们可以启动多个命令终端来分别开启他们,或者使用Xshell多个tab页面。
每一个执行以下命令(注意更改端口号):
在这里插入图片描述
全部启动之后,查看进程信息再次确认ps -ef|grep redis
在这里插入图片描述
上图说明全部的服务都已经成功开启了,集群环境搭建完毕。

4. 配置主从复制(slaveof)

现在我们可以在每个服务输入info replication,你会发现现在三台redis都是主机,而且他们之间没有任何联系。我们需要手动配置。

  • 打开6381的客户端,使用slaveof 127.0.0.1 6380命令,为它指定主机地址。然后info replication就会发现它的身份变成了从机。
    在这里插入图片描述
    同样的,为6382指定6380为主机,这样基本上已经形成了一主二从的局面,其中6380为共同的主机,6381/6382都是从机。
    大家可以在分别的客户端进行一点数据的读写操作,你会发现主机可读可写,从机只读,他们之间数据共享。比如你可以在master上set几个变量,然后使用slave的客户端去访问这些变量是能够访问到的。

补充

redis级联主从复制

redis不禁支持一主多从的主从复制,还支持下图所示的级联模式:
在这里插入图片描述
实现模式类似于上面所说的一主多从,就是slave服务也可以作为别人的master,用slaveof命令套娃就行了。

通过配置文件配置主从复制

使用配置文件配置主从复制服务只需要在从服务器配置文件中加一个配置就好,主服务不用做任何更改,配置如下:
slaveof [host] [port]
其中上式中的host是主服务器地址,port是主服务器端口,实例:
slaveof 127.0.0.1 6379

Redis主从复制原理

Redis主从复制同步过程分为全量同步和增量同步两种,主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。
那么什么是全量同步和增量同步呢?其实通俗的说就是主服务器把全部的数据同步给从服务器的过程是全量同步,可想而知,这个过程应该耗时又耗力;而增量同步就是从服务器只同步写入和更改的最新数据,主服务器每执行一个写入命令就发送给各个分机,实现增量复制,速度很快。
redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
以下是全量同步和增量同步的详细概念:

全量同步

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

  • 从服务器连接主服务器,发送SYNC命令;
  • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
    在这里插入图片描述

完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。

增量同步

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

注意点
如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。

扩展知识

Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝。需要清楚Redis主从复制的几点重要内容:

1)Redis使用异步复制。但从Redis 2.8开始,从服务器会周期性的应答从复制流中处理的数据量。
2)一个主服务器可以有多个从服务器。
3)从服务器也可以接受其他从服务器的连接。除了多个从服务器连接到一个主服务器之外,多个从服务器也可以连接到一个从服务器上,形成一个
图状结构。
4)Redis主从复制不阻塞主服务器端。也就是说当若干个从服务器在进行初始同步时,主服务器仍然可以处理请求。
5)主从复制也不阻塞从服务器端。当从服务器进行初始同步时,它使用旧版本的数据来应对查询请求,假设你在redis.conf配置文件是这么配置的。否则的话,你可以配置当复制流关闭时让从服务器给客户端返回一个错误。但是,当初始同步完成后,需要删除旧的数据集和加载新的数据集,在这个短暂的时间内,从服务器会阻塞连接进来的请求。
6)主从复制可以用来增强扩展性,使用多个从服务器来处理只读的请求(比如,繁重的排序操作可以放到从服务器去做),也可以简单的用来做数据冗余。
7)使用主从复制可以为主服务器免除把数据写入磁盘的消耗:在主服务器的redis.conf文件中配置“避免保存”(注释掉所有“保存“命令),然后连接一个配置为“进行保存”的从服务器即可。但是这个配置要确保主服务器不会自动重启

下一篇我们将为他们配置哨兵机制,以备主机宕机的特殊情况发生。

猜你喜欢

转载自blog.csdn.net/weixin_41674401/article/details/109625757