Redis集羣容器化安裝

  1. Redis集羣概述

Redis做爲當前很是熱門的內存型數據結構存儲,可用於數據存儲,緩存和消息代理等。本文將講解如何基於docker搭建Redis集羣,Redis的集羣設計包括兩個部分:主從複製和哈希Slot。
1.1. 主從複製
主從複製在數據庫中很常見,通常用來作讀寫分離,Redis中也是如此。要求只有1個Master(主節點),能夠有N個slaver(從節點),並且Slaver也能夠有本身的Slaver,因爲這種主從的關係決定他們是在配置階段就要指定他們的上下級關係,而不是Zookeeper那種平行關係是自主推優出來的。
讀寫分離,Master只負責寫和同步數據給Slaver,Slaver承擔了被讀的任務,因此Slaver的擴容只能提升讀效率不能提升寫效率。
Slaver先將Master那邊獲取到的信息壓入磁盤,再load進內存,client端是從內存中讀取信息的。當一個新的Slaver加入到這個集羣時,會主動找Master來拜碼頭,Master發現新的小弟後將全量數據發送給新的Slaver,數據量越大性能消耗也就越大,因此儘可能避免在運行時作Slaver的擴容。
優勢:讀寫分離,經過增長Slaver能夠提升併發讀的能力。
缺點:Master寫能力是瓶頸,維護Slaver開銷也總將會變成瓶頸。
1.2. 哈希Slot
哈希Slot名字上可能很差理解,其實就是數據庫中的「水平劃分」。若是你以前有了解過數據庫的表分區的話,就會發現下來對於哈希Slot的描述,就和數據庫表分區裏面的「HASH分區」原理上大體相同。
圖片描述
對象保存到Redis以前先通過CRC16哈希到一個指定的Node上,例如圖中Object4最終Hash到了Node1上。
每一個Node被平均分配了一個Slot段,對應着0-16384,Slot不能重複也不能缺失,不然會致使對象重複存儲或沒法存儲。
Node之間也互相監聽,一旦有Node退出或者加入,會按照Slot爲單位作數據的遷移。例如Node1若是掉線了,0-5640這些Slot將會平均分攤到Node2和Node3上,因爲Node2和Node3自己維護的Slot還會在本身身上不會被從新分配,因此遷移過程當中不會影響到 5641-16384 Slot段的使用。
優勢:將Redis的寫操做分攤到了多個節點上,提升寫的併發能力,擴容簡單。
缺點:每一個Node承擔着互相監聽、高併發數據寫入、高併發數據讀出,工做任務繁重。
1.3. 合二爲一
看到這裏你們也就發現了,主從和哈希的設計優缺點正好是相互彌補的,將兩者結合在一塊兒,就是Redis集羣的終極形態,先Hash分邏輯節點,而後每一個邏輯節點內部是主從,如圖:
圖片描述
2.集羣安裝
默認咱們已經有了docker環境,如今開始基於docker安裝Redis集羣。redis 5.0 版本以前,網上有不少教程都是經過redis-trib.rb 來建立集羣,可是redis 5.0 版本之後,就只能經過 redis-cli 來實現。本文即經過 redis-cli 建立集羣,由於redis集羣的節點選舉方式是須要半數以上的master經過,因此建議建立奇數個節點。本例中建立3個Master節點,併爲每一個Master節點各分配1個Slave節點。
2.1. 宿主機環境
首先須要找一份原始的redis.conf文件,將其重命名爲:redis-cluster.tmpl,並配置以下幾個參數,此文件的目的是生成每個redis實例的redis.conf:
圖片描述
vi redis-cluster.tmpl
圖片描述
而後執行下列腳本,給3個Master和3個Slave建立各自的掛載卷目
圖片描述
錄當前目錄結構爲
圖片描述
2.2. 建立Redis節點
假設咱們只考慮單純的docker環境,並沒有docker-compose和k8s之類的服務編排,每一個redis容器之間必需要保證通信,能夠經過建立docker network。(使用微服務編排的狀況,後續再討論)
圖片描述
如今咱們就能夠運行docker redis 的 master 和 slave 實例了
圖片描述
查看已建立的redis容器
圖片描述
2.3. 構建集羣
經過redis-cli 命令構建集羣,隨便找一個redis容器,運行redis-cli --cluster create --cluster-replicas 1 ip:port 命令便可
圖片描述
記住構建集羣時,要保證節點redis數據爲空,不然會出現下列錯誤。
圖片描述
2.4. 集羣驗證
集羣搭建完成後,咱們經過 redis-cli 命令鏈接集羣節點驗證一下。redis 集羣節點的鏈接命令是經過 redis-cli -c -h ${ip} -p ${port}
圖片描述
圖片描述
能夠看到經過 "cluster info"命令看到集羣的基本信息,全部的slot (16384) 都分配完畢。而後經過 "cluster nodes" 命令查看到每一個master節點的slot分配的區域。至此,redis集羣基本安裝成功。
3.後期運維
3.1. 基本命令
集羣
圖片描述
節點
圖片描述
槽(slot)
圖片描述
3.2. 常見問題
(1)redis-cluster 把全部的物理節點映射到[ 0 ~ 16383 ]個slot(哈希槽)上,cluster負責維護 node<->slot<->value。
(2)集羣任意一個節點中,若是master掛掉,可是還有slaver,slave將自動升爲 master,系統正常。
(3)集羣任意一個節點中,若是master掛掉,而且沒有slaver,集羣將進入fail狀態。
(4)若是集羣超過半數以上節點的master掛掉,不論是否有slaver,集羣都將進入fail狀態。
(5)節點判斷是否失效的選舉,是集羣中全部的master參與的,若是半數以上的master節點與當前被檢測的master節點通信檢測超時(cluster-node-timerout),就認爲當前master節點掛掉了。
本人創業團隊產品MadPecker,主要作BUG管理、測試管理、應用分發
網址:www.madpecker.com,有須要的朋友歡迎試用、體驗!
本文爲MadPecker團隊技術人員編寫,轉載請標明出處node

相關文章
相關標籤/搜索