您的位置:首页 > 数据库 > Redis

Redis主从复制原理及设置

2017-07-15 01:06 686 查看
表:从服务器连接主服务器的步骤
步骤
主服务器操作
从服务器操作
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。因此,下面的补充点哨兵功能也是可用的。
补充一点:上面的策略可以利用哨兵,需要的可以去研究下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: