Shardingsphere整合Atomikos對XA分佈式事務的支持(1)

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Apache ShardingSphere 是一套開源的分佈式數據庫中間件解決方案組成的生態圈,它由 JDBC、Proxy 和 Sidecar(規劃中)這 3 款相互獨立,卻又能夠混合部署配合使用的產品組成。它們均提供標準化的數據分片、分佈式事務和數據庫治理功能,可適用於如 Java 同構、異構語言、雲原生等各種多樣化的應用場景。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"ShardingSphere 已於2020年4月16日成爲 Apache 軟件基金會的頂級項目。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"分佈式系統CAP理論"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/f7\/28\/f79273yya895fae95e745eb6d8fc5a28.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"一致性(Consistency)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一致性指 "},{"type":"codeinline","content":[{"type":"text","text":"all nodes see the same data at the same time"}]},{"type":"text","text":",即更新操作成功並返回客戶端完成後,所有節點在同一時間的數據完全一致,不能存在中間狀態。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"關於一致性,如果用戶時刻看到的數據都是一致的,那麼稱之爲強一致性。如果允許存在中間狀態,只要求經過一段時間後,數據最終是一致的,則稱之爲最終一致性。此外,如果允許存在部分數據不一致,那麼就稱之爲弱一致性"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"可用性(Availability)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可用性是指系統提供的服務必須一直處於可用的狀態,對於用戶的每一個操作請求總是能夠在有限的時間內返回結果。"},{"type":"codeinline","content":[{"type":"text","text":"有限的時間內是指"}]},{"type":"text","text":":對於用戶的一個操作請求,系統必須能夠在指定的時間內返回對應的處理結果,如果超過了這個時間範圍,那麼系統就被認爲是不可用的。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"返回結果"}]},{"type":"text","text":"是可用性的另一個非常重要的指標,它要求系統在完成對用戶請求的處理後,返回一個正常的響應結果,不論這個結果是成功還是失敗。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"分區容錯性(Partition tolerance )"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"布式系統在遇到任何網絡分區故障的時候,仍然需要能夠保證對外提供滿足一致性和可用性的服務,除非是整個網絡環境都發生了故障。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"X\/Open DTP模型與XA規範"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"X\/Open,即現在的open group,是一個獨立的組織,主要負責制定各種行業技術標準。官網地址:http:\/\/www.opengroup.org\/。X\/Open組織主要由各大知名公司或者廠商進行支持,這些組織不光遵循X\/Open組織定義的行業技術標準,也參與到標準的制定。下圖展示了open group目前主要成員(官網截圖):"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/62\/b9\/62c003487d5f82bab2dd509ebb9594b9.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"DTP模型"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/95\/6d\/95c5a2356387700a06855fe96dfa126d.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"應用程序(Application Program ,簡稱AP):用於定義事務邊界(即定義事務的開始和結束),並且在事務邊界內對資源進行操作。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"資源管理器(Resource Manager,簡稱RM,一般也稱爲事務參與者):如數據庫、文件系統等,並提供訪問資源的方式。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"事務管理器(Transaction Manager ,簡稱TM,一般也稱爲事務協調者):負責分配事務唯一標識,監控事務的執行進度,並負責事務的提交、回滾等。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"XA規範"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/a1\/b7\/a1b6edc2726bc94d2f82078259cb50b7.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏的接口規範特別多,我們只要來講講幾個最重要的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"xa_start"}]},{"type":"text","text":" : 在 "},{"type":"codeinline","content":[{"type":"text","text":"RM"}]},{"type":"text","text":"端調用此接口開啓一個"},{"type":"codeinline","content":[{"type":"text","text":"XA"}]},{"type":"text","text":"事務,後面需要接上"},{"type":"codeinline","content":[{"type":"text","text":"XID"}]},{"type":"text","text":" 作爲參數。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"xa_end"}]},{"type":"text","text":" : 取消當前線程與事務的關聯, 與 "},{"type":"codeinline","content":[{"type":"text","text":"xa_start"}]},{"type":"text","text":"是配對使用。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"xa_prepare"}]},{"type":"text","text":" : 詢問"},{"type":"codeinline","content":[{"type":"text","text":"RM"}]},{"type":"text","text":" 是否已經準備好了提交事務。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"xa_commit"}]},{"type":"text","text":" : 通知"},{"type":"codeinline","content":[{"type":"text","text":"RM"}]},{"type":"text","text":" 提交事務分支。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"xa_rollback"}]},{"type":"text","text":" : 通知 "},{"type":"codeinline","content":[{"type":"text","text":"RM"}]},{"type":"text","text":" 提交回滾事務分支。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"XA二階段提交"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"階段一"}]},{"type":"text","text":" :TM通知各個RM準備提交它們的事務分支。如果RM判斷自己進行的工作可以被提交,那就就對工作內容進行持久化,再給TM肯定答覆;要是發生了其他情況,那給TM的都是否定答覆。在發送了否定答覆並回滾了已經的工作後,RM就可以丟棄這個事務分支信息。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"階段二"}]},{"type":"text","text":" :TM根據階段1各個RM prepare的結果,決定是提交還是回滾事務。如果所有的RM都prepare成功,那麼TM通知所有的RM進行提交;如果有RM prepare失敗的話,則TM通知所有RM回滾自己的事務分支。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"MySQL對XA協議的支持"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"MySQL"}]},{"type":"text","text":" 從"},{"type":"codeinline","content":[{"type":"text","text":"5.0.3"}]},{"type":"text","text":"開始支持XA分佈式事務,且只有"},{"type":"codeinline","content":[{"type":"text","text":"InnoDB"}]},{"type":"text","text":"存儲引擎支持XA事務。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"MySQL"}]},{"type":"text","text":" 在"},{"type":"codeinline","content":[{"type":"text","text":"DTP"}]},{"type":"text","text":"模型中也是屬於資源管理器"},{"type":"codeinline","content":[{"type":"text","text":"RM"}]},{"type":"text","text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"MySQL XA 事務的 SQL語法"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"XA START xid \/\/開啓XA事務,xid是一個唯一值,表示事務分支標識符\nXA END xid \/\/結束一個XA事務,\nXA PREPARE xid 準備提交\nXA COMMIT xid [ONE PHASE] \/\/提交事務。兩階段提交協議中,如果只有一個RM參與,那麼可以優化爲一階段提交\nXA ROLLBACK xid \/\/回滾\nXA RECOVER [CONVERT XID] \/\/列出所有處於PREPARE階段的XA事務\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"MySQL xid詳解"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"mysql中使用xid來作爲一個事務分支的標識符。通過C語言進行描述,如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\/∗\n∗ Transaction branch identification: XID and NULLXID:\n∗\/\n#define XIDDATASIZE 128 \/∗ size in bytes ∗\/\n#define MAXGTRIDSIZE 64 \/∗ maximum size in bytes of gtrid ∗\/\n#define MAXBQUALSIZE 64 \/∗ maximum size in bytes of bqual ∗\/\nstruct xid_t {\n long formatID; \/* format identifier *\/\n long gtrid_length; \/* value 1-64 *\/\n long bqual_length; \/* value 1-64 *\/\n char data[XIDDATASIZE];\n };\n\/∗\n∗ A value of -1 in formatID means that the XID is null.\n∗\/\ntypedef struct xid_t XID;\n\/∗\n∗ Declarations of routines by which RMs call TMs:\n∗\/\nextern int ax_reg(int, XID ∗, long);\nextern int ax_unreg(int, long);\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"gtrid"}]},{"type":"text","text":" :全局事務標識符(global transaction identifier),最大不能超過64字節。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"bqual"}]},{"type":"text","text":" :分支限定符(branch qualifier),最大不能超過64字節。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"formatId"}]},{"type":"text","text":":記錄gtrid、bqual的格式,類似於memcached中flags字段的作用。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"data"}]},{"type":"text","text":" :xid的值,其是 gtrid和bqual拼接後的內容。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"MySQL XA事務狀態"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/fd\/4d\/fd0yyc12b7a02c19b5b5c0b03e21744d.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"JTA規範"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章