最近在学习 Redis,然后看到了 Redis 主从同步这块,正好手上有一个 CentOS 服务器和一台 Ubuntu 笔记本,并且都被我装了 Redis,那就试试呗。
主从同步:主从同步可以防止主机(Master)坏掉导致网站不能正常工作,这种方法即把从机(Slave)设置为主机即可。
redis 支持主从同步,数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制,并且配置很简单。Redis 主从同步的优点如下:
1、Master 可以有多个 Slave;
2、多个 Slave 连接到相同的 Master,Slave 还可以链接其他 Slave 形成图形结构;
3、 不会阻塞 Master。当一个或者多个 Slave 与 Master 进行初次同步数据的时候,Master 可以继续处理客户端的请求,相反,Slave 在初次同步数据时会阻塞从而不能处理客户端的请求(2.2版本后不再阻塞);
4、主从同步用来提高系统的伸缩性,比如多个 Slave 专门用于客户端的读请求,而 Master 用来收集数据,达到读写分离;
5、 可以在 Master 服务器上禁止数据的持久化(只需要注释配置文件 redis.conf 中所有 save 配置选项),只在 Slave 服务器上进行数据的持久化。
Redis 主从同步设置很简单,设置好 Slave 服务器后,Slave 自动和 Master 建立连接,发送 SYNC 命令(同步命令)。无论是第一次同步建立的连接还是连接断开后重新建立的链接,Master 都会启动一个后台进程,将内存数据以快照的方式写入文件中,同时 Master 主进程开始收集新的写命令并且缓存起来。Master 后台进程完成内存快照操作后,把数据文件发给 Slave,Slave 将文件保存到磁盘上,然后把数据加载到内存中。接着 Master 把缓存的命令发给 Slave,后续 Master 收到的写命令都通过开始建立的连接发送给 Slave。当 Master 与 Slave 断开连接,Slave 自动重新建立连接。如果 Master 同时收到多个 Slave 发来的同步请求,其只启动一个进程写数据库镜像,然后发送给所有的 Slave。
Redis 主从同步原理图示:
Redis 主从同步过程分两个阶段,第一阶段如下:
1) Slave 服务器主动链接到 Master 服务器。
2) Slave 服务器发送 SYNC 命令到 Master 服务器请求同步。
3) Master 服务器备份内存数据库到 rdb 文件。
4) Master 服务器把 rdb 去文件传输给 Slave 服务器。
5) Slave 服务器清空数据库数据,把 rdb 文件数据导入数据库中。
完成上面的第一阶段之后,接下来 Master 服务器把用户所有更改数据的操作,通过命令的形式转发给所有 Slave 服务器,Slave 服务器只需执行 Master 服务器发送过来的命令就可以达到同步的效果。
配置 Master、Slave:现在我有一个 Centos 服务器(IP:115.159.147.258)和一台 Ubuntu 笔记本,都安装了 Redis 服务,我将 Centos 配置为 Master,将 Ubuntu 配置为 Slave。
配置非常简单,只需在 Slave 的 Redis 配置文件中指定 Master 的 ip 和 port:
#格式:slaveof <masterip> <masterport> slaveof 115.159.147.258 6379 #设置slave为只读模式(默认也是只读的) slave-read-only yes重启 ubuntu 上的 Redis,使配置生效:
systemctl restart redis如果不想修改配置文件,我们还可以使用命令行的方式:
# Ubuntu 启动 redis 命令行(客户端 redis-cli) /usr/bin/redis-cli # 127.0.0.1:6379> slaveof 115.159.147.258 6379 OK使用命令行的方式就不用重启 Redis。
现在我的 Centos 就是 Master,Ubuntu 就是 Slave 了。
配置完了之后,我们可以分别在 Centos(Master)和 Ubuntu(Slave)分别执行命令:
info replication命令查看信息。
#Centos(Master)输出: # Replication role:master connected_slaves:1 slave0:ip=202.206.209.238,port=6379,state=online,offset=17358,lag=1 ....... #Ubuntu(Slave)输出: # Replication role:slave master_host:115.159.147.258 master_posr:6379 master_link_status:up .......从以上的输出中可以看出他们的关系了吧。。。。
测试: