對于配置文件巡揍,我們不陌生,它提供我們可以動(dòng)態(tài)修改程序運(yùn)行能力塑径。引用別人的一句話就是:
系統(tǒng)運(yùn)行時(shí)(runtime)飛行姿態(tài)的動(dòng)態(tài)調(diào)整
我可以把我們的工作稱之為在快速飛行的飛機(jī)上修理零件土至。我們?nèi)祟惪偸菬o法掌控和預(yù)知一切酒来。對于我們系統(tǒng)來說,我們總是需要預(yù)留一些控制線條岂座,以便在我們需要的時(shí)候做出調(diào)整力图,控制系統(tǒng)方向(如灰度控制、限流調(diào)整)掺逼,這對于擁抱變化的互聯(lián)網(wǎng)行業(yè)尤為重要吃媒。對于單機(jī)版,我們稱之為配置(文件)吕喘,對于分布式集群系統(tǒng)赘那,我們稱之為配置中心(系統(tǒng));下面聊聊我們的配置中心。
他山之石
- 配置中心Lion:http://yeming.me/2017/11/27/lion/
- Apollo配置中心介紹:https://github.com/ctripcorp/apollo/wiki/Apollo配置中心介紹
- QConf搭建配置中心:https://segmentfault.com/a/1190000008949515
- 動(dòng)態(tài)調(diào)整的基礎(chǔ) —— 配置中心:http://pingguohe.net/2016/03/18/config-center.html
- 一篇好TM長的關(guān)于配置中心的文章:http://jm.taobao.org/2016/09/28/an-article-about-config-center/
演進(jìn)中的配置
當(dāng)我們是一個(gè)單機(jī)服務(wù)的是氯质,我們的配置通常寫在一個(gè)文件中的募舟,代碼發(fā)布的時(shí)候,把配置文件和程序推送到機(jī)器上去闻察。
當(dāng)隨著業(yè)務(wù)的用戶量增加拱礁,通常我們會(huì)把我們的服務(wù)進(jìn)行多機(jī)器(集群)部署。這時(shí)候辕漂,配置的發(fā)布就變成了如下:
行呢灶,這樣發(fā)配置也能接受
業(yè)務(wù)的急劇擴(kuò)張,導(dǎo)致單機(jī)服務(wù)無法滿業(yè)務(wù)需求钉嘹。這時(shí)候需要對單體大服務(wù)進(jìn)行切開鸯乃,服務(wù)走向SOA(微服務(wù)化)。
這樣去部署配置簡直是一場噩夢跋涣,而且無法做到快速的動(dòng)態(tài)的調(diào)整缨睡。失去了配置主要意義之一鸟悴。這時(shí)候就需要今天說的統(tǒng)一配置中心。
配置中心之簡版
配置中心的特點(diǎn)
- 配置的增刪改查
- 不同環(huán)境配置隔離(開發(fā)奖年、測試细诸、預(yù)發(fā)布、灰度/線上)
- 高性能陋守、高可用性
- 請求量多揍堰、高并發(fā)
- 讀多寫少
我們可以設(shè)計(jì)出如下的簡版配置中心
設(shè)計(jì)說明點(diǎn):
- 通過OA系統(tǒng)對每一條配置(每一個(gè)配置有唯一的配置ID)進(jìn)行增刪改查。
- 區(qū)分不同環(huán)境的配置嗅义,每個(gè)環(huán)境同一配置ID對應(yīng)不同數(shù)據(jù)庫記錄。
- 配置最終以json格式(便于編輯和理解)儲(chǔ)存在mysql數(shù)據(jù)庫中隐砸。
- 引入redis集群之碗,做配置的緩存(比如可以設(shè)置配置修改后1分鐘后生效)
- 配置對外服務(wù),多機(jī)器部署季希,滿足性能需要褪那。
- 如果有必要,可以引入配置歷史修改記錄式塌。
很多時(shí)候博敬,這樣可以基本上滿足我們對配置系統(tǒng)的基本需求,對配置的增刪改查峰尝,能容忍一段時(shí)間的數(shù)據(jù)不一致性偏窝。
這種設(shè)計(jì),由于所有的配置都存放在集中式緩存中武学,這樣集中式的緩存也會(huì)有他的性能瓶頸祭往。而且,每次配置的訪問都需要發(fā)起rpc請求(網(wǎng)絡(luò)請求)火窒,因此考慮在客戶端引入本地緩存(localCache硼补,例如Ehcache)。
本地緩存可以參考我之前文章:【180409】本地緩存的選擇及其原理
配置中心之性能可用性改進(jìn)
考慮到熏矿,減少網(wǎng)絡(luò)請求的因素已骇,在客戶端引入localcache,來解決系統(tǒng)的高可用票编,高性能褪储、可伸縮性。
相對于第一版的改進(jìn)點(diǎn)是慧域,在客戶端引入localcache乱豆。開啟線程異步調(diào)用配置服務(wù),更新本地配置吊趾。
這樣可以減少rpc調(diào)用宛裕。
基于數(shù)據(jù)的CAP原理瑟啃,該方式只做到了AP,這里會(huì)存在數(shù)據(jù)的一段時(shí)間的不一致性揩尸,但最終會(huì)保證是配置的最終一致性蛹屿。如何解決這個(gè)數(shù)據(jù)不一致性問題?
配置中心之?dāng)?shù)據(jù)一致性改進(jìn)
還好岩榆,配置通常都只會(huì)有一個(gè)入口修改错负,因此可以考慮在配置修改后,通知應(yīng)用服務(wù)清理本地緩存和分布式緩存勇边。這里可以引入mq或ZooKeeper犹撒。
最后通過,推拉相結(jié)合的方式粒褒,完成數(shù)據(jù)的一致性识颊。
都看到這里了,成神之路上奕坟,要不要一起祥款?