MariaDB:真正的實(shí)時(shí)同步數(shù)據(jù)庫,MySQL要小心了
一、背景介紹
無論是采用binlog或者GTID的方式,其本質(zhì)都是通過I/O_thread和sql_thread的形式進(jìn)行的同步,因?yàn)闊o法避免復(fù)制延遲而飽受詬病,基于上述MariaDB引入了Galera Cluster來解決此問題。
二、Galera Cluster介紹
Galera Cluster與傳統(tǒng)的復(fù)制方式不同,不通過I/O_thread和sql_thread進(jìn)行同步,而是在更底層通過wsrep實(shí)現(xiàn)文件系統(tǒng)級(jí)別的同步,可以做到幾乎實(shí)時(shí)同步,而其上的MySQL對(duì)此一無所知
這就要求MySQL能夠調(diào)用wsrep提供的API來完成,在Mariadb10.1之前的版本,支持Galera Cluster的版本是與Mariadb分開發(fā)行的,其版本名稱就成為Mariadb-Galera,Mariadb10.1以后的版本中MariaDB Galera Cluste不再單獨(dú)發(fā)行,而是以galera-25.3.12-2.el7.x86_64包的形式出現(xiàn)方面都強(qiáng)過MySQL。
MariaDB Galera Cluster主要功能
同步復(fù)制:真正的multi-master,即所有節(jié)點(diǎn)可以同時(shí)讀寫數(shù)據(jù)庫自動(dòng)的節(jié)點(diǎn)成員控制,失效節(jié)點(diǎn)自動(dòng)被清除新節(jié)點(diǎn)加入數(shù)據(jù)自動(dòng)復(fù)制真正的并行復(fù)制,行級(jí)用戶可以直接連接集群,使用感受上與MySQL完全一致
MariaDB Galera Cluster的優(yōu)缺點(diǎn)
1.優(yōu)勢(shì):
- 因?yàn)槭嵌嘀鳎圆淮嬖赟lavelag(延遲)
- 不存在丟失事務(wù)的情況
- 同時(shí)具有讀和寫的擴(kuò)展能力
- 更小的客戶端延遲
- 節(jié)點(diǎn)間數(shù)據(jù)是同步的,而Master/Slave模式是異步的,不同slave上的binlog可能是不同的
2.缺點(diǎn):
- 加入新節(jié)點(diǎn)時(shí)開銷大,需要復(fù)制完整的數(shù)據(jù)
- 不能有效地解決寫擴(kuò)展的問題,所有的寫操作都發(fā)生在所有的節(jié)點(diǎn)
- 有多少個(gè)節(jié)點(diǎn),就有多少份重復(fù)的數(shù)據(jù)
- 由于事務(wù)提交需要跨節(jié)點(diǎn)通信,即涉及分布式事務(wù)操作,因此寫入會(huì)比主從復(fù)制慢很多,節(jié)點(diǎn)越多,寫入越慢,死鎖和回滾也會(huì)更加頻繁
- 對(duì)網(wǎng)絡(luò)要求比較高,如果網(wǎng)絡(luò)出現(xiàn)波動(dòng)不穩(wěn)定,則可能會(huì)造成兩個(gè)節(jié)點(diǎn)失聯(lián),Galera Cluster集群會(huì)發(fā)生腦裂,服務(wù)將不可用
還有一些地方存在局限:
- 僅支持InnoDB/XtraDB存儲(chǔ)引擎,任何寫入其他引擎的表,包括mysql.*表都不會(huì)被復(fù)制。但是DDL語句可以復(fù)制,但是insert into mysql.user(MyISAM存儲(chǔ)引擎)之類的插入數(shù)據(jù)不會(huì)被復(fù)制
- Delete操作不支持沒有主鍵的表,因?yàn)闆]有主鍵的表在不同的節(jié)點(diǎn)上的順序不同,如果執(zhí)行select … limit …將出現(xiàn)不同的結(jié)果集
- LOCK/UNLOCK TABLES/FLUSH TABLES WITH READ LOCKS不支持單表所鎖,以及鎖函數(shù)GET_LOCK()、RELEASE_LOCK(),但FLUSH TABLES WITH READ LOCK支持全局表鎖
- General Query Log日志不能保存在表中,如果開始查詢?nèi)罩?,則只能保存到文件中
- 不能有大事務(wù)寫入,不能操作wsrep_max_ws_rows=131072(行),且寫入集不能超過wsrep_max_ws_size=1073741824(1GB),否則客戶端直接報(bào)錯(cuò)
- 由于集群是樂觀鎖并發(fā)控制,因此,在commit階段會(huì)有事務(wù)沖突發(fā)生。如果兩個(gè)事務(wù)在集群中的不同節(jié)點(diǎn)上對(duì)同一行寫入并提交,則失敗的節(jié)點(diǎn)將回滾,客戶端返回死鎖報(bào)錯(cuò)
- XA分布式事務(wù)不支持Codership Galera Cluster,在提交時(shí)可能會(huì)回滾
- 整個(gè)集群的寫入吞吐量取決于最弱的節(jié)點(diǎn)限制,集群要使用同一的配置
三、 MariaDB與Mysql的對(duì)比
1.MariaDB發(fā)展趨勢(shì)和更新頻率
畢竟基于MySQL創(chuàng)始人領(lǐng)銜開發(fā)的MariaDB數(shù)據(jù)庫,肯定是知道MYSQL數(shù)據(jù)庫存在的弱項(xiàng),然后提供更好的兼容性和擴(kuò)展性,我們基本上完全可以將MYSQL數(shù)據(jù)庫建議到MariaDB數(shù)據(jù)庫中,而且MariaDB發(fā)展速度和升級(jí)速度遠(yuǎn)遠(yuǎn)優(yōu)先。
2.MySQL封閉且發(fā)展緩慢
由于MySQL在被收購(gòu)之后更新速度與性能的優(yōu)化非常的緩慢,而且是閉源的,完全沒有Oracle之外的人參與進(jìn)來,很多需要解決的問題都沒有升級(jí)進(jìn)去,反之很多公司雖然也有利用自己開發(fā)的分支Mysql版本。
3.MariaDB的特點(diǎn)和優(yōu)勢(shì)
MariaDB基于事務(wù)的Maria存儲(chǔ)引擎,替換了MySQL的MyISAM存儲(chǔ)引擎,它使用了Percona的 XtraDB,InnoDB的變體,MariaDB默認(rèn)的存儲(chǔ)引擎是Aria,不是MyISAM。Aria可以支持事務(wù),但是默認(rèn)情況下沒有打開事務(wù)支持,因?yàn)槭聞?wù)支持對(duì)性能會(huì)有影響。MariaDB是一個(gè)采用Maria存儲(chǔ)引擎的MySQL分支版本,是由原來 MySQL 的作者M(jìn)ichael Widenius創(chuàng)辦的公司所開發(fā)的免費(fèi)開源的數(shù)據(jù)庫服務(wù)器。
4.MariaDB與MySQL對(duì)比
這個(gè)直觀的區(qū)別在于MariaDB能夠快速的查詢和處理數(shù)據(jù),且占用資源相對(duì)是少于MySQL數(shù)據(jù)庫的,而且在運(yùn)行速度、以及支持對(duì) Unicode 的排序問題優(yōu)于MYSQL數(shù)據(jù)庫。