天天看点

redis之二 主从复制、sentinel集群搭建

redis中文官网:

replication

sentinel

一、主从复制

通过redis的持久化功能,redis可以保证服务器重启也不会损失(或少量损失)数据。但数据保存在单台redis服务器上,如果这台服务器出现硬盘故障,则会导致数据丢失。

为了避免单点故障,可以将数据库复制多个副本保存在不同的服务器上,这样即使一台服务器故障,其它服务器仍可以提供服务。

redis提供了复制(replication)功能,可以在一台服务器数据更新后,自动将新的数据同步其它服务器上。

主从复制将服务器分为两类,一类是master,另一类是slave。主数据库可以读写,而从数据库通常是只读的,

redis之二 主从复制、sentinel集群搭建

主从复制的配置很简单,只需在从库的配置中加入”slave of 主库ip 主库端口”即可,主库无需进行任何配置。

服务器 端口 角色
127.0.0.1 6379 master
127.0.0.1 6380 slave
127.0.0.1 6381 slave
配置
【windows下请将redis.windows.conf文件复制一份改名为redis.conf后操作。】
#分别修改各自配置文件的端口
port 
port 
port 

#然后在两台slave库都加入以下配置
slave of  

#####这样就已经配置好了######

启动
#启动三台数据库
redis-server

#然后分别启动三台数据库的客户端
redis-cli 
redis-cli -p 
redis-cli -p 
#查看各库的信息。注意查看主库输出中role为master,两个从库为slave。
info replication

验证
#在主库上插入
set myname "hello kitty"

#三个库都获取,如果都能获取值"hello kitty",则说明配置成功
get myname

其它
#从库默认为是只读的,若对从库进行set,会发现报错:(error) READONLY You can't write against a read only slave.
#对应配置项为slave-read-only。修改该配置没意义,因为主库更新时进行数据同步会覆盖该值。
set myname "hello world"
           

二、sentinel集群

参考官网Redis 的 Sentinel 文档

主从复制模式中,当主库down掉后,可以手动将从库提升为主库来继续提供服务。但是手动的方式毕竟比较麻烦,需要人工介入,难以实现自动化。为此,redis在2.8版本中提供了哨兵工具来实现自动化的监控和故障恢复功能,哨兵是一个独立的进程。在生产环境下,为了高可用,哨兵通常也不会只有单节点,而是有多个。

需要再次强调的是,哨兵只是一个单独的进程。所以只需要在redis节点单独再启动一个哨兵进程即可。(有些博客演示时是把哨兵单独搞成个redis节点的形式,容易误导人)
服务器 端口 角色 是否部署哨兵 哨兵端口
127.0.0.1 6379 master 部署哨兵 26379
127.0.0.1 6380 slave 部署哨兵 26380
127.0.0.1 6381 slave 部署哨兵 26381
#说明
因为是在单台机器上演示,所以三个哨兵端口不能一样。
如果是三台服务器,则哨兵端口可以设为同一个,默认是

配置哨兵时,只需配置其监视主库即可,哨兵会自动发现主库对应的从库。

这里在前面主从复制的基础上,为每个redis节点都部署一个哨兵。
配置前首先确保按照前面主从复制的步骤配置好了主从复制模式。
           

1.开始配置

【linux下redis自带了sentinel.conf文件,直接配置下列项即可。
windows下请先创建一个sentinel.conf文件,然后在里面配置下列项】


#哨兵端口
port 
#监视一个主服务器(redis主节点), 这个主服务器的名称为mymaster,IP地址为127.0.0.1,端口为6379。 
#而将这个主服务器判断为失效至少需要2个Sentinel同意。只要同意Sentinel的数量不达标,自动故障迁移就不会执行。
sentinel monitor mymaster   
#
sentinel down-after-milliseconds mymaster 
#
sentinel failover-timeout mymaster 
#
sentinel parallel-syncs mymaster 
           

2.启动redis集群

#启动三台redis
redis-server
           

3.依次启动三个哨兵

使用以下命令依次启动26379,26380,26381三个哨兵,注意观察输出

#下面依次启动三个哨兵进程(windows下没有redis-sentinel命令,不能用后者启动) 
  redis-server sentinel.conf --sentinel (Linux或Windows)
或redis-sentinel sentinel.conf          (仅Linux)
           

我这里仅观察26379哨兵的界面输出。其它哨兵的情况类似。

redis之二 主从复制、sentinel集群搭建
redis之二 主从复制、sentinel集群搭建
redis之二 主从复制、sentinel集群搭建

从输出界面的变化可以发现,哨兵启动后可以自动发现隶属于其监视的master节点下的slave节点,同时哨兵间也可以相互发现。

我们还可以使用info命令查看一下哨兵的信息

#连接26379哨兵
redis-cli -p 
#查看sentinel信息
info sentinel
           

到这里,哨兵集群的配置就算成功了。

4.演示故障迁移

实验目的:干掉master节点,观察哨兵选举将slave节点提升为master节点

windows下直接关闭master节点的命令行界面

Linux下使用kill杀进程
#查看master节点的pid
ps -ef|grep redis
#kill掉进程 
kill - [上面的pid]
           

然后等待一段时间(默认为,由sentinel.conf中的配置项决定),观察其它的哨兵命令行界面窗口。

redis之二 主从复制、sentinel集群搭建

最终,我们发现哨兵通过选举将6381这台slave节点提升为了master节点。

具体的选举过程和更多内容可以参考官方文档Redis 的 Sentinel 文档

继续阅读