HOME 首頁
SERVICE 服務產品
XINMEITI 新媒體代運營
CASE 服務案例
NEWS 熱點資訊
ABOUT 關于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    redis高可用集群(redis高可用集群搭建)

    發(fā)布時間:2023-04-13 14:14:41     稿源: 創(chuàng)意嶺    閱讀: 72        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于redis高可用集群的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端

    官網(wǎng):https://ai.de1919.com

    創(chuàng)意嶺作為行業(yè)內優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    redis高可用集群(redis高可用集群搭建)

    一、redis HA方案

    HA(High Available,高可用性群集)機集群系統(tǒng)簡稱,是保證業(yè)務連續(xù)性的有效解決方案,一般有兩個或兩個以上的節(jié)點,且分為活動節(jié)點及備用節(jié)點。通常把正在執(zhí) 行業(yè)務的稱為活動節(jié)點,而作為活動節(jié)點的一個備份的則稱為備用節(jié)點。當活動節(jié)點出現(xiàn)問題,導致正在運行的業(yè)務(任務)不能正常運行時,備用節(jié)點此時就會偵測到,并立即接續(xù)活動節(jié)點來執(zhí)行業(yè)務。從而實現(xiàn)業(yè)務的不中斷或短暫中斷。

    Redis 一般以主/從方式部署(這里討論的應用從實例主要用于備份,主實例提供讀寫)該方式要實現(xiàn) HA 主要有如下幾種方案:

    二、Redis哨兵集群

    Redis-Sentinel是redis官方推薦的高可用性解決方案,

    當用redis作master-slave的高可用時,如果master本身宕機,redis本身或者客戶端都沒有實現(xiàn)主從切換的功能。

    而redis-sentinel就是一個獨立運行的進程,用于監(jiān)控多個master-slave集群,

    自動發(fā)現(xiàn)master宕機,進行自動切換slave > master

    每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發(fā)送一個 PING 命令

    如果一個實例(instance)距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記為主觀下線。

    如果一個Master被標記為主觀下線,則正在監(jiān)視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態(tài)。

    當有足夠數(shù)量的 Sentinel(大于等于配置文件指定的值)在指定的時間范圍內確認Master的確進入了主觀下線狀態(tài), 則Master會被標記為客觀下線

    在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發(fā)送 INFO 命令

    當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發(fā)送 INFO 命令的頻率會從 10 秒一次改為每秒一次

    若沒有足夠數(shù)量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態(tài)就會被移除。

    若 Master 重新向 Sentinel 的 PING 命令返回有效回復, Master 的主觀下線狀態(tài)就會被移除。

    主觀下線和客觀下線

    主觀下線:Subjectively Down,簡稱 SDOWN,指的是當前 Sentinel 實例對某個redis服務器做出的下線判斷。

    客觀下線:Objectively Down, 簡稱 ODOWN,指的是多個 Sentinel 實例在對Master Server做出 SDOWN 判斷,并且通過 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下線判斷,然后開啟failover.

    SDOWN適合于Master和Slave,只要一個 Sentinel 發(fā)現(xiàn)Master進入了ODOWN, 這個 Sentinel 就可能會被其他 Sentinel 推選出, 并對下線的主服務器執(zhí)行自動故障遷移操作。

    ODOWN只適用于Master,對于Slave的 Redis 實例,Sentinel 在將它們判斷為下線前不需要進行協(xié)商, 所以Slave的 Sentinel 永遠不會達到ODOWN。

    Redis主從復制可將主節(jié)點數(shù)據(jù)同步給從節(jié)點,從節(jié)點此時有兩個作用:

    但是問題是:

    那么這個問題,redis-sentinel就可以解決了

    Redis的一個進程,但是不存儲數(shù)據(jù),只是監(jiān)控redis

    本實驗是在測試環(huán)境下,因此只準備一臺linux服務器用作環(huán)境??!

    服務器環(huán)境,一臺即可完成操作

    所有配置文件如下

    總體redis配置文件如下,6379為master,6380和6381為slave

    redis-6380.conf slave配置文件詳解,6381端口的配置文件,僅僅和6380端口不一樣

    在主節(jié)點上查看主從通信關系

    在從節(jié)點上查看主從關系(6380、6379)

    此時可以在master上寫入數(shù)據(jù),在slave上查看數(shù)據(jù),此時主從復制配置完成

    redis-sentinel-26379.conf配置文件寫入如下信息

    redis-sentinel-26380.conf和redis-sentinel-26381.conf的配置僅僅差異是port(端口)的不同。

    然后啟動三個sentinel哨兵

    此時查看哨兵是否成功通信

    實例的思路

    首先查看三個Redis的進程狀態(tài)

    第一個

    第二個

    第三個

    直接干掉master,然后等待其他兩個節(jié)點是否能自動被哨兵sentienl,切換為master節(jié)點

    此時查看兩個slave的狀態(tài)

    然后會發(fā)現(xiàn)slave節(jié)點成為master節(jié)點!!

    三、linux 的環(huán)境搭建(二)--redis單機環(huán)境、生產環(huán)境、集群環(huán)境的搭建

    一、目錄

    1、工具

    2、安裝tcl

    3、安裝單機版redis

    4、把redis設置為daemon進程,每次系統(tǒng)啟動,redis進程一起啟動

    5、安裝redis cluster

    二、工具

    2.1、tcl8.6.1-src.tar.gz

    2.2、ruby-2.3.1.tar.gz

    2.3、redis-4.1.1.gem

    2.4、redis-3.2.8.tar.gz

    2.5、openssl-1.0.2r.tar.gz

    三、安裝tcl(安裝redis必須先要安裝tcl)

    3.1、把tcl8.6.1-src.tar.gz通過WinSCP上傳到虛擬機中的/usr/local目錄下

    四、安裝單機版redis

    4.1、把redis-3.2.8.tar.gz通過WinSCP上傳到虛擬機中的/usr/local目錄下

    4.2、依次運行如下命令:

    tar -zxvf redis-3.2.8.tar.gz 解壓文件

    cd redis-3.2.8

    make && make test && make install

    五、把redis設置為daemon進程,每次系統(tǒng)啟動,redis進程一起啟動

    5.1、將redis的utils目錄下的redis_init_script腳本拷貝到linux的/etc/init.d目錄中,將redis_init_script重命名為redis_6379,6379是我們希望這個redis實例監(jiān)聽的端口號

    5.2、修改redis_6379腳本的第6行的REDISPORT,設置為相同的端口號(默認就是6379)

    protected-mode no 取消保護模式,保護模式只能127.0.0.1訪問

    daemonize yes 讓redis以daemon進程運行

    pidfile /var/run/redis_6379.pid 設置redis的pid文件位置

    bind 192.168.3.110

    port 6379 設置redis的監(jiān)聽端口號

    dir /var/redis/6379 設置持久化文件的存儲位置

    logfile /var/log/redis/6379.log 設置日志文件位置

    5.6、啟動redis,依次執(zhí)行:

    cd /etc/init.d,

    chmod 777 redis_6379,賦讀寫執(zhí)行的權限(chmod -R 777 * 是遞歸把該目錄下的所有文件和其子文件全部賦權限)

    ./redis_6379 start 啟動

    5.7、確認redis進程是否啟動,ps -ef | grep redis

    5.8、讓redis跟隨系統(tǒng)啟動自動啟動

    5.9、重啟系統(tǒng),不手動啟動redis,直接連接redis,可以連接上,表示配置成功

    此時一個單機版的redis的生產環(huán)境已經搭建好了,每次服務器重啟,redis都會自動的啟動

    六、安裝redis cluster

    (redis cluster集群,要求至少3個master,去組成一個高可用,健壯的分布式的集群,每個master都建議至少給一個slave,3個master,3個slave)

    6.1、前提,我在其它機器上啟動了六個redis(安裝步驟都如下)

    2.2、創(chuàng)建三個目錄:

    mkdir -p /etc/redis-cluster 存放集群配置信息,自動生成配置

    mkdir -p /var/log/redis redis日志

    mkdir -p /var/redis/7001 存放redis的rdb文件和aof文件

    6.3、將redis的utils目錄下的redis_init_script腳本拷貝到linux的/etc/init.d目錄中,將redis_init_script重命名為redis_7001,7001是我們希望這個redis實例監(jiān)聽的端口號,并修改redis_7001配置文件中的REDISPORT=7001

    6.4、修改/etc/redis/7001.conf中的部分配置為生產環(huán)境

    6.5、完成了一個redis環(huán)境的配置,依次再配置其余五個,分別為7002、7003、7004、7005、7006,每個啟動腳本內,都修改對應的端口號

    6.6、啟動6個redis實例

    6.7、創(chuàng)建集群(需要安裝ruby、rubygems)

    上述命令在部分機器上是可以直接運行完成,成功安裝的,但在部分機器上運行第三條命令時會提示ruby版本太低、openssl找不到的問題,下面依次解決這兩個問題:

    6.8、再次運行gem install redis命令,報出兩個錯誤

    6.9、再次運行gem install redis命令,報出一個錯誤

    6.10、再次運行gem install redis命令,報出一個錯誤

    6.11、再次運行gem install redis命令

    [root@ceshi01 local]# gem install redis

    Successfully installed redis-4.1.1

    Parsing documentation for redis-4.1.1

    Done installing documentation for redis after 1 seconds

    WARNING: Unable to pull data from ' https://rubygems.org/' : SSL_connect returned=1 errno=0 state=error: certificate verify failed ( https://api.rubygems.org/specs.4.8.gz )

    1 gem installed

    運行成功

    此時Redis安裝好,此三個工具也安裝好了,這時我們來做一個Redis集群測試,在一臺服務器中創(chuàng)建了6個Redis實例,開啟6個Redis服務

    redis-trib.rb create --replicas 1 192.168.3.104:7001 192.168.3.104:7002 192.168.3.105:7003 192.168.3.105:7004 192.168.3.106:7005 192.168.3.106:7006

    [root@eshop-cache02 init.d]# redis-trib.rb create --replicas 1 192.168.3.104:7001 192.168.3.104:7002 192.168.3.105:7003 192.168.3.105:7004 192.168.3.106:7005 192.168.3.106:7006

    此時一個redis集群環(huán)境就已經搭建好了,可以通過redis-trib.rb check 192.168.3.105:7003命令查看集群幾點的信息

    [root@eshop-cache02 init.d]# redis-trib.rb check 192.168.3.105:7004

    redis cluster的優(yōu)點:讀寫分離+高可用+多master

    讀寫分離:每個master都有一個slave

    高可用:master宕機,slave自動被切換過去

    多master:橫向擴容支持更大數(shù)據(jù)量

    四、redis常見問題

    1. 緩存擊穿

    緩存擊穿是指一個請求要訪問的數(shù)據(jù),緩存中沒有,但數(shù)據(jù)庫中有的情況。這種情況一般都是緩存過期了。

    但是這時由于并發(fā)訪問這個緩存的用戶特別多,這是一個熱點 key,這么多用戶的請求同時過來,在緩存里面沒有取到數(shù)據(jù),所以又同時去訪問數(shù)據(jù)庫取數(shù)據(jù),引起數(shù)據(jù)庫流量激增,壓力瞬間增大,直接崩潰給你看。

    所以一個數(shù)據(jù)有緩存,每次請求都從緩存中快速的返回了數(shù)據(jù),但是某個時間點緩存失效了,某個請求在緩存中沒有請求到數(shù)據(jù),這時候我們就說這個請求就"擊穿"了緩存。

    針對這個場景,對應的解決方案一般來說有三種。

    借助Redis setNX命令設置一個標志位就行。設置成功的放行,設置失敗的就輪詢等待。就是在更新緩存時加把鎖

    后臺開一個定時任務,專門主動更新過期數(shù)據(jù)

    比如程序中設置 why 這個熱點 key 的時候,同時設置了過期時間為 10 分鐘,那后臺程序在第 8 分鐘的時候,會去數(shù)據(jù)庫查詢數(shù)據(jù)并重新放到緩存中,同時再次設置緩存為 10 分鐘。

    其實上面的后臺續(xù)命思想的最終體現(xiàn)是也是永不過期。

    只是后臺續(xù)命的思想,會主動更新緩存,適用于緩存會變的場景。會出現(xiàn)緩存不一致的情況,取決于你的業(yè)務場景能接受多長時間的緩存不一致。

    2. 緩存穿透

    緩存穿透是指一個請求要訪問的數(shù)據(jù),緩存和數(shù)據(jù)庫中都沒有,而用戶短時間、高密度的發(fā)起這樣的請求,每次都打到數(shù)據(jù)庫服務上,給數(shù)據(jù)庫造成了壓力。一般來說這樣的請求屬于惡意請求。

    解決方案有兩種:

    就是在數(shù)據(jù)庫即使沒有查詢到數(shù)據(jù),我們也把這次請求當做 key 緩存起來,value 可以是 NULL。下次同樣請求就會命中這個 NULL,緩存層就處理了這個請求,不會對數(shù)據(jù)庫產生壓力。這樣實現(xiàn)起來簡單,開發(fā)成本很低。

    3. 緩存雪崩

    緩存雪崩是指緩存中大多數(shù)的數(shù)據(jù)在同一時間到達過期時間,而查詢數(shù)據(jù)量巨大,這時候,又是緩存中沒有,數(shù)據(jù)庫中有的情況了。

    防止雪崩的方案簡單來說就是錯峰過期。

    在設置 key 過期時間的時候,在加上一個短的隨機過期時間,這樣就能避免大量緩存在同一時間過期,引起的緩存雪崩。

    如果發(fā)了雪崩,我們可以有服務降級、熔斷、限流手段來拒絕一些請求,保證服務的正常。但是,這些對用戶體驗是有一定影響的。

    4. Redis 高可用架構

    Redis 高可用架構,大家基本上都能想到主從、哨兵、集群這三種模式。

    哨兵模式:

    它主要執(zhí)行三種類型的任務:

    哨兵其實也是一個分布式系統(tǒng),我們可以運行多個哨兵。

    然后這些哨兵之間需要相互通氣,交流信息,通過投票來決定是否執(zhí)行自動故障遷移,以及選擇哪個從服務器作為新的主服務器。

    哨兵之間采用的協(xié)議是 gossip,是一種去中心化的協(xié)議,達成的是最終一致性。

    選舉規(guī)則:

    以上就是關于redis高可用集群相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。


    推薦閱讀:

    Address怎么記憶(address記憶法)

    paper免費查重入口官網(wǎng)(paperfree免費查重入口官網(wǎng))

    redis排行榜(redis排行榜實時更新)

    國內醬油品牌排行榜(中國醬油品牌排行榜前十名)

    成都眼科醫(yī)院排行榜(成都眼科醫(yī)院排名前三)