MariaDB主從同步

MariaDB是MySQL的一個主要的開源分支朽们。由于oracle收購MySQL之后兽泣,擔心將其閉源绎橘,MySQL之父monty主導開發(fā)了MariaDB,用自己小女兒的名字命名唠倦。Maria DB完全兼容MySQL称鳞,可以輕松切換。在存儲引擎方面牵敷,MariaDB 10.1及之前版本均使用Percona XtraDB做為默認引擎胡岔,從10.2開始使用MySQL官方的InnoDB做為默認引擎。XtraDB是 InnoDB 存儲引擎的增強版枷餐,用來更好地發(fā)揮最新的計算機硬件系統(tǒng)性能靶瘸,同時還包含一些在高性能環(huán)境下的新特性。在MySQL 5.1和5.5版本上有很好的性能表現(xiàn)毛肋。但是后來MySQL官方幾乎把所有的優(yōu)秀特性都實現(xiàn)了怨咪,所以MariaDB 10.2開始又切換到了InnoDB。在新功能特性方面润匙,MariaDB優(yōu)化了子查詢诗眨,增加了多源復制(基于表的并行復制),Galera Cluster集群等孕讳。雖然MySQL 5.7以后也增加了相關特性匠楚,比如基于表的并行復制巍膘,但MySQL社區(qū)版畢竟一個閹割版本,企業(yè)版又是閉源收費的芋簿。此外MariaDB在高并發(fā)環(huán)境下穩(wěn)定性比MySQL好很多峡懈,壓測的時候隨著連接數(shù)的增大性能曲線不會大幅抖動,很平穩(wěn)与斤。

安裝MariaDB

我是在虛擬機在中安裝了centos6.9肪康,數(shù)據(jù)庫版本選擇是mariadb10.2。通過yum的方式進行安裝撩穿,在線查找安裝源:在線源信息

新建MariaDB.repo文件:

選擇自己將安裝版本磷支,將源信息復制到MariaDB.repo中。在安裝的過程中可能因為網(wǎng)絡或者缺少庫文件而造成安裝失敗食寡。在這里推薦大家使用國內(nèi)的鏡像:http://mirrors.ustc.edu.cn/mariadb/yum/雾狈。選擇合適的操作系統(tǒng)合適數(shù)據(jù)庫版本。

# MariaDB 10.2 CentOS repository list -created 2018-06-22 02:15 UTC

# http://downloads.mariadb.org/mariadb/repositories/

[mariadb]

name = MariaDB

baseurl = http://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos/6.9/x86_64

gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB

gpgcheck=1

(↑國內(nèi)源信息內(nèi)容)

安裝MariaDB:sudo yum install MariaDB-server MariaDB-client

啟動MariaDB:service mysql start

開機啟動:chkconfig mysql on

初始設置MariaDB:mysql_secure_installation

設置一下root用戶密碼冻河,其他設置全部按回車就可以了箍邮。

通過客戶端訪問數(shù)據(jù)庫:mysql -u root -p

接下來設置權限茉帅,允許遠程機器通過root用戶訪問數(shù)據(jù)庫叨叙。

GRANT ALL PRIVILEGES ON *.* to 'root'@'%' identified by 'root';(可以指定特定IP訪問,如果是%表示任意IP訪問)

別忘了刷新權限:flush privileges;

如果防火墻處于開啟狀態(tài)堪澎,先關閉掉擂错。service iptables stop

MariaDB主從同步原理

先說一下,數(shù)據(jù)庫主從同步復制能解決的問題樱蛤,我能想到就是數(shù)據(jù)備份和負載均衡钮呀。數(shù)據(jù)備份自然不用說,負載均衡讀寫分離的前提就是主從同步復制昨凡,然后通過數(shù)據(jù)庫代理(比如:mycat爽醋、mysql router等)分流應用的讀寫請求,降低數(shù)據(jù)庫的壓力便脊,提高訪問性能蚂四。至于高可用和容錯性,我認為主從單向同步無法解決哪痰。首先遂赠,如果主庫宕機,數(shù)據(jù)庫代理會把從庫也變?yōu)椴豢捎蒙谓埽蛘咧荒茏x不能寫跷睦。而且,寫操作只能在主庫上進行肋演,如果在從庫也不小心寫入操作抑诸,那么就會造成數(shù)據(jù)不一致或者同步狀態(tài)異常等問題烂琴。

a) MariaDB的數(shù)據(jù)變化會記錄在二進制日志中(bing log),我們需要在主庫的配置文件中開啟這個日志功能蜕乡。

b) 從庫有一個I/O線程會監(jiān)聽主庫的二進制日志改變事件监右,把事件內(nèi)容記錄到中繼日志(Relay log)中。我們需要在從庫中開啟這個日志功能异希。

c) 從庫的SQL線程會從中繼日志中讀取事件健盒,并重放事件更新到從庫中。

Binglog的復制類型分為三種:

基于sql語句的復制(statement)称簿,每一條會修改數(shù)據(jù)的?SQL?都會記錄到?master?的?bin-log?中扣癣。slave?在復制的時候?SQL?進程會解析成和原來?master?端執(zhí)行過的相同的?SQL?再次執(zhí)行。

基于行內(nèi)容的復制(row)憨降,日志中會記錄成每一行數(shù)據(jù)被修改的形式父虑,然后在?slave?端再對相同的數(shù)據(jù)進行修改。

混合復制模式(mixed)授药,就是前兩種模式的結合士嚎。在?Mixed?模式下,MySQL?會根據(jù)執(zhí)行的每一條具體的?SQL?語句來區(qū)分對待記錄的日志形式悔叽,也就是在?statement?和?row?之間選擇一種莱衩。

statement的方式產(chǎn)生的binglog日志文件量小,節(jié)省了I/O和存儲資源娇澎。但在執(zhí)行一些特定函數(shù)比如now()笨蚁、?last_insert_id()在主庫和從庫上會產(chǎn)生不一樣的結果。而且復制的時候相對于row的模式會產(chǎn)生更多的行級鎖表趟庄。row的方式任何情況都可以被復制括细,這對復制來說是最安全可靠的。最大的一個問題是產(chǎn)生的日志量太大戚啥,因為要記錄數(shù)據(jù)改動的內(nèi)容奋单。尤其是對一個大表執(zhí)行了alert tbale產(chǎn)生的日志量是驚人的。新版的MySQL和MariaDB對row模式進行的優(yōu)化猫十,并不是所有的修改都會以?row?模式來記錄览濒,比如遇到表結構變更的時候就會以?statement?模式來記錄。

默認情況下復制都是異步進行的炫彩,這樣的性能最佳匾七。但問題在于,異步情況下江兢,如果從庫沒有接受到主庫發(fā)過來的二級制事件日志昨忆,而且主庫并沒有感知到這個情況的發(fā)生,這樣就會出現(xiàn)主從數(shù)據(jù)不一致的情況發(fā)生杉允,造成數(shù)據(jù)丟失邑贴。為了解決異步復制數(shù)據(jù)丟失的問題席里,從MySQL5.5開始的數(shù)據(jù)庫引入了半同步的復制模式。該模式下從庫接受到主庫的日志信息拢驾,并寫入到自己的中繼日志中奖磁,然后會給主庫一個反饋,主庫接受到這個反饋才會告知當前會話操作完成繁疤。主庫確認從庫反饋有一個超時時間(rpl_semi_sync_master_timeout)咖为,默認是10秒。如果超出這個時間稠腊,從還沒有反饋的話躁染,就會切換到異步模式,不再等待slave從庫架忌。如果主庫再次探測到slave從庫恢復吞彤,則會自動回到半同步復制模式。

注:半同步復制模式必須在主從節(jié)點同時啟用叹放,否則主節(jié)點默認使用異步復制模式饰恕。

MariaDB主從同步復制配置

本文采用的半同步復制模式。首先查找MariaDB的安裝包中是否存在半同步復制插件:find / -name semisync*

在主庫中安裝插件:install plugin rpl_semi_sync_master soname 'semisync_master.so';

開啟主庫半同步復制:SET GLOBAL rpl_semi_sync_master_enabled =1;

在從庫中安裝插件:install plugin rpl_semi_sync_slave soname 'semisync_slave.so';?

開啟從半同步復制:SET GLOBAL rpl_semi_sync_slave_enabled =1;?

配置主庫的server.cnf:vi /etc/my.cnf.d/server.cnf

skip_name_resolve = ON

innodb_file_per_table = ON

server-id = 10001? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #主庫唯一標識

log-bin=master-bin? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #開啟二級制日志

log-bin-index=master-bin.index

rpl_semi_sync_master_enabled=1? ? ? ? ? ? #開啟半同步復制井仰,需要先安裝插件

rpl_semi_sync_master_timeout=10000? ? ?#主庫半同步復制模式等待從庫反回信息的超時時間

expire_logs_days = 5? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #日志的有效天數(shù)

binlog_format = row? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #基于行內(nèi)容的復制

binlog_row_image = minimal? ? ? ? ? ? ? ? ? ? #行內(nèi)容復制時埋嵌,只保存修改過列。

重啟主庫:service mysql restart

查看主庫配置:show variables like 'rpl%';

rpl_semi_sync_master_enabled=ON 表示在master主庫上開啟半同步復制模式糕档。

配置從庫的server.cnf:vi /etc/my.cnf.d/server.cnf

skip_name_resolve = ON

innodb_file_per_table = ON

server_id=10002? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #從庫唯一標識

relay_log_index = slave_relay_bin.index

relay_log = slave_relay_bin? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#開啟中繼日志

rpl_semi_sync_slave_enabled =1? ? ? ? ? ? ? ? ? ?#開啟半同步復制莉恼,需要先安裝插件

重啟從庫拌喉,并查看從庫配置:show variables like 'rpl%';

rpl_semi_sync_slave_enabled=ON 表示在slave從庫上開啟半同步復制模式速那。

查看主庫master狀態(tài):show master status;

記錄File和Position,然后在主庫創(chuàng)建同步復制用戶:GRANT REPLICATION CLIENT,REPLICATION SLAVE ON? *.*? TO 'repluser'@'%' IDENTIFIED BY '123456';

登錄到從庫中執(zhí)行下面的操作:

CHANGE MASTER TOMASTER_HOST='192.168.1.56',

MASTER_USER='repluser',

MASTER_PASSWORD='123456',

MASTER_PORT=3306,

MASTER_LOG_FILE='mysql-bin.000004',

MASTER_LOG_POS=621;

啟動從庫同步狀態(tài):start slave;

查看從庫同步狀態(tài):show slave status \G

只要Slave_IO_Running和Slave_SQL_Runing這兩個參數(shù)為YES尿背,證明主從同步已經(jīng)開始正常工作了端仰。

異常情況

Slave_IO_Running為No的情況一般是網(wǎng)絡問題或者讀取主機binglog文件位置不對。重新查看主庫狀態(tài)田藐,記錄FIle和Position荔烧。然后stop slave;修改從庫指向的File和Position:

CHANGE MASTER TOMASTER_LOG_FILE='master-bin.000004', MASTER_LOG_POS=621;

啟動同步:start slave;

Slave_SQL_Running為NO的情況是有可能在主從同步之前沒有把主庫中完整數(shù)據(jù)導入到從庫中,這時候如果刪除一個從庫中沒有的數(shù)據(jù)汽久,會造成Slave_SQL_Running狀態(tài)不可用鹤竭。

同樣先停止同步:stop slave;

set global sql_slave_skip_counter=1;? //從庫直接跳過

啟動同步:start slave;

不管遇到同步的什么問題,我們都可以先通過last_errno和last_error信息來進行定位景醇。

我們可以通過在從庫配置文件中設置:read_only=on臀稚,或則在從庫客戶端運行:set global read_only=1;來開啟從庫只讀模式,防止在從庫中寫入數(shù)據(jù)三痰。這種方式不影響主從復制吧寺,只是禁止用戶在從庫上寫操作窜管。但是對于super權限(ALL PRIVILEGES)的用戶這個設置是無效的,比如root用戶稚机,所以我們要保證擁有super權限的用戶只能本機訪問幕帆。如果之前授權了root用戶遠程訪問的權限,那么先撤銷授權赖条。修改或刪除myql庫中user表的對應數(shù)據(jù)失乾。創(chuàng)建一個新的用戶并授予增刪查改的權限:GRANT select,insert,update,delete ON *.* to 'myuser'@'%' identified by '123456';

這時候我們用這個myuser遠程登錄到從庫,雖然授予了該用戶寫的權限纬乍,但執(zhí)行寫操作的時候就會提示從庫是只讀的仗扬。這樣就可以保證從庫不會被意外寫入造成同步數(shù)據(jù)不一致。

如果想要禁止super權限的用戶也不能寫入蕾额,需要設置全局鎖:flush tables with read lock;但是這樣會造成從庫復制操作也無法進行早芭。

一般會在主庫進行數(shù)據(jù)遷移的時候執(zhí)行:flush tables with read lock;set global read_only=1;禁止所有用戶修改數(shù)據(jù)庫,等待數(shù)據(jù)遷移完成后诅蝶,通過unlock tables;set global read_only=0;恢復主庫的寫入功能退个。

至此,關于MariaDB的主從同步就描述完成调炬。在我學習的過程中參考了很多來自網(wǎng)絡的相關資料语盈,由于來源很多,就不一一列舉了缰泡,感謝大家的分享刀荒。我也希望我的這個總結能對其他人有一點幫助。還有就是認真寫一點東西真的很耗時間棘钞,但這些時間上的投入我認為是很有必要的缠借。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宜猜,隨后出現(xiàn)的幾起案子泼返,更是在濱河造成了極大的恐慌,老刑警劉巖姨拥,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绅喉,死亡現(xiàn)場離奇詭異,居然都是意外死亡叫乌,警方通過查閱死者的電腦和手機柴罐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憨奸,“玉大人革屠,你說我怎么就攤上這事。” “怎么了屠阻?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵红省,是天一觀的道長。 經(jīng)常有香客問我国觉,道長吧恃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任麻诀,我火速辦了婚禮痕寓,結果婚禮上,老公的妹妹穿的比我還像新娘蝇闭。我一直安慰自己呻率,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布呻引。 她就那樣靜靜地躺著礼仗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逻悠。 梳的紋絲不亂的頭發(fā)上元践,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音童谒,去河邊找鬼单旁。 笑死,一個胖子當著我的面吹牛饥伊,可吹牛的內(nèi)容都是我干的象浑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琅豆,長吁一口氣:“原來是場噩夢啊……” “哼愉豺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趋距,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粒氧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后节腐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡摘盆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年翼雀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孩擂。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狼渊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狈邑,我是刑警寧澤城须,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站米苹,受9級特大地震影響糕伐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蘸嘶,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一良瞧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧训唱,春花似錦褥蚯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至澳骤,卻和暖如春尘执,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宴凉。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工誊锭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弥锄。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓丧靡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親籽暇。 傳聞我的和親對象是個殘疾皇子温治,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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