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