1.测试环境redis
master: 127.0.0.1 6379安全
slave1: 127.0.0.1 6479app
slave2: 127.0.0.1 6579测试
master-sentinel: 127.0.0.1 26379ui
slave1-sentinel: 127.0.0.1 26479spa
slave2-sentinel: 127.0.0.1 26579server
2.下载安装redis 2.8.3排序
cdip
wget http://download.redis.io/releases/redis-2.8.3.tar.gzget
tar –zxvf redis-2.8.3.tar.gz
cd redis-2.8.3
make;make install(此处可用PREFIX参数将redis安装到其余目录)
3.配置测试环境
----建立目录:
cd /usr/local
mkdir redis_cluster
mkdir redis_cluster/master_6379
mkdir redis_cluster/slave_6479
mkdir redis_cluster/slave_6579
----配置redis:
master:
cp –a –R –p ~/redis-2.8.3/redis.conf ./redis_cluster/master_6379/
cp –a –R –p ~/redis-2.8.3/sentinel.conf ./redis_cluster/master_6379/6379-sentinel.conf
vi ./redis_cluster/master_6379/redis.conf(将对应配置修改为以下)
-------------------------------------------------------------------------------------------
####master redis.conf
####端口
port 6379
####受权密码,在安全的环境中能够不设置
requirepass luyx30
masterauth luyx30
####注释指令重命名,若已配置则不须要修改
#rename-command
####开启AOF
appendonly yes
save “”
slave-read-only yes
-------------------------------------------------------------------------------------------
vi ./redis_cluster/master_6379/6379-sentinel.conf
-------------------------------------------------------------------------------------------
####master sentinel.conf
##sentinel实例之间的通信端口
port 26379
####sentinel须要监控的master信息:<mastername> <masterIP> <masterPort> <quorum>.
####<quorum>应该小于集群中slave的个数,只有当至少<quorum>个sentinel实例提交"master失效" 才会认为master为ODWON("客观"失效) .
sentinel monitor mymaster 127.0.0.1 6379 2
####受权密码,在安全的环境中能够不设置
sentinel auth-pass mymaster luyx30
####master被当前sentinel实例认定为“失效”(SDOWN)的间隔时间
sentinel down-after-milliseconds mymaster 30000
####当新master产生时,同时进行“slaveof”到新master并进行同步复制的slave个数。
##在salve执行salveof与同步时,将会终止客户端请求。
##此值较大,意味着“集群”终止客户端请求的时间总和和较大。
##此值较小,意味着“集群”在故障转移期间,多个salve向客户端提供服务时仍然使用旧数据。
sentinel parallel-syncs mymaster 1
####failover过时时间,当failover开始后,在此时间内仍然没有触发任何failover操做,当前sentinel将会认为这次failoer失败。
sentinel failover-timeout mymaster 900000
-------------------------------------------------------------------------------------------
slave1:
cp –a –R –p ~/redis-2.8.3/redis.conf ./redis_cluster/slave_6479/
cp –a –R –p ~/redis-2.8.3/sentinel.conf ./redis_cluster/slave_6479/6479-sentinel.conf
vi ./redis_cluster/slave_6479/redis.conf(将对应配置修改为以下)
-------------------------------------------------------------------------------------------
####slave1 redis.conf
port 6479
slaveof 127.0.0.1 6379
##-----------其余配置和master redis.conf保持一致-----------##
-------------------------------------------------------------------------------------------
vi ./redis_cluster/slave_6479/6479-sentinel.conf
-------------------------------------------------------------------------------------------
####slave1 sentinel.conf
port 26479
##--------其余配置和master sentinel.conf保持一致-------##
-------------------------------------------------------------------------------------------
slave2:
cp –a –R –p ~/redis-2.8.3/redis.conf ./redis_cluster/slave_6579/
cp –a –R –p ~/redis-2.8.3/sentinel.conf ./redis_cluster/slave_6579/6579-sentinel.conf
vi ./redis_cluster/slave_6579/redis.conf(将对应配置修改为以下)
-------------------------------------------------------------------------------------------
####slave1 redis.conf
port 6579
slaveof 127.0.0.1 6379
##-----------其余配置和master redis.conf保持一致-----------##
-------------------------------------------------------------------------------------------
vi ./redis_cluster/slave_6579/6579-sentinel.conf
-------------------------------------------------------------------------------------------
####slave1 sentinel.conf
port 26579
##--------其余配置和master sentinel.conf保持一致-------##
-------------------------------------------------------------------------------------------
----启动查看:
注意:首次构建sentinel环境时,必须首先启动master。
启动master和master-sentinel:
redis-server --include /usr/local/redis_cluster/master-6379/redis.conf
redis-sentinel /usr/local/redis_cluster/master-6379/6379-sentinel.conf
克隆会话,启动slave1和slave1-sentinel:
redis-server --include /usr/local/redis_cluster/slave-6479/redis.conf
redis-sentinel /usr/local/redis_cluster/slave-6479/6479-sentinel.conf
克隆会话,启动slave2和slave2-sentinel:
redis-server --include /usr/local/redis_cluster/slave-6579/redis.conf
redis-sentinel /usr/local/redis_cluster/slave-6579/6579-sentinel.conf
查看master的状态:
redis-cli -h 127.0.0.1 -p 6379
查看slave的状态:
redis-cli –h 127.0.0.1 –p 6479
4.测试:
----场景1:slave宕机
关闭slave1:
查看sentinel状态:
查看master的Replication信息:
此时只存在一个slave。
----场景2:slave恢复
从新开启slave1:
redis-server /usr/local/redis_cluster/slave-6479/redis.conf
查看sentinel状态:
sentinel能快速的发现slave加入到集群中:
查看master的Replication信息:
----场景3:master宕机
master- sentinel做为master 1的leader,会选取一个master 1的slave做为新的master。slave的选取是根据一个判断DNS状况的优先级来获得,优先级相同经过runid的排序获得,但目前优先级设定 还没实现,因此直接获取runid排序获得slave 1。
然 后发送命令slaveof no one来取消slave 1的slave状态来转换为master。当其余sentinel观察到该slave成为master后,就知道错误处理例程启动了。sentinel A而后发送给其余slave slaveof new-slave-ip-port 命令,当全部slave都配置完后,sentinel A从监测的masters列表中删除故障master,而后通知其余sentinels。
关闭master:
查看sentinel状态:
6379-sentinel:
自动将slave2即6579切换成master,原来的master变成slave。
6579-sentinel:
显示了failover的过程:
----场景4:master恢复
从新启动原来的master:
redis-server /usr/local/redis_cluster/master-6379/redis.conf
查看sentinel状态:
原来的master自动切换成slave,不会自动恢复成master:
测试完成。
注意:若在sentinel已选出新主但还没有完成其它实例的reconfigure以前,重启old master,则整个系统会出现没法选出new master的异常。