Redis主从复制原理及设置

本文详细介绍Redis主从配置步骤及方法,包括如何设置从服务器、实现读写分离,以及应对读多写少情况的策略。同时探讨了主从同步过程中的注意事项,如关闭主服务器持久化的影响和主从服务器故障恢复方案。

表:从服务器连接主服务器的步骤

步骤

主服务器操作

从服务器操作

1

(等待命令进入)

连接(或者重连接)主服务器,发送SYNC命令

2

开始执行BGSAVE,并使用缓冲区记录BGSAVE之后执行的所有写命令

根据配置选项来决定是否使用现有的数据(如果有的话)来处理客户端的命令请求,还是向发送请求的客户端返回错误

3

BGSAVE执行完毕,向从服务器发送快照文件,并在发送期间继续使用缓冲区记录被执行的写命令

丢弃所有旧数据(如果有的话),开始载入主服务器发来的快照文件

4

快照文件发送完毕,开始向从服务器发送存储在缓冲区里面的写命令

完成对快照文件的解释操作,像往常一样开始接受命令请求

5

缓冲区存储的写命令发送完毕;从现在开始,每执行一个写命令,就向从服务器发送相同的写命令

执行主服务器发来的所有存储在缓冲区里面的写命令;并从现在开始接收并执行主服务器传来的每个写命令

这里主从同步是利用快照,如果主Redis快照持久化和AOP持久化都无,则此时既无dump.rdb文件和apendonly.aof文件。当我们启动主Redis后,两个文件都没有生成。此时,当我们配置好后从redis,当我们启动从redis后,主redis变开始执行bgsave命令,其他的步骤见表:从服务器连接主服务器的步骤。(当完成后,在主从配置的目录下会多了一个dump.rdb文件)


如何设置从服务器?

两种方法:

(1)配置文件redis.conf中设置,比如:slaveof 192.168.1.119 6379(slave masterIpmasterPort)

(2)在redis-cli客户端执行:slaveof 192.168.1.119 6379 ,但是如果关闭重启后,就失效了。

Redis主从服务器,读写分离

至于读写分离,只需在业务上进行划分,即代码上控制主服务器只负责写,而从服务器只负责读。

Reids主从与主从从链

如何应对读多写少的情况?

Redis通常是作为缓存供数据读,因此读的压力较大,很容易想到,通过多台服务器同步相同的数据,来分散读压力。

一个简单的做法是:设置主从结构,即一个主Redis,多个从Redis。然而,由上面的主从同步的过程,可知会有网络IO和磁盘IO的问题,因此,过多的从Redis必然是不合适的。

改进的做法:在上面的主从结构下,在设置从从结构,减少主Redis的IO,示例图如下:


关于从库中redis.conf的只读属性:在redis.conf中默认从库是设置为只读的,如下:


如果我们更改为no的话,那么从库的Redis也可以进行写数据,根据Redis主从复制的原理,可以知道,从库写的数据不会同步到自身附属的主数据库,但是会同步到自身的从数据库。因此,通常不建议将从数据库slave-read-only no,设置为no。

问题:由于主服务器的写压力也可能较大,因此可以关闭主服务器的持久化,而让从服务器来执行持久化,这样会有什么问题?

答:主从同步的时候,如果主库关闭持久化,而从库开启持久化,那么确实可以缓解主库的压力,而从库来持久化数据,但是如果此时主库宕机,由主从同步的原理可知,在同步过程中,从库持久化的文件将被丢弃,从而主从数据库还是没有数据。


问题:Redis主或者从宕机如何恢复?

(1)从库Redis宕机处理如下:

如果是从库宕机的话,在redis.conf中配置了slaveof masterIp masterPort,则只需要再次启动该台的redis,命令为:redis-server redis.conf(其中,redis.conf文件为该台的配置文件);若主从关系不是通过配置文件配置的(即redis.conf中注释了主从关系),则再次启动,需要在该台的客户端中,输入:slaveof masterIp masterPort即可。

(2)主库Redis宕机处理如下:

再次启动该主库的redis-server redis.conf,然后从库会自动加进来。(即:主从关系中,既可以先启动主库,然后从库启动后会自动加载进来;也可以先启动从库,然后,主库启动后,从库会加载进来。原理:应该是从库定期回去ping连接主库)

PS:网络上说,先把某台从redis,执行:slaveof no one,即变成主redis,再把宕机的redis执行slavof masterIp masterPort,将该台设置为从Redis。问题:在实际中,某台作为主reids是负责写的,而某台作为从redis是负责读的,ip地址是固定的,实际开发中已经写死了ip地址。一个解决的办法:在客户端写过程中,尝试所有的redis的写,如果成功,说明这台是主redis,则其余是从redis。因此,下面的补充点哨兵功能也是可用的。

补充一点:上面的策略可以利用哨兵,需要的可以去研究下。


Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 Redis支持主从同步数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。   本课程主要讲解以下内容:1. Redis的基本使用2. Redis数据库的数据类型3. Redis数据数据管理4. Redis主从复制5. Redis数据库的持久性6. Redis的高可靠性和集群7. Redis的优化和性能测试8. Redis服务器的维护和管理9. Redis服务器的常见问题排错 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值