網(wǎng)上有一篇文章提到數(shù)據(jù)庫(kù)不適合容器化的七大原因:
1、數(shù)據(jù)不安全
2、運(yùn)行數(shù)據(jù)庫(kù)的環(huán)境需求
3、網(wǎng)絡(luò)問(wèn)題
4、狀態(tài)
5、數(shù)據(jù)庫(kù)不適合使用主要的Docker功能
6、額外的隔離對(duì)數(shù)據(jù)庫(kù)是不利的
7、云平臺(tái)的不適用性
當(dāng)然網(wǎng)上搜索“數(shù)據(jù)庫(kù)適不適合Docker容器化部署”相關(guān)關(guān)鍵詞,基本上也只有這一篇文章。
至于它說(shuō)的到底對(duì)不對(duì),一開(kāi)始也非常疑惑,但經(jīng)過(guò)一段時(shí)間以后,阿湯博客覺(jué)得“數(shù)據(jù)庫(kù)適不適合Docker容器化部署”沒(méi)有絕對(duì)的答案,完全看業(yè)務(wù)場(chǎng)景、量級(jí)和數(shù)據(jù)庫(kù)的架構(gòu)。下面談?wù)劙┲鱾€(gè)人的一點(diǎn)點(diǎn)看法和理解。
從數(shù)據(jù)安全性來(lái)看,目前在實(shí)際工作中,項(xiàng)目非生產(chǎn)環(huán)境中的MySQL、Redis、Eleasticsearch都實(shí)現(xiàn)了容器化,都運(yùn)行良好,也并未出現(xiàn)過(guò)什么數(shù)據(jù)安全問(wèn)題。前提當(dāng)前是不能把數(shù)據(jù)存儲(chǔ)到容器內(nèi)部。
當(dāng)初為什么要把數(shù)據(jù)庫(kù)容器化部署?
在非容器化部署時(shí),一臺(tái)服務(wù)器上面要部署多個(gè)MySQL、Redis、Eleasticsearch實(shí)例,可以說(shuō)非常困難,維護(hù)管理也非常痛苦。
容器化以后,同一個(gè)鏡像,可以在一臺(tái)服務(wù)器同時(shí)部署dev、test、uat三個(gè)數(shù)據(jù)庫(kù)實(shí)例,只需要映射不同的端口即可,完全保證了環(huán)境一致性;而不用每臺(tái)服務(wù)器去編譯安裝。
單機(jī)的情況,完全可以一個(gè)docker-compose文件,就管理了三個(gè)環(huán)境的實(shí)例。
從復(fù)雜度來(lái)說(shuō),有狀態(tài)應(yīng)用在容器化相對(duì)于無(wú)狀態(tài)應(yīng)用來(lái)說(shuō)要略微復(fù)雜。
容器化以后,網(wǎng)絡(luò)也是一個(gè)復(fù)雜的問(wèn)題。
就拿比較熱門的容器編排工具kubernetes來(lái)說(shuō),在部署無(wú)狀態(tài)應(yīng)用和有狀態(tài)應(yīng)用是就能體現(xiàn)出來(lái)無(wú)狀態(tài)應(yīng)用的優(yōu)勢(shì),你要多考慮一個(gè)數(shù)據(jù)持久化。
數(shù)據(jù)持久化就設(shè)計(jì)到共享存儲(chǔ)、PV、PVC管理以及如何水平擴(kuò)容等等相關(guān)的一系列問(wèn)題。
從性能方面來(lái)說(shuō),不管是什么docker網(wǎng)絡(luò)插件、什么kubernetes網(wǎng)絡(luò)插件、都會(huì)有多多少少的性能損耗。
如果使用共享存儲(chǔ),即使是阿里云的文件存儲(chǔ)CPFS,也存在一定的網(wǎng)絡(luò)傳輸IO延遲。
這也是為什么阿里云RDS,存儲(chǔ)類型推薦購(gòu)買本地SSD,而不是云盤。
阿湯博客認(rèn)為這些損耗和延遲在你的業(yè)務(wù)沒(méi)有達(dá)到一個(gè)量級(jí)或不要求極限并發(fā)I/O性能、讀寫時(shí)延極穩(wěn)定的業(yè)務(wù)場(chǎng)景,是可以完全忽略的。
打個(gè)比方,我有一個(gè)10000節(jié)點(diǎn)的集群,每個(gè)節(jié)點(diǎn)實(shí)例因?yàn)槿萜骰W(wǎng)絡(luò)插件損耗,QPS低于非容器化100,如果沒(méi)有這些損耗,集群QPS就要提高10000*100=100萬(wàn)。
如果你只是一個(gè)3節(jié)點(diǎn)的集群,這點(diǎn)損耗完全就可以忽略不計(jì)了,不如水平擴(kuò)展一個(gè)節(jié)點(diǎn)、增加服務(wù)器配置提升來(lái)的性能來(lái)的明細(xì)。
很多人都在談服務(wù)器性能優(yōu)化、內(nèi)核優(yōu)化,個(gè)人認(rèn)為業(yè)務(wù)量沒(méi)有達(dá)到一個(gè)量級(jí)時(shí),這些優(yōu)化并不能帶來(lái)太多收益和效果,不如增加一個(gè)節(jié)點(diǎn)來(lái)的明顯。
從數(shù)據(jù)庫(kù)集群管理方面來(lái)說(shuō),目前只有Eleasticsearch官方推出了ECK,用于編排和管理Eleasticsearch在kubernetes集群中的運(yùn)行。
至于Redis,當(dāng)不需要數(shù)據(jù)持久化時(shí),在kubernetes集群中相對(duì)其他數(shù)據(jù)庫(kù)編排、水平擴(kuò)容還是容易一些。
至于MySQL,在kubernetes集群想要部署管理一套高可用MySQL集群,并實(shí)現(xiàn)水平擴(kuò)容是一件非常困難復(fù)雜的事情。
所以生產(chǎn)環(huán)境MySQL集群我還是采用了商用產(chǎn)品。
目前,一些高性能DB如:騰訊云的TDSQL(金融分布式數(shù)據(jù)庫(kù))和阿里云的Oceanbase(分布式數(shù)據(jù)庫(kù)系統(tǒng))都直接運(yùn)行中在物理機(jī)器上,并非使用便于管理的 Docker 上。
部分介紹:
OceanBase 數(shù)據(jù)庫(kù)采用 Shared-Nothing 架構(gòu),各個(gè)節(jié)點(diǎn)之間完全對(duì)等,每個(gè)節(jié)點(diǎn)都有自己的 SQL 引擎、存儲(chǔ)引擎,運(yùn)行在普通 PC 服務(wù)器組成的集群之上,具備可擴(kuò)展、高可用、高性能、低成本、云原生等核心特性。
TDSQL 可提供多種部署形態(tài)。在公有云,提供多租戶和獨(dú)享物理集群兩種部署形態(tài),僅需在管理控制臺(tái)中單擊幾下,即可生產(chǎn)一套 TDSQL 數(shù)據(jù)庫(kù)。同時(shí)可兼容 MySQL、MariaDB 協(xié)議,兼容 PostgreSQL 協(xié)議,高度兼容 Oracle 語(yǔ)法;可在一個(gè)物理集群中擴(kuò)展支持集中式和分布式實(shí)例。