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

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

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

    posts - 12, comments - 8, trackbacks - 0, articles - 5
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    一. 應(yīng)用場(chǎng)景

    在大型分布式應(yīng)用中,我們經(jīng)常碰到在多數(shù)據(jù)庫(kù)之間的數(shù)據(jù)同步問(wèn)題,比如說(shuō)一款游戲,在玩家注冊(cè)后,可以馬上登陸進(jìn)入服務(wù)器,數(shù)據(jù)在一個(gè)IDC更新,其它IDC立即可見(jiàn)。為了簡(jiǎn)化思路,我們這里稱(chēng)玩家注冊(cè)的數(shù)據(jù)庫(kù)(數(shù)據(jù)來(lái)源庫(kù))為中心庫(kù),同步目的地的數(shù)據(jù)庫(kù)為分站庫(kù)。

    在分布式領(lǐng)域有個(gè)CAP理論,是說(shuō)Consistency(一致性), Availability(可用性), Partition tolerance(分區(qū)和容錯(cuò)) 三部分在系統(tǒng)實(shí)現(xiàn)只可同時(shí)滿(mǎn)足二點(diǎn),無(wú)法三者兼顧。

    能做的

    · 數(shù)據(jù)快速搬運(yùn)到指定的IDC節(jié)點(diǎn)

    · 數(shù)據(jù)傳遞過(guò)程中失敗時(shí),重新傳遞

    · 監(jiān)控?cái)?shù)據(jù)傳遞流程

    · 故障轉(zhuǎn)移

    · 數(shù)據(jù)版本控制

    · 分配全局唯一的ID

    不能做的

    · 不參與業(yè)務(wù)行為,業(yè)務(wù)操作只能通過(guò)注冊(cè)的方式集成

    · 不保存業(yè)務(wù)數(shù)據(jù),不提供傳遞的業(yè)務(wù)的查詢(xún)

    二.系統(tǒng)要求

    1.數(shù)據(jù)快速同步:除去網(wǎng)絡(luò)原因,正常情況下從來(lái)源庫(kù)同步到接收庫(kù)的時(shí)間不超過(guò)300m2.高并發(fā):?jiǎn)蝹€(gè)應(yīng)用每秒同步2000條記錄
    3.可伸縮性,在資源達(dá)到上限時(shí)能通過(guò)增加應(yīng)用分散處理后期增長(zhǎng)的壓力
    4.數(shù)據(jù)完整性要求,在數(shù)據(jù)同步過(guò)程中保證數(shù)據(jù)不丟失和數(shù)據(jù)安全
    5.故障轉(zhuǎn)移和數(shù)據(jù)恢復(fù)功能

    三.設(shè)計(jì)思路

    系統(tǒng)優(yōu)化,最常用的就是進(jìn)行業(yè)務(wù)切割,將總?cè)蝿?wù)切割為許多子任務(wù),分區(qū)塊分析系統(tǒng)中可能存在的性能瓶頸并有針對(duì)性地進(jìn)行優(yōu)化,在本系統(tǒng)中,主要業(yè)務(wù)包含以下內(nèi)容:
    1.Syncer:外部接口,接收同步數(shù)據(jù)請(qǐng)求,初始化同步系統(tǒng)的一些必要數(shù)據(jù)
    2.Delivery:將同步數(shù)據(jù)按照業(yè)務(wù)或優(yōu)先級(jí)進(jìn)行分發(fā),并記錄分發(fā)結(jié)果
    3.Batch:分站庫(kù)收到同步數(shù)據(jù)后,根據(jù)不同的業(yè)務(wù)類(lèi)型調(diào)用相應(yīng)的業(yè)務(wù)邏輯處理數(shù)據(jù)
    基于以上三塊業(yè)務(wù)功能,我們可以把整個(gè)數(shù)據(jù)同步流程切割為3個(gè)應(yīng)用,具體如下圖顯示。在Syncer端應(yīng)用中,我們需要將原始同步數(shù)據(jù)和分發(fā)的分站進(jìn)行存儲(chǔ),以備失敗恢復(fù),此時(shí)如果采用數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ),勢(shì)必會(huì)受限于數(shù)據(jù)庫(kù)性能影響,因此我們采用了高效的key-value風(fēng)格存儲(chǔ)的redis服務(wù)來(lái)記錄數(shù)據(jù),同時(shí)在不同應(yīng)用之間采用隊(duì)列(Httpsqs服務(wù))的方式來(lái)進(jìn)行通訊,同時(shí)也保證的數(shù)據(jù)通訊的順序性,為之后的順序同步做好基礎(chǔ)。
    Httpsqs提供了http風(fēng)格的數(shù)據(jù)操作模式,業(yè)務(wù)編碼非常簡(jiǎn)單,同時(shí)也提供了web形式的隊(duì)列處理情況查詢(xún),這是選擇它做隊(duì)列服務(wù)很大一部分原因:方便業(yè)務(wù)操作和性能監(jiān)控。

    四.數(shù)據(jù)流轉(zhuǎn) 

    綠色-正常流程、紅色-異常流程

    隊(duì)列處理

    根據(jù)業(yè)務(wù)劃分隊(duì)列名稱(chēng),每個(gè)隊(duì)列再劃分為三個(gè)關(guān)聯(lián)隊(duì)列:正常隊(duì)列(Normal)、重試隊(duì)列(Retry)、死亡隊(duì)列(Death),處理流程為:

    【進(jìn)程A】把數(shù)據(jù)先放入正常隊(duì)列,如果放置失敗寫(xiě)恢復(fù)日志

    【進(jìn)程B】監(jiān)聽(tīng)正常隊(duì)列,獲取隊(duì)列數(shù)據(jù)并進(jìn)行業(yè)務(wù)處理,處理失敗放入重試隊(duì)列

    【進(jìn)程C】監(jiān)聽(tīng)重試隊(duì)列,過(guò)幾秒獲取隊(duì)列數(shù)據(jù)并重新進(jìn)行業(yè)務(wù)處理,處理失敗放入死亡隊(duì)列

    【進(jìn)程D】監(jiān)聽(tīng)死亡隊(duì)列,獲取隊(duì)列數(shù)據(jù)并重新進(jìn)行業(yè)務(wù)處理,處理失敗重新放入死亡隊(duì)列尾部,等待下一次輪回

    業(yè)務(wù)處理失敗如果無(wú)法再次放入隊(duì)列,記錄恢復(fù)日志

    數(shù)據(jù)同步流程

    1發(fā)送數(shù)據(jù),支持Http POST:curl -d "經(jīng)過(guò)URL編碼的文本消息",如"http://host:port/sync_all/register"
    或者Http GET:curl "http://host:port/sync_all/register?data=經(jīng)過(guò)URL編碼的文本消息"

    sync-syncer接收到同步數(shù)據(jù)請(qǐng)求,創(chuàng)建sid并分解出需要同步的節(jié)點(diǎn)個(gè)數(shù),把原始數(shù)據(jù)和子任務(wù)寫(xiě)入redis中,sid寫(xiě)入httpsqs中

    sync-delivery監(jiān)聽(tīng)中心httpsqs隊(duì)列,根據(jù)sid從redis獲取到原始數(shù)據(jù)和需要同步的節(jié)點(diǎn)地址,往其他節(jié)點(diǎn)發(fā)送數(shù)據(jù),流程如按"隊(duì)列處理流程"進(jìn)行

    sync-batch監(jiān)聽(tīng)分節(jié)點(diǎn)的httpsqs隊(duì)列,調(diào)用已經(jīng)注冊(cè)的處理器處理隊(duì)列數(shù)據(jù),流程如按"隊(duì)列處理流程"進(jìn)行

    三. 恢復(fù)和監(jiān)控

    恢復(fù)數(shù)據(jù)源

    · httpsqs中的死亡隊(duì)列 - 業(yè)務(wù)處理暫時(shí)處理不了的數(shù)據(jù)

    · recovery日志文件 - 其它異常情況下的數(shù)據(jù),例如網(wǎng)絡(luò)無(wú)法連接、內(nèi)部服務(wù)不可用

    數(shù)據(jù)恢復(fù)

    獨(dú)立的應(yīng)用來(lái)處理正常流程中沒(méi)有完成的任務(wù),主要功能有:

    · 監(jiān)聽(tīng)死亡隊(duì)列,進(jìn)行業(yè)務(wù)重做,再次執(zhí)行失敗時(shí)將執(zhí)行次數(shù)+1,最大執(zhí)行次數(shù)為5(默認(rèn)),超出上限則記錄到恢復(fù)日志中

    · 讀取恢復(fù)日志,重新放入死亡隊(duì)列

    應(yīng)用監(jiān)控

    · 使用scribe日志框架服務(wù)業(yè)務(wù)日志的采集和監(jiān)控

    · 收集重要的業(yè)務(wù)操作日志

    · 動(dòng)態(tài)的開(kāi)啟/關(guān)閉某類(lèi)業(yè)務(wù)日志

    · 對(duì)redis進(jìn)行監(jiān)控

    · 對(duì)httpsps,監(jiān)控隊(duì)列個(gè)數(shù),每個(gè)隊(duì)列的狀態(tài)

    四. 數(shù)據(jù)結(jié)構(gòu)

    {"sid":111,"type":"reg","v":1,"data":"hello world","ctime":65711321800,"exec":1}

    · sid(sync id) - 全局唯一id

    · v(version) - 版本號(hào)

    · data - 業(yè)務(wù)數(shù)據(jù)

    · ctime(create time) - 創(chuàng)建時(shí)間(毫秒)

    · exec - 可選,執(zhí)行次數(shù)

    類(lèi)別

    key格式

    value格式

    備注

    redis原始數(shù)據(jù)

    sync:<業(yè)務(wù)類(lèi)型>:<sid>

    {"ctime":65711321800,"v":1,"data":"hello world"}

    分站沒(méi)有此項(xiàng)

    redis業(yè)務(wù)附加任務(wù)

    sync:<業(yè)務(wù)類(lèi)型>:<sid>:sub

    set類(lèi)型,保存需要同步的節(jié)點(diǎn)id,例如[1,3,5]

    分發(fā)確認(rèn)Set數(shù)據(jù)結(jié)構(gòu) 

    httpsqs隊(duì)列

    sync:<業(yè)務(wù)類(lèi)型> 
    sync:<業(yè)務(wù)類(lèi)型>:retry 
    sync:<業(yè)務(wù)類(lèi)型>:death

    {"sid":111,"type":"pp_register","exec":1} 

    中心隊(duì)列內(nèi)容,key中<業(yè)務(wù)類(lèi)型>是可選項(xiàng) 

    httpsqs隊(duì)列

    sync:<業(yè)務(wù)類(lèi)型> 
    sync:<業(yè)務(wù)類(lèi)型>:retry 
    sync:<業(yè)務(wù)類(lèi)型>:death

    {"sid":111,"v":1,"data":"hello world","ctime":65711321800,"exec":1} 

    分站隊(duì)列內(nèi)容,包含業(yè)務(wù)數(shù)據(jù) 

    所有的key都小寫(xiě),以 ':' 作為分隔符

    五.編碼及測(cè)試結(jié)果

    經(jīng)過(guò)編碼和測(cè)試,在內(nèi)網(wǎng)環(huán)境下,在無(wú)數(shù)據(jù)庫(kù)限制的情況下,單應(yīng)用可以傳遞1500條/秒,基本滿(mǎn)足業(yè)務(wù)需求。如果需進(jìn)一步擴(kuò)展,采用集群式布署可使得吞吐量成倍的增長(zhǎng)。


    評(píng)論

    # re: 數(shù)據(jù)同步系統(tǒng)設(shè)計(jì)  回復(fù)  更多評(píng)論   

    2013-07-29 16:02 by adf
    asdfasdfadsf

    # re: 數(shù)據(jù)同步系統(tǒng)設(shè)計(jì)[未登錄](méi)  回復(fù)  更多評(píng)論   

    2013-11-06 17:23 by 魚(yú)中魚(yú)
    要是有個(gè)示例就好了。

    # re: 數(shù)據(jù)同步系統(tǒng)設(shè)計(jì)  回復(fù)  更多評(píng)論   

    2013-12-26 16:41 by bolo
    太慢了吧,才2000條/s,我做的可以7000條/s

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 在线亚洲精品视频| 男女一边摸一边做爽的免费视频| 亚洲男人在线无码视频| 7723日本高清完整版免费| 最近的2019免费中文字幕| 羞羞视频免费网站入口| 一本色道久久综合亚洲精品蜜桃冫| 久久亚洲国产视频| 亚洲精品无码mv在线观看网站| 国产又大又粗又硬又长免费| 久久精品女人天堂AV免费观看| 97在线视频免费播放| 国产情侣久久久久aⅴ免费 | 亚洲成人免费网站| 中文无码成人免费视频在线观看| 男人j进女人p免费视频| 精品久久亚洲一级α| 亚洲精品美女久久久久久久| 国产精品亚洲综合久久| 国产日本亚洲一区二区三区| 亚洲制服丝袜一区二区三区| 亚洲五月六月丁香激情| 亚洲人成电影福利在线播放 | av成人免费电影| 一级做a爰全过程免费视频毛片| 亚洲成a∨人片在无码2023| 亚洲最大的成人网| 亚洲色欲色欲www| 中文字幕亚洲精品无码| 亚洲一线产品二线产品| 亚洲精品一卡2卡3卡四卡乱码| 在线观看亚洲AV日韩AV| 亚洲欧美国产精品专区久久| 亚洲精品无码高潮喷水A片软| 亚洲一区AV无码少妇电影| 亚洲乱码日产精品一二三| 久久精品国产亚洲AV天海翼| 激情小说亚洲色图| 一级美国片免费看| 伊人免费在线观看高清版| 99re6在线视频精品免费下载|