理解并从头搭建redis集群
部分開發(fā)人員工作當(dāng)中只是在應(yīng)用中使用redis,比如用來做數(shù)據(jù)結(jié)果的緩存。而且現(xiàn)在有很多不錯(cuò)的redis客戶端工具(redisson),基本上可以不用關(guān)注redis命令就可以完成相當(dāng)部分的功能。所以可能會對如下這些問題關(guān)注點(diǎn)不夠:
如何容災(zāi)?即某個(gè)redis節(jié)點(diǎn)出了問題如何保證服務(wù)的高可用性
如何橫向擴(kuò)容?當(dāng)數(shù)據(jù)量特別大時(shí),如何解決單個(gè)redis的性能問題
集群至少需要幾臺機(jī)器?或者幾個(gè)redis節(jié)點(diǎn)
集群搭建都利用什么技術(shù),哪些工具?
如何容災(zāi)?
redis提供了主從熱備機(jī)制,主服務(wù)器的數(shù)據(jù)同步到從服務(wù)器,通過哨兵實(shí)時(shí)監(jiān)控主服務(wù)器狀態(tài)并負(fù)責(zé)選舉主服務(wù)器。當(dāng)發(fā)現(xiàn)主服務(wù)器異常時(shí)根據(jù)一定的算法重新選舉主服務(wù)器并將問題服務(wù)器從可用列表中去除,最后通知客戶端。主從是一對多的樹型結(jié)構(gòu),如下圖:
哨兵
哨兵是sentinel的中文名稱,是redis出的一個(gè)高可用架構(gòu)的工具,自身是一個(gè)獨(dú)立的進(jìn)程,可以同時(shí)監(jiān)控一個(gè)以上的redis集群。
哨兵集群
基于高可用的考慮,哨兵自身也是需要支持集群的,如果只有一個(gè)哨兵就會存在單點(diǎn)問題。
哨兵決策
哨兵有一個(gè)數(shù)量配置,當(dāng)多少個(gè)哨兵同時(shí)認(rèn)為某個(gè)主服務(wù)不可用時(shí)才進(jìn)行主從切換,比如總共有5個(gè)哨兵,當(dāng)3個(gè)哨兵認(rèn)為服務(wù)不可用時(shí)才決定做主從切換。這么做可以避免一些誤切換,降低切換成本,比如瞬時(shí)的網(wǎng)絡(luò)異常等。
如何橫向擴(kuò)容?
無論是redis還是其它一些數(shù)據(jù)庫之類的產(chǎn)品,當(dāng)單節(jié)點(diǎn)的數(shù)據(jù)容量達(dá)到一定上限后,服務(wù)對外提供的能力會越來越弱。redis在高版本中提供了redis-trib.rb來實(shí)現(xiàn)集群功能,也可以使用第三方的工具twemproxy。
去中心化,每個(gè)節(jié)點(diǎn)都是平等的
redis集群從設(shè)計(jì)上沒有考慮中心化,這樣可以避免中心節(jié)點(diǎn)的單點(diǎn)等問題。每個(gè)節(jié)點(diǎn)都能掌握整個(gè)集群的狀態(tài),連接任意的節(jié)點(diǎn)都可以訪問到所有的key,就像單節(jié)點(diǎn)的redis一樣。
集群原理圖
自己理解畫的,如有理解不對的地方可以指出。
key與redis節(jié)點(diǎn)的關(guān)系
引入了hasy solt,中文理解為哈希槽。總共16384個(gè),我們操作的key通過取模算法確認(rèn)key落在哪個(gè)槽上。
HASH_SLOT = CRC16(key) mod 16384
哈希槽與節(jié)點(diǎn)之間有一定關(guān)系,所以我們就可以將key分配到某個(gè)具體的redis節(jié)點(diǎn)上了。
詳細(xì)的關(guān)系可再研究,簡單的比如節(jié)點(diǎn)A負(fù)責(zé)0-5000編號的哈希槽,節(jié)點(diǎn)B負(fù)責(zé)5001-1000
一步一步搭建
開始搭建三主三從的集群,系統(tǒng)是ubuntu,采用redis提供的集群工具redis-trib.rb。
安裝最新redis
創(chuàng)建redis_cluster目錄,并且創(chuàng)建7000到7005這6個(gè)目錄
將redis目錄下的redis.conf復(fù)制到上面創(chuàng)建的6個(gè)目錄中
分別修改redis.conf文件,對6個(gè)文件做類似的修改。
bind需要注意的就是需要配置為其它機(jī)器可以訪問的ip,否則無論是創(chuàng)建集群還是客戶端連接都會有問題。
啟動6個(gè)redis
創(chuàng)建集群
redis的src目錄下有個(gè)redis-trib.rb,將它復(fù)制到/usr/local/bin中,然后執(zhí)行如下腳本:
--replicas后面的1代表從服務(wù)器的個(gè)數(shù),上面可以理解為前面3個(gè)為主服務(wù)器,后面三個(gè)分別做為從服務(wù)器,即三對主從。
執(zhí)行過程中會遇到提示需要安裝ruby,安裝完成之后又會提示安裝 gem redis。
安裝gem redis,折騰了好久,最終發(fā)現(xiàn)是因?yàn)樵趪鴥?nèi)訪問不了某些網(wǎng)站導(dǎo)致通過apt-get install安裝不成功,最后通過下載源碼的方式安裝成功。
再次執(zhí)行創(chuàng)建集群的腳本,出現(xiàn)如下提示:
輸入yes,繼續(xù)
最少需要多少個(gè)主服務(wù)器?
可能是基于某些約定,集群約定只有當(dāng)可用節(jié)點(diǎn)數(shù)大于半數(shù)以上時(shí)才具備對外提供服務(wù)的能力。首先數(shù)量一定是奇數(shù),其實(shí)必須大于1,所以最少的主服務(wù)器數(shù)量為3。
測試集群
連接客戶端,由于我的所有節(jié)點(diǎn)都是在本地,所以不需要輸入ip,但需要加-c的參數(shù)。
連接成功后,增加一個(gè)key
set mykey 123有一行提示語,指向到端口7002,這說明雖然我們連接的是7000的實(shí)例,但通過hash算法最終會將key分配到7002的實(shí)例上。
再連接7005端口查詢下key,測試下是否任意一個(gè)實(shí)例都可以查詢到key
get mykey顯示指向到端口7002
集群需要注意的地方
這塊還未仔細(xì)研究,有些命令在集群下是不支持的,待后續(xù)求證。
引用
http://www.cnblogs.com/wuxl360/p/5920330.html
https://segmentfault.com/a/1190000002680804
http://blog.csdn.net/lifeiaidajia/article/details/45370377
總結(jié)
真實(shí)環(huán)境的部署與單機(jī)部署還是差異比較大的,但也不復(fù)雜,盡管部分開發(fā)人員可能一輩子都不會有機(jī)會在線上搭建redis集群,但了解redis的高可用可擴(kuò)展的方案對設(shè)計(jì)大型系統(tǒng)還是有比較大的幫助的,也有助于分析解決線上問題。看了上面的這些,對于本文開頭提到的問題就不難理解了。
相關(guān)文章:
?Redis集群~StackExchange.redis連接Sentinel服務(wù)器并訂閱相關(guān)事件
用Docker構(gòu)建分布式Redis集群
推薦–個(gè)通用緩存接口抽象類庫:CacheManager
C#使用Redis集群緩存
StackExchange.Redis客戶端讀寫主從配置,以及哨兵配置
怎樣在Redis通過StackExchange.Redis 存儲集合類型List
原文地址:http://www.cnblogs.com/ASPNET2008/p/6400674.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的理解并从头搭建redis集群的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 十五岁,谈谈我眼中的.NET
- 下一篇: Docker4Dev#7 使用 Wind