07Redis入门指南笔记(主从复制、哨兵)

本文详细介绍了Redis的复制功能,包括主从复制的配置、原理和优化,如无硬盘复制、增量复制。在主从复制的基础上,文章还探讨了哨兵系统,解释了哨兵如何实现自动监控和故障恢复,包括哨兵的工作原理、实践操作和实现机制。哨兵通过监控主从节点状态,实现主库故障时的自动切换,确保系统的高可用性。
摘要由CSDN通过智能技术生成

        现实项目中通常需要若干台Redis服务器的支持:

        结构上,单个 Redis 服务器会发生单点故障,而且一台服务器需要承受所有的请求负载。这就需要为数据生成多个副本并分配在不同的服务器上;

        容量上,单个 Redis 服务器的内存非常容易成为存储瓶颈,所以需要进行数据分片。

        同时拥有多个 Redis 服务器后就会面临如何管理集群的问题,包括如何增加节点、故障恢复等操作。

 

一:复制(replication)

        为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此,Redis 提供了“复制”功能,当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。

 

1:配置

        在复制的概念中,数据库分为两类,一类是主库,另一类是从库。主库可以进行读写操作,当写操作导致数据变化时,会自动将数据同步给从库。从库一般是只读的,并接受主库同步过来的数据。

        一个主库可以拥有多个从库,而一个从库只能拥有一个主库,如下图所示:

        在 Redis 中使用复制功能非常容易, 只需要在从库的配置文件中加入:”slaveof  masterip masterport”即可,而主库无需进行任何配置。

 

        下面实现一个最简化的复制系统:在一台服务器上启动两个 Redis 实例,监听不同端口,其中一个作为主库,另一个为从库。

        首先不加任何参数来启动一个Redis实例作为主库,该实例默认监听6379端口。然后启动另一个Redis实例,加上”slaveof”参数作为从库,并让其监听6380端口:

# redis-server --port 6380 --slaveof 127.0.0.1 6379

        此时在主库中的任何数据变化都会自动地同步到从库中。打开终端A执行redis-cli连接到主库:

root@localhost:~# redis-cli
127.0.0.1:6379> 

        再打开终端B执行redis-cli连接到从库:

root@localhost:~# redis-cli -p 6380 
127.0.0.1:6380> 

        使用”info”命令来分别在终端A和终端B中获取Replication节点的相关信息,下面是终端A得到的信息:

127.0.0.1:6379>info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=379,lag=1
...

        可见,得到的角色是master,即主库,同时已连接的从库的个数为1。下面是终端B得到的信息:

127.0.0.1:6380>info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
...

        可见,得到的角色是slave,即从库,同时其主库的IP地址为127.0.0.1,端口为 6379。

 

        在终端A中使用set命令设置一个键的值:

127.0.0.1:6379> set foo heheh
OK

        此时在终端B中就可以获得该值了:

127.0.0.1:6380> get foo
"heheh"

        默认情况下,从库是只读的, 如果直接修改从库的数据会出现错误:

127.0.0.1:6380> set foo hi
(error) READONLY You can't write against a read only slave.

        可以通过设置从库的配置文件中的“slave-read-only”为”no”,使从库可写,但是对从库的任何更改都不会同步给任何其他数据库,并且一旦主库中更新了对应的数据就会覆盖从库中的改动,所以通常的场景下,不应该设置从库可写。

 

        配置多台从库的方法也一样,在所有从库的配置文件中都加上”slaveof”参数指向同一个主库即可。

        除了通过配置文件或命令行参数设置”slaveof”参数,还可以在运行时使用”slaveof”命令修改:

127.0.0.1:6380>info replication
# Replication
role:master
connected_slaves:0
...
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380>info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
...

        如果该数据库已经是其他主库的从库了,则slaveof命令会停止和原来数据库的同步,转而和新数据库进行同步。此外对于从库来说,还可以使用”slave  no  one”命令来使当前数据库停止接收其他数据库的同步并转换成为主库。

 

2:原理

        当一个从库启动后,会向主库发送”sync”命令。主库收到该命令后,开始在后台保存快照(即RDB持久化的过程),并将保存快照期间接收到的命令缓存起来。当快照完成后,Redis会将快照文件和所有缓存的命令发送给从库。从库收到后,会载入快照文件并执行收到的缓存命令。以上过程称为复制初始化。

        复制初始化结束后,主库每当收到写命令时就会将命令同步给从库,从而保证主从库数据一致。

 

        当主从库之间的连接断开重连后,Redis2.6及之前的版本会重新进行复制初始化(即主库重新保存快照并传送给从库),即使从库可能仅有几条命令没有收到,主库也必须要将数据库里的所有数据重新传送给从库。这使得主从库断线重连后的数据恢复过程效率很低下,在网络环境不好的时候这一问题尤其明显。

        Redis 2.8版的一个重要改进就是断线重连后,支持有条件的增量数据传输,当从库重新连接上主库后,主库只需要将断线期间执行的命令传送给从库,从而大大提高Redis复制的实用性。后续会详细介绍增量复制的实现原理以及应用条件。

 

        下面从具体协议角度,详细介绍复制初始化的过程。Redis服务器使用 TCP协议通信,可以使用 telnet 工具伪装成一个从库来与主库通信。首先在命令行中连接主库:<

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值