新聞中心
一、背景介紹
創(chuàng)新互聯(lián)是一家專業(yè)提供永登企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為永登眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
無(wú)論是采用binlog或者GTID的方式,其本質(zhì)都是通過(guò)I/O_thread和sql_thread的形式進(jìn)行的同步,因?yàn)闊o(wú)法避免復(fù)制延遲而飽受詬病,基于上述MariaDB引入了Galera Cluster來(lái)解決此問(wèn)題。
二、Galera Cluster介紹
Galera Cluster與傳統(tǒng)的復(fù)制方式不同,不通過(guò)I/O_thread和sql_thread進(jìn)行同步,而是在更底層通過(guò)wsrep實(shí)現(xiàn)文件系統(tǒng)級(jí)別的同步,可以做到幾乎實(shí)時(shí)同步,而其上的MySQL對(duì)此一無(wú)所知
這就要求MySQL能夠調(diào)用wsrep提供的API來(lái)完成,在Mariadb10.1之前的版本,支持Galera Cluster的版本是與Mariadb分開(kāi)發(fā)行的,其版本名稱就成為Mariadb-Galera,Mariadb10.1以后的版本中MariaDB Galera Cluste不再單獨(dú)發(fā)行,而是以galera-25.3.12-2.el7.x86_64包的形式出現(xiàn)
三、實(shí)驗(yàn)?zāi)康?/p>
本次實(shí)驗(yàn)操作系統(tǒng)為CentOS7.4,數(shù)據(jù)庫(kù)版本為MariaDB10.2.14,驗(yàn)證3節(jié)點(diǎn)下通過(guò)Galera Cluster實(shí)現(xiàn)數(shù)據(jù)同步。需要說(shuō)明的是:
1.Galera Cluster最少要求3個(gè)節(jié)點(diǎn)以上,建議是大于3的奇數(shù),2節(jié)點(diǎn)雖然可以部署,但無(wú)法避免腦裂的出現(xiàn)
2.盡管Galera Cluster不再需要binlog的形式進(jìn)行同步,但建議還是在配置文件中開(kāi)啟該功能,原因是后期如果要有新節(jié)點(diǎn)加入,老節(jié)點(diǎn)通過(guò)SST全量傳輸?shù)姆绞较蛐鹿?jié)點(diǎn)傳輸數(shù)據(jù),很可能會(huì)拖垮性能,所以讓新節(jié)點(diǎn)先通過(guò)binlog完成同步后在加入Galera Cluster是一種不錯(cuò)的選擇
3.在Mariadb10.1之后版本中實(shí)現(xiàn)Galera Cluster用到的庫(kù)文件libgalera_smm.so通過(guò)rpm -ql galera-25.3.12-2.el7.x86_64查找其位置
四、操作步驟
1.node3節(jié)點(diǎn)主機(jī)操作
(1)安裝MariaDB 10.2.14
(2)編輯配置文件并啟動(dòng)服務(wù)
[root@host3 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip_name_resolve=ON
relay_log=mysql-relaylog
relay_log_index=mysql-relaylog
relay_log_purge=OFF
slow_query_log=ON
server-id=10
innodb_file_per_table=ON
binlog_format=ROW
log_bin=mysql-binlog
log_slave_updates=ON
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_cluster_name=ark
wsrep_provider=/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://172.16.10.30,172.16.10.40,172.16.10.50
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_doublewrite=1
[root@host3 ~]# galera_new_cluster #第一次啟用時(shí)在任意節(jié)點(diǎn)使用
(3)將配置文件發(fā)送給node4和node5
[root@host3 ~]# scp -r /etc/my.cnf.d/server.cnf root@172.16.10.40:/etc/my.cnf.d/
[root@host3 ~]# scp -r /etc/my.cnf.d/server.cnf root@172.16.10.50:/etc/my.cnf.d/
2.node4節(jié)點(diǎn)操作
(1)將配置文件中的server_id改為20
(2)啟動(dòng)MySQL服務(wù)
可以在日志中看到Galera Cluster的SST默認(rèn)使用rsync傳輸
(3)在node4創(chuàng)建一個(gè)用于復(fù)制的賬戶
[root@host4 ~]# mysql
MariaDB [(none)]> grant replication slave on *.* to 'bak'@'172.16.10.%' identified by 'bakpass';
MariaDB [(none)]> flush privileges;
(4)隨意創(chuàng)建數(shù)據(jù),在node3上驗(yàn)證是否同步
MariaDB [(none)]> CREATE DATABASE `hellodb`;
MariaDB [(none)]> CREATE TABLE `students` (
-> `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `Name` varchar(50) NOT NULL,
-> `Age` tinyint(3) unsigned NOT NULL,
-> `Gender` enum('F','M') NOT NULL,
-> `ClassID` tinyint(3) unsigned DEFAULT NULL,
-> `TeacherID` int(10) unsigned DEFAULT NULL,
-> PRIMARY KEY (`StuID`)
-> );
MariaDB [(none)]> insert into hellodb.students (name,age) values ('QiaoFeng',40);
MariaDB [(none)]> insert into hellodb.students (name,age) values ('DuanYu',21);
MariaDB [(none)]> insert into hellodb.students (name,age) values ('XuZhu',24);
(5)備份當(dāng)前數(shù)據(jù)庫(kù)并發(fā)送到node5
[root@host4 ~]# mysqldump -uroot --databases hellodb --master-data=2 --single-transaction --quick > /tmp/hellodb.sql
[root@host4 ~]# scp -r /tmp/hellodb.sql root@172.16.10.50:/tmp/
(6)再插入數(shù)據(jù),模擬備份后又有新增數(shù)據(jù)
MariaDB [(none)]> insert into hellodb.students (name,age) values ('XuanCi','66');
3.node5操作
(1)將配置文件中的server_id改為30,注銷[galera]段(目的是先通過(guò)binlog同步)
(2)啟動(dòng)MySQL服務(wù)
(3)查看備份時(shí)node4的binlog及position
(4)恢復(fù)數(shù)據(jù)庫(kù),并驗(yàn)證
MariaDB [hellodb]> source /tmp/hellodb.sql
MariaDB [hellodb]> change master to master_host='172.16.10.40',master_user='bak',master_password='bakpass',master_port=3306,master_log_file='mysql-binlog.000004',master_log_pos=2061,master_connect_retry=10;
MariaDB [hellodb]> start slave;
MariaDB [hellodb]> select * from students;
+-------+----------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+----------+-----+--------+---------+-----------+
| 3 | QiaoFeng | 40 | F | NULL | NULL |
| 5 | DuanYu | 21 | F | NULL | NULL |
| 7 | XuZhu | 24 | F | NULL | NULL |
| 9 | XuanCi | 66 | F | NULL | NULL |
+-------+----------+-----+--------+---------+-----------+
(5)停止主從復(fù)制和MySQL服務(wù)
MariaDB [hellodb]> start slave;
[root@host5 ~]# systemctl stop mariadb.service
(6)取消[galera]段注銷并重啟服務(wù)
再在任意節(jié)點(diǎn)添加數(shù)據(jù)3個(gè)節(jié)點(diǎn)間都可以進(jìn)行同步,至此操作全部完成
補(bǔ)充說(shuō)明:
1.Galera Cluster節(jié)點(diǎn)停止服務(wù)后,后期如果數(shù)據(jù)有更新,只需要重啟MySQL服務(wù),數(shù)據(jù)會(huì)自動(dòng)同步
2.后期如果有新的節(jié)點(diǎn)加入,可以在新節(jié)點(diǎn)的配置文件里將自己的IP地址加入wsrep_cluster_address變量中后再啟動(dòng)數(shù)據(jù)庫(kù),這樣之前節(jié)點(diǎn)配置文件里的wsrep_cluster_address變量中就算沒(méi)有新節(jié)點(diǎn)的IP地址也能實(shí)現(xiàn)同步,建議在老節(jié)點(diǎn)wsrep_cluster_address變量中加入新節(jié)點(diǎn)IP地址后重啟服務(wù)
存在的疑問(wèn):
在任意Galera Cluster節(jié)點(diǎn)導(dǎo)入一個(gè)數(shù)據(jù)庫(kù),無(wú)論是命令行下通過(guò)mysql < xxx方式還是使用sql語(yǔ)句source xxx方式,只有當(dāng)前節(jié)點(diǎn)有數(shù)據(jù),其他節(jié)點(diǎn)僅創(chuàng)建該數(shù)據(jù)庫(kù)和庫(kù)中表,但表中無(wú)任何數(shù)據(jù),重啟MySQL服務(wù)后也不會(huì)同步,原因不明
文章標(biāo)題:初識(shí)MariaDB之10——MariaDBGaleraCluster
文章鏈接:http://fisionsoft.com.cn/article/giscog.html