扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一、背景介绍
创新互联是一家专业提供永登企业网站建设,专注与成都网站设计、成都网站建设、成都h5网站建设、小程序制作等业务。10年已为永登众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。
无论是采用binlog或者GTID的方式,其本质都是通过I/O_thread和sql_thread的形式进行的同步,因为无法避免复制延迟而饱受诟病,基于上述MariaDB引入了Galera Cluster来解决此问题。
二、Galera Cluster介绍
Galera Cluster与传统的复制方式不同,不通过I/O_thread和sql_thread进行同步,而是在更底层通过wsrep实现文件系统级别的同步,可以做到几乎实时同步,而其上的MySQL对此一无所知
这就要求MySQL能够调用wsrep提供的API来完成,在Mariadb10.1之前的版本,支持Galera Cluster的版本是与Mariadb分开发行的,其版本名称就成为Mariadb-Galera,Mariadb10.1以后的版本中MariaDB Galera Cluste不再单独发行,而是以galera-25.3.12-2.el7.x86_64包的形式出现
三、实验目的
本次实验操作系统为CentOS7.4,数据库版本为MariaDB10.2.14,验证3节点下通过Galera Cluster实现数据同步。需要说明的是:
1.Galera Cluster最少要求3个节点以上,建议是大于3的奇数,2节点虽然可以部署,但无法避免脑裂的出现
2.尽管Galera Cluster不再需要binlog的形式进行同步,但建议还是在配置文件中开启该功能,原因是后期如果要有新节点加入,老节点通过SST全量传输的方式向新节点传输数据,很可能会拖垮性能,所以让新节点先通过binlog完成同步后在加入Galera Cluster是一种不错的选择
3.在Mariadb10.1之后版本中实现Galera Cluster用到的库文件libgalera_smm.so通过rpm -ql galera-25.3.12-2.el7.x86_64查找其位置
四、操作步骤
1.node3节点主机操作
(1)安装MariaDB 10.2.14
(2)编辑配置文件并启动服务
[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 #第一次启用时在任意节点使用
(3)将配置文件发送给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节点操作
(1)将配置文件中的server_id改为20
(2)启动MySQL服务
可以在日志中看到Galera Cluster的SST默认使用rsync传输
(3)在node4创建一个用于复制的账户
[root@host4 ~]# mysql
MariaDB [(none)]> grant replication slave on *.* to 'bak'@'172.16.10.%' identified by 'bakpass';
MariaDB [(none)]> flush privileges;
(4)随意创建数据,在node3上验证是否同步
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)备份当前数据库并发送到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)再插入数据,模拟备份后又有新增数据
MariaDB [(none)]> insert into hellodb.students (name,age) values ('XuanCi','66');
3.node5操作
(1)将配置文件中的server_id改为30,注销[galera]段(目的是先通过binlog同步)
(2)启动MySQL服务
(3)查看备份时node4的binlog及position
(4)恢复数据库,并验证
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)停止主从复制和MySQL服务
MariaDB [hellodb]> start slave;
[root@host5 ~]# systemctl stop mariadb.service
(6)取消[galera]段注销并重启服务
再在任意节点添加数据3个节点间都可以进行同步,至此操作全部完成
补充说明:
1.Galera Cluster节点停止服务后,后期如果数据有更新,只需要重启MySQL服务,数据会自动同步
2.后期如果有新的节点加入,可以在新节点的配置文件里将自己的IP地址加入wsrep_cluster_address变量中后再启动数据库,这样之前节点配置文件里的wsrep_cluster_address变量中就算没有新节点的IP地址也能实现同步,建议在老节点wsrep_cluster_address变量中加入新节点IP地址后重启服务
存在的疑问:
在任意Galera Cluster节点导入一个数据库,无论是命令行下通过mysql < xxx方式还是使用sql语句source xxx方式,只有当前节点有数据,其他节点仅创建该数据库和库中表,但表中无任何数据,重启MySQL服务后也不会同步,原因不明
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流