Keepalived+Redis高可用部署


1   Redis簡介及安裝

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

Redis從它的許多競爭繼承來的三個主要特點:

Redis數據庫完全在內存中,使用磁盤僅用於持久性。

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

Redis可以將數據復制到任意數量的從服務器。

1.1 REDIS優勢

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

支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數據類型更好。

操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis服務器將獲得更新后的值。

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

 

1.2 REDIS安裝

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

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不需要。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM