环境介绍:php
实现的原理redis
在master和backup服务器分别安装哨兵和keepalived,master的优先级为100,backup的优先级为99,在salve服务器上配置vrrp_script检查脚本规则,检查slave当前的角色状态,一旦slave的redis角色状态为master,就把slave的优先级加2变为101,使其得到vip的权限;vim
当master的redis服务挂掉后,哨兵会将slave提高为新的master,slave检查角色状态为master时将优先级加2得到vip,当原来master的redis服务起来后哨兵将其做为slave加入到主从复制centos
当变为master的slave节点上redis服务挂掉后,哨兵会将redis的master设置为原来的master节点,vrrp_script检查本身的redis不是master时,将优先级减2变为99,原来的master优先级比slave优先级高,原来的master得到vip权限bash
如下操做主从服务器步骤同样,这里只安装一次服务器
1、安装redis和哨兵服务ide
一、下载redis服务软件包到服务器,解压后并编译安装(主从步骤同样,这里只安装一次)spa
[root@centos01 /]# tar xzvf redis-3.2.9.tar.gz [root@centos01 /]# cd redis-3.2.9/ [root@centos01 redis-3.2.9]# make && make ×××tall [root@centos01 redis-3.2.9]# ./utils/×××tall_server.sh Welcome to the redis service ×××taller ##一路回车 Installation successful!
二、修改redis配置文件,修改成后台运行、监听全部地址(其余参数按需修改),重启redis服务rest
[root@centos01 redis-3.2.9]# vim /etc/redis/6379.conf bind 0.0.0.0 daemonize yes [root@centos01 redis-3.2.9]# /etc/init.d/redis_6379 restart
三、复制哨兵的配置文件和启动文件到redis安装目录日志
[root@centos01 redis-3.2.9]# cp sentinel.conf /etc/redis/ [root@centos01 redis-3.2.9]# cp src/redis-sentinel /etc/redis/
2、设置redis主从复制,并配置哨兵监控
一、登陆slave-redis服务器,将master设置为192.168.2.225
[root@slave /]# redis-cli 127.0.0.1:6379> SLAVEOF 192.168.2.225 6379 ##设置master为2.225 127.0.0.1:6379> INFO Replication
三、修改master和slave服务器的sentinel.conf配置文件(master和slave配置一致)
##修改master的哨兵文件 [root@master /]# cd /etc/redis/ [root@master /]# vim /etc/redis/sentinel.conf port 26379 dir "/tmp" sentinel monitor mymaster 192.168.2.225 6379 1 #(指定监控的master地址和端口号,1表示多个sentinel赞成才进行主从切换) sentinel down-after-milliseconds mymaster 4000 #(超过多少毫秒链接不到master认定为master死掉) sentinel failover-timeout mymaster 18000 #(当主从切换多久后认为主从切换失败) daemonize yes #(后台运行) logfile "/var/log/redis_sentinel.log" #(日志文件保存路径) [root@master redis]# ./redis-sentinel sentinel.conf #启动哨兵服务
3、配置keepalived实现高可用
一、使用yum方式安装keepalived软件包(master和slave都安装)
[root@master redis]# yum ×××tall -y keepalived [root@master redis]# ./redis-sentinel sentinel.conf #启动哨兵服务
二、修改keepalived配置文件
Master配置文件内容 ! Configuration File for keepalived global_defs { router_id redis-225 ##设备名称 } vrrp_×××tance VI_redis { state MASTER ##当前设备为master interface eth0 ##vip绑定的网卡 virtual_router_id 79 ##备份组id,同一备份组要一致 priority 100 ##优先级,优先级高的成为master advert_int 3 ##每多少秒进行一次健康检查 authentication { auth_type PASS auth_pass redis } virtual_ipaddress { 192.168.2.253 dev eth0 label eth0:1 ##vip地址并设置一个网卡别名 } }
BACKUP配置文件内容
! Configuration File for keepalived global_defs { router_id redis-224 } vrrp_script chkmaster { script "/etc/keepalived/scripts/chkmaster.sh" #检查当前redis是否为master interval 3 #每3秒检查一次 weight 2 #当本机为master检测结果返回1,将优先级加2 fall 2 ##检测失败多少次就才认为是真的失败 rise 1 ##检测成功1为就认为是成功的 } vrrp_×××tance VI_redis { state BACKUP #本机的状态信息 interface eth0 #vip绑定的网卡 virtual_router_id 79 ##备份组id,同一备份组要一致 priority 99 ##优先级,优先级高的成为master advert_int 3 ##每多少秒进行一次健康检查 authentication { auth_type PASS auth_pass redis } virtual_ipaddress { 192.168.2.253 dev eth0 label eth0:1 } track_script { ##调用状态检查 chkmaster } }
状态检查脚本内容:
#!/bin/bash STATUS=`/usr/local/bin/redis-cli info | grep role:master | wc -l` echo $STATUS if [ "$STATUS" -eq 0 ];then exit 1 else exit 0 fi
验证结果:
1. 关闭master的redis服务程序,查看vip和redis主服务器切换到slave
2. 开启master的redis服务程序,redis服务以slave身份加入到slave服务器中
3. 关闭slave服务器的redis服务,查看vip和redis主服务器切换到master
4. 开启slave的redis服务程序,redis服务以slave身份加入到master服务器中
遇到的一个主从不切换的坑
停掉master主从切换日志提示此错误
解决办法:
1)若是redis实例没有配置
protected-mode yes
bind 192.168.98.136
则在sentinel 配置文件加上
protected-mode no
便可
2)若是redis实例有配置
protected-mode yes
bind 192.168.98.136
则在sentinel 配置文件加上
protected-mode yes
bind 192.168.98.136
我是将redis配置文件和sentinel配置文件中都“protected-mode no”改成no重启服务解决了问题