大型高併發與高可用緩存架構總結4

1、redis安裝redis

redis安裝有yum和編譯兩種方式,本文以編譯方式安裝,參考文檔爲官網安裝文檔bash

1.gcc安裝服務器

[root@redis-master ~]# yum -y install gcc

 

2.下載安裝包負載均衡

[root@redis-master ~]# wget http://download.redis.io/redis-stable.tar.gz

 

3.解壓編譯運維

[root@redis-master ~]# tar xvzf redis-stable.tar.gz [root@redis-master ~]# cd redis-stable [root@redis-master redis-stable]# make [root@redis-master redis-stable]# make install

 

4.修改配置文件ssh

[root@redis-master redis-stable]# mkdir /etc/redis[root@redis-master redis-stable]# mkdir -p /var/redis/6379 [root@redis-master redis-stable]# cp redis.conf /etc/redis/6379.conf [root@redis-master redis-stable]# cd /etc/redis/ [root@redis-master redis]# cp 6379.conf 6379.conf.bak [root@redis-master redis]# grep -Ev '^$|#' 6379.conf.bak > 6379.conf

主要配置修改以下:工具

#bind 127.0.0.1 protected-mode no daemonize yes pidfile /var/run/redis_6379.pid logfile /var/log/redis_6379.log dir /var/redis/6379

 

5.製做啓動服務測試

[root@redis-master redis-stable]# cp utils/redis_init_script /etc/init.d/redis_6379

 

6.啓動服務並加入開機啓動ui

[root@redis-master redis]# service redis_6379 start [root@redis-master redis]# chkconfig redis_6379 on

 

7.RedisDesktopManager管理工具spa

該工具爲redis圖形化管理工具

軟件下載:https://pan.baidu.com/s/1no0IWcIEBapfehNi8dfCfw 密碼:7dvc

鏈接設置:

圖片.png

鏈接後效果

圖片.png

 

2、redis主從複製及持久化

1.從服務器設置

redis主從複製很簡單,只須要在從服務器配置文件新增一條配置便可

[root@redis-slave redis]# sed -i '$a slaveof 172.27.9.30 6379' /etc/redis/6379.conf

 

2.主從測試

2.1主機上寫入值

[root@redis-master ~]# redis-cli set test-key abc OK

查看從機redis鍵值:

圖片.png

2.2從機寫入值

[root@redis-slave redis]# redis-cli set test-key 123 (error) READONLY You can't write against a read only slave.

發現報錯,處於slave狀態redis沒法寫入。

 

3.持久化

redis持久化有RDB和AOF兩種方式,默認持久化爲RDB方式,關閉默認持久化只須要把默認配置註釋就行:

#save 900 1 #save 300 10 #save 60 10000

 

3、keepalived安裝配置

1.keepalived安裝

[root@redis-master ~]# yum -y install keepalived

 

2.keepalived配置

[root@redis-master ~]# more /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id master #router_id 機器標識,一般爲hostname,但不必定非得是hostname。故障發生時,郵件通知會用到。 } vrrp_script chk_redis { script "/etc/keepalived/redis-check.sh" interval 2 #健康檢查週期 weight 30 #優先級變化幅度 fall 2 #嘗試兩次都成功才成功 rise 2 #嘗試兩次都失敗才失敗 } vrrp_instance VI_1 { #vrrp實例定義部分 state MASTER #設置lvs的狀態,MASTER和BACKUP兩種,必須大寫 interface ens33 #設置對外服務的接口 virtual_router_id 100 #設置虛擬路由標示,這個標示是一個數字,同一個vrrp實例使用惟一標示 priority 100 #定義優先級,數字越大優先級越高,在一個vrrp——instance下,master的優先級必須大於backup advert_int 1 #設定master與backup負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { #設置驗證類型和密碼 auth_type PASS #主要有PASS和AH兩種 auth_pass 1111 #驗證密碼,同一個vrrp_instance下MASTER和BACKUP密碼必須相同 } virtual_ipaddress { #設置虛擬ip地址,能夠設置多個,每行一個 172.27.9.100 } track_script { #執行腳本chk_redis chk_redis } notify_master "/etc/keepalived/redis-master.sh" #指定當切換爲master時,執行的腳本 }

相比master,slave配置有3點不一樣:

router_id slave
state BACKUP 
priority 90

爲了不主從間的來回切換,也能夠設置nopreemt參數,開啓非搶佔式模式;不過當redis或者keepalived發生異常時都會觸發各類告警,運維人員會及時介入處理。

 

3.啓動並設置開機啓動

[root@redis-master ~]# systemctl start keepalived [root@redis-master ~]# systemctl enable keepalived

 

4、expect安裝

[root@redis-master ~]# yum -y install expect

expect是一個提供自動交互的工具,本文notify_master中的腳本會使用到。

 

5、高可用腳本

1.redis-check.sh腳本

[root@redis-master keepalived]# more redis-check.sh #!/bin/sh rediscli="/usr/local/bin/redis-cli" logfile="/var/log/redis_6379.log" result=$($rediscli ping) echo $result echo "-------------------redis-check-------------------" >> $logfile date >> $logfile if [ $result == "PONG" ]; then : echo "Success: the result is $result" >> $logfile 2>&1 exit 0 else echo "Failed:the result is $result " >> $logfile 2>&1 exit 1 fi

該腳本爲對redis狀態檢查

 

2.redis-master.sh腳本

[root@redis-master keepalived]# more redis-master.sh #!/bin/bash rediscli="/usr/local/bin/redis-cli" logfile="/var/log/redis_6379.log" sync=`$rediscli info replication|grep master_sync_in_progress|awk -F: '{print $2}'|sed 's/\r//'` #sync=`/usr/local/bin/redis-cli info replication|grep master_sync_in_progress|awk -F: '{print $2}'` echo $sync echo "-------------------change to master-------------------" >> $logfile 2>&1 date >> $logfile if [ $sync == 0 ]; then : echo "the master_sync_in_progress is 0 and excute slaveof no one" >>$logfile 2>&1 $rediscli slaveof no one elif [ $sync == 1 ]; then : sleep 10 $rediscli slaveof no one else echo "the host is master,do nothing" >>$logfile 2>&1 fi /etc/keepalived/exp.sh 172.27.9.31 monitor >>$logfile 2>&1

該腳本爲本文高可用切換的關鍵。

monitor爲31的root密碼;slave腳本的ip應改成172.27.9.30;該腳本爲服務器切換爲master時執行的腳本,首先會檢查切換前與master的主從同步是否完成,而後利用expect工具跳到另外一臺服務器將其redis狀態更改成slave。

 

3.exp.sh腳本

[root@redis-master keepalived]# more exp.sh #!/usr/bin/expect -f set ip [lindex $argv 0 ] set password [lindex $argv 1 ] set timeout 30 spawn ssh root@$ip expect { "*yes/no" { send "yes\r"; exp_continue} "*password:" { send "$password\r";exp_continue } } expect "#*" send "/usr/local/bin/redis-cli slaveof 172.27.9.30 6379\r" send "exit\r" expect eof

slave腳本中的ip爲172.27.9.31;該腳本做用是跳到另外一臺服務執行slaveof命令。

 

6、測試

1.模擬redis服務異常

操做:停掉master的redis服務

預期:vip漂移,slave主機的redis狀態切換爲master

測試過程:

1.1中止master的redis服務

[root@redis-master keepalived]# service redis_6379 stop

1.2查看虛ip

圖片.png

圖片.png

發現vip由30漂移至31

1.3查看redis狀態

[root@redis-slave keepalived]# redis-cli info replication

圖片.png

31的redis狀態切換爲master

1.4回切

啓動30的redis服務

[root@redis-master keepalived]# service redis_6379 start

查看vip和redis狀態

30:

圖片.png

31:

圖片.png

結論:redis服務異常時會發生切換,從機會切換爲master狀態對外提供服務。

 

2.模擬keepalived服務異常

操做:停掉master的keepalived服務

預期:vip漂移,master的redis狀態切換爲slave,slave的redis狀態切換爲master

測試過程:

2.1中止master的keepalived服務

[root@redis-master keepalived]# systemctl stop keepalived

2.2查看vip和redis狀態

30:

圖片.png

31:

圖片.png

vip由30漂移至31且主從發生反轉;開啓keepalived服務會觸發回切。

結論:keepalived服務異常時會發生切換,主從會反轉。

 

3.模擬master宕機

操做:master關機

預期:vip漂移,slave的redis狀態切換爲master

測試過程:

3.1master服務器關機

[root@redis-master ~]# init 0

3.2查看vip和redis狀態

圖片.png

vip漂移至31且狀態切換爲master;30開機會觸發回切。

結論:master宕機時會發生切換,從機切換爲master狀態對外提供服務。

 

至此完成redis高可用測試。

相關文章
相關標籤/搜索