<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jinfeng_wang

    G-G-S,D-D-U!

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
    http://blog.720ui.com/2016/redis_action_04_cluster/ 



    下面介紹Redis的集群方案。

    Replication(主從復(fù)制)

    Redis的replication機(jī)制允許slave從master那里通過(guò)網(wǎng)絡(luò)傳輸拷貝到完整的數(shù)據(jù)備份,從而達(dá)到主從機(jī)制。為了實(shí)現(xiàn)主從復(fù)制,我們準(zhǔn)備三個(gè)redis服務(wù),依次命名為master,slave1,slave2。

    配置主服務(wù)器

    為了測(cè)試效果,我們先修改主服務(wù)器的配置文件redis.conf的端口信息

    1. port 6300

    配置從服務(wù)器

    replication相關(guān)的配置比較簡(jiǎn)單,只需要把下面一行加到slave的配置文件中。你只需要把ip地址和端口號(hào)改一下。

    1. slaveof 192.168.1.1 6379

    我們先修改從服務(wù)器1的配置文件redis.conf的端口信息和從服務(wù)器配置。

    1. port 6301
    2. slaveof 127.0.0.1 6300

    我們?cè)傩薷膹姆?wù)器2的配置文件redis.conf的端口信息和從服務(wù)器配置。

    1. port 6302
    2. slaveof 127.0.0.1 6300

    值得注意的是,從redis2.6版本開(kāi)始,slave支持只讀模式,而且是默認(rèn)的。可以通過(guò)配置項(xiàng)slave-read-only來(lái)進(jìn)行配置。
    此外,如果master通過(guò)requirepass配置項(xiàng)設(shè)置了密碼,slave每次同步操作都需要驗(yàn)證密碼,可以通過(guò)在slave的配置文件中添加以下配置項(xiàng)

    1. masterauth <password>

    測(cè)試

    分別啟動(dòng)主服務(wù)器,從服務(wù)器,我們來(lái)驗(yàn)證下主從復(fù)制。我們?cè)谥鞣?wù)器寫(xiě)入一條消息,然后再其他從服務(wù)器查看是否成功復(fù)制了。

    Sentinel(哨兵)

    主從機(jī)制,上面的方案中主服務(wù)器可能存在單點(diǎn)故障,萬(wàn)一主服務(wù)器宕機(jī),這是個(gè)麻煩事情,所以Redis提供了Redis-Sentinel,以此來(lái)實(shí)現(xiàn)主從切換的功能,類(lèi)似與zookeeper。

    Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當(dāng)用Redis做master-slave的高可用方案時(shí),假如master宕機(jī)了,Redis本身(包括它的很多客戶(hù)端)都沒(méi)有實(shí)現(xiàn)自動(dòng)進(jìn)行主備切換,而Redis-Sentinel本身也是一個(gè)獨(dú)立運(yùn)行的進(jìn)程,它能監(jiān)控多個(gè)master-slave集群,發(fā)現(xiàn)master宕機(jī)后能進(jìn)行自動(dòng)切換。

    它的主要功能有以下幾點(diǎn)

    • 監(jiān)控(Monitoring):不斷地檢查redis的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。
    • 提醒(Notification):如果發(fā)現(xiàn)某個(gè)redis服務(wù)器運(yùn)行出現(xiàn)狀況,可以通過(guò) API 向管理員或者其他應(yīng)用程序發(fā)送通知。
    • 自動(dòng)故障遷移(Automatic failover):能夠進(jìn)行自動(dòng)切換。當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí),會(huì)將失效主服務(wù)器的其中一個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器,并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器; 當(dāng)客戶(hù)端試圖連接失效的主服務(wù)器時(shí), 集群也會(huì)向客戶(hù)端返回新主服務(wù)器的地址, 使得集群可以使用新主服務(wù)器代替失效服務(wù)器。

    Redis Sentinel 兼容 Redis 2.4.16 或以上版本, 推薦使用 Redis 2.8.0 或以上的版本。

    配置Sentinel

    必須指定一個(gè)sentinel的配置文件sentinel.conf,如果不指定將無(wú)法啟動(dòng)sentinel。首先,我們先創(chuàng)建一個(gè)配置文件sentinel.conf

    1. port 26379
    2. sentinel monitor mymaster 127.0.0.1 6300 2

    官方典型的配置如下

    1. sentinel monitor mymaster 127.0.0.1 6379 2
    2. sentinel down-after-milliseconds mymaster 60000
    3. sentinel failover-timeout mymaster 180000
    4. sentinel parallel-syncs mymaster 1
    5.  
    6. sentinel monitor resque 192.168.1.3 6380 4
    7. sentinel down-after-milliseconds resque 10000
    8. sentinel failover-timeout resque 180000
    9. sentinel parallel-syncs resque 5

    配置文件只需要配置master的信息就好啦,不用配置slave的信息,因?yàn)閟lave能夠被自動(dòng)檢測(cè)到(master節(jié)點(diǎn)會(huì)有關(guān)于slave的消息)。

    需要注意的是,配置文件在sentinel運(yùn)行期間是會(huì)被動(dòng)態(tài)修改的,例如當(dāng)發(fā)生主備切換時(shí)候,配置文件中的master會(huì)被修改為另外一個(gè)slave。這樣,之后sentinel如果重啟時(shí),就可以根據(jù)這個(gè)配置來(lái)恢復(fù)其之前所監(jiān)控的redis集群的狀態(tài)。

    接下來(lái)我們將一行一行地解釋上面的配置項(xiàng):

    1. sentinel monitor mymaster 127.0.0.1 6379 2

    這行配置指示 Sentinel 去監(jiān)視一個(gè)名為 mymaster 的主服務(wù)器, 這個(gè)主服務(wù)器的 IP 地址為 127.0.0.1 , 端口號(hào)為 6300, 而將這個(gè)主服務(wù)器判斷為失效至少需要 2 個(gè) Sentinel 同意,只要同意 Sentinel 的數(shù)量不達(dá)標(biāo),自動(dòng)故障遷移就不會(huì)執(zhí)行。

    不過(guò)要注意, 無(wú)論你設(shè)置要多少個(gè) Sentinel 同意才能判斷一個(gè)服務(wù)器失效, 一個(gè) Sentinel 都需要獲得系統(tǒng)中多數(shù)(majority) Sentinel 的支持, 才能發(fā)起一次自動(dòng)故障遷移, 并預(yù)留一個(gè)給定的配置紀(jì)元 (configuration Epoch ,一個(gè)配置紀(jì)元就是一個(gè)新主服務(wù)器配置的版本號(hào))。換句話說(shuō), 在只有少數(shù)(minority) Sentinel 進(jìn)程正常運(yùn)作的情況下, Sentinel 是不能執(zhí)行自動(dòng)故障遷移的。sentinel集群中各個(gè)sentinel也有互相通信,通過(guò)gossip協(xié)議。

    除了第一行配置,我們發(fā)現(xiàn)剩下的配置都有一個(gè)統(tǒng)一的格式:

    1. sentinel <option_name> <master_name> <option_value>

    接下來(lái)我們根據(jù)上面格式中的option_name一個(gè)一個(gè)來(lái)解釋這些配置項(xiàng):

    • down-after-milliseconds 選項(xiàng)指定了 Sentinel 認(rèn)為服務(wù)器已經(jīng)斷線所需的毫秒數(shù)。
    • parallel-syncs 選項(xiàng)指定了在執(zhí)行故障轉(zhuǎn)移時(shí), 最多可以有多少個(gè)從服務(wù)器同時(shí)對(duì)新的主服務(wù)器進(jìn)行同步, 這個(gè)數(shù)字越小, 完成故障轉(zhuǎn)移所需的時(shí)間就越長(zhǎng)。

    啟動(dòng) Sentinel

    對(duì)于 redis-sentinel 程序, 你可以用以下命令來(lái)啟動(dòng) Sentinel 系統(tǒng)

    1. redis-sentinel sentinel.conf

    對(duì)于 redis-server 程序, 你可以用以下命令來(lái)啟動(dòng)一個(gè)運(yùn)行在 Sentinel 模式下的 Redis 服務(wù)器

    1. redis-server sentinel.conf --sentinel

    以上兩種方式,都必須指定一個(gè)sentinel的配置文件sentinel.conf, 如果不指定將無(wú)法啟動(dòng)sentinel。sentinel默認(rèn)監(jiān)聽(tīng)26379端口,所以運(yùn)行前必須確定該端口沒(méi)有被別的進(jìn)程占用。

    測(cè)試

    此時(shí),我們開(kāi)啟兩個(gè)Sentinel,關(guān)閉主服務(wù)器,我們來(lái)驗(yàn)證下Sentinel。發(fā)現(xiàn),服務(wù)器發(fā)生切換了。

    當(dāng)6300端口的這個(gè)服務(wù)重啟的時(shí)候,他會(huì)變成6301端口服務(wù)的slave。

    Twemproxy

    Twemproxy是由Twitter開(kāi)源的Redis代理, Redis客戶(hù)端把請(qǐng)求發(fā)送到Twemproxy,Twemproxy根據(jù)路由規(guī)則發(fā)送到正確的Redis實(shí)例,最后Twemproxy把結(jié)果匯集返回給客戶(hù)端。

    Twemproxy通過(guò)引入一個(gè)代理層,將多個(gè)Redis實(shí)例進(jìn)行統(tǒng)一管理,使Redis客戶(hù)端只需要在Twemproxy上進(jìn)行操作,而不需要關(guān)心后面有多少個(gè)Redis實(shí)例,從而實(shí)現(xiàn)了Redis集群。

    Twemproxy本身也是單點(diǎn),需要用Keepalived做高可用方案。

    這么些年來(lái),Twenproxy作為應(yīng)用范圍最廣、穩(wěn)定性最高、最久經(jīng)考驗(yàn)的分布式中間件,在業(yè)界廣泛使用。

    但是,Twemproxy存在諸多不方便之處,最主要的是,Twemproxy無(wú)法平滑地增加Redis實(shí)例,業(yè)務(wù)量突增,需增加Redis服務(wù)器;業(yè)務(wù)量萎縮,需要減少Redis服務(wù)器。但對(duì)Twemproxy而言,基本上都很難操作。其次,沒(méi)有友好的監(jiān)控管理后臺(tái)界面,不利于運(yùn)維監(jiān)控。

    Codis

    Codis解決了Twemproxy的這兩大痛點(diǎn),由豌豆莢于2014年11月開(kāi)源,基于Go和C開(kāi)發(fā)、現(xiàn)已廣泛用于豌豆莢的各種Redis業(yè)務(wù)場(chǎng)景。

    Codis 3.x 由以下組件組成:

    • Codis Server:基于 redis-2.8.21 分支開(kāi)發(fā)。增加了額外的數(shù)據(jù)結(jié)構(gòu),以支持 slot 有關(guān)的操作以及數(shù)據(jù)遷移指令。具體的修改可以參考文檔 redis 的修改。
    • Codis Proxy:客戶(hù)端連接的 Redis 代理服務(wù), 實(shí)現(xiàn)了 Redis 協(xié)議。 除部分命令不支持以外(不支持的命令列表),表現(xiàn)的和原生的 Redis 沒(méi)有區(qū)別(就像 Twemproxy)。對(duì)于同一個(gè)業(yè)務(wù)集群而言,可以同時(shí)部署多個(gè) codis-proxy 實(shí)例;不同 codis-proxy 之間由 codis-dashboard 保證狀態(tài)同步。
    • Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、刪除,以及據(jù)遷移等操作。在集群狀態(tài)發(fā)生改變時(shí),codis-dashboard 維護(hù)集群下所有 codis-proxy 的狀態(tài)的一致性。對(duì)于同一個(gè)業(yè)務(wù)集群而言,同一個(gè)時(shí)刻 codis-dashboard 只能有 0個(gè)或者1個(gè);所有對(duì)集群的修改都必須通過(guò) codis-dashboard 完成。
    • Codis Admin:集群管理的命令行工具。可用于控制 codis-proxy、codis-dashboard 狀態(tài)以及訪問(wèn)外部存儲(chǔ)。
    • Codis FE:集群管理界面。多個(gè)集群實(shí)例共享可以共享同一個(gè)前端展示頁(yè)面;通過(guò)配置文件管理后端 codis-dashboard 列表,配置文件可自動(dòng)更新。
    • Codis HA:為集群提供高可用。依賴(lài) codis-dashboard 實(shí)例,自動(dòng)抓取集群各個(gè)組件的狀態(tài);會(huì)根據(jù)當(dāng)前集群狀態(tài)自動(dòng)生成主從切換策略,并在需要時(shí)通過(guò) codis-dashboard 完成主從切換。
    • Storage:為集群狀態(tài)提供外部存儲(chǔ)。提供 Namespace 概念,不同集群的會(huì)按照不同 product name 進(jìn)行組織;目前僅提供了 Zookeeper 和 Etcd 兩種實(shí)現(xiàn),但是提供了抽象的 interface 可自行擴(kuò)展。

    Codis引入了Group的概念,每個(gè)Group包括1個(gè)Redis Master及一個(gè)或多個(gè)Redis Slave,這是和Twemproxy的區(qū)別之一,實(shí)現(xiàn)了Redis集群的高可用。當(dāng)1個(gè)Redis Master掛掉時(shí),Codis不會(huì)自動(dòng)把一個(gè)Slave提升為Master,這涉及數(shù)據(jù)的一致性問(wèn)題,Redis本身的數(shù)據(jù)同步是采用主從異步復(fù)制,當(dāng)數(shù)據(jù)在Maste寫(xiě)入成功時(shí),Slave是否已讀入這個(gè)數(shù)據(jù)是沒(méi)法保證的,需要管理員在管理界面上手動(dòng)把Slave提升為Master。

    Codis使用,可以參考官方文檔https://github.com/CodisLabs/codis/blob/release3.0/doc/tutorial_zh.md

    Redis 3.0集群

    Redis 3.0集群采用了P2P的模式,完全去中心化。支持多節(jié)點(diǎn)數(shù)據(jù)集自動(dòng)分片,提供一定程度的分區(qū)可用性,部分節(jié)點(diǎn)掛掉或者無(wú)法連接其他節(jié)點(diǎn)后,服務(wù)可以正常運(yùn)行。Redis 3.0集群采用Hash Slot方案,而不是一致性哈希。Redis把所有的Key分成了16384個(gè)slot,每個(gè)Redis實(shí)例負(fù)責(zé)其中一部分slot。集群中的所有信息(節(jié)點(diǎn)、端口、slot等),都通過(guò)節(jié)點(diǎn)之間定期的數(shù)據(jù)交換而更新。

    Redis客戶(hù)端在任意一個(gè)Redis實(shí)例發(fā)出請(qǐng)求,如果所需數(shù)據(jù)不在該實(shí)例中,通過(guò)重定向命令引導(dǎo)客戶(hù)端訪問(wèn)所需的實(shí)例。

    Redis 3.0集群,目前支持的cluster特性

    • 節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn)
    • slave->master 選舉,集群容錯(cuò)
    • Hot resharding:在線分片
    • 集群管理:cluster xxx
    • 基于配置(nodes-port.conf)的集群管理
    • ASK 轉(zhuǎn)向/MOVED 轉(zhuǎn)向機(jī)制

    如上圖所示,所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬。節(jié)點(diǎn)的fail是通過(guò)集群中超過(guò)半數(shù)的節(jié)點(diǎn)檢測(cè)失效時(shí)才生效。客戶(hù)端與redis節(jié)點(diǎn)直連,不需要中間proxy層。客戶(hù)端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可。redis-cluster把所有的物理節(jié)點(diǎn)映射到[0-16383]slot上cluster負(fù)責(zé)維護(hù)node<->slot<->value。


    選舉過(guò)程是集群中所有master參與,如果半數(shù)以上master節(jié)點(diǎn)與master節(jié)點(diǎn)通信超時(shí),認(rèn)為當(dāng)前master節(jié)點(diǎn)掛掉。

    當(dāng)集群不可用時(shí),所有對(duì)集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯(cuò)誤。如果集群任意master掛掉,且當(dāng)前master沒(méi)有slave,集群進(jìn)入fail狀態(tài),也可以理解成進(jìn)群的slot映射[0-16383]不完成時(shí)進(jìn)入fail狀態(tài)。如果進(jìn)群超過(guò)半數(shù)以上master掛掉,無(wú)論是否有slave集群進(jìn)入fail狀態(tài)。

    環(huán)境搭建

    現(xiàn)在,我們進(jìn)行集群環(huán)境搭建。集群環(huán)境至少需要3個(gè)主服務(wù)器節(jié)點(diǎn)。本次測(cè)試,使用另外3個(gè)節(jié)點(diǎn)作為從服務(wù)器的節(jié)點(diǎn),即3個(gè)主服務(wù)器,3個(gè)從服務(wù)器。

    修改配置文件,其它的保持默認(rèn)即可。

    1. # 根據(jù)實(shí)際情況修改
    2. port 7000
    3. # 允許redis支持集群模式
    4. cluster-enabled yes
    5. # 節(jié)點(diǎn)配置文件,由redis自動(dòng)維護(hù)
    6. cluster-config-file nodes.conf
    7. # 節(jié)點(diǎn)超時(shí)毫秒
    8. cluster-node-timeout 5000
    9. # 開(kāi)啟AOF同步模式
    10. appendonly yes

    創(chuàng)建集群

    目前這些實(shí)例雖然都開(kāi)啟了cluster模式,但是彼此還不認(rèn)識(shí)對(duì)方,接下來(lái)可以通過(guò)Redis集群的命令行工具redis-trib.rb來(lái)完成集群創(chuàng)建。
    首先,下載 https://raw.githubusercontent.com/antirez/redis/unstable/src/redis-trib.rb

    然后,搭建Redis 的 Ruby 支持環(huán)境。這里,不進(jìn)行擴(kuò)展,參考相關(guān)文檔。

    現(xiàn)在,接下來(lái)運(yùn)行以下命令。這個(gè)命令在這里用于創(chuàng)建一個(gè)新的集群, 選項(xiàng)–replicas 1 表示我們希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)。

    1. redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

    5.3、測(cè)試

    posted on 2016-12-14 16:35 jinfeng_wang 閱讀(116) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 2016-REDIS
    主站蜘蛛池模板: 亚洲国产精品无码专区在线观看 | 亚洲人精品亚洲人成在线| 亚洲自偷精品视频自拍| 全免费a级毛片免费看| 亚洲女同成av人片在线观看| 又粗又长又爽又长黄免费视频| 日本视频一区在线观看免费| 亚洲AV无码成人精品区天堂| 国产免费阿v精品视频网址| 国产亚洲精品一品区99热| 免费看黄的成人APP| 亚洲国产精品高清久久久| 免费高清国产视频| 亚洲AV乱码一区二区三区林ゆな| 国产成人一区二区三区视频免费| 久久亚洲精品中文字幕无码| 日韩精品无码专区免费播放| 亚洲视频手机在线| 免费毛片a在线观看67194 | 亚洲成av人无码亚洲成av人| 日韩一区二区在线免费观看| 国产亚洲综合久久| 亚洲国产小视频精品久久久三级 | 久久笫一福利免费导航| 亚洲一久久久久久久久| 日韩黄色免费观看| 免费人成视频在线播放| 激情综合色五月丁香六月亚洲| 国产色无码精品视频免费| 亚洲综合精品香蕉久久网97| 波多野结衣免费在线观看| 亚洲欧洲av综合色无码| 色片在线免费观看| 亚洲影院天堂中文av色| 国产免费观看网站| 国产精品免费久久久久影院 | 四虎影视精品永久免费| jizz在线免费观看| 亚洲av中文无码乱人伦在线播放| 99在线视频免费| 亚洲人成小说网站色|