Redis主從+sentinel(哨兵)+keepalived

環境介紹:php

wKiom1eQaN6ypRFMAACM7C6mGfU877.jpg-wh_500x0-wm_3-wmp_4-s_3122638359.png

實現的原理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. 關閉masterredis服務程序,查看vipredis主服務器切換到slave

2. 開啓masterredis服務程序,redis服務以slave身份加入到slave服務器中

3. 關閉slave服務器的redis服務,查看vipredis主服務器切換到master

4. 開啓slaveredis服務程序,redis服務以slave身份加入到master服務器中


遇到的一個主從不切換的坑

停掉master主從切換日誌提示此錯誤

圖片1.png

解決辦法:

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重啓服務解決了問題

相關文章
相關標籤/搜索