linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux数据库 >

关于 Redis 主从同步初认识

时间:2017-05-16  来源:未知  作者:linuxsir首页

前言:

最近在学习 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 主从同步原理:

Redis 主从同步设置很简单,设置好 Slave 服务器后,Slave 自动和 Master 建立连接,发送 SYNC 命令(同步命令)。无论是第一次同步建立的连接还是连接断开后重新建立的链接,Master 都会启动一个后台进程,将内存数据以快照的方式写入文件中,同时 Master 主进程开始收集新的写命令并且缓存起来。Master 后台进程完成内存快照操作后,把数据文件发给 Slave,Slave 将文件保存到磁盘上,然后把数据加载到内存中。接着 Master 把缓存的命令发给 Slave,后续 Master 收到的写命令都通过开始建立的连接发送给 Slave。当 Master 与 Slave 断开连接,Slave 自动重新建立连接。如果 Master 同时收到多个 Slave 发来的同步请求,其只启动一个进程写数据库镜像,然后发送给所有的 Slave。

Redis 主从同步原理图示:

关于 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
.......

从以上的输出中可以看出他们的关系了吧。。。。

测试:

我们在 Master 上存一些数据,看看在 Slave 中是否已经同步了。

# Centos :
127.0.0.1:6379> set name lsgogroup
OK
127.0.0.1:6379> set age 20
OK

然后在 Slave 中读取数据

# Ubuntu:
127.0.0.1:6379> get name
"lsgogroup"
127.0.0.1:6379> get age
"20"

可以看出,数据同步成功,你可以在 Master 中修改一下数据,看看 Slave 中是否会变化。

PS:如果你尝试在 Slave 中修改数据,比如执行 set name lsgozj,看看会不会提示:(error)READONLY You can’t write against a read only slave。

为什么会这样?

因为我们前面修改配置文件时设置了 slave-read-only yes,其实默认也是只读的。为什么要设置 Slave 为只读呢?因为这是为了实现读写分离:多个 Slave 专门用于客户端的读请求,而 Master 用来收集数据。

升级 Slave 为 Master:

Master 不可用的情况下,停止 Master,将 Slave 的设定无效化后,Slave 升级为 Master。

就是说当 Master 不可用的时候,我们使某台 Slave 服务器不再作为从服务器,由于该台 Slave 服务器保存的数据基本上是最新的,可以把他作为 Master 来用。

通过注释前面的配置项然后从其或者在命令行运行 slaveof no one 达到将 Slave 升级为 Master。

更多的关于 Redis 主从同步的只是大家可以参考《http://www.linuxidc.com/Linux/2017-05/143591p2.htm 》

下面关于Redis的文章您也可能喜欢,不妨参考下:

Ubuntu 14.04下Redis安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis主从复制基本配置 http://www.linuxidc.com/Linux/2015-03/115610.htm

CentOS 7下Redis的安装与配置 http://www.linuxidc.com/Linux/2017-02/140363.htm

Ubuntu 14.04安装Redis与简单配置 http://www.linuxidc.com/Linux/2017-01/139075.htm

Ubuntu 16.04环境中安装PHP7.0 Redis扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

Redis 单机&集群离线安装部署 http://www.linuxidc.com/Linux/2017-03/141403.htm

CentOS 7.0 安装Redis 3.2.1详细过程和使用常见问题 http://www.linuxidc.com/Linux/2016-09/135071.htm

Ubuntu 16.04环境中安装PHP7.0 Redis扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

Ubuntu 15.10下Redis集群部署文档 http://www.linuxidc.com/Linux/2016-06/132340.htm

Redis实战 中文PDF http://www.linuxidc.com/Linux/2016-04/129932.htm

友情链接