Redis主从复制总结

导读:本篇文章讲解 Redis主从复制总结,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1. 简介

主从复制指的是主机数据更新后根据配置和策略,自动同步到从机的Master/Slaver机制,Master以写为主,Slave以读为主。主从复制可以在一定程度上扩展Redis性能,Redis的主从复制和关系型数据库的主从复制类似,从机Salve能够精确的复制主机Master上的内容。实现了主从复制之后,一方面能够实现数据的读写分离从而降低主机的压力,另一方面也能实现数据的备份。

2. 数据库准备

1.为了方便区分,将redis.conf文件更名为redis6379.conf,然后把redis6379.conf再复制两份,分别为redis6380.conf和redis6381.conf。如下:

[root@localhost ~]# cd /myredis
[root@localhost myredis]# mv redis.conf redis6379.conf
[root@localhost myredis]# cp redis6379.conf redis6380.conf
[root@localhost myredis]# cp redis6379.conf redis6381.conf
[root@localhost myredis]# ls -l
总用量 212
-rw-rw-r--. 1 root root 61817 220 20:23 redis6379.conf
-rw-r--r--. 1 root root 61817 220 20:27 redis6380.conf
-rw-r--r--. 1 root root 61817 220 20:27 redis6381.conf

2.使用vi打开redis6379.conf,将如下配置对应命名加上6379方便区分和使用,如下:

port 6379
logfile "/myredis/redis6379.log "
dbfilename dump6379.rdb
pidfile /var/run/redis_6379.pid

另外两个配置文件redis6380.conf和redis6381.conf也对应着将上面的相关配置改为6380和6381。
3.打开三个终端窗口,在/usr/local/bin目录下分别启动三个redis实例,如下:

[root@localhost bin]# redis-server /myredis/redis6379.conf
[root@localhost bin]# redis-server /myredis/redis6379.conf
[root@localhost bin]# redis-server /myredis/redis6379.conf

4.对应输入如下命令,分别打开三个Redis实例的客户端:

[root@localhost bin]# redis-cli -p 6379
[root@localhost bin]# redis-cli -p 6380
[root@localhost bin]# redis-cli -p 6381

5.通过 ps -ef|grep redis查看redis相关进程 ,如下:

[root@localhost ~]# ps -ef|grep redis
root       4385      1  0 20:51 ?        00:00:01 redis-server 127.0.0.1:6379
root       4404   3950  0 20:51 pts/0    00:00:00 redis-cli -p 6379
root       4511      1  0 20:56 ?        00:00:00 redis-server 127.0.0.1:6380
root       4521   4408  0 20:56 pts/1    00:00:00 redis-cli -p 6380
root       4581      1  0 20:57 ?        00:00:00 redis-server 127.0.0.1:6381
root       4591   4524  0 20:57 pts/2    00:00:00 redis-cli -p 6381
root       4698   4646  0 21:01 pts/3    00:00:00 grep --color=auto redis

这样就成功配置好了三个Redis实例。

3. 从库配置

假设在这三个实例中,端口6379的是主库,即master;6380和6381是从库,即slave。
通过如下命令在6380和6381的实例中进行配置:

127.0.0.1:6380> slaveof 127.0.0.1 6379
OK

也可以在从库的配置文件中添加如下配置,这样重新启动担任salve的服务器也会自动连上主库。

slaveof 127.0.0.1 6379

这样就配置好了从库,通过INFO replication命令可以查看到每个实例的状态,主库的状态如下:
在这里插入图片描述
我们可以看到这是主库,连接着两个从库,并有两个从库的地址、端口等信息。
在端口6380的从库上执行INFO replication,部分显示信息如下:
在这里插入图片描述
可以看到这是从库以及它的信息、主库的地址和端口信息。

4. 注意点

  1. 如果主机已经运行了一段时间了,并且存储了一些数据了,此时从机连上来后,从机就会将主机上所有的数据进行备份,而不是仅仅备份连接后主机上更新的数据。
  2. 配置了主从复制后,主机上可读可写,但是从机只能读取不能写入,会报如下错误:(可以通过修改redis.conf中 slave-read-only 的值让从机也可以执行写操作)。
(error) READONLY You can't write against a read only replica.
  1. 在整个主从结构运行过程中,如果主机不幸挂掉,主机重启之后依然是主机,主从复制操作也能够继续进行。
  2. 从机挂了后再次连接,如果配置文件没有配置主机信息,则需要再次运行命令来重新连接主机,连接成功后即会将主机上的所有数据进行备份,如下:
127.0.0.1:6380> shutdown save
not connected> exit
[root@localhost bin]# redis-server /myredis/redis6380.conf
[root@localhost bin]# redis-cli -p 6380
127.0.0.1:6380> get k1
"v1"
127.0.0.1:6380> get k2
(nil)
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> get k2
"v2"

5. 复制原理

每一个master都有一个replication ID,这是一个较大的伪随机字符串,标记了一个给定的数据集。每个master也持有一个偏移量,master将自己产生的复制流发送给slave时,发送多少个字节的数据,自身的偏移量就会增加多少,目的是当有新的操作修改自己的数据集时,它可以以此更新slave的状态。复制偏移量即使在没有一个slave连接到master时,也会自增,所以基本上每一对给定的Replication ID, offset都会标识一个master数据集的确切版本。当slave连接到master时,它们使用PSYNC命令来发送它们记录的旧的master replication ID和它们至今为止处理的偏移量。通过这种方式,master能够仅发送slave所需的增量部分。但是如果master的缓冲区中没有足够的命令积压缓冲记录,或者如果slave引用了不再知道的历史记录(replication ID),则会转而进行一个全量重同步:在这种情况下,slave会得到一个完整的数据集副本,从头开始。

简单来说,就是以下几个步骤:

  1. slave启动成功连接到master后会发送一个sync命令。
  2. Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令。
  3. 在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步。
  4. 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
  5. 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。
  6. 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。

6. 接力模式

通过在端口为6381的实例上执行如下命令,让6381从6380实例上复制数据,如下:

127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK

查看6381的信息,如下:
在这里插入图片描述
查看6380的信息,如下:
在这里插入图片描述
这样配置后主从结构,如下图所示:
在这里插入图片描述

7. 哨兵模式

7.1 基本介绍

上面讲到的两种主从模式会存在一个问题,那就是当主机出现故障后,就会发生群龙无首的情况。
而哨兵模式就是在后台监控主机是否故障,故障发生时,能够从从机中根据投票数选出一个从机来担任主机,这样就不用我们每次去手动重启主机或者配置从机为主机了。

7.2 哨兵模式的配置

修改主从模式为一主二从的模式,将6381改为6379的从机,如下:

127.0.0.1:6381> slaveof 127.0.0.1 6379
OK

1.在配置文件所在的目录下,新建sentinel.conf文件

[root@localhost ~]# cd /myredis
[root@localhost myredis]# touch sentinel.conf

2.sentinel.conf文件中添加如下配置:

sentinel monitor myMaster 127.0.0.1 6379 1

其中myMaster是给要监控的主机取的名字,后面是主机地址和端口号,最后面的1表示有多少个sentinel认为主机挂掉了,就进行切换,配置完成后,输入如下命令启动哨兵:

[root@localhost myredis]# cd /usr/local/bin
[root@localhost bin]# redis-sentinel /myredis/sentinel.conf

启动成功可以看到,
在这里插入图片描述
启动成功后,关闭master,观察哨兵窗口输出的日志,如下:
在这里插入图片描述
可以看到,6380被选为主机,此时本为主机的6379再次启动,查看6380信息如下:
在这里插入图片描述
可以看到主机依然是6380,6379成为了从机。

8. 主从复制的缺点

由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。对于主从复制导致的延迟问题,可以通过搭建Redis集群来解决。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/44347.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!