環境介紹: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重啓服務解決了問題