深度解析容器化技术在广发证券交易系统的应用
作者簡介:楊濤,廣發(fā)證券交易云技術(shù)研發(fā)團(tuán)隊(duì)負(fù)責(zé)人,資深架構(gòu)師,在證券行業(yè)有超過9年的工作經(jīng)驗(yàn)。目前致力于廣發(fā)證券OpenTrading證券交易云核心技術(shù)研發(fā)。
責(zé)編:魏偉,本文轉(zhuǎn)載自《程序員》,謝絕轉(zhuǎn)載,更多技術(shù)文章,請(qǐng)訂閱《程序員》,歡迎投稿,郵箱weiwei@csdn.net
證券行業(yè)已經(jīng)走在“互聯(lián)網(wǎng)+”的前列。一是證券行業(yè)的用戶服務(wù)手段已經(jīng)高度互聯(lián)網(wǎng)化,截至2014年底,我國證券行業(yè)網(wǎng)上交易量占比已經(jīng)超過90%;二是互聯(lián)網(wǎng)證券試點(diǎn)工作取得了積極成果,截至2015年5月,已有55家證券公司開展互聯(lián)網(wǎng)證券業(yè)務(wù)試點(diǎn),在證券支付體系、賬戶體系、移動(dòng)應(yīng)用、跨界合作等方面進(jìn)行了有益探索,互聯(lián)網(wǎng)對(duì)于證券行業(yè)的影響正在持續(xù)擴(kuò)大;三是證券行業(yè)互聯(lián)網(wǎng)化基礎(chǔ)設(shè)施建設(shè)取得顯著成效,機(jī)構(gòu)間私募產(chǎn)品報(bào)價(jià)與服務(wù)系統(tǒng)、場(chǎng)外證券業(yè)務(wù)清算機(jī)構(gòu)、場(chǎng)外證券業(yè)務(wù)備案系統(tǒng)、證券行業(yè)支付體系、證券行業(yè)云平臺(tái)、征信體系、證聯(lián)網(wǎng)等基礎(chǔ)設(shè)施的籌建和使用,為證券行業(yè)的互聯(lián)網(wǎng)化奠定了發(fā)展基礎(chǔ)。
2014年可謂證券行業(yè)的“互聯(lián)網(wǎng)化元年”,作為證券行業(yè)互聯(lián)網(wǎng)化的先行者,廣發(fā)證券通過一系列變革積累了豐富的創(chuàng)新經(jīng)驗(yàn)。當(dāng)前,證券行業(yè)創(chuàng)新轉(zhuǎn)型進(jìn)程不斷加快,互聯(lián)網(wǎng)金融的迅速崛起更是加劇了行業(yè)競(jìng)爭和洗牌,也為有實(shí)力的券商做大做強(qiáng)提供了歷史機(jī)遇。作為植根廣東的知名證券公司,廣發(fā)證券始終堅(jiān)持“創(chuàng)新驅(qū)動(dòng)、轉(zhuǎn)型發(fā)展”,圍繞券商基礎(chǔ)功能建設(shè)加快組織創(chuàng)新、業(yè)務(wù)創(chuàng)新和產(chǎn)品創(chuàng)新,努力打造核心競(jìng)爭力,也為行業(yè)提供了值得借鑒的創(chuàng)新模板。
概述
我們的平臺(tái)邏輯層次上分為四層結(jié)構(gòu),分別為:接入控制層、業(yè)務(wù)前置層、交易總線層、虛擬化/容器化層。每一層我們?cè)诩夹g(shù)上都采用基于異步高性能消息流水線的體系結(jié)構(gòu)。平臺(tái)在架構(gòu)上支持多開發(fā)語言接入,所用的開發(fā)語言包括Java、Go、Nodejs、Lua、C++等。
圖1,opentrading平臺(tái)邏輯架構(gòu)我們從2013年左右開始研究docker的,生產(chǎn)環(huán)境從最初的docker-1.3.2用到目前docker-1.10.0,一直在不斷增加基于docker的部署。2014年開始嘗試在生產(chǎn)環(huán)境使用docker,2015年開始大規(guī)模使用。
目前我們生產(chǎn)環(huán)境使用的docker實(shí)例個(gè)數(shù):
-
行情云:超過4000個(gè)實(shí)例,分布在6個(gè)IDC機(jī)房。目前承載實(shí)時(shí)并發(fā)超過30萬,整個(gè)行情云每秒的吞吐在1.5Gbps左右, 目前服務(wù)客戶超過200萬。
-
交易云:超過300個(gè)實(shí)例,主要分布在廣州同城中心交易機(jī)房。目前承載客戶DMA接入,每天的交易請(qǐng)求數(shù)在100萬以上,每日交易額平均在8億左右,最高的峰值超過30億。
為什么要容器化
對(duì)傳統(tǒng)的垂直行業(yè)來講,Docker也是最近幾年才出來的技術(shù),技術(shù)理念非常先進(jìn),因此采用Docker容器化技術(shù)對(duì)我們而言需要綜合的評(píng)估,但是我們?yōu)槭裁匆プ瞿?#xff1f;首先,從行業(yè)現(xiàn)狀來說,證券行業(yè)一方面量化交易、高頻交易、實(shí)時(shí)風(fēng)控要求高,其次,行業(yè)創(chuàng)新非常多,創(chuàng)新業(yè)務(wù)也很頻繁,另外,監(jiān)管方面,證監(jiān)會(huì)證監(jiān)局對(duì)我們要求交易事故零容忍,當(dāng)然,最近幾年互聯(lián)網(wǎng)金融發(fā)展非常快,眾籌、P2P非常多,再次,天量行情,2014年底到去年,最高一天有兩萬億的市場(chǎng)行情,這樣的話對(duì)我們整個(gè)交易系統(tǒng)是非常大的挑戰(zhàn)。
我們?cè)跇I(yè)務(wù)發(fā)展過程中一直團(tuán)繞我們的就是怎樣利用有限的資源去支撐業(yè)務(wù)創(chuàng)新,真正做到IT引領(lǐng)業(yè)務(wù);另一方面,我們和其他大型的互聯(lián)網(wǎng)公司在資源方面是沒有辦法比的,所以怎樣利用有限的資源支撐業(yè)務(wù)創(chuàng)新,這些都是我們要考慮的事情。
在使用容器化技術(shù)之前,我們遇到一些比較典型的痛點(diǎn):
容器化技術(shù)很好的解決了我們上面所遇到的問題,因?yàn)椴捎萌萜骰辽儆幸韵聨讉€(gè)方面的好處:
① 輕量的引擎,高效虛擬化
② 秒級(jí)部署,輕松遷移和擴(kuò)展
③ 易于移植、彈性伸縮,簡單管理
④ 開始具備一點(diǎn)“云”的能力
⑤ 讓微服務(wù)成為可能
⑥ 標(biāo)準(zhǔn)化的服務(wù)器端交付物
⑦ 向DevOps邁進(jìn)的重要一步
容器技術(shù)與云的落地
舉一個(gè)簡單的監(jiān)控服務(wù)例子,一個(gè)基于statsd完備的監(jiān)控服務(wù)需要有influxdb、grafana、statsd三個(gè)服務(wù)組成,每個(gè)服務(wù)只是一個(gè)單一的功能,單純的一個(gè)服務(wù)是不能提供監(jiān)控服務(wù)的,要把它提供成一個(gè)服務(wù),肯定要組合起來,所以我們是通過compose文件把三個(gè)服務(wù)組成一個(gè)關(guān)系,這樣就是一個(gè)完整的服務(wù)。
1. influxdb: 2. image: "docker.gf.com.cn/gfcloud/influxdb:0.9" 3. ports: 4. - "8083:8083" 5. - "8086:8086" 6. expose: 7. - "8090" 8. - "8099" 9. volumes: 10. - "/var/monitor/influxdb:/data" 11. environment: 12. - "PRE_CREATE_DB=influxdb" 13. - "ADMIN_USER=root" 14. - "INFLUXDB_INIT_PWD=root" 15. grafana: 16. image: "docker.gf.com.cn/gfcloud/grafana" 17. ports: 18. - "3000:3000" 19. volumes: 20. - "/var/monitor/grafana:/var/lib/grafana" 21. statsd: 22. image: "docker.gf.com.cn/gfcloud/statsd" 23. ports: 24. - "8125:8125/udp" 25. links: 26. - "influxdb:influxdb" 27. volumes: 28. - "/var/monitor/statsd/log:/var/log" 29. environment: 30. - INFLUXDB_HOST=influxdb 31. - INFLUXDB_PORT=8086 32. - INFLUXDB=influxdb 33. - INFLUXDB_USERNAME=root 34. - INFLUXDB_PASSWORD=root對(duì)于容器編排,可以從以下兩個(gè)方面理解。
還有調(diào)度,云要落地必須要對(duì)資源進(jìn)行調(diào)度,這個(gè)其實(shí)也不難理解,舉個(gè)例子,我們每年的春運(yùn),鐵道局都會(huì)對(duì)客流很大的路線增加臨時(shí)列車,以防止出現(xiàn)乘客滯留。對(duì)我們應(yīng)用也是這樣的類似情況,比如說我們交易系統(tǒng)的一個(gè)登錄服務(wù),這個(gè)服務(wù)現(xiàn)在資源利用比較高,有可能出現(xiàn)瓶頸了,這個(gè)時(shí)候就要想辦法多部署一套登錄服務(wù),因此調(diào)度的話其實(shí)就是要發(fā)現(xiàn)一些存在潛在的資源瓶頸的節(jié)點(diǎn),你要想辦法調(diào)度一下,再拉取一套系統(tǒng)提供服務(wù)。
圖2,容器編排的技術(shù)演進(jìn)透明部署之應(yīng)用要感知云
云要落地,對(duì)我們的應(yīng)用也是有要求的,應(yīng)用一開始設(shè)計(jì)的時(shí)候就要容錯(cuò),寫的應(yīng)用可以容忍宕機(jī),應(yīng)用要有可伸縮,盡量做到無狀態(tài),能夠做到透明部署。
應(yīng)用服務(wù)就像一個(gè)樂高玩具,每一個(gè)組件都有不同的功能,不管怎么部署,怎么組合,可以把樂高玩具可以組成一個(gè)民房,也可以組合成大廈,對(duì)樂高玩具的組件來講,功能是一樣的,不管你怎么組合怎么部署,房子也好大廈也好,應(yīng)用本身是不知道的,所以應(yīng)用設(shè)計(jì)的時(shí)候也是這樣子的,一定不要對(duì)部署有任何的要求,所以我們是這樣想的,對(duì)部署是不能做要求的,這樣才符合云的一些要素。
圖3,容器與樂高玩具類比交易云平臺(tái)的架構(gòu)
虛擬化部署
我們的目標(biāo)是把整個(gè)平臺(tái)搭建在私有云上,并在多個(gè)IDC復(fù)制部署。目前我們尚未實(shí)現(xiàn)IaaS,故目前僅是通過虛擬化技術(shù)在物理機(jī)上構(gòu)建虛擬機(jī)資源層,通過工具把本平臺(tái)的各部件的部署變成可重復(fù)和自動(dòng)化。另外,對(duì)數(shù)據(jù)分片、服務(wù)器負(fù)載均衡等做了設(shè)計(jì),例如采用一定的consistent hash算法,讓例如Redis服務(wù)在其底層虛擬機(jī)數(shù)量一定的情況下,擴(kuò)展物理機(jī)資源達(dá)到擴(kuò)容目的。
圖5、容器管理及部署如果一個(gè)“私有云”是一個(gè)部署單元(包含整個(gè)平臺(tái)所有模塊、服務(wù))的話,上圖則是簡略的一覽圖,我們所有的應(yīng)用都是基于Docker Container,采用的是最小化的Container,一個(gè)服務(wù)就一個(gè)Container,因此生產(chǎn)環(huán)境,在主機(jī)服務(wù)器上面會(huì)跑無數(shù)個(gè)Container來提供服務(wù),一個(gè)Container等同于一個(gè)APP提供的服務(wù),我們的Docker通過Rancher開源容器管理平臺(tái)來管理。
集中與分散部署結(jié)合
對(duì)于金融行業(yè)來說,其業(yè)務(wù)需求對(duì)比其它行業(yè),甚至證券行業(yè)對(duì)銀行、保險(xiǎn)等金融行業(yè),都具有更高的要求。主要體現(xiàn)在:
①、高時(shí)效性,證券市場(chǎng)瞬息萬變,幾秒鐘的時(shí)間差可能導(dǎo)致結(jié)果的巨大差異;
②、高一致性要求,重要數(shù)據(jù)在不同節(jié)點(diǎn)應(yīng)表現(xiàn)一致性,如客戶的資金和委托數(shù)據(jù);
③、高可用性,哪怕是分鐘級(jí)別的系統(tǒng)服務(wù)中斷都是不可接受的;
基于以上三點(diǎn),簡單的集中部署方案和傳統(tǒng)的分布部署方案均已經(jīng)不能滿足要求,需要集中與分布部署相結(jié)合:
重要業(yè)務(wù)數(shù)據(jù)集中部署,以實(shí)現(xiàn)高一致性要求,如客戶的資產(chǎn)信息、委托信息等,客戶無論從哪個(gè)渠道接入,查看到的所有信息都是一致的。
行情和資訊以及一些靜態(tài)資源分布部署到離客戶最近的互聯(lián)網(wǎng)接入中心 (IDC),以解決互聯(lián)網(wǎng)客戶“最后一公里”問題。這樣可以實(shí)現(xiàn)數(shù)據(jù)的高時(shí)效性(如行情數(shù)據(jù),這顯然是很重要的),有效提升客戶使用體驗(yàn)。
多個(gè)IDC接入中心具有互備功能,假如其中一個(gè)接入中心因?yàn)椴豢煽沽?dǎo)致服務(wù)終止,可通過DNS域名切換到其它可用的IDC接入,以保證服務(wù)的持續(xù)性。
容器技術(shù)與云的最佳實(shí)踐
不可變運(yùn)維
因?yàn)橛辛巳萜骷夹g(shù),使得我們?cè)诠芾碜兏?#xff0c;自動(dòng)化部署方面有了可能,生產(chǎn)系統(tǒng)隨著時(shí)間的推移,無論如何服務(wù)器都會(huì)積攢下許多變更,包括:新應(yīng)用、升級(jí)、配置變更、計(jì)劃任務(wù),以及問題的修正。有一點(diǎn)是毫無疑問的:配置好的服務(wù)器運(yùn)行時(shí)間越長久,它就越有可能處于未知狀態(tài)。對(duì)于前面所述的每次變更,不可變運(yùn)維將通過重新創(chuàng)建新的容器實(shí)例來解決確定服務(wù)器狀態(tài)的問題。這樣之前我們提到的升級(jí)打補(bǔ)丁的一系列痛點(diǎn)問題都得到很好的解決。
不可變,顧名思義就是一旦創(chuàng)建,便不再修改,以下是我們生產(chǎn)實(shí)踐在使用Docker容器方面的一些原則:
①、容器一旦實(shí)例化后,永不改變
②、服務(wù)的變更(升級(jí),降級(jí),修改配置)都通過重新部署實(shí)現(xiàn)
③、不修改容器的內(nèi)部
Docker最佳實(shí)踐
①. 除了持久存儲(chǔ)外,不用映射外部文件
特別是日志文件,不通過映射外部文件的方式,可以通過flume、kafka等接口把日志數(shù)據(jù)寫入到集中地方。
②.不要使用本地網(wǎng)絡(luò)
不使用”Host”模式,Host模式會(huì)污染宿主機(jī),同時(shí)也不符合云計(jì)算
③.鏡像使用標(biāo)簽,拋棄Latest
生產(chǎn)應(yīng)用中一律使用Tag來標(biāo)識(shí)應(yīng)用,不使用Latest,因?yàn)槭褂肔atest將無法實(shí)現(xiàn)回滾。
④.Build編譯應(yīng)用和Build Image分離
使用專用的編譯Docker來編譯應(yīng)用本身,如用Maven、Go、C++的image來編譯應(yīng)用。編譯后再把應(yīng)用通過Dockerfile加到服務(wù)Image里面。
⑤.Apt-get安裝Package用完即刪
如下圖的例子,Apt-get在一條命令里面寫完,因?yàn)镈ocker是分層存儲(chǔ),如果是在另一個(gè)RUN命令里面卸載臨時(shí)軟件包,對(duì)Docker的Images的大小減小沒有幫助。
⑥.Docker內(nèi)部不要Daemon
服務(wù)在Docker內(nèi)部不要有守護(hù)進(jìn)程,應(yīng)用掛掉就讓它掛掉。通過外部監(jiān)控來實(shí)現(xiàn)應(yīng)用重啟等操作。
1. FROM docker.gf.com.cn/gfcloud/ubuntu 2. RUN echo "deb http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list && \ 3. echo "deb-src http://nginx.org/packages/ubuntu/ trusty nginx" >>/etc/apt/sources.list 4. RUN apt-get update && apt-get install -y wget \ 5. && wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key \ 6. && apt-get update && apt-get install -y nginx \ 7. && rm -rf /var/lib/apt/lists/* \ 8. && echo "\ndaemon off;" >> /etc/nginx/nginx.conf \ 9. && apt-get purge -y --auto-remove wget 10. # chown -R www-data:www-data /var/lib/nginx 11. 12. # Define mountable directories. 13. VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"] 14. 15. # Define working directory. 16. WORKDIR /etc/nginx 17. 18. # Define default command. 19. 20. # Expose ports. 21. EXPOSE 80 22. EXPOSE 443 23. CMD ["nginx","-g","daemon off;"]CSDN Docker技術(shù)微信專家群已經(jīng)建立,匯聚容器技術(shù)頂級(jí)專家,歡迎微信搜索“k15751091376”,由專人拉入。
總結(jié)
以上是生活随笔為你收集整理的深度解析容器化技术在广发证券交易系统的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Face Alignment at 30
- 下一篇: Samba共享后不能访问,或者看不到文件