日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

搭建一个redis高可用系统

發布時間:2023/12/2 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搭建一个redis高可用系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、單個實例

當系統中只有一臺redis運行時,一旦該redis掛了,會導致整個系統無法運行。


單個實例

二、備份

由于單臺redis出現單點故障,就會導致整個系統不可用,所以想到的辦法自然就是備份(一般工業界認為比較安全的備份數應該是3份)。當一臺redis出現問題了,另一臺redis可以繼續提供服務。


備份

三、自動故障轉移

雖然上面redis做了備份,看上去很完美。但由于redis目前只支持主從復制備份(不支持主主復制),當主redis掛了,從redis只能提供讀服務,無法提供寫服務。所以,還得想辦法,當主redis掛了,讓從redis升級成為主redis。

這就需要自動故障轉移,redis sentinel帶有這個功能,當一個主redis不能提供服務時,redis sentinel可以將一個從redis升級為主redis,并對其他從redis進行配置,讓它們使用新的主redis進行復制備份。


自動故障轉移

四、動手實踐

1.環境

這里使用三臺服務器,每臺服務器上開啟一個redis-server和redis-sentinel服務,redis-server端口為8000,redis-sentinel的端口為6800,修改默認端口是安全的第一步^_^。

redis-server說明

  • 192.168.56.101:8000 主
  • 192.168.56.102:8000 從
  • 192.168.56.103:8000 從

redis-sentinel說明

  • 192.168.56.101:6800
  • 192.168.56.102:6800
  • 192.168.56.103:6800

2.搭建redis系統

首先下載安裝redis

wget http://download.redis.io/releases/redis-3.2.8.tar.gz tar zxvf redis-3.2.8.tar.gz cd redis-3.2.8 makecd src #復制redis相關命令到/usr/sbin目錄下,這樣就可以直接執行這些命令,不用寫全路徑 sudo cp redis-cli redis-server redis-sentinel /usr/sbin/

在redis目錄下有redis.conf和sentinel.conf配置文件示例,使用sudo cp redis.conf sentinel.conf /etc/命令將兩個配置文件復制到/etc目錄下(當然也可以在/etc/目錄新建配置文件),然后修改配置文件。

修改主redis-server配置文件內容如下:

port 8000 #修改端口是安全的第一步 daemonize yes bind 0.0.0.0 pidfile /var/run/redis-8000.pid logfile /var/log/redis/redis-8000.log

修改從redis-server配置文件內容如下:

port 8000 #修改端口是安全的第一步 daemonize yes bind 0.0.0.0 pidfile /var/run/redis-8000.pid logfile /var/log/redis/redis-8000.log slaveof 192.168.56.101 8000 #從redis比主redis多這一行

啟動redis-server。

sudo redis-server /etc/redis.conf

三個redis服務啟動完畢后,進入命令行,執行info replication查看當前主從配置。


主節點上查看主從信息

發現并沒有從節點信息。

3.主從間無法通信

這里的原因是防火墻屏蔽了8000端口,需要修改防火墻設置,開放8000端口(同理redis-sentinel的6800端口)。

# 打開防火墻配置文件,增加8000端口 sudo vim /etc/sysconfig/iptables#修改完后,需要重啟防火墻 sudo service iptables restart
增加8000端口和6800端口

然后重新進入主節點,查看主從信息,可以發現兩個從節點信息,表明redis-server主從已經配置完畢。


主節點上查看主從信息

4.搭建redis-sentinel系統

redis-sentinel程序上面已經安裝過了,這里只需要修改配置文件就可以了。修改/etc/sentinel.conf,如果沒有創建即可。

修改sentinel.conf配置文件內容如下:

daemonize yes port 6800 logfile /var/log/redis/sentinel.log pidfile /var/run/sentinel.pid sentinel monitor master8000 192.168.56.101 8000 2 #5秒內master6800沒有響應,就認為SDOWN sentinel down-after-milliseconds master8000 5000 sentinel failover-timeout master8000 15000

啟動redis-sentinel。

redis-sentinel /etc/sentinel.conf

三個redis-sentinel服務啟動完畢后,連接任意sentinel服務可以獲知當前主redis服務信息。


sentinel監控狀態

五、測試

1.把住redis停掉

redis-cli -h 192.168.56.101 -p 8000 shutdown

2.查看redis-sentinel的監控狀態


sentinel監控狀態

發現102這臺redis-server提升為主庫。


至此,redis的高可用方案已經搭建完成。

六、客戶端程序

客戶端程序(如PHP程序)連接redis時需要ip和port,但redis-server進行故障轉移時,主redis是變化的,所以ip地址也是變化的。客戶端程序如何感知當前主redis的ip地址和端口呢?redis-sentinel提供了接口,請求任何一個sentinel,發送SENTINEL get-master-addr-by-name <master name>就能得到當前主redis的ip和port。


獲取當前主redis的ip和port

客戶端每次連接redis前,先向sentinel發送請求,獲得主redis的ip和port,然后用返回的ip和port連接redis。

這種方法的缺點是顯而易見的,每次操作redis至少需要發送兩次連接請求,第一次請求sentinel,第二次請求redis。

php請求sentinel程序代碼可參見:https://github.com/huyanping/redis-sentinel

更好的辦法是使用VIP,當然這對配置的環境有一定的要求,比如redis搭建在阿里云服務器上,可能不支持VIP。

VIP方案是,redis系統對外始終是同一ip地址,當redis進行故障轉移時,需要做的是將VIP從之前的redis服務器漂移到現在新的主redis服務器上。

比如:當前redis系統中主redis的ip地址是192.168.56.101,那么VIP(192.168.56.250)指向192.168.56.101,客戶端程序用VIP(192.168.56.250)地址連接redis,實際上連接的就是當前主redis,這樣就避免了向sentinel發送請求。

當主redis宕機,進行故障轉移時,192.168.56.102這臺服務器上的redis提升為主,這時VIP(192.168.56.250)指向192.168.56.102,這樣客戶端程序不需要修改任何代碼,連接的是192.168.56.102這臺主redis。


VIP指向192.168.56.101
故障轉移后,VIP漂移指向192.168.56.102

七、漂移VIP

那么現在的問題是,如何在進行redis故障轉移時,將VIP漂移到新的主redis服務器上。

這里可以使用redis sentinel的一個參數client-reconfig-script,這個參數配置執行腳本,sentinel在做failover的時候會執行這個腳本,并且傳遞6個參數<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中<to-ip>是新主redis的IP地址,可以在這個腳本里做VIP漂移操作。

sentinel client-reconfig-script master8000 /opt/notify_master6800.sh

修改三個服務器的redis-sentinel配置文件/etc/sentinel.conf,增加上面一行。然后在/opt/目錄下創建notify_master6800.sh腳本文件,這個腳本做VIP漂移操作,內容如下:

#notify_master6800.sh腳本內容 #!/bin/bash MASTER_IP=$6 #第六個參數是新主redis的ip地址 LOCAL_IP='192.168.56.101' #其他兩個服務器上為192.168.56.102,192.168.56.103 VIP='192.168.56.250' NETMASK='24' INTERFACE='eth1' if [ ${MASTER_IP} = ${LOCAL_IP} ];then /sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE} #將VIP綁定到該服務器上/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}exit 0 else /sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE} #將VIP從該服務器上刪除exit 0 fi exit 1 #如果返回1,sentinel會一直執行這個腳本

現在當前主redis是192.168.56.102,需要手動綁定VIP到該服務器上。

/sbin/ip addr add 192.168.56.250/24 dev eth1 /sbin/arping -q -c 3 -A 192.168.56.250 -I eth1

然后,去另一個服務器上通過VIP地址連接redis-server和redis-sentinel。


通過VIP連接redis


從上面也可以看出當前主redis是192.168.56.102。

下面關閉這臺redis服務,看看VIP是否漂移到另一臺服務器上。

redis-cli -h 192.168.56.102 -p 8000 shutdown


通過查詢sentinel發現192.168.56.103提升為主。


通過訪問VIP連接redis,發現VIP確實指向了192.168.56.103。

八、總結

通過上面的操作,使用redis主從 + 哨兵(sentinel)+ 漂移VIP的方案搭建了一個redis高可用系統,但這個系統保證的是單個redis實例的高可用,所以適合業務比較小的應用。如果業務比較大,并發量比較高,建議搭建redis集群,比如官方redis cluster,還有開源的codings集群。

另外,漂移VIP可以使用keepalived軟件來實現,這里就不多介紹了。



作者:zhou
鏈接:http://www.jianshu.com/p/c2ab606b00b7
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

轉載于:https://www.cnblogs.com/shizhiyi/p/7747574.html

總結

以上是生活随笔為你收集整理的搭建一个redis高可用系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。