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)絡的相關資料语盈,由于來源很多,就不一一列舉了缰泡,感謝大家的分享刀荒。我也希望我的這個總結能對其他人有一點幫助。還有就是認真寫一點東西真的很耗時間棘钞,但這些時間上的投入我認為是很有必要的缠借。