pyMySQL.connect(host=testHost, port=testPort, user=testUser, password=testPassword,
database=testDatabase)

    cursor = db.cursor()

    try:

       
cursor.execute(begin)

        #為一個(gè)賬戶Bob的余額減1

        query = update
t_user_balance SET balance = balance – 1 
where user=\\\’Bob\\\’ and balance>1)

        affected =
cursor.execute(query)

        if affected == 0: #余額不足,回滾事務(wù)

           
cursor.execute(rollback)

            return

        #為一個(gè)賬戶John的余額加1

        query = update
t_user_balance SET balance = balance 1 
where user=\\\’John\\\’)

        cursor.execute(query)

        # 為了安全起見,建議在這里執(zhí)行‘SELECT gtid()’獲取當(dāng)前事務(wù)的id值,便于后續(xù)跟蹤事務(wù)的執(zhí)行情況

        #提交事務(wù)

       
cursor.execute(commit)

    except pyMySQL.err.MySQLError as
e:

        # 發(fā)生故障,回滾事務(wù)

       
cursor.execute(rollback)

分布式事務(wù)的好處在于會(huì)大大降低應(yīng)用開發(fā)難度,因?yàn)樵谀承┎恢С諼A的數(shù)據(jù)庫中,需要業(yè)務(wù)系統(tǒng)通過特殊并且巧妙的設(shè)計(jì),而非利用數(shù)據(jù)庫來解決事務(wù)中數(shù)據(jù)不一致等問題。這種對(duì)應(yīng)用開發(fā)者的技術(shù)水平要求很高,越是復(fù)雜的業(yè)務(wù)系統(tǒng),越會(huì)增加開發(fā)成本和技術(shù)門檻,這是業(yè)內(nèi)大多數(shù)開發(fā)者面對(duì)分布式數(shù)據(jù)庫時(shí),只能望而卻步的主要原因。

騰訊云DCDB XA關(guān)鍵實(shí)現(xiàn)方案

1、DCDB架構(gòu)介紹

騰訊云DCDB整個(gè)集群架構(gòu)簡圖如下圖,MySQL采用主從節(jié)點(diǎn)配置(也叫作主備)一套主從節(jié)點(diǎn)叫做SET,在每一個(gè)SET外配置網(wǎng)關(guān)(TProxy),形成一個(gè)物理分片(Shard)。

DCDB后端是MySQL(或其分支版本)數(shù)據(jù)庫,目前騰訊云公有云發(fā)布支持XA的版本是基于MySQL 5.7.17(percona分支)。

2、網(wǎng)關(guān)(TProxy)與XA

網(wǎng)關(guān)是用于接收請(qǐng)求并與后端MySQL建立連接的網(wǎng)絡(luò)模塊。網(wǎng)關(guān)可以用兩種模式工作,一種稱為noshard,此模式下網(wǎng)關(guān)不處理/不解析SQL語句,透明轉(zhuǎn)發(fā)請(qǐng)求和應(yīng)答。另一種模式稱為shard(分布式,即支持自動(dòng)水平分表)模式下,TProxy會(huì)解析SQL并轉(zhuǎn)發(fā)到不同的數(shù)據(jù)分片。

在實(shí)現(xiàn)XA之前,網(wǎng)關(guān)不允許在一個(gè)事務(wù)中向多個(gè)SET發(fā)送DML語句。因?yàn)槲磳?shí)現(xiàn)二階段提交(2PC)時(shí),事務(wù)采用一階段提交,如果分布式中某一個(gè)SET提交失敗了或回滾了,那么這個(gè)分布式事務(wù)就處于不一致的狀態(tài)。

(網(wǎng)關(guān)的工作方式)

二階段提交中需要的事務(wù)管理器(TM)。為了解決容災(zāi)、簡化架構(gòu),騰訊云DCDB將TM實(shí)現(xiàn)在TProxy中,而DCDB的網(wǎng)關(guān)是一個(gè)無狀態(tài)的模塊,通過這一架構(gòu),DCDB XA可以支持:

1、分布式事務(wù)對(duì)業(yè)務(wù)透明,兼容單機(jī)事務(wù)語法(start transaction/commit/rollback/savepoint)。

2、每個(gè)網(wǎng)關(guān)都可以獨(dú)立接受和處理事務(wù)請(qǐng)求,且無需與其他網(wǎng)關(guān)進(jìn)行協(xié)調(diào)節(jié)點(diǎn)故障不丟失事務(wù)。

3、允許顯式事務(wù)中多條語句分別發(fā)給多個(gè)分片。

4、網(wǎng)關(guān)無需持久狀態(tài),無需容災(zāi),可以隨時(shí)經(jīng)由調(diào)度集群退出或加入集群,且性能可以擴(kuò)展。

5、支持autocommit下單條語句寫訪問多個(gè)分片等。

DCDB網(wǎng)關(guān)還允許以流式處理方式運(yùn)行g(shù)roup by、order by,流式處理讓這類操作變得非常方式非常高效;網(wǎng)關(guān)還支持兩個(gè)Shard使用shardkey(分表鍵)做等值連接,以及使用shardkey的子查詢。

未來,騰訊云還計(jì)劃支持分布式JOIN、Sparksql、二級(jí)分區(qū)等高級(jí)功能,兼容更多MySQL高級(jí)語法。

3、強(qiáng)同步與XA

由于騰訊云DCDB默認(rèn)采用強(qiáng)同步復(fù)制,即主從節(jié)點(diǎn)數(shù)據(jù)完全一致,因此XA事務(wù)也遵循強(qiáng)同步的邏輯,即需等待從機(jī)確認(rèn)數(shù)據(jù)同步后,才給業(yè)務(wù)以應(yīng)答(commit)?;趶?qiáng)同步,在以下兩種異常情況下,DCDB XA可輕松應(yīng)對(duì)

1、主節(jié)點(diǎn)故障時(shí),已確認(rèn)事務(wù)數(shù)據(jù)不會(huì)丟失:主節(jié)點(diǎn)故障那么擁有最新數(shù)據(jù)和binlog的從機(jī)就被選為主節(jié)點(diǎn),這其中的數(shù)據(jù)也包括所有已經(jīng)向用戶確認(rèn)完成提交的事務(wù)的數(shù)據(jù)。

2、原主節(jié)點(diǎn)恢復(fù)后重新加入集群,未確認(rèn)事務(wù)自動(dòng)閃回:原主節(jié)點(diǎn)恢復(fù)重新接入集群,它將作為從機(jī)運(yùn)行,此時(shí)他可能存留多余的已提交事務(wù)(此時(shí)事務(wù)并未得到強(qiáng)同步同步確認(rèn),即原備機(jī)并沒有相關(guān)數(shù)據(jù)),那么這些事務(wù)會(huì)被閃回。雖然這些事務(wù)可能已經(jīng)在原主節(jié)點(diǎn)的MySQL內(nèi)部完成提交,但由于強(qiáng)同步機(jī)制,他并不會(huì)向客戶端返回commit語句,這意味著仍被視為一個(gè)未完成的事務(wù)。因此,這些事務(wù)的閃回了也并沒有破壞數(shù)據(jù)庫的ACID屬性。這里值得說的是,閃回flashback是基于binlog生成做逆操作,它與數(shù)據(jù)庫回滾并不同rollback,閃回可以做DDL操作。

騰訊云DCDB的強(qiáng)同步為騰訊金融級(jí)數(shù)據(jù)庫自研的一項(xiàng)能力,性能比官方半同步大幅提高,幾乎等于異步復(fù)制性能,騰訊云DCDB在騰訊內(nèi)部應(yīng)用多年,未發(fā)生過一起因?yàn)橹鲝那袚Q、故障帶來的數(shù)據(jù)誤差。而且,從性能上,也撐住了騰訊公司各類大型運(yùn)營活動(dòng)如紅包、各類游戲大型推廣等海量并發(fā),其主要原因是強(qiáng)同步采用異步提交/等待方式,且不占用數(shù)據(jù)庫工作線程。

4、并發(fā)控制與隔離級(jí)別

為了達(dá)到數(shù)據(jù)一致性和性能的平衡,分布式事務(wù)的關(guān)鍵是數(shù)據(jù)庫隔離控制。XA的隔離級(jí)別最高可以達(dá)到serializable(完全串行化),該級(jí)別將不存在幻讀的問題,serializable級(jí)別可以通過設(shè)置SET global tx_isolation=\\\’serializable\\\’來對(duì)DCDB所有物理分片(和其上承載的MySQL數(shù)據(jù)庫)進(jìn)行設(shè)置。當(dāng)然,也可以通過調(diào)整隔離級(jí)別以調(diào)整數(shù)據(jù)庫實(shí)例性能,理論上,Read Uncommitted性能最高,但可能存在臟讀、幻讀的情況。

隔離解別

臟讀

不可重復(fù)讀

幻讀

Read Uncommitted

Y

Y

Y

Read Committed

N

Y

Y

Repeatable(default)

N

N

Y

Serializable

N

N

N

(ANSI/ISO定義的SQL-92標(biāo)準(zhǔn)定義的四種隔離級(jí)別)

5、分布式事務(wù)處理算法

前面講到,騰訊云DCDB的網(wǎng)關(guān)在shard模式下已經(jīng)能夠解析SQL語句,騰訊云在網(wǎng)關(guān)上實(shí)現(xiàn)TM以使得XA最具效率。為此,我們?cè)诰W(wǎng)關(guān)中實(shí)現(xiàn)TM中的協(xié)調(diào)器(coordinator),并在網(wǎng)關(guān)中維護(hù)每個(gè)XA的狀態(tài),記錄好每個(gè)XA寫入的SET,然后在提交階段做兩階段提交即可,大致流程如下:

1、網(wǎng)關(guān)在執(zhí)行一個(gè)事務(wù)的insert/update/delete語句時(shí),會(huì)記錄這個(gè)語句修改了哪個(gè)SET;

2、SET時(shí)會(huì)發(fā)送一個(gè)XA START在這個(gè)SET上面啟動(dòng)事務(wù)分支;(注:XA事務(wù)開始時(shí),并不確認(rèn)事務(wù)將以哪種提交方式執(zhí)行,因此總是以xa start來開啟一個(gè)事務(wù))

3、檢測是否影響SET個(gè)數(shù)≤1,若是,則直接做一階段提交(xa commit one phase)。

4、影響SET個(gè)數(shù)≥2,則改為做兩階段提交

1)網(wǎng)關(guān)首先發(fā)送xa prepare ‘gtid’ 給參與的SET(大于等于2個(gè)SET)

2)SET接受到xa prepare應(yīng)答ok(表示成功確認(rèn))

3)收到成功確認(rèn)后,寫入XA對(duì)應(yīng)的commit log,再發(fā)送xa commit ‘gtid’參與SET。

4)如果有SET返回了錯(cuò)誤,或者寫入commit
log失敗,那么網(wǎng)關(guān)發(fā)送 xa
rollback ‘gtid’ 給相關(guān)SET,這樣這個(gè)全局事務(wù)就實(shí)現(xiàn)了回滾。

騰訊云DCDB的commit log是在SET中存儲(chǔ),這個(gè)步驟是批量完成的——網(wǎng)關(guān)后臺(tái)線程會(huì)匯集正在提交的分布式事務(wù)然后在獨(dú)立的連接和事務(wù)中完成對(duì)每個(gè)SET的寫入,并且每個(gè)事務(wù)的commit
log只寫入一個(gè)SET中,因而這個(gè)開銷并沒有顯著增加事務(wù)的提交耗時(shí)或者降低TPS。而且,依賴騰訊云DCDB已有的強(qiáng)同步和容災(zāi)特性,只要XA成功寫入了commit log,就意味著數(shù)據(jù)已經(jīng)寫入從機(jī)。

雖然絕大多數(shù)的XA事務(wù)可以正常執(zhí)行。但極少數(shù)的異常情況還是會(huì)影響整個(gè)集群穩(wěn)定性,因此,騰訊云設(shè)計(jì)了agent(監(jiān)控模塊),在故障后繼續(xù)協(xié)助完成本地MySQL上面prepared事務(wù)的提交,即agent會(huì)解析commit log,并根據(jù)異常處理本地仍然處于prepared的事務(wù)數(shù)據(jù);如果commit log上面沒有事務(wù)的提交決定的話,agent也會(huì)回滾超時(shí)未被提交的prepared本地事務(wù)。

雖然在MySQL 5.5、5.6等版本早已實(shí)現(xiàn)XA,但這兩個(gè)版本相對(duì)于5.7仍然有性能不足,因此騰訊云目前只在公有云上基于5.7.17支持XA版本。如今,騰訊云在MySQL 、percona、MariaDB等分支中做了大量優(yōu)化和相關(guān)bug修復(fù)(部分已經(jīng)提交到社區(qū)修復(fù)patch或開源),未來騰訊云還將繼續(xù)致力于新特性的開發(fā)和相關(guān)Bug的修復(fù),為眾多有需要的企業(yè),提供更好的分布式數(shù)據(jù)庫支持。

更多關(guān)于云服務(wù)器域名注冊(cè),虛擬主機(jī)的問題,請(qǐng)?jiān)L問三五互聯(lián)官網(wǎng):m.shinetop.cn

贊(0)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。郵箱:3140448839@qq.com。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明出處:三五互聯(lián)知識(shí)庫 » 一文教你迅速解決分布式事務(wù)XA一致性問題

登錄

找回密碼

注冊(cè)

主站蜘蛛池模板: 日韩美少妇大胆一区二区| 国产一区二区三区尤物视频| 精品国偷自产在线视频99| 伊人激情av一区二区三区| 最新国产精品亚洲| 2021国产精品视频网站| 国产精品久久蜜臀av| 欧美成人一区二区三区不卡| 国产伦精品一区二区亚洲| 国产亚洲精品日韩香蕉网| 无码一区二区三区av在线播放| 国产男女猛烈无遮挡免费视频网站 | 农村妇女野外一区二区视频| 国产精品欧美福利久久| 国产精品福利自产拍久久 | 欧美精品一区二区三区中文字幕| 人妻少妇精品视频专区| 亚洲一区二区三区人妻天堂| 亚洲中文字幕精品第一页| 欧美怡春院一区二区三区| 日韩av片无码一区二区不卡| 色悠悠国产精品免费观看| 国产精品伦人一久二久三久| 亚洲老熟女一区二区三区| 夜夜添狠狠添高潮出水| 欧美z0zo人禽交另类视频| 国产主播精品福利午夜二区| 爆乳2把你榨干哦ova在线观看| 午夜色大片在线观看免费| 我国产码在线观看av哈哈哈网站| 国产精品久久久久久爽爽爽| 日本黄页网站免费观看| 日本污视频在线观看| 一本大道av人久久综合| 疯狂做受XXXX高潮国产| 日韩中文字幕亚洲精品| 国产老熟女无套内射不卡| 精品人妻一区二区三区蜜臀 | 丝袜无码一区二区三区| 国产稚嫩高中生呻吟激情在线视频 | 久久国产精品老女人|