Keepalived+Redis高可用部署

1   Redis簡介及安裝

Redis是一個開源,先進的key-value存儲,並用於構建高性能,可擴展的Web應用程序的完美解決方案。redis

Redis從它的許多競爭繼承來的三個主要特色:數據庫

Redis數據庫徹底在內存中,使用磁盤僅用於持久性。vim

相比許多鍵值數據存儲,Redis擁有一套較爲豐富的數據類型。緩存

Redis能夠將數據複製到任意數量的從服務器。bash

1.1 REDIS優點

異常快速:Redis的速度很是快,每秒能執行約11萬集合,每秒約81000+條記錄。服務器

支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它很是容易解決各類各樣的問題,由於咱們知道哪些問題是能夠處理經過它的數據類型更好。工具

操做都是原子性:全部Redis操做是原子的,這保證了若是兩個客戶端同時訪問的Redis服務器將得到更新後的值。性能

多功能實用工具:Redis是一個多實用的工具,能夠在多個用例如緩存,消息,隊列使用(Redis原生支持發佈/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。測試

 

1.2 REDIS安裝

在redis官網下載最新的源碼包ui

http://download.redis.io/releases/redis-2.8.3.tar.gz

  1. 解壓

# tar xzf redis-3.0.0.tar.gz

  1. 拷貝目錄

# mv redis-3.0.0 /usr/local/redis

  1. 進入目錄

# cd /usr/local/redis

  1. 編譯

# make && make install

  1. 查看命令運行結果,若是是0則是成功

# echo $?

 

1.3 REDIS啓動

# redis-server

第一次啓動時可能會有提示的warning信息;能夠忽略,但最好是按照提示的處理辦法修改。

 

1.4 REDIS客戶端啓動

# redis-cli

1.5 驗證客戶端操做

# redis> set iom dtsoft

OK

# redis> get iom

「dtsoft」

2   主從自動切換原理

2.1 場景描述

假設有兩臺服務器A,B,A爲主節點,B爲從節點,每臺上都裝有keepalived和redis,而且已爲keepalived分配一個VIP,下面分兩種狀況討論:

 

B-redis掛掉

VIP仍爲A服務器佔用,用戶讀寫不受任何影響,B-keepalived檢測到B-redis掛掉後自動關掉自己服務(其實也能夠不關掉keepalived服務,此處是爲了儘可能保持和A-keepalived相同的配置);問題修復後,以從機配置文件啓動B-redis,啓動B-keepalived, A、B兩節點回到初始狀態。

 

A-redis掛掉

A-keepalived檢測到A-redis掛掉後自動關掉自己服務,VIP被B服務器佔用,B-redis設置爲主節點;問題修復後,A-redis以從機配置文件重啓並自動同步B-redis數據,同步完成後開啓A-keepalived, VIP重回A 服務器,A-redis設置成主節點, B-redis設置爲A-redis的從節點,A、B兩節點回到初始狀態

 

2.1 切換要求

  1. A,B上的keepalived要能在本服務器上的redis掛掉後關掉自己服務。
  2. 不論A-redis仍是B-redis,都是以從機配置文件重啓(第一次安裝,或兩個服務都宕掉重啓等特殊狀況例外);
  3. A-reids必須在同步完成後才能開啓keepalived;
  4. A-redis必須在本服務器得到VIP後,設置爲主節點;
  5. 丟失VIP的服務器要將本機上的redis置爲從節點(若是redis還沒掛)。

 

1,4,5能夠用keepalived的配置腳本解決,2,3能夠本身編寫主從啓動腳本控制。

3   keepalived配置

3.1 A-keepalived配置

紅字爲手工加的備註,原文件裏沒有。

vi /etc/keepalived/keepalived.cnf文件

 

global_defs {

router_id LVS_MASTER

}

 

vrrp_script monitor_redis {

script 「/etc/keepalived/script/redis_monitor.sh」 –檢查redis服務狀態腳本;

interval 3

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

 

track_script {

monitor_redis      –檢查redis服務狀態腳本;

}

 

virtual_ipaddress {

192.168.10.251     #virtual server

}

notify_backup /etc/keepalived/script/redis_backup.sh –keepalived變爲從節點(丟失VIP)後執行的腳本

notify_master /etc/keepalived/script/redis_master.sh — keepalived變爲主節點(得到VIP)後執行的腳本

}

3.2 B-keepalived配置

vi /etc/keepalived/keepalived.cnf文件

 

global_defs {

router_id LVS_BACKUP

}

 

vrrp_script monitor_redis {

script 「/etc/keepalived/script/redis_monitor.sh」 –檢查redis服務狀態腳本;

interval 3

}

 

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 99

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

 

track_script {

monitor_redis      –檢查redis服務狀態腳本;

}

 

virtual_ipaddress {

192.168.10.251     #virtual server

}

notify_backup /etc/keepalived/script/redis_backup.sh –keepalived變爲從節點(丟失VIP)後執行的腳本

notify_master /etc/keepalived/script/redis_master.sh — keepalived變爲主節點(得到VIP)後執行的腳本

}

 

4   REDIS配置

咱們是根據keepalived自動切換VIP的原理來實現redis主從切換,每次切換,主從角色都會調換,所以兩臺兩臺機子上都要編寫主從配置文件。

4.1 編輯主節點配置文件

# vim redis.conf

daemonize yes                    –進程後臺啓動

logfile /usr/local/redis/redis.log       –日誌文件

syslog-enabled no                –日誌不寫進系統日誌

dir /usr/local/redis/data      –數據文件存放

requirepass system                      –認證密碼

slave-server-stale-data no               –同步未完成從機不能接收除slaveof和info以外的命令,至關重要

4.2 編輯從節點配置文件

# vim redis_slave.conf

daemonize yes

logfile /usr/local/redis/redis.log

syslog-enabled no

dir /usr/local/redis/data

slaveof 192.168.10.3 6379           –主服務器的IP(兩臺機器不一樣)地址和端口

masterauth system                       –主服務器上的認證密碼

slave-server-stale-data no               –同步未完成從機不能接收除slaveof和info以外的命令,至關重要

 

5   編寫腳本

5.1 A服務器redis啓動腳本:

#!/bin/bash

export CONFIGPATH=/usr/local/redis/redis_slave.conf

export REDISPATH=/usr/local/redis/src

export REDISPASS=system

export result=123

export RESULT=0

export VIP=192.168.10.251

export SLAVEIP=192.168.10.3

killall -9 redis-server

 

 

 

#scp $REDISPATH/flag xf7023@$SLAVEIP:$REDISPATH

 

echo 「start redis-server with $CONFIGPATH」

 

nohup $REDISPATH/redis-server $CONFIGPATH  2>nohup.out

 

until [ 「$result」 = 「$RESULT」 ]

do

export RESULT=`redis-cli -a $REDISPASS<<EOF

get iom

EOF`

echo 「RESULT=$RESULT,SYNC…, wait 10s…」

sleep 10

done

 

 

killall -9 keepalived

 

sleep 5

 

echo 「start keepalived」

 

service keepalived start

 

sleep 10

 

echo 「VIP get?」

 

ip a|sed -n ‘/inet addr/p’|grep $VIP

 

#until [ 「$?」 = 「0」 ]

#do

#ip a|sed -n ‘/inet/p’|grep $VIP

#done

 

if [ 「$?」 == 「0」 ];then

echo $(ip a)

fi

 

 

echo 「set slaveof master」

redis-cli -a $REDISPASS <<EOF

slaveof no one

EOF

 

exit 0

 

 

5.2 redis_monitor.sh

#/bin/bash

export LOGFILE=/etc/keepalived/log/alive_state.log

export ALIVE=$(/usr/local/redis/src/redis-cli -a system PING)

 

echo 「ALIVE=$ALIVE」 >>$LOGFILE

if [ 「$ALIVE」 = 「PONG」 ]; then

echo $ALIVE

exit 0

else

echo 「killall -9 keepalived」>>$LOGFILE

echo $ALIVE

killall -9 keepalived

exit 1

fi

5.3 redis_master.sh

#!/bin/bash

export REDISPATH=/usr/local/redis/src

export REDISPASS=system

export LOGFILE=」/etc/keepalived/log/alive_state.log」

date >> $LOGFILE

echo 「set master 」 >> $LOGFILE

echo 「run slaveof no one cmd …」

$REDISPATH/redis-cli -a $REDISPASS slaveof no one

 

5.4 redis_backup.sh

#!/bin/bash

export REDISPATH=/usr/local/redis/src

export REDISPASS=system

export REDISMASTER=」192.168.10.3 6379″   –redis主節點地址,A,B兩服務器不一樣,注意區別

export LOGFILE=」/etc/keepalived/log/alive_state.log」

date >> $LOGFILE

echo 「set back up 」 >> $LOGFILE

echo 「MASTER:$REDISMASTER」>>$LOGFILE

echo 「run slaveof cmd …」

$REDISPATH/redis-cli -a $REDISPASS slaveof $REDISMASTER

 

 

 

6   系統測試

6.1.1   測試環境

VIP:192.168.10.251

A機器IP:192.168.10.2

B機器IP:192.168.10.2

客戶機IP:192.168.10.1

6.1.2   測試過程

A機器啓動redis和keepalived

# redis-server redis.conf

# service keepalived start

 

B機器啓動redis和keepalived

# redis-server redis_slave.conf

# service keepalived start

 

            測試客戶機與A,B集羣鏈接

客戶機運行redis客戶端:

# redis-cli –h 192.168.10.251 –p 6379

redis:6379> auth system –第一次須要輸入密碼

OK

客戶機上作些寫(增,刪,改)操做,看A-redis和B-redis是否數據同步。

 

            測試A-redis(主節點)掛掉後客戶機業務

關掉redis主機,查看A-keepalived是否自動中止

# ps –ef|grep keep

B機器是否得到VIP

# ip a

B-redis是否變爲主機狀態

# info

客戶機上作些寫(增,刪,改)操做,看B-redis是否數據同步。

 

            測試A-redis重啓後客戶機業務

用命令腳本啓動A-redis主機

# sh ./script/redis_start.sh

查看A-redis是否將B-redis數據同步徹底,分別在A,B redis運行

# keys * 看數量是否相等

查看A機器是否或得VIP

# ip a

查看A-redis是否變爲主節點(keepalived得到VIP會執行命令,將A-redis變爲主節點),登錄A-redis,運行命令

# info

查看B-redis是否變爲從節點(keepalived丟失VIP會執行命令,將B-redis變爲從節點),登錄B-redis,運行命令

# info

客戶機鏈接redis客戶端,測試業務是否正常

# redis-cli –h 192.168.10.251 –p 6379

6.1.3   測試注意

  • redis節點不能開啓從節點只讀模式,也就是slave-read-only要設置爲 no。
  • 若是AB服務器keepalived都掛掉,VIP有可能長久固定在某個上面。
  • keepalived的配置文件裏的腳本要注意執行權限,配置文件格式要徹底正確,不然可能會沒法綁定VIP。
  • A,B服務器各腳本里的變量要注意區別,尤爲是IP。
  • A-redis掛掉後啓動要用啓動腳本,B-redis不須要。
相關文章
相關標籤/搜索