主从同步可以防止主机坏掉而导致网站不能正常运行。通过主从同步可以允许多个slave server跟master server拥有相同的数据库副本。
redis主从同步的优点
- master 可以有多个slave
- 多个slave除了可以连接到相同的master,还可以连接到其他slave,当master服务器意外dump之后,这台slave就可以充当master的角色
- 主从同步不会阻塞redis处理client的请求。当一个或多个slave与master进行初次同步数据时,master可以继续处理客户端的请求。同样的,slave初次同步的时候也不会阻塞。
- 提高系统的伸缩性,比如多个slave专门用于客户端的读请求
- 在master server上禁止数据持久化(注释配置文件中所有的save配置选项),只在slave server上进行数据持久化
主从同步的配置
redis的同步比较简单,在配置文件中修改slaveof选项,如果master设置了密码还需要修改masterauth选项,格式为
slave of <主机ip> <主机端口>
masterauth 主机密码
我这里就简单的cp一下配置文件改一下配置,改端口号为6378模拟下过程。
更改slave配置文件中的slaveof与masterauth:
在redis2.6以后的版本中,slave server默认是只读模式,如果需要slave 可写,就更改conf中的slave-read-only 为no。
开启master跟slave服务器,登录master服务器并随机输入一些数据
再登录slave服务器,使用-p port登录,检查slave中的数据
发现数据已经同步。保持两个客户端都打开,在master中添加新数据,查看slave中是否同步:
master中:
slave中:
分别在master与slave中执行info命令,查看replication:
由此可看,主从同步成功。
主从同步的原理及流程
设置好slave并启动服务器之后,slave自动与master建立连接,发送sync命令。无论是否是第一次同步建立的连接,master都会启动一个后台进程,把内存数据以快照的方式写入文件,同时master主进程开始收集新的写命令并且缓存起来。master后台进程完成快照操作后就会把数据发送给slave,slave把数据保存在磁盘上然后再加载到内存中。当这一系列的操作完成之后,master就会把缓存的命令发给slave,后续master收到的写命令都会通过开始建立的连接发送给slave。当master与slave断开连接,slave自动重新建立连接。如果master同时收到多个slave发来的同步请求,master只启动一个进程写数据库镜像,然后发送给所有的slave。
主从同步的流程:
- slave server连接到master server
- slave server发送sync命令到master请求同步
- master server启动一个后台进程把数据以快照的方式备份到rdb文件,同时master主进程会开始收集新的写命令到缓存
- master server把备份好的rdb文件发送给slave server
- slave server清空服务器数据,把接收到的rdb文件写入到磁盘中
- slave server完成写入操作后,master会将缓存的写命令发送到slave server,slave执行接受到的命令之后,就可以达到同步的效果