mysql killed进程不结束_优秀的数据库产品——MySQL 云数据库服务
作為一種低成本,高性能,高可靠性和開放源代碼的數(shù)據(jù)庫產(chǎn)品,MySQL已在Internet公司中廣泛使用。 例如,淘寶有數(shù)千個(gè)MySQL服務(wù)器。 盡管NoSQL在過去兩年中發(fā)展迅速,新產(chǎn)品層出不窮,但NoSQL在企業(yè)中的應(yīng)用對(duì)開發(fā)人員的要求相對(duì)較高,而MySQL具有成熟的中間件和運(yùn)維工具,并形成了良性的生態(tài)系統(tǒng)。 因此,在當(dāng)前應(yīng)用階段,MySQL仍然是主要組件,NoSQL是次要組件。
在過去的一年中,我們?cè)贛ySQL托管平臺(tái)方面做了很多工作,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)UMP(Unifield MySQL平臺(tái))系統(tǒng),以提供低成本和高性能的MySQL云數(shù)據(jù)庫服務(wù)。 。 開發(fā)人員從平臺(tái)申請(qǐng)MySQL實(shí)例資源,并通過平臺(tái)提供的單個(gè)條目訪問數(shù)據(jù)。 UMP系統(tǒng)在內(nèi)部維護(hù)和管理資源池,并以透明形式提供一系列服務(wù),例如主從熱備份,數(shù)據(jù)備份,遷移,災(zāi)難恢復(fù),讀寫分離以及數(shù)據(jù)庫和表劃分。 該平臺(tái)通過在物理機(jī)上運(yùn)行多個(gè)MySQL實(shí)例來降低成本,并實(shí)現(xiàn)資源隔離,根據(jù)需要分配和限制CPU,內(nèi)存和I / O資源,同時(shí)支持?jǐn)?shù)據(jù)服務(wù)而不影響前提。 根據(jù)用戶業(yè)務(wù)的發(fā)展動(dòng)態(tài)地?cái)U(kuò)大和收縮。
架構(gòu)演進(jìn)
UMP系統(tǒng)的第一個(gè)版本基于MySQL Proxy 0.8版修復(fù)了多個(gè)錯(cuò)誤,并修改了代理插件中管理用戶連接和數(shù)據(jù)庫連接的狀態(tài)機(jī)過程; 使用Lua腳本來獲取用戶身份驗(yàn)證信息和中央數(shù)據(jù)庫中的后臺(tái)數(shù)據(jù)庫地址以驗(yàn)證用戶; 建立了與后臺(tái)數(shù)據(jù)庫的連接以及轉(zhuǎn)發(fā)數(shù)據(jù)包的邏輯(如圖1所示)。
圖1 UML系統(tǒng)的第一個(gè)版本(當(dāng)時(shí)稱為RDS系統(tǒng))使用MySQL Proxy
在第一個(gè)版本的開發(fā)和部署期間,我們逐漸認(rèn)識(shí)到了幾個(gè)問題。
首先,MySQL Proxy 0.8對(duì)多線程的支持相對(duì)簡(jiǎn)單和粗魯。 多個(gè)工作線程共享同一消息隊(duì)列,并同時(shí)偵聽同一套接字對(duì)通道。 當(dāng)新事件進(jìn)入消息隊(duì)列時(shí),套接字對(duì)將寫入一個(gè)字節(jié),并且所有睡眠線程都將被喚醒以爭(zhēng)奪互斥體以從消息隊(duì)列中獲取任務(wù)。 此實(shí)現(xiàn)存在幾個(gè)問題:首先,它會(huì)導(dǎo)致“休克組”現(xiàn)象,喚醒多個(gè)線程,但只有一個(gè)線程需要完成任務(wù)。 其次,任務(wù)的CPU親和力相對(duì)較差,在同一狀態(tài)機(jī)上觸發(fā)的事件將在多個(gè)處理器之間來回切換。 此外,MySQL Proxy中使用了全局Lua鎖,并且只允許一個(gè)工作線程執(zhí)行Lua腳本(計(jì)劃在0.9版中進(jìn)行改進(jìn))。 因此,在多線程模式下,MySQL Proxy的性能遠(yuǎn)遠(yuǎn)不能隨CPU內(nèi)核數(shù)量的增加而線性增長(zhǎng),甚至16個(gè)內(nèi)核的性能也不如4個(gè)內(nèi)核。 使用單進(jìn)程模式時(shí),需要在物理計(jì)算機(jī)上部署多個(gè)進(jìn)程以有效利用計(jì)算機(jī)的處理能力,但是這會(huì)給部署,監(jiān)視和服務(wù)升級(jí)帶來麻煩。
其次,由于MySQL Proxy的框架在功能上不容易擴(kuò)展,因此難以實(shí)現(xiàn)用戶的連接數(shù)限制,QPS限制,主從切換,讀寫分離,子數(shù)據(jù)庫子 -table和其他功能。
最后,近年來,MySQL Proxy社區(qū)并不活躍,并且C語言對(duì)開發(fā)人員技能有相對(duì)較高的要求。 很難要求所有團(tuán)隊(duì)成員共同開發(fā)平衡優(yōu)雅與正確性的代碼。
因此,我們決定用Erlang語言重寫代理服務(wù)器,以替換原始的MySQL代理模塊。 目前,整個(gè)項(xiàng)目有50,000行Erlang源代碼,30,000行C / C ++源代碼和20,000行其他語言源代碼。
為什么選擇Erlang語言
Erlang是一種結(jié)構(gòu)化,動(dòng)態(tài)和功能性的編程語言。 普遍的說法是,Erlang是面向并發(fā)的,這主要意味著Erlang用該語言定義了Erlang過程的概念和行為(本文中提到的“ Erlang過程”是指Erlang語言過程中的定義以區(qū)別于此) 來自熟悉的操作系統(tǒng)過程)。 與操作系統(tǒng)的進(jìn)程/線程相比,Erlang進(jìn)程也是并發(fā)執(zhí)行的一個(gè)單元,但是它特別輕巧。 它是在Erlang虛擬機(jī)中管理和調(diào)度的“綠色進(jìn)程”,即用戶模式進(jìn)程。(如圖2所示)。 例如,在關(guān)閉了HiPE和SMP支持的Erlang虛擬機(jī)中,新創(chuàng)建的進(jìn)程僅占用309個(gè)字(Word,在64位服務(wù)器上為8個(gè)字節(jié))。 其中,233個(gè)單詞是堆空間(包括堆棧)。 創(chuàng)建和結(jié)束進(jìn)程大約需要1-3微秒,而Erlang虛擬機(jī)可以同時(shí)支持成千上萬個(gè)或更多的進(jìn)程。
圖2 Erlang的輕量級(jí)過程
當(dāng)涉及到Erlang語言時(shí),您必須提及OTP(開放電信平臺(tái))。 OTP是用于開發(fā)分布式,高度容錯(cuò)的Erlang應(yīng)用程序的框架和平臺(tái)。 例如,一個(gè)Erlang節(jié)點(diǎn)連接到Erlang集群并在其中注冊(cè),發(fā)現(xiàn)集群中的其他節(jié)點(diǎn),并通過RPC與它們通信。 這些在OTP的內(nèi)核服務(wù)中實(shí)現(xiàn)。 OTP和Erlang緊密相關(guān),因此通常稱為Erlang / OTP,因此從嚴(yán)格意義上講,我們應(yīng)該選擇Erlang / OTP來構(gòu)建UMP系統(tǒng)。 Erlang / OTP是開發(fā)分布式,高度容錯(cuò)應(yīng)用程序所需元素的良好抽象,包括網(wǎng)絡(luò)編程框架,序列化和反序列化,容錯(cuò)和熱部署。
為了支持并發(fā),服務(wù)器使用多進(jìn)程/多線程模型,即每個(gè)進(jìn)程/線程都處理一個(gè)客戶端連接。 但是,由于操作系統(tǒng)資源的原因,每個(gè)服務(wù)器可以處理的并發(fā)連接數(shù)并不高,并且由于進(jìn)程/線程上下文切換開銷而影響了系統(tǒng)性能。 高并發(fā),高性能服務(wù)器的開發(fā)通常使用事件驅(qū)動(dòng)的狀態(tài)機(jī)模型,底層使用非阻塞I / O(Linux中的epoll,BSD系統(tǒng)中的kqueue,Java中的nio)或異步I / O,或用于事件通知的異步I / O框架,例如C / C ++下的ACE,boost :: asio,libevent,Java下的MINA等。在業(yè)務(wù)層,狀態(tài)機(jī)用于表示每個(gè)客戶端連接,并且 I / O事件和超時(shí)事件驅(qū)動(dòng)狀態(tài)機(jī)跳轉(zhuǎn)。 每個(gè)進(jìn)程/線程可以處理數(shù)千個(gè)客戶端連接。 和更多與流程/多線程模型相比,盡管事件驅(qū)動(dòng)的狀態(tài)機(jī)模型具有更高的并發(fā)性和更好的性能,但是很難將業(yè)務(wù)邏輯表示為狀態(tài)機(jī)。 相比之下,多進(jìn)程/多線程模型中的業(yè)務(wù)邏輯可以實(shí)現(xiàn)為順序執(zhí)行的代碼,這很容易開發(fā)。
Erlang / OTP中的網(wǎng)絡(luò)編程模型結(jié)合了兩者的優(yōu)點(diǎn)。 每個(gè)Erlang進(jìn)程都處理一個(gè)客戶端連接,并且業(yè)務(wù)邏輯按順序執(zhí)行。 Erlang過程非常輕巧。 可以認(rèn)為每個(gè)Erlang進(jìn)程都是狀態(tài)機(jī),堆和堆棧上的數(shù)據(jù)就是該狀態(tài)機(jī)的狀態(tài)。 Erlang進(jìn)程在接收到數(shù)據(jù)包或其他進(jìn)程發(fā)送的消息后執(zhí)行處理例程,這相當(dāng)于狀態(tài)機(jī)的跳轉(zhuǎn),因此還具有高并發(fā)和高性能的優(yōu)點(diǎn)。
Erlang / OTP定義了“外部術(shù)語格式”協(xié)議,以相互轉(zhuǎn)換Erlang數(shù)據(jù)結(jié)構(gòu)和二進(jìn)制字符串,并使用C在Erlang虛擬機(jī)中實(shí)現(xiàn)。當(dāng)跨節(jié)點(diǎn)通信時(shí),它遵循此協(xié)議。 因此,開發(fā)人員無需考慮序列化和反序列化問題。
在容錯(cuò)方面,Erlang進(jìn)程的數(shù)據(jù)空間相互隔離,并且沒有共享內(nèi)存。 因此,一個(gè)Erlang進(jìn)程的崩潰將不會(huì)影響其他Erlang進(jìn)程的操作,也不會(huì)導(dǎo)致Erlang虛擬機(jī)崩潰。 OTP提供了監(jiān)督樹機(jī)制和心臟模塊。 前者在檢測(cè)到Erlang進(jìn)程崩潰時(shí)恢復(fù),而后者在發(fā)現(xiàn)Erlang虛擬機(jī)失去響應(yīng)時(shí)重新啟動(dòng)程序。
Erlang / OTP提供了一種熱部署方法,可以避免服務(wù)升級(jí)期間的空閑時(shí)間。 此外,OTP還提供了一些工具來在系統(tǒng)運(yùn)行時(shí)觀察系統(tǒng)狀態(tài)。 例如,lcnt工具可以計(jì)算虛擬機(jī)中的鎖和沖突數(shù)量,以指導(dǎo)系統(tǒng)優(yōu)化。
當(dāng)前系統(tǒng)架構(gòu)
在設(shè)計(jì)UMP系統(tǒng)時(shí),我們遵循以下原則。
系統(tǒng)在外部維護(hù)單個(gè)入口,在內(nèi)部維護(hù)單個(gè)資源池。
確保服務(wù)的高可用性并消除單點(diǎn)故障。
確保系統(tǒng)具有彈性和可伸縮性,并且可以動(dòng)態(tài)添加和刪除計(jì)算和存儲(chǔ)節(jié)點(diǎn)。
保證分配給用戶資源也具有彈性和可伸縮性,并且資源彼此隔離。
UMP系統(tǒng)中的角色包括:控制器服務(wù)器,代理服務(wù)器,代理服務(wù)器,API / Web服務(wù)器,日志分析服務(wù)器和信息統(tǒng)計(jì)服務(wù)器。 圖3是當(dāng)前UMP系統(tǒng)的體系結(jié)構(gòu)圖。 UMP系統(tǒng)依賴于Mnesia,LVS,RabbitMQ,ZooKeeper等開源組件。
圖3當(dāng)前的UMP系統(tǒng)架構(gòu)圖
Mnesia是OTP提供的分布式數(shù)據(jù)庫。 它與MySQL NDB位于同一扇門,是愛立信在1990年代中期為電信業(yè)務(wù)開發(fā)的數(shù)據(jù)產(chǎn)品。 Mnesia支持事務(wù),支持透明數(shù)據(jù)分片,使用兩階段鎖來實(shí)現(xiàn)分布式事務(wù),并且可以線性擴(kuò)展到至少50個(gè)節(jié)點(diǎn)。
從CAP理論的角度來看,Mnesia更傾向于犧牲可用性,以換取屬于CP陣營(yíng)的強(qiáng)一致性。 但是,它也提供臟的讀寫操作,可以繞過事務(wù)管理來操縱數(shù)據(jù)。 此時(shí),不能保證一致性,這與AP系統(tǒng)有些相似。 在工程實(shí)踐中,我們使用事務(wù)來修改關(guān)鍵數(shù)據(jù)(例如路由表),并使用臟寫接口來寫入非關(guān)鍵數(shù)據(jù)(例如用戶狀態(tài)信息),并使用臟讀接口來讀取數(shù)據(jù)。
Controller服務(wù)器為UMP集群提供各種管理服務(wù),實(shí)現(xiàn)元數(shù)據(jù)存儲(chǔ),集群成員管理,MySQL實(shí)例管理,故障恢復(fù),備份,遷移和擴(kuò)展等功能。 Controller服務(wù)器運(yùn)行一組Mnesia分布式數(shù)據(jù)庫服務(wù)。 系統(tǒng)元數(shù)據(jù)(例如集群成員,用戶配置和狀態(tài)信息以及用戶名到后端MySQL實(shí)例地址的映射關(guān)系(路由表))存儲(chǔ)在Mnesia中。 ,其他服務(wù)器組件通過向Controller服務(wù)器發(fā)送請(qǐng)求來獲取用戶數(shù)據(jù)。
為了實(shí)現(xiàn)高可用性,系統(tǒng)中將部署多個(gè)Controller服務(wù)器。 他們通過ZooKeeper提供的分布式鎖定算法選舉一位領(lǐng)導(dǎo)者。 該負(fù)責(zé)人負(fù)責(zé)安排和監(jiān)視各種系統(tǒng)任務(wù),例如創(chuàng)建和刪除數(shù)據(jù)庫。 實(shí)例,備份和遷移等。這些系統(tǒng)任務(wù)可以分為多個(gè)步驟,并且它將涉及系統(tǒng)中的多個(gè)組件,例如主庫,從屬庫和代理服務(wù)器等,并且還需要提供一種在發(fā)生故障時(shí)回滾的方法。 因此,我們使用類似的工作流程來實(shí)現(xiàn)。 每個(gè)系統(tǒng)任務(wù)都分為Erlang進(jìn)程的多個(gè)階段。 執(zhí)行完每個(gè)步驟后,中間狀態(tài)將保留到Mnesia中,然后跳轉(zhuǎn)到下一步。 如果任務(wù)由于節(jié)點(diǎn)故障而停止,則領(lǐng)導(dǎo)者可以檢測(cè)并重新啟動(dòng)任務(wù)。 任務(wù)重新啟動(dòng)后,它將從失敗的最后一個(gè)“斷點(diǎn)”繼續(xù)執(zhí)行。
API / Web服務(wù)器為用戶提供系統(tǒng)管理界面。 它們是基于開源項(xiàng)目Mochiweb和Chicago Boss開發(fā)的。 Mochiweb提供HTTP / HTTPS服務(wù),而Chicago Boss由Nginx的作者之一Evan Miller開發(fā),并提供類似于Rails的MVC框架。 與Rails相比,Erlang開發(fā)的框架具有對(duì)并發(fā)性的良好支持。 每個(gè)請(qǐng)求都占用一個(gè)輕量級(jí)的Erlang進(jìn)程。 盡管Rails最近引入了多線程安全性,但是在處理每個(gè)請(qǐng)求時(shí)它仍然是排他性的。 對(duì)于整個(gè)過程,有必要使用多進(jìn)程模型來處理并發(fā)請(qǐng)求,并通過諸如Phusion Passenger之類的應(yīng)用服務(wù)器分發(fā)它們。
代理服務(wù)器為用戶提供對(duì)MySQL數(shù)據(jù)庫的訪問權(quán)限。 它完全實(shí)現(xiàn)了MySQL協(xié)議。 用戶可以使用現(xiàn)有的MySQL客戶端連接到代理服務(wù)器。 代理服務(wù)器通過用戶名獲取用戶的認(rèn)證信息。 對(duì)資源配額(例如最大連接數(shù),QPS,IOPS等)和后臺(tái)MySQL實(shí)例的地址(列表)進(jìn)行限制,然后將用戶的SQL查詢請(qǐng)求轉(zhuǎn)發(fā)到正確的MySQL實(shí)例。
除了數(shù)據(jù)路由的基本功能之外,代理服務(wù)器還實(shí)現(xiàn)以下功能:資源限制,屏蔽MySQL實(shí)例故障,讀寫分離,子數(shù)據(jù)庫和子表分離以及記錄用戶 訪問日志。 代理服務(wù)器是無狀態(tài)的。 服務(wù)器的停機(jī)時(shí)間不會(huì)影響系統(tǒng)中的其他服務(wù)器。 這只會(huì)導(dǎo)致連接到代理的用戶斷開連接。 多個(gè)代理服務(wù)器使用LVS HA解決方案實(shí)現(xiàn)負(fù)載平衡連接后,LVS會(huì)將其定向到其他代理。
代理服務(wù)器部署在運(yùn)行MySQL進(jìn)程的計(jì)算機(jī)上,用于管理每臺(tái)物理計(jì)算機(jī)上的MySQL實(shí)例,執(zhí)行創(chuàng)建,刪除,備份,遷移和主從切換之類的操作,收集并分析 MySQL進(jìn)程的統(tǒng)計(jì)信息,bin日志和慢速查詢?nèi)罩尽?
日志分析服務(wù)器將存儲(chǔ)和分析來自代理服務(wù)器的用戶訪問日志,并為用戶實(shí)現(xiàn)實(shí)時(shí)索引,以查詢一段時(shí)間內(nèi)的慢日志和統(tǒng)計(jì)報(bào)告。 信息統(tǒng)計(jì)服務(wù)器使用RRDtool定期收集收集的用戶連接,QPS值和MySQL實(shí)例的進(jìn)程狀態(tài)以進(jìn)行統(tǒng)計(jì),這些信息可以顯示在Web界面上,并且將來還可以提供靈活的資源分配和自動(dòng)的MySQL實(shí)例遷移 。 依據(jù)。
UMP系統(tǒng)中節(jié)點(diǎn)之間的通信(不包括直接通過TCP的大型數(shù)據(jù)流(如SQL查詢和日志的傳輸)直接用作通過RabbitMQ進(jìn)行消息通信的中間件,以確保可靠性 發(fā)送的郵件中。 ZooKeeper主要扮演配置服務(wù)器,分布式鎖和監(jiān)視所有MySQL實(shí)例的角色。
在多個(gè)組件的協(xié)同操作下,整個(gè)系統(tǒng)為用戶實(shí)現(xiàn)了透明的災(zāi)難恢復(fù),讀寫分離,子庫和表劃分的功能。 在系統(tǒng)內(nèi),多個(gè)小規(guī)模用戶共享同一個(gè)MySQL實(shí)例,中型用戶壟斷一個(gè)MySQL實(shí)例,多個(gè)MySQL實(shí)例共享同一臺(tái)物理計(jì)算機(jī),以實(shí)現(xiàn)資源虛擬化并降低總體成本。 在資源隔離方面,通過結(jié)合使用Cgroup限制MySQL進(jìn)程資源和Proxy服務(wù)器端限制QPS,UMP系統(tǒng)可以在確保用戶服務(wù)質(zhì)量的同時(shí)實(shí)現(xiàn)資源虛擬化。 另外,UMP系統(tǒng)全面使用SSL數(shù)據(jù)庫連接,數(shù)據(jù)訪問IP白名單,記錄用戶操作日志,SQL攔截等技術(shù)來保護(hù)用戶的數(shù)據(jù)安全。
結(jié)論
天貓公司的Jushi Tower平臺(tái)已使用UMP系統(tǒng)的某些組件(例如代理服務(wù)器和日志分析服務(wù)器)為電子商務(wù)和ISV提供安全的數(shù)據(jù)云服務(wù)。 此外,UMP系統(tǒng)還用于淘寶的店鋪裝修平臺(tái)為開發(fā)人員提供數(shù)據(jù)服務(wù)。 在下一階段,我們希望UMP系統(tǒng)可以進(jìn)一步降低企業(yè)的數(shù)據(jù)存儲(chǔ)成本。
有興趣的朋友可以一起來探討一下
總結(jié)
以上是生活随笔為你收集整理的mysql killed进程不结束_优秀的数据库产品——MySQL 云数据库服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 信息通信建设工程预算定额_通信建设工程概
- 下一篇: 赛博义体成真,帕金森病患者植入脊椎电极后
