摘要:本文將講解如何基于搭建集群,的集群設(shè)計包括兩個部分主從復(fù)制和哈希。至此,集群基本安裝成功。后期運維基本命令集群節(jié)點槽常見問題把所有的物理節(jié)點映射到個哈希槽上,負責維護。
Redis集群概述
Redis作為當前非常熱門的內(nèi)存型數(shù)據(jù)結(jié)構(gòu)存儲,可用于數(shù)據(jù)存儲,緩存和消息代理等。本文將講解如何基于docker搭建Redis集群,Redis的集群設(shè)計包括兩個部分:主從復(fù)制和哈希Slot。
1.1. 主從復(fù)制
主從復(fù)制在數(shù)據(jù)庫中很常見,一般用來做讀寫分離,Redis中也是如此。要求只有1個Master(主節(jié)點),可以有N個slaver(從節(jié)點),而且Slaver也可以有自己的Slaver,由于這種主從的關(guān)系決定他們是在配置階段就要指定他們的上下級關(guān)系,而不是Zookeeper那種平行關(guān)系是自主推優(yōu)出來的。
讀寫分離,Master只負責寫和同步數(shù)據(jù)給Slaver,Slaver承擔了被讀的任務(wù),所以Slaver的擴容只能提高讀效率不能提高寫效率。
Slaver先將Master那邊獲取到的信息壓入磁盤,再load進內(nèi)存,client端是從內(nèi)存中讀取信息的。當一個新的Slaver加入到這個集群時,會主動找Master來拜碼頭,Master發(fā)現(xiàn)新的小弟后將全量數(shù)據(jù)發(fā)送給新的Slaver,數(shù)據(jù)量越大性能消耗也就越大,所以盡量避免在運行時做Slaver的擴容。
優(yōu)點:讀寫分離,通過增加Slaver可以提高并發(fā)讀的能力。
缺點:Master寫能力是瓶頸,維護Slaver開銷也總將會變成瓶頸。
1.2. 哈希Slot
哈希Slot名字上可能不好理解,其實就是數(shù)據(jù)庫中的“水平劃分”。如果你之前有了解過數(shù)據(jù)庫的表分區(qū)的話,就會發(fā)現(xiàn)下來對于哈希Slot的描述,就和數(shù)據(jù)庫表分區(qū)里面的“HASH分區(qū)”原理上大致相同。
對象保存到Redis之前先經(jīng)過CRC16哈希到一個指定的Node上,例如圖中Object4最終Hash到了Node1上。
每個Node被平均分配了一個Slot段,對應(yīng)著0-16384,Slot不能重復(fù)也不能缺失,否則會導(dǎo)致對象重復(fù)存儲或無法存儲。
Node之間也互相監(jiān)聽,一旦有Node退出或者加入,會按照Slot為單位做數(shù)據(jù)的遷移。例如Node1如果掉線了,0-5640這些Slot將會平均分攤到Node2和Node3上,由于Node2和Node3本身維護的Slot還會在自己身上不會被重新分配,所以遷移過程中不會影響到 5641-16384 Slot段的使用。
優(yōu)點:將Redis的寫操作分攤到了多個節(jié)點上,提高寫的并發(fā)能力,擴容簡單。
缺點:每個Node承擔著互相監(jiān)聽、高并發(fā)數(shù)據(jù)寫入、高并發(fā)數(shù)據(jù)讀出,工作任務(wù)繁重。
1.3. 合二為一
看到這里大家也就發(fā)現(xiàn)了,主從和哈希的設(shè)計優(yōu)缺點正好是相互彌補的,將二者結(jié)合在一起,就是Redis集群的終極形態(tài),先Hash分邏輯節(jié)點,然后每個邏輯節(jié)點內(nèi)部是主從,如圖:
2.集群安裝
默認我們已經(jīng)有了docker環(huán)境,現(xiàn)在開始基于docker安裝Redis集群。redis 5.0 版本之前,網(wǎng)上有很多教程都是通過redis-trib.rb 來創(chuàng)建集群,但是redis 5.0 版本以后,就只能通過 redis-cli 來實現(xiàn)。本文即通過 redis-cli 創(chuàng)建集群,因為redis集群的節(jié)點選舉方式是需要半數(shù)以上的master通過,所以建議創(chuàng)建奇數(shù)個節(jié)點。本例中創(chuàng)建3個Master節(jié)點,并為每個Master節(jié)點各分配1個Slave節(jié)點。
2.1. 宿主機環(huán)境
首先需要找一份原始的redis.conf文件,將其重命名為:redis-cluster.tmpl,并配置如下幾個參數(shù),此文件的目的是生成每一個redis實例的redis.conf:
vi redis-cluster.tmpl
然后執(zhí)行下列腳本,給3個Master和3個Slave創(chuàng)建各自的掛載卷目
錄當前目錄結(jié)構(gòu)為
2.2. 創(chuàng)建Redis節(jié)點
假設(shè)我們只考慮單純的docker環(huán)境,并無docker-compose和k8s之類的服務(wù)編排,每個redis容器之間必須要保證通訊,可以通過創(chuàng)建docker network。(使用微服務(wù)編排的情況,后續(xù)再討論)
現(xiàn)在我們就可以運行docker redis 的 master 和 slave 實例了
查看已創(chuàng)建的redis容器
2.3. 構(gòu)建集群
通過redis-cli 命令構(gòu)建集群,隨便找一個redis容器,運行redis-cli --cluster create --cluster-replicas 1 ip:port 命令即可
記住構(gòu)建集群時,要保證節(jié)點redis數(shù)據(jù)為空,否則會出現(xiàn)下列錯誤。
2.4. 集群驗證
集群搭建完成后,我們通過 redis-cli 命令連接集群節(jié)點驗證一下。redis 集群節(jié)點的連接命令是通過 redis-cli -c -h ${ip} -p ${port}
可以看到通過 "cluster info"命令看到集群的基本信息,所有的slot (16384) 都分配完畢。然后通過 "cluster nodes" 命令查看到每個master節(jié)點的slot分配的區(qū)域。至此,redis集群基本安裝成功。
3.后期運維
3.1. 基本命令
集群
節(jié)點
槽(slot)
3.2. 常見問題
(1)redis-cluster 把所有的物理節(jié)點映射到[ 0 ~ 16383 ]個slot(哈希槽)上,cluster負責維護 node<->slot<->value。
(2)集群任意一個節(jié)點中,如果master掛掉,但是還有slaver,slave將自動升為 master,系統(tǒng)正常。
(3)集群任意一個節(jié)點中,如果master掛掉,并且沒有slaver,集群將進入fail狀態(tài)。
(4)如果集群超過半數(shù)以上節(jié)點的master掛掉,不管是否有slaver,集群都將進入fail狀態(tài)。
(5)節(jié)點判斷是否失效的選舉,是集群中所有的master參與的,如果半數(shù)以上的master節(jié)點與當前被檢測的master節(jié)點通訊檢測超時(cluster-node-timerout),就認為當前master節(jié)點掛掉了。
本人創(chuàng)業(yè)團隊產(chǎn)品MadPecker,主要做BUG管理、測試管理、應(yīng)用分發(fā)
網(wǎng)址:www.madpecker.com,有需要的朋友歡迎試用、體驗!
本文為MadPecker團隊技術(shù)人員編寫,轉(zhuǎn)載請標明出處
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/27912.html
摘要:本文將講解如何基于搭建集群,的集群設(shè)計包括兩個部分主從復(fù)制和哈希。至此,集群基本安裝成功。后期運維基本命令集群節(jié)點槽常見問題把所有的物理節(jié)點映射到個哈希槽上,負責維護。 Redis集群概述 Redis作為當前非常熱門的內(nèi)存型數(shù)據(jù)結(jié)構(gòu)存儲,可用于數(shù)據(jù)存儲,緩存和消息代理等。本文將講解如何基于docker搭建Redis集群,Redis的集群設(shè)計包括兩個部分:主從復(fù)制和哈希Slot。1.1....
摘要:本文將講解如何基于搭建集群,的集群設(shè)計包括兩個部分主從復(fù)制和哈希。對象保存到之前先經(jīng)過哈希到一個指定的上,例如圖中最終到了上。至此,集群基本安裝成功。返回個槽中的鍵常見問題把所有的物理節(jié)點映射到個哈希槽上,負責維護。 1. Redis集群概述 Redis作為當前非常熱門的內(nèi)存型數(shù)據(jù)結(jié)構(gòu)存儲,可用于數(shù)據(jù)存儲,緩存和消息代理等。本文將講解如何基于docker搭建Redis集群,Redis的...
摘要:雖然可以使用相同的方式部署應(yīng)用到云端,使用外部負載均衡器,但動態(tài)添加或者減少負載均衡節(jié)點依舊是痛點。這對使用外部負載均衡器幫助巨大。 數(shù)人云今天帶來的本篇文章將分享Docker在應(yīng)用程序生命周期每個階段中所扮演的角色,以及遷移到Swarm集群時需要考慮的問題。 利用Docker來開發(fā) Docker讓工作更輕松。如需要一個部署安裝MySQL數(shù)據(jù)庫,或者安裝Ghost,又或者Redis數(shù)據(jù)...
閱讀 2848·2021-11-04 16:15
閱讀 3566·2021-09-29 09:35
閱讀 4172·2021-09-22 15:45
閱讀 1473·2019-08-30 15:55
閱讀 1760·2019-08-30 15:44
閱讀 2818·2019-08-29 12:56
閱讀 2783·2019-08-26 13:30
閱讀 2233·2019-08-23 17:00