怎樣用集群方式開發(fā)app項目?
由于Redis出眾的性能,其在眾多的移動互聯(lián)網(wǎng)企業(yè)中得到廣泛的應(yīng)用。Redis在3.0版本前只支持單實例模式,雖然現(xiàn)在的服務(wù)器內(nèi)存可以達到100GB、200GB的規(guī)模,但是單實例模式限制了Redis沒法滿足業(yè)務(wù)的需求(例如新浪微博就曾經(jīng)在用Redis存儲了超過1TB的數(shù)據(jù))Redis的開發(fā)者antirez早在博客上提出Redis3.0版本中加入集群的功能,但3.0版本等到2015才發(fā)布正式版。各大企業(yè)在3.0版本還沒發(fā)布前為了解決Redis的存儲瓶頸,紛紛推出了各自的Redis集群方案。這些方案的核心思想是把數(shù)據(jù)分片(sharding)存儲在多個Redis實例中每片就是個Redis的實例。深圳APP開發(fā)公司下面介紹Redis的集群解決方案。
一、APP開發(fā)集群解決方案之客戶端分片
客戶端分片是把分片的邏輯放在Redis客戶端實現(xiàn),通過Redis客戶端預(yù)先定義好的路由規(guī)則,把對key的訪問轉(zhuǎn)發(fā)到不同的Redis的實例中,最后把返回結(jié)果匯集。這種方案的模式如圖7-15所示。
APP制作集群解決方案示意圖7-15客戶端分片的模式
客戶端分片的好處是所有的邏輯都是可控,不依賴于第三方分布式中司件。開發(fā)人員清楚怎么實現(xiàn)分片、路由的規(guī)則.不用擔(dān)心踩坑。客戶端分片的方案有下面的壞處
·這是一種靜態(tài)的分片方案,需要增加或者減少Redis實例的數(shù)量,都需要手工調(diào)整分片的程序。
·可運維性差,集群的數(shù)據(jù)出了任何問題都需要運維人員(查看Redis實例的部分)和開發(fā)人員(查看客戶端的分片邏輯部分)一起合作,延遲了解決問題的速度,增加了跨部門溝通的成本。
·在不同的客戶端程序中,維護相同的分片邏輯成本巨大。例如,系統(tǒng)中有兩套業(yè)務(wù)系統(tǒng)共用套Redis集群,一套業(yè)務(wù)系統(tǒng)用Jaya實現(xiàn),另一套業(yè)務(wù)系統(tǒng)用PHP實現(xiàn)。為了保證分片邏輯的致性,在Jaya客戶端中實現(xiàn)的分片邏輯也需要在PHP客戶端實現(xiàn)次。把相同的邏輯在不同的系統(tǒng)中分別實現(xiàn),這種設(shè)計本來就非常糟糕,而且需要耗費巨大的開發(fā)成本保證兩套業(yè)務(wù)系統(tǒng)分片邏輯的一致性。
二、APP開發(fā)之Twemproxy方案
Twemproxy是由Twitter開源的Redis代理,其基本原理是:Redis客戶端把請求發(fā)送到Twemproxy,Twemproxy根據(jù)路由規(guī)則發(fā)送到正確的Redis實例,最后Twemproxy把結(jié)果匯集返回給客戶端。
Twelnproxy通過引入了一個代理層,將多個Redis實例進行統(tǒng)管理,使Redis客戶端只需要在Twemproxy上進行操作,而不需要關(guān)心后面有多少個Redis實例,從而實現(xiàn)了Redis的集群。APP制作集群解決方案Twemproxy集群架構(gòu)如圖7-16所示。
APP集群解決方案示意圖7-16Twemproxy集群架構(gòu)
Twemproxy的優(yōu)點如下:
·客戶端像連接Redis實例樣連接Twemproxy,不需要改任何的代碼邏輯。
·支持無效Redis實例的自動刪除。
·Twemproxy與Redis實例保持連接,減少了客戶端與Redis實例的連接數(shù)。
Twelnproxy有如下不足:
·由于Redis客戶端的每個請求都經(jīng)過Twemproxy代理才能到達Redis服務(wù)器,這個過程中會產(chǎn)生性能損失。
·沒有友好的監(jiān)控管理后臺界面,不利于運維監(jiān)控。
·最大的問題是Twemproxy無法平滑地增加Redis實例。對于運維人員來說,當(dāng)因為業(yè)務(wù)需要增加Redis實例時工作量非常大。Twelnproxy作為最被廣泛使用、最久經(jīng)考驗、穩(wěn)定性最高的Redis代理,在業(yè)界被廣泛使用。
三、APP開發(fā)集群解決方案之Codis
Twemproxy不能平滑增加Redis實例的問題帶來了很大的不便,于是豌豆莢自主研發(fā)了Codis,一個支持平滑增加Redis實例的Redis代理軟件,其基于Go和C語言開發(fā),并于2014年11月在Github上開源。
Codis包含下面4個部分。
·CodisProxy:Redis客戶端連接到Redis實例的代理,實現(xiàn)了Redis的協(xié)議,Redis客戶端連接到CodisProxy進行各種操作。Codis Proxy是無狀態(tài)的,可以用keepalived等負載均衡軟件部署多個CodisProxy實現(xiàn)高可用。
·CodisRedis:Codis項目維護的Redis分支,添加了slot和原子的數(shù)據(jù)遷移命令。Codis上層的CodisProxy和Codisconfig只有與這個版本的Redis通信才能正常運行。
·Codisconfig:Codis管理工具??梢蕴砑觿h除CodisRedis節(jié)點,添加刪除CodisProxy,數(shù)據(jù)遷移等操作。另外,Codisconfig自帶了HTTP server,里面集成了一個管理界面,方便運維人員觀察Codis集群的狀態(tài)和進行相關(guān)的操作,極大提高了運維的方便性,彌補了Twemproxy的缺點。
·ZooKeeper:分布式的、開源的應(yīng)用程序協(xié)調(diào)服務(wù),是Hadoop和Hbase的重要組件,其為分布式應(yīng)用提供致性服務(wù),提供的功能包括:配置維護、名字服務(wù)、分布式同步、組服務(wù)等。Codis依賴于Zool:eeper存儲數(shù)據(jù)路由表的信息和Codis P roxy節(jié)點的元信息。另外,Codisconfig發(fā)起的命令都會通Zookeeper同步到Codis P roxy的節(jié)點。Codis的架構(gòu)如圖7-17所示
APP開發(fā)集群方案示意圖7-17Codis的架構(gòu)圖
在圖7-17的Codis的架構(gòu)圖中,Codis引入了Redis Seryer G roup,其通過指定了個主CodisRedis和個或多個從CodisRedis.實現(xiàn)了Redis集群的高可用。當(dāng)個主CodisRedis掛掉時,Codis不會自動把個從CodisRedis提升為主CodisRedis,這涉及到數(shù)據(jù)的一致性問題。
(Redis本身的數(shù)據(jù)同步是采用主從異步復(fù)制,當(dāng)數(shù)據(jù)在主CodisRedis寫入成功時,^CodisRedis是否己讀入這個數(shù)據(jù)是沒法保證的),需要管理員在管理界面上手動把從CodisRedis提升為主CodisRedis。
如果覺得麻煩,豌豆莢也提供了個工具Codis-ha,這個工具會在檢測到主CodisRedis掛掉的時候?qū)⑵湎戮€并提升個從CodisRedis為主CodisRedis。
Codis中采用預(yù)分片的形式,啟動的時候就創(chuàng)建了1024個slot,1個slot相當(dāng)于1個箱子,每個箱子有個固定的編號,范圍是l-1024。slot這個箱子用作存放Key,至于Key存放到哪個箱子,可以通過算法“crc32(key)%1024”獲得個數(shù)字,這個數(shù)字的范圍定是1--1024之間,Key就放到這個數(shù)字對應(yīng)的slot。例如,如果某個Key通過算法“crc32(key)%1024”得到的數(shù)字是5,就放到編碼為5的slot(箱子)。一個slot只能放一個'Redis Seryer Group,不能把1個slot放到多個Redis Seryer Group中。一個Redis Seryer Group最少可以存放1個slot,最大可以存放1024i'slot。因此,Codis中最多可以指定1024一個Redis Seryer Group。
Codis最大的優(yōu)勢在于支持平滑增加(減少)RedisSeryerGroup(Redis實例,能安全、透明地遷移數(shù)據(jù),這也是Codis有別于Twemproxy等靜態(tài)的分布式Redis解決方案的地方。Codis增加了RedisSeryerGroup后,就牽涉到slot的遷移問題。例如,系統(tǒng)有兩個RedisSeryerGroup.RedisSeryerGroup和slot的對應(yīng)關(guān)系如下。
當(dāng)增加了個RedisSeryer Group,slot就要重新分配了。Codis分配slot有兩種方法。
第一種:通過Codis管理工具Codisconfig手動重新,指定每個Redis Seryer Group所對應(yīng)的slot的范圍,例如可以指定Redis。Seryer Group和slot的新的對應(yīng)關(guān)系如下。

第二種:通過Codis管理工具Codisconfig的rebalance功能,會自動根據(jù)每個RedisSeryerGroup的內(nèi)存對slot進行遷移,以實現(xiàn)數(shù)據(jù)的均衡。好了APP開發(fā)公司本文關(guān)于APP項目制作怎樣使用集群模式的經(jīng)驗知識本文就分享到這里。謝謝你的關(guān)注。博納網(wǎng)絡(luò)編輯整理。