久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL數據庫中怎么實現多主復制

149次閱讀
沒有評論

共計 2373 個字符,預計需要花費 6 分鐘才能閱讀完成。

這篇文章給大家介紹 MySQL 數據庫中怎么實現多主復制,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

MySQL 管理每個復制通道,都是通過一個 Master_info 類 (sql/rpl_mi.h 中定義),start_slave/change_master /stop_slave/show_slave/end_slave 這些函數都需要傳入一個 Master_info 指針,這就給我們改造多 Master 提 供了很大的便利,基本只需要為每個復制通道傳入相應的 Master_info 即可。
除了找到函數入口,還需要讓語法支持多主,否則 CHANGE MASTER TO 語句并不能支持多主。我修改了 sql_yacc.yy,支持如下語法:
CHANGE MASTER lsquo; 通道標識 rsquo; TO,START SLAVE lsquo; 通道標識 rsquo;,STOP SLAVE lsquo; 通道標識 rsquo;,SHOW SLAVE lsquo; 通道標識 rsquo; STATUS。
這樣就可以支持多 Master 的語法了。
另一個問題是怎么保存多個通道的信息,默認單通道的情況下,用 master.info 存 Master 的信息,用 relay-log.info 存復制應用 的情況。所以存儲文件的名稱也要修改,我的方式是,master.info 和 relay-log.info 在末尾加上通道標識后綴,例如名為”plx”的 通道,會存成 master.info.plx 和 relay-log.info.plx。Relay Log 因為有序列,所以增加”- 通道標識”在序列前。
還有一個問題就是,操作命令都是用通道標識來確定一個通道,那么肯定需要持久化正在用的通道名稱,以及建立通道后可以用通道名獲取相應的 Master_info。于是我新建了一個 MASTER_INFO_INDEX 類 (在 sql/rpl_mi.h),里面包含一個通道標識和 Master_info 指針的對應 HASH 表,以及持久化需要的 IO_CACHE,通過 master.info.index 這個文件來存已有的通道標識。
命名實例如下:

雙擊代碼全選
11-rw-rw mdash;- 1 mysql mysql 10 Feb 13 20:40 master.info.index-rw-rw mdash;- 1 mysql mysql 76 Feb 14 17:27 master.info.plx1 -rw-rw mdash;- 1 mysql mysql 71 Feb 14 17:27 master.info.plx2 -rw-rw mdash;- 1 mysql mysql 90 Feb 14 17:25 relay-log.info.plx1 -rw-rw mdash;- 1 mysql mysql 90 Feb 14 17:27 relay-log.info.plx2 -rw-rw mdash;- 1 mysql mysql 160 Feb 14 10:16 mysql-relay-bin-plx1.000011 -rw-rw mdash;- 1 mysql mysql 83765425 Feb 14 17:27 mysql-relay-bin-plx1.000012 -rw-rw mdash;- 1 mysql mysql 106 Feb 14 10:16 mysql-relay-bin-plx1.index-rw-rw mdash;- 1 mysql mysql 160 Feb 14 10:16 mysql-relay-bin-plx2.000014 -rw-rw mdash;- 1 mysql mysql 83455792 Feb 14 17:27 mysql-relay-bin-plx2.000015 -rw-rw mdash;- 1 mysql mysql 106 Feb 14 10:16 mysql-relay-bin-plx2.index

下載 Patch 在此:http://bugs.mysql.com/file.php?id=18020

有了多 Master 以后我們可以做什么呢? 下面給兩個應用場景。
第一個是一備多的備份。因為我們采用的分庫策略,使我們一個集群會有很多個實例,每個實例里面有幾個 Schema,但是肯定不會重復。例如第一個實例是 1~3 號 Schema。第二個實例就是 4~6 號 Schema,所以 binlog 應用到一起并不會沖突數據。這是我們測試的在線備份方案。

第二個是跨機房的 HA。為了容災或者加速,很多公司都采用在不同機房部署數據庫的方式,所以就涉及到數據同步。為了保證每個機房產生的數據不沖突,一般 來說我們采用的是 auto_increment_increment,auto_increment_offset 這兩個參數,可以控制步進。例如雙 MAster,我們會配置主庫是奇數序列的 ID,備庫是偶數序列的 ID,這樣切換時就算有少量 binlog 還未應用,也不會導致數據沖突。跨機房以后,例 如兩個機房都有雙 Master,兩個機房之間數據又需要同步,以前需要借助第三方腳本或者程序,有了多 Master,按如下方式搭建,設置步進為 4,就可 以保證每個機房有雙 MAster HA,機房之間數據又可以同步。

已知缺陷:
1. 我還沒做 reset slave lsquo; 通道標識 rsquo; 命令,就是復制通道還不能重置,只能 CHANGE MASTER 來改,不是做不了,因為暫時我們沒這個需求,等穩定了再考慮這個細節。
2. 數據沖突沒有檢測。這個是無法解決的,我只是簡單的調用了啟動 Slave 的函數來啟動多個復制線程,binlog 取到本地應用,有數據沖突是不能事先檢測 的,執行到了才會報出來,可以設置 skip-slave-error,對全局有效。其他復制相關的也是全局有效。

關于 MySQL 數據庫中怎么實現多主復制就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-03發表,共計2373字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 泰州市| 宁城县| 巫山县| 湖南省| 玉屏| 柞水县| 珠海市| 巴彦县| 综艺| 浦北县| 唐河县| 清水河县| 环江| 苍梧县| 阿鲁科尔沁旗| 泰宁县| 黄梅县| 乌拉特中旗| 江油市| 临泉县| 安阳县| 横山县| 察哈| 满洲里市| 彭泽县| 长沙市| 潜山县| 平果县| 宜春市| 绥滨县| 武安市| 温宿县| 合水县| 绿春县| 安丘市| 建湖县| 通州区| 潞城市| 玛曲县| 衡南县| 贵阳市|