Redis 主从同步的过程
配置好 slave 服务器连接的master后, slave 会建立和 master 的连接,然后发送 sync 命令。无论是第一次同步建立的连接还是连接断开后的重新连接, master 都会启动一个后台进程,将数据库快照保存到文件中.同时 master 主进程会开始收集新的写命令并缓存起来。当后台进程完成写文件后, master 就将快照文件发送给 slave , slave 将文件保存到磁盘上,然后加载到内存将数据库快照 恢复 到 slave 上。slave完成快照文件的恢复后, master 就会把缓存的命令都转发给 slave,slave更新内存数据库 。后续 master 收到的写命令都会通过开始建立的连接发送给 slave 。从 master 到 slave 的同步数据的命令和从 client到master 发送的命令使用相同的协议格式。当 master 和 slave 的连接断开时, slave 可以自动重新建立连接。如果 master 同时收到多个 slave 发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有 slave 。
Redis 主从同步的特点
主从同步具有明显的分布式缓存特点,主要包括这些方面:
1 )一个 master 可以有多个 slave,一个slave也可以有多个slave ;
2 ) slave 不仅可以连接到 master , slave 也可以连接其他 slave 形成树状结构;
3 )主从同步不会阻塞 master,但是会阻塞slave 。也就是说当一个或多个 slave 与 master 进行初次同步数据时, master 可以继续处理 client 发来的请求。相反 slave 在初次同步数据时则会阻塞不能处理 client 的请求;
4 )主从同步可以用来提高系统的可伸缩性,我们可以用多个 slave 专门处理 client 的读请求, 也可以用来做简单的数据冗余或者只在slave上进行持久化从而提升集群的整体性能。
主从复制优化要点:
Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。
为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<--Slave1<--Slave2<--Slave3
Redis主从配置步骤:
1、编辑主从配置文件
主配置文件:
include ./redis.conf daemonize yes pidfile /var/run/redis.pid port 6379 bind 192.168.10.128 logfile /opt/redis/logs/redis.log requirepass 123456
从配置文件:
include ./redis.conf daemonize yes pidfile /var/run/redis2.pid port 6380 bind 192.168.10.128 logfile /opt/redis/logs/redis2.log slaveof 192.168.10.128 6379 masterauth 123456 requirepass 234567
2、启动主Redis:
cd /opt/redis/bin
redis-server ./local-redis.conf
tail -f /opt/redis/logs/redis.log查看日志
3、启动从Redis:
cd /opt/redis/bin2
redis-server ./local-redis.conf
tail -f /opt/redis/logs/redis2.log查看日志
4、测试数据同步:
终端一:
cd /opt/redis/bin
redis-cli -h 192.168.10.128 -p 6379 -a 123456
set cjm 123
get cjm
终端二:
cd /opt/redis/bin2
redis-cli -h 192.168.10.128 -p 6380 -a 234567
get cjm
主从切换的步骤:
停止主Redis
redis-cli -h 192.168.10.128 -p 6379 -a 123456
shutdown
将从redis设成主redis
redis-cli -h 192.168.10.128 -p 6380 -a 234567
slaveof NO ONE
测试从redis是否切换为主redis
set cjm 111
get cjm
原来的主redis恢复正常了,要重新切换回去
将现在的主redis的数据进行保存
redis-cli -h 192.168.10.128 -p 6380 -a 234567
save
将现在的主redis根目录下dump.rdb文件拷贝覆盖到原来主redis的根目录
cp -frp /opt/redis/bin2/dump.rdb /opt/redis/bin/dump.rdb
启动原来的主redis
redis-server ./local-redis.conf
tail -f /opt/redis/logs/redis.log
在现在的主redis中切换
slaveof 192.168.10.128 6379