MyCAT讀寫分離以及參數調配

MyCat說明

MyCat的說明文檔請參見官網

MyCat配置

主要使用到得幾個配置文件有schema.xml、rule.xml、server.xml

MYCAT_HOME/conf/schema.xml 中定義邏輯庫,表、分片節點等內容.

MYCAT_HOME/conf/rule.xml 中定義分片規則.

MYCAT_HOME/conf/server.xml 中定義用戶以及系統相關變量,如端口等.

MyCat配置單實例庫

假設有如下幾個數據庫,arp庫是a庫的復制庫,brp庫是b庫的復制庫,需要搭建成mycat模式,配置成單個實例模式,同時配置成讀寫分離模式

mysqldatabasetable

a.mysql.com.cnt_database1-4t_table

arp.mysql.com.cnt_database1-4t_table

b.mysql.com.cnt_database5-8t_table

brp.mysql.com.cnt_database5-8t_table

mycatdatabasetable

mycat.mysql.com.cnt_databaset_table

schema.xml配置讀寫分離數據庫,并定義讀寫分離的模式

[envuser@node1 conf]$ more schema.xmlselect user()select user()

rule.xml定義讀寫規則

site_idpartStr8site_idpartStr81664:2568128:256

server.xml配置,定義mycat的數據庫名稱、用戶名、密碼等參數

passwordt_database

默認分配的賬戶是具備讀寫權限的賬戶

MyCat操作

開啟MyCat

[envuser@localhost conf]$ cd ~/mycat/bin/

[envuser@localhost bin]$ ./mycat start

關閉MyCat

[envuser@localhost conf]$ cd ~/mycat/bin/

[envuser@localhost bin]$ ./mycat stop

查看MyCat狀態

[envuser@localhost conf]$ cd ~/mycat/bin/

[envuser@localhost bin]$ ./mycat status

Mycat-server is running (8320).

MyCat分配只讀賬戶

如果只想給MyCat分配一個只讀賬戶,可以通過配置server.xml來實現,重啟MyCat,使配置生效

passwordt_databasetrue

MyCat調整日志級別

MyCat的log都存放在logs目錄下,可以通過查找logs目錄找到對應的log,默認的log級別是info,可以通過調整~/mycat/conf/log4j2.xml調整日志的級別和日志的格式,如果MyCat無法正常開啟,可以通過查找該日志來定位原因,修改日志的配置文件,重啟MyCat使配置生效

[envuser@ip-10-21-8-46 conf]$ more log4j2.xml%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n-->-->-->-->

MyCat具體case分析

從數據庫長時間CPU 100%

大體數據庫架構如上面所示,由于以a.mysql.com.cn和arp.mysql.com.cn,這兩個數據庫通過mycat配置成讀寫分離,但是發現復制庫的cpu長時間處于100%狀態,且該數據庫的Read的QPS明顯要高于Write的QPS,而主數據庫的CPU長期處于空閑狀態,針對該現象做原因分析

該數據庫由4個分庫,每個分庫中只有1張表,但是表最高的數據行數達到了1800W行((⊙﹏⊙)b),通過修改代碼將每一條SQL的耗時打印到日志中觀察發現,用戶的使用行為中針對該數據庫的Wirie操作較少,且寫的數據庫操作耗時較短,屬于正常現象,但是Read操作較為頻繁,通過分析日志發現,Read的操作最長耗時竟然達到了20s,這也是為什么用戶使用起來覺得查詢慢的原因,由于查詢不斷堆積,導致cpu長時間100%

通過日志分析定位出查詢時間較長的SQL,發現有幾個SQL的查詢非常慢,需要20s以上。將該SQL通過MyCat執行,確實需要花費20s以上的時間,驗證日志無異常;

由于擔心MyCat的查詢規則導致查詢慢,通過在MyCat explain該語句,定位到需要執行該語句的數據庫,直接在該數據庫上執行該語句,發現依然需要20s以上,也就是說該查詢的慢跟MyCat沒有關系

mysql>SELECTglobal_idFROMt_tableWHEREwarn_type='102'ANDchild_warn_type='102003'ANDsite_id='xxxxxxx'ANDdevice_id='xxxxxx'ANDpoint_id='INV.State'ANDcategory='22'ANDOCCUR_TIME_UTC<'2017-09-25 00:05:55.079'ANDOCCUR_TIME<'2017-09-25 08:05:55.079'ANDOCCUR_TIME>'2017-07-01 00:00:00'ORDERBYOCCUR_TIMEDESCLIMIT1;+----------------------------------+|global_id|+----------------------------------+|xxxxxxxx|+----------------------------------+1rowinset(25.80sec)

通過在數據庫上單獨explain該查詢用戶,獲取執行過程中hit到的索引,發現該查詢查找了數百萬行的數據,同時explain的結果顯示,并沒有hit到以前的索引,所以導致查詢慢,并通過分析所有慢的查詢,通過綜合分析索引和查詢的條件,發現以前的索引已經不符合現有的使用情況;

mysql>explainSELECTglobal_idFROMt_tableWHEREwarn_type='102'ANDchild_warn_type='102003'ANDsite_id='xxxxxxxx'ANDdevice_id='xxxxxxx'ANDpoint_id='INV.State'ANDcategory='22'ANDOCCUR_TIME_UTC<'2017-09-25 00:05:55.079'ANDOCCUR_TIME<'2017-09-25 08:05:55.079'ANDOCCUR_TIME>'2017-07-01 00:00:00'ORDERBYOCCUR_TIMEDESCLIMIT1;mysql>showindexfromt_table;+------------------+------------+----------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+|Table|Non_unique|Key_name|Seq_in_index|Column_name|Collation|Cardinality|Sub_part|Packed|Null|Index_type|Comment|Index_comment|+------------------+------------+----------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+|t_table|0|PRIMARY|1|id|A|8669108|NULL|NULL||BTREE||||t_table|0|PRIMARY|2|occur_time|A|8669108|NULL|NULL||BTREE||||t_table|1|t_table_global_id_index|1|global_id|A|8669108|NULL|NULL||BTREE||||t_table|1|t_table_index|1|site_id|A|7833|NULL|NULL|YES|BTREE||||t_table|1|t_table_index|2|occur_time_utc|A|6831715|NULL|NULL|YES|BTREE||||t_table|1|t_table_index|3|device_id|A|8669108|NULL|NULL||BTREE||||t_table|1|t_table_index|4|point_id|A|8669108|NULL|NULL|YES|BTREE||||t_table|1|t_table_index|5|warn_type|A|8669108|NULL|NULL|YES|BTREE||||t_table|1|t_table_index|6|child_warn_type|A|8669108|NULL|NULL|YES|BTREE|||+------------------+------------+----------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+9rowsinset(0.00sec)mysql>

決定重構索引,將查詢的字段根據查詢的內容重構索引,并將老的索引刪除,重啟MyCat后,該查詢正常,經過沖過股索引后,已經可以解決大部分查詢慢的問題,但是還有若干查詢很奇怪,每次查詢的耗時很長20s以上,但是查詢的頻率非常高,基本上市1s一次,這樣的查詢在某個時間段內一直出現,且該查詢可以hit到正常的索引,也就是說他是可以正常的查詢,但是這樣的查詢行為是很怪異的

經過定位查詢語句和查詢邏輯找到了查詢的調用方,經過檢查發現,由于調用方的配置錯誤,導致了這樣的異常查詢調用,要求調用方整改后,基本上已經沒有了長時間的CPU非常高的情況,說明用戶的調用都已經開始恢復正常

但是每天都會有一段時間復制庫的cpu達到100%,持續時間在1h左右,經過定位分析這是用戶的正常使用邏輯,之所以CPU 100%,是由于業務方每天定時調用,每次調用的數據量較大,完成這樣的大量查詢需要1h才能把所有的查詢執行完成,在這段時間內復制庫的cpu是100%的,但是Master數據庫的cpu卻一直長期處于低領用率狀態

既然不能要求業務方該,那就只能從數據庫這方面修改了,由于索引的利用價值已經不高,在不增加成本的情況下,相當一個方案是,將讀寫分離的架構調整成為,主庫寫/讀,復制庫讀的模式,將復制庫的讀壓力部分的轉移到主庫上來,可以分擔一部分的壓力

通過查詢MyCat的schema.xml配置,發現dataHost的blance配置可以滿足我們這樣的需求,balance的具體配置如下:

balance 屬性

負載均衡類型,目前的取值有 3 種:

1. balance="0", 不開啟讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上。

2. balance="1",全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙

主雙從模式(M1->S1,M2->S2,并且 M1 與 M2 互為主備),正常情況下,M2,S1,S2 都參與 select 語句的負載

均衡。

3. balance="2",所有讀操作都隨機的在 writeHost、readhost 上分發。

4. balance="3",所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓

力,注意 balance=3 只在 1.4 及其以后版本有,1.3 沒有。

通過修改balance的值=2,重啟MyCat使配置生效,后面觀察發現主數據庫的Read的IOPS明顯上升,同時副本數據庫的IOPS明顯下降,說明該配置已經生效,復制數據庫的CPU明顯下降,再也沒有打到100%的情況

雖然我也不推薦使用balance=2的模式,但是在成本控制的時候,可以使用,當然了有更好的方案,比如再增加一個副本數據庫,如arp2.mysql.com.cn,同時按照如下配置,將從數據庫的讀寫分擔,也是可以實現這樣的壓力分擔的,但是MySQL數據庫的瓶頸上限是1000W行,當數據量超過1000W行時,查詢等操作會明顯有瓶頸,應當考慮其他的存儲方式,如HBase等

[envuser@node1 conf]$ more schema.xmlselect user()select user()

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,733評論 18 399
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,829評論 0 11
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,816評論 18 139
  • 朔雨望雨連霏霏,江濤云濤共滾滾。 一眺萬頃天穹黯,徘徊復擇素傘出。 但見車馬疾疾走,心憂安存同漉人。 惟睹傘影已遠...
    浮生清歡味閱讀 213評論 0 0
  • 這幾天廣州的天氣有點異常,十月底了還是熱如酷夏,更沒有早晚應有的涼爽。可是收拾換季衣服的習慣還一時改不了,加上心中...
    好馨勤閱讀 338評論 0 0