redis 一般启动几个 哨兵_Redis6.0主从、哨兵、集群搭建和原理
點擊上方藍(lán)色字體,選擇“設(shè)為星標(biāo)”
回復(fù)”資源“獲取更多資源大數(shù)據(jù)技術(shù)與架構(gòu)點擊右側(cè)關(guān)注,大數(shù)據(jù)開發(fā)領(lǐng)域最強公眾號!暴走大數(shù)據(jù)點擊右側(cè)關(guān)注,暴走大數(shù)據(jù)!由于單機Redis存儲能力受單機限制,以及無法實現(xiàn)讀寫操作的負(fù)載均衡和讀寫分離,無法保證高可用。本篇就來介紹 Redis 集群搭建方案及實現(xiàn)原理,實現(xiàn)Redis對數(shù)據(jù)的冗余備份,從而保證數(shù)據(jù)和服務(wù)的高可用。主從復(fù)制是哨兵和集群的基石,因此我們循序漸進,由淺入深一層層的將Redis高可用方案抽絲剝繭展示在大家面前。
主從復(fù)制
介紹
主從復(fù)制,是指將一臺Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器,主從是哨兵和集群模式能夠?qū)嵤┑幕A(chǔ)。前者稱為主節(jié)點(master),后者稱為從節(jié)點(slave),數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點到從節(jié)點。
默認(rèn)情況下,每臺Redis服務(wù)器都是主節(jié)點;且一個主節(jié)點可以有零個或多個從節(jié)點(0+個從節(jié)點),但一個從節(jié)點只能有一個主節(jié)點。一般主節(jié)點負(fù)責(zé)接收寫請求,從節(jié)點負(fù)責(zé)接收讀請求,從而實現(xiàn)讀寫分離。
主從一般部署在不同機器上,復(fù)制時存在網(wǎng)絡(luò)延時問題,使用參數(shù)repl-disable-tcp-nodelay選擇是否關(guān)閉TCP_NODELAY,默認(rèn)為關(guān)閉:
關(guān)閉:無論數(shù)據(jù)大小都會及時同步到從節(jié)點,占帶寬,適用于主從網(wǎng)絡(luò)好的場景;
開啟:主節(jié)點每隔指定時間合并數(shù)據(jù)為TCP包節(jié)省帶寬,默認(rèn)為40毫秒同步一次,適用于網(wǎng)絡(luò)環(huán)境復(fù)雜或帶寬緊張,如跨機房;
數(shù)據(jù)冗余:主從復(fù)制實現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
故障恢復(fù):當(dāng)主節(jié)點出現(xiàn)問題時,可以由從節(jié)點提供服務(wù),實現(xiàn)快速的故障恢復(fù);實際上是一種服務(wù)的冗余。
負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫分離,可以由主節(jié)點提供寫服務(wù),由從節(jié)點提供讀服務(wù),分擔(dān)服務(wù)器負(fù)載;尤其是在寫少讀多的場景下,通過多個從節(jié)點分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。
讀寫分離:主庫寫、從庫讀,讀寫分離不僅可以提高服務(wù)器的負(fù)載能力,同時可根據(jù)需求的變化,改變從庫的數(shù)量;
高可用基石:除了上述作用以外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ)。
配置文件
在從服務(wù)器配置文件中添加下面的配置然后重啟從服務(wù)器即可:#在從節(jié)點配置文件中新增下面兩個配置即可指定成為某個主節(jié)點的從節(jié)點#slaveof 主節(jié)點地址 主節(jié)點端口slaveof host port#從服務(wù)器只讀(推薦配置)slave-read-only yes使用ACL用戶同步
上一篇文章中介紹了Redis6的新特性ACL訪問控制列表,基于該特性我們可以為Redis設(shè)置不同的用戶和權(quán)限,在主從復(fù)制中我們也可以配置該同步用戶的賬號密碼:#命令行模式#在從節(jié)點配置主節(jié)點ACL賬號密碼(Redis6開啟ACL的情況)config set masteruser defaultconfig set masterauth wyk123456#在從節(jié)點查看主節(jié)點的ACL用戶密碼config get master*#配置文件模式 redis.conf#在從節(jié)點配置主節(jié)點ACL賬號密碼(Redis6開啟ACL的情況)masteruser defaultmasterauth wyk123456一主一從
最基礎(chǔ)的主從復(fù)制模型,主節(jié)點負(fù)責(zé)處理寫請求,從節(jié)點負(fù)責(zé)處理讀請求,主節(jié)點使用RDB持久化模式,從節(jié)點使用AOF持久化模式:一主多從
一個主節(jié)點可以有多個從節(jié)點,但每個從節(jié)點只能有一個主節(jié)點。一主多從適用于寫少讀多的場景,多個從節(jié)點可以分擔(dān)讀請求負(fù)載,提升并發(fā):樹狀主從
上面的一主多從可以實現(xiàn)讀請求的負(fù)載均衡,但當(dāng)從節(jié)點數(shù)量多的時候,主節(jié)點的同步壓力也是線性提升的,因此可以使用樹狀主從來分擔(dān)主節(jié)點的同步壓力:復(fù)制原理主從復(fù)制過程大體可以分為3個階段:連接建立階段(即準(zhǔn)備階段)、數(shù)據(jù)同步階段、命令傳播階段。在從節(jié)點執(zhí)行 slaveof 命令后,復(fù)制過程便開始按下面的流程運作:保存主節(jié)點信息:配置slaveof之后會在從節(jié)點保存主節(jié)點的信息。
主從建立socket連接:定時發(fā)現(xiàn)主節(jié)點以及嘗試建立連接。
發(fā)送ping命令:從節(jié)點定時發(fā)送ping給主節(jié)點,主節(jié)點返回PONG。若主節(jié)點沒有返回PONG或因阻塞無法響應(yīng)導(dǎo)致超時,則主從斷開,在下次定時任務(wù)時會從新ping主節(jié)點。
權(quán)限驗證:若主節(jié)點開啟了ACL或配置了requirepass參數(shù),則從節(jié)點需要配置masteruser和masterauth參數(shù)才能保證主從正常連接。
同步數(shù)據(jù)集:首次連接,全量同步。
命令持續(xù)復(fù)制:全量同步完成后,保持增量同步。
監(jiān)控:監(jiān)控主從節(jié)點運行情況。
通知:當(dāng)監(jiān)控節(jié)點出現(xiàn)故障,哨兵之間進行通訊。
自動故障轉(zhuǎn)移:當(dāng)監(jiān)控到主節(jié)點宕機后,斷開與宕機主節(jié)點連接的所有從節(jié)點,然后在從節(jié)點中選取一個作為主節(jié)點,將其他的從節(jié)點連接到這個最新的主節(jié)點。最后通知客戶端最新的服務(wù)器地址。
配置文件
在redis源碼中找到?sentinel.conf?配置文件,我們把它移動到redis安裝目錄下然后修改配置,共有下面幾個配置:vim /opt/app/redis6/bin/sentinel.conf#端口port 26379#后臺啟動daemonize yes#運行時PID文件pidfile /var/run/redis-sentinel.pid#日志文件(絕對路徑)logfile "/opt/app/redis6/sentinel.log"#數(shù)據(jù)目錄dir /tmp/sentinel_26379#監(jiān)控的節(jié)點名字可以自定義,后邊的2代表的:如果有倆個哨兵判斷這個主節(jié)點掛了那這個主節(jié)點就掛了,通常設(shè)置為哨兵個數(shù)一半加一sentinel monitor mymaster 127.0.0.1 6379 2#哨兵連接主節(jié)點多長時間沒有響應(yīng)就代表主節(jié)點掛了,單位毫秒。默認(rèn)30000毫秒,30秒。sentinel down-after-milliseconds mymaster 30000#在故障轉(zhuǎn)移時,最多有多少從節(jié)點對新的主節(jié)點進行同步。這個值越小完成故障轉(zhuǎn)移的時間就越長,這個值越大就意味著越多的從節(jié)點因為同步數(shù)據(jù)而暫時阻塞不可用sentinel parallel-syncs mymaster 1#在進行同步的過程中,多長時間完成算有效,單位是毫秒,默認(rèn)值是180000毫秒,3分鐘。sentinel failover-timeout mymaster 180000#禁止使用SENTINEL SET設(shè)置notification-script和client-reconfig-scriptsentinel deny-scripts-reconfig yes哨兵啟動及驗證
我這里演示在一臺機器上啟動3個Redis服務(wù)以及3個哨兵服務(wù),其中3個redis服務(wù)作一主兩從,哨兵監(jiān)控主節(jié)點,然后測試主節(jié)點掛了之后哨兵自動選舉新的master節(jié)點。[實際應(yīng)用中建議分別部署在不同的機器上]:Redis服務(wù):localhost:6381,localhost:6382,localhost:6383sentinel服務(wù):localhost:26381,localhost:26382,localhost:263836381為Redis初始主節(jié)點,6382,6383分別為6381的從節(jié)點。26381,26382,26383作為三個哨兵服務(wù)監(jiān)控上面的Redis主從架構(gòu)。配置啟動三個Redis服務(wù)以及Sentinel 服務(wù):1.首先復(fù)制Redis目錄出三個:cp -r /opt/app/redis6 /opt/app/redis6Acp -r /opt/app/redis6 /opt/app/redis6Bcp -r /opt/app/redis6 /opt/app/redis6C2.分別修改A,B,C三個目錄中的redis.conf和sentinel.conf文件,主要修改端口和文件路徑,下面以A為演示,B,C略過:vim redis.conf--------------------------------------------port 6381daemonize yespidfile "/var/run/redisA_6381.pid"logfile "/opt/app/redis6A/redis_6381.log" #需要手動touch文件dir "/opt/app/redis6A/data" #需要手動先mkdir文件夾--------------------------------------------vim sentinel.conf--------------------------------------------port 26381daemonize yespidfile /var/run/redis-sentinel_26381.pidlogfile "/opt/app/redis6A/sentinel_26381.log" #需要手動先touch文件dir /tmp/sentinel_26381 #需要手動先mkdir文件夾sentinel monitor mymaster 127.0.0.1 6381 2 #此參數(shù)在ABC三個服務(wù)中保持一致,都監(jiān)聽6381端口--------------------------------------------創(chuàng)建log文件和目錄:mkdir /opt/app/redis6A/datamkdir /opt/app/redis6B/datamkdir /opt/app/redis6C/datatouch /opt/app/redis6A/redis_6381.logtouch /opt/app/redis6B/redis_6382.logtouch /opt/app/redis6C/redis_6383.logmkdir /tmp/sentinel_26381mkdir /tmp/sentinel_26382mkdir /tmp/sentinel_26383touch /opt/app/redis6A/sentinel_26381.logtouch /opt/app/redis6B/sentinel_26382.logtouch /opt/app/redis6C/sentinel_26383.log3.配置完成后,分別啟動Redis三個服務(wù)以及Sentinel三個服務(wù):#啟動Redis/opt/app/redis6A/bin/redis-server /opt/app/redis6A/bin/redis.conf/opt/app/redis6B/bin/redis-server /opt/app/redis6B/bin/redis.conf/opt/app/redis6C/bin/redis-server /opt/app/redis6C/bin/redis.conf#配置Redis主從,6381為主,6382和6383為從節(jié)點#最后啟動Sentinel/opt/app/redis6A/bin/redis-sentinel /opt/app/redis6A/bin/sentinel.conf/opt/app/redis6B/bin/redis-sentinel /opt/app/redis6B/bin/sentinel.conf/opt/app/redis6C/bin/redis-sentinel /opt/app/redis6C/bin/sentinel.conf使用redis-cli客戶端命令行進入6381,6382,6383的Redis服務(wù),然后配置6382和6383作為6381的從節(jié)點:啟動哨兵服務(wù):此時我們在redis客戶端中使用debug命令模擬主節(jié)點崩潰的情況,然后看是否會選舉6382和6383提升為主節(jié)點,以及6381恢復(fù)啟動后是什么角色:#命令執(zhí)行一個非法的內(nèi)存訪問從而讓 Redis 崩潰,僅在開發(fā)時用于 BUG 調(diào)試,執(zhí)行后需要重啟服務(wù)debug segfault然后我們查看哨兵的日志:vim?/opt/app/redis6A/sentinel_26381.log重啟6381的redis服務(wù)后查看,哨兵已經(jīng)自動將6381節(jié)點作為6382新主節(jié)點的從節(jié)點:原理哨兵之間會有通訊,哨兵和主從節(jié)點之間也有監(jiān)控,基于這些信息同步和狀態(tài)監(jiān)控實現(xiàn)Redis的故障轉(zhuǎn)移:哨兵和哨兵之間以及哨兵和Redis主從節(jié)點之間每隔一秒發(fā)送ping監(jiān)控它們的健康狀態(tài);
哨兵向Redis主從節(jié)點每隔10秒發(fā)送一次info保存節(jié)點信息;
哨兵向Redis主節(jié)點每隔2秒發(fā)送一次hello,直到哨兵報出sdown,代表主節(jié)點失聯(lián),然后通知其余哨兵嘗試連接該主節(jié)點;
哨兵A發(fā)現(xiàn)Redis主節(jié)點失聯(lián);
哨兵A報出sdown,并通知其他哨兵,發(fā)送指令sentinel is-master-down-by-address-port給其余哨兵節(jié)點;
其余哨兵接收到哨兵A的指令后嘗試連接Redis主節(jié)點,發(fā)現(xiàn)主節(jié)點確實失聯(lián);
哨兵返回信息給哨兵A,當(dāng)超過半數(shù)的哨兵認(rèn)為主節(jié)點下線后,狀態(tài)會變成odown;
最先發(fā)現(xiàn)主節(jié)點下線的哨兵A會成為哨兵領(lǐng)導(dǎo)者負(fù)責(zé)這次的主從節(jié)點的切換工作;
哨兵Leader 根據(jù)一定規(guī)則從各個從節(jié)點中選擇出一個節(jié)點升級為主節(jié)點;
其余從節(jié)點修改對應(yīng)的主節(jié)點為新的主節(jié)點;
當(dāng)原主節(jié)點恢復(fù)啟動的時候,變?yōu)樾碌闹鞴?jié)點的從節(jié)點
數(shù)據(jù)分區(qū):突破單機的存儲限制,將數(shù)據(jù)分散到多個不同的節(jié)點存儲;
負(fù)載均衡:每個主節(jié)點都可以處理讀寫請求,提高了并發(fā)能力;
高可用:集群有著和哨兵模式類似的故障轉(zhuǎn)移能力,提升集群的穩(wěn)定性;
普通端口:即客戶端訪問端口,如默認(rèn)的6379;
集群端口:普通端口號加10000,如6379的集群端口為16379,用于集群節(jié)點之間的通訊;
MEET:在節(jié)點握手階段,對新加入的節(jié)點發(fā)送meet消息,請求新節(jié)點加入當(dāng)前集群,新節(jié)點收到消息會回復(fù)PONG消息;
PING:節(jié)點之間互相發(fā)送ping消息,收到消息的會回復(fù)pong消息。ping消息內(nèi)容包含本節(jié)點和其他節(jié)點的狀態(tài)信息,以此達到狀態(tài)同步;
PONG:pong消息包含自身的狀態(tài)數(shù)據(jù),在接收到ping或meet消息時會回復(fù)pong消息,也會主動向集群廣播pong消息;
FAIL:當(dāng)一個主節(jié)點判斷另一個主節(jié)點進入fail狀態(tài)時,會向集群廣播這個消息,接收到的節(jié)點會保存該消息并對該fail節(jié)點做狀態(tài)判斷;
PUBLISH:當(dāng)節(jié)點收到publish命令時,會先執(zhí)行命令,然后向集群廣播publish消息,接收到消息的節(jié)點也會執(zhí)行publish命令;
搭建集群
從Redis5之后我們就可以直接使用redis-cli --cluster命令自動部署Redis集群了,所以本篇也直接使用該方式搭建集群。?這里演示仍然是一臺機器上使用三主三從的方式部署Redis集群:配置:將上面的A,B,C復(fù)制出AA,BB,CC,然后修改里面的配置文件:1.首先復(fù)制Redis目錄出三個:cp -r /opt/app/redis6A /opt/app/redis6AAcp -r /opt/app/redis6B /opt/app/redis6BBcp -r /opt/app/redis6C /opt/app/redis6CC2.分別修改6個目錄中的redis.conf文件,主要開啟集群以及修改端口和文件路徑,下面以A為演示,其余略過:vim /opt/app/redis6A/bin/redis.conf--------------------------------------------port 6381daemonize yespidfile "/var/run/redisA_6381.pid"logfile "/opt/app/redis6A/redis_6381.log" #需要手動touch文件dir "/opt/app/redis6A/data" #需要手動先mkdir文件夾cluster-enabled yes # 啟用集群模式cluster-node-timeout 15000 # 設(shè)置當(dāng)前節(jié)點連接超時毫秒數(shù)cluster-config-file node_6381.conf #設(shè)置當(dāng)前節(jié)點集群配置文件路徑--------------------------------------------3.在6個目錄下分別創(chuàng)建log文件和目錄:mkdir /opt/app/redis6A/datatouch?/opt/app/redis6A/redis_6381.logcluster-config-file:每個節(jié)點在運行過程中,會維護一份集群配置文件。當(dāng)集群信息發(fā)生變化時(如增減節(jié)點),集群內(nèi)所有節(jié)點會將最新信息更新到該配置文件。節(jié)點重啟后,會重新讀取該配置文件,獲取集群信息,可以方便的重新加入到集群中。也就是說,當(dāng) Redis 節(jié)點以集群模式啟動時,會首先尋找是否有集群配置文件。如果有則使用文件中的配置啟動;如果沒有,則初始化配置并將配置保存到文件中。集群配置文件由 Redis 節(jié)點維護,不需要人工修改。?啟動部署:部署集群需要先啟動各個節(jié)點的服務(wù),此時這些節(jié)點都沒加到集群中,使用redis-cli --cluster create xxx命令創(chuàng)建集群:bin/redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6391 127.0.0.1:6392 127.0.0.1:6393 --cluster-replicas 1#這里的--cluster-replicas表示每個主節(jié)點有幾個副本節(jié)點redis-cli --cluster代替了之前的redis-trib.rb,我們無需安裝ruby環(huán)境即可直接使用它附帶的所有功能:創(chuàng)建集群、增刪節(jié)點、槽遷移、完整性檢查、數(shù)據(jù)重平衡等等。集群限制由于Redis集群中數(shù)據(jù)分布在不同的節(jié)點上,因此有些功能會受限:db庫:單機的Redis默認(rèn)有16個db數(shù)據(jù)庫,但在集群模式下只有一個db0;復(fù)制結(jié)構(gòu):上面的復(fù)制結(jié)構(gòu)有樹狀結(jié)構(gòu),但在集群模式下只允許單層復(fù)制結(jié)構(gòu);事務(wù)/lua腳本:僅允許操作的key在同一個節(jié)點上才可以在集群下使用事務(wù)或lua腳本;(使用Hash Tag可以解決)key的批量操作:如mget,mset操作,只有當(dāng)操作的key都在同一個節(jié)點上才可以執(zhí)行;(使用Hash Tag可以解決)keys/flushall:只會在該節(jié)點之上進行操作,不會對集群的其他節(jié)點進行操作;Hash Tag:上面介紹集群限制的時候,由于key被分布在不同的節(jié)點之上,因此無法跨節(jié)點做事務(wù)或lua腳本操作,但我們可以使用hash tag方式解決。hash tag:當(dāng)key包含{}的時候,不會對整個key做hash,只會對{}包含的部分做hash然后分配槽slot;因此我們可以讓不同的key在同一個槽內(nèi),這樣就可以解決key的批量操作和事務(wù)及l(fā)ua腳本的限制了;但由于hash tag會將不同的key分配在相同的slot中,如果使用不當(dāng),會造成數(shù)據(jù)分布不均的情況,需要注意。集群參數(shù)優(yōu)化cluster_node_timeout:默認(rèn)值為15s。影響ping消息接收節(jié)點的選擇,值越大對延遲容忍度越高,選擇的接收節(jié)點就越少,可以降低帶寬,但會影響收斂速度。應(yīng)該根據(jù)帶寬情況和實際要求具體調(diào)整。影響故障轉(zhuǎn)移的判定,值越大越不容易誤判,但完成轉(zhuǎn)移所消耗的時間就越長。應(yīng)根據(jù)網(wǎng)絡(luò)情況和實際要求具體調(diào)整。cluster-require-full-coverage為了保證集群的完整性,只有當(dāng)16384個槽slot全部分配完畢,集群才可以上線,但同時,若主節(jié)點發(fā)生故障且故障轉(zhuǎn)移還未完成時,原主節(jié)點的槽不在任何節(jié)點中,集群會處于下線狀態(tài),影響客戶端的使用。該參數(shù)可以改變此設(shè)定:no:? 表示當(dāng)槽沒有完全分配時,集群仍然可以上線;yes: 默認(rèn)配置,只有槽完全分配,集群才可以上線。歡迎點贊+收藏+轉(zhuǎn)發(fā)朋友圈素質(zhì)三連文章不錯?點個【在看】吧!??
總結(jié)
以上是生活随笔為你收集整理的redis 一般启动几个 哨兵_Redis6.0主从、哨兵、集群搭建和原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery多维对象计算个数_多维尺度分
- 下一篇: QQ农场怎么开挂_qq农场矿山辅助(QQ