MySQL Connector J 高級特性 failover&loadbalance

MySQL Connector/J failover協(xié)議

MySQL Connector/J支持 failover 協(xié)議:即Client鏈接失效時(shí)扁誓,將會嘗試與其他host建立連接,這個過程對應(yīng)用是透明的瑞躺。Failover協(xié)議是“Multi-Host”模式中最基礎(chǔ)的協(xié)議,“l(fā)oad balancing”尼变、“replication”完丽、“farbic”協(xié)議都基于Failover協(xié)議励七。其URL格式如下:
jdbc:mysql://[primary-host]:[port],[secondary-host]:[port],.../[database]?[property=<value>]&[property=<value>]

Host列表中有兩種hosts:primary(master)和secondaries(slaves),priamry需要位于hosts列表的第一個;當(dāng)創(chuàng)建一個新的連接時(shí)变抽,會首先嘗試與primary連接础拨,如果primary連接異常氮块,將會依次與secondaries建立連接直到成功為止。即使與primary的鏈接失效诡宗,但是并不會丟失primary的特殊狀態(tài):比如它的訪問模式滔蝉、優(yōu)先級等。

連接屬性

Failover協(xié)議支持以下屬性:

  • failOverReadOnly
  • secondsBeforeRetryMaster
  • queriesBeforeRetryMaster
  • retriesAllDown
  • autoReconnect
  • autoReconnectForPools

failOverReadOnly用于控制連接中“read_only”參數(shù)僚焦,即當(dāng)primary連接失效時(shí)锰提,連接到secondary時(shí)的默認(rèn)訪問模式,此值默認(rèn)為“true”芳悲,即與secondary的連接訪問模式為“只讀”立肘。

primary的連接訪問模式總是“read/write”,即read_only為false名扛。當(dāng)與primary的連接失敗谅年,如果failOverReadOnly為false,表示與secondary的連接上允許發(fā)生“write”操作肮韧,與secondary的連接訪問模式也是“read/write”融蹂。
在failover發(fā)生后,會定期檢測primary的鏈接狀況弄企,如果發(fā)現(xiàn)primary的連接恢復(fù)正常超燃,那么連接會“Fallback”(回落)到primary上,即此后的read/write將在primary連接上發(fā)生(與secondary的連接將會保持空閑拘领,或者斷開)意乓。“secondsBeforeRetryMaster”表示驅(qū)動每隔多少秒將重試master的連接约素,“queriesBeforeRetryMaster”表示執(zhí)行多少次queries后重試master的連接届良,如果重試成功,則將連接“Fallback”到primary上圣猎∈亢可以將上述兩個屬性設(shè)置為“0”來關(guān)閉自動Fallback。

當(dāng)primary的連接失效后送悔,觸發(fā)failover慢显,此時(shí)驅(qū)動將依次與hosts列表中的secondary建立連接,直到與某個Secondary連接成功欠啤,否則將所有的secondaries都嘗試完畢鳍怨,然后繼續(xù)從頭開始,直到與其中一個secondary連接成功跪妥。如果所有的hosts都無法連接鞋喇,驅(qū)動最多重試“retriesAllDown”次(默認(rèn)為120)。

測試

  1. MySQL部署結(jié)構(gòu)

2.JDBC設(shè)置:
db.url = jdbc:mysql://172.16.21.193:3306,172.16.21.191:3306/testdb?failOverReadOnly=false&secondsBeforeRetryMaster=0&queriesBeforeRetryMaster=0&retriesAllDown=120&autoReconnect=false
每秒訪問MySQL進(jìn)行一次查詢眉撵,在日志中打印時(shí)間侦香。

  1. 當(dāng)觸發(fā)一次MySQL主從切換落塑,舊主解綁 172.16.21.193,新主綁定 172.16.21.191罐韩,看日志每隔3s才會訪問一次 172.16.21.191憾赁,這顯然是有問題的:
  2. 抓包分析得知,每次訪問 172.16.21.191 后散吵,會發(fā)3次 ARP 廣播詢問 172.16.21.193 的 mac 地址龙考,每隔1s 發(fā)一次,剛好 3s:

再看正確的 ARP 應(yīng)答矾睦,如果詢問的 IP 存在晦款,會立馬回復(fù),然后進(jìn)行握手:
  1. 對比測試枚冗,將 VIP 換成真實(shí) IP:
    db.url = jdbc:mysql://172.16.21.5:3306,172.16.21.4:3306
    關(guān)閉 172.16.21.5:3306 這個 MySQL缓溅,觀察到每次連接 MySQL 時(shí),都先嘗試連接 172.16.21.5:3306 赁温,再連接 172.16.21.4:3306坛怪。不同的是很快就會收到 RST 重連信號,不會阻塞與 172.16.21.4:3306 的連接股囊。此處不會有 arp袜匿,因?yàn)?arp -a 查看到的 arp 緩存一直都有真實(shí)IP的mac地址。

測試結(jié)論

從前面分析可以推得結(jié)論:
MySQL-JDBC 驅(qū)動每次訪問 host 列表都需要檢測 primary host 的連通性稚疹,如果 primary host IP 地址不在 arp 緩存中沉帮,則會發(fā)3次 arp 廣播,導(dǎo)致連接 secondary host 時(shí)有3s 延遲贫堰,這對應(yīng)用來說延遲太大。secondsBeforeRetryMaster=0&queriesBeforeRetryMaster=0 看起來失效了(本來作用是定義 primary host 連接檢測失敗后待牵,不再檢測 primary host)

但是:
嘗試修改 JDBC 其他參數(shù)(autoReconnect=true)其屏,發(fā)現(xiàn)并不是每次訪問 secondary host 即 172.16.21.191 前都需要 arp 廣播尋找 primary host 即 172.16.21.193,而是隔多少秒才會進(jìn)行 arp 廣播缨该。與前面的結(jié)論又相矛盾偎行。

因此本次探索MySQL Connector J 高級特性 failover 協(xié)議以一頭霧水告終,留此記錄希望以后能解開這個謎團(tuán)贰拿。

MySQL Connector/J loadbalance協(xié)議

Load Balancing可以將read/write負(fù)載蛤袒,分布在多個MySQL實(shí)例上,這些MySQL實(shí)例通常為 Cluster 架構(gòu)或者 Replication 架構(gòu)膨更,本文主要講解“Replication”架構(gòu)相關(guān)的知識妙真。LB協(xié)議基于“Failover協(xié)議”,即具備Failover特性荚守,其URL格式:jdbc:mysql:loadbalance://[host]:[port],[host]:[port],...[/database]?[property=<value>]&[property=<value>]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末珍德,一起剝皮案震驚了整個濱河市练般,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锈候,老刑警劉巖薄料,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泵琳,居然都是意外死亡摄职,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門获列,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谷市,“玉大人,你說我怎么就攤上這事蛛倦「枥粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵溯壶,是天一觀的道長及皂。 經(jīng)常有香客問我,道長且改,這世上最難降的妖魔是什么验烧? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮又跛,結(jié)果婚禮上碍拆,老公的妹妹穿的比我還像新娘。我一直安慰自己慨蓝,他們只是感情好感混,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著礼烈,像睡著了一般弧满。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上此熬,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天庭呜,我揣著相機(jī)與錄音,去河邊找鬼犀忱。 笑死募谎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阴汇。 我是一名探鬼主播数冬,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搀庶!你這毒婦竟也來了吉执?” 一聲冷哼從身側(cè)響起疯淫,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤严肪,失蹤者是張志新(化名)和其女友劉穎畜埋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溃卡,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咕宿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年币绩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片府阀。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缆镣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出试浙,到底是詐尸還是另有隱情董瞻,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布田巴,位于F島的核電站钠糊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壹哺。R本人自食惡果不足惜抄伍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望管宵。 院中可真熱鬧截珍,春花似錦、人聲如沸箩朴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炸庞。三九已至钱床,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間燕雁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工鲸拥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拐格,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓刑赶,卻偏偏與公主長得像捏浊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撞叨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容