環境:
192.168.205.37: as member of galera-server
192.168.205.47: as member of galera-server
192.168.205.57: as member of galera-server
版本:
OS: centos 7 1810 with mini install
mariadb-server 5.5.64
目地:
集成了Galera插件的MySQL集羣,是一種新型的,數據不共享的,高度冗餘的高可用方案,目前Galera Cluster有兩個版本,分別是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即採用multi-master的集羣架構,是一個既穩健,又在數據一致性、完整性及高性能方面有出色表現的高可用解決方案。
Galera要求至少三個節點組成集羣,與普通的主從架構不同,它們都可以作爲主節點,三個節點是對等的,稱爲multi-master架構,當有客戶端要寫入或者讀取數據時,連接哪個實例都是一樣的,讀到的數據是相同的,寫入某一個節點之後,集羣自己會將新數據同步到其它節點上面,這種架構不共享任何數據,是一種高冗餘架構。
步驟
- 準備yum 源,此包與mariadb-server衝突,必須不能安裝mariadb-server,在三個節點上全部安裝
[root@centos7 ~]#cat > /etc/yum.repos.d/mysql.repo <<EOF > [mysql] > baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.64/yum/centos7-amd64/ > gpgcheck=0 > EOF
- 安裝mariadb-galera-server
[root@centos7 ~]#yum install MariaDB-Galera-server
- 修改配置文件三臺全部相同
[root@centos7 ~]#vi /etc/my.cnf.d/server.cnf [galera] wsrep_provider = /usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://192.168.205.37,192.168.205 .47,192.168.205.57" binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 wsrep_cluster_name = 'testcluster'
- 第一個啓動時需要執行如下,表示新建集羣
[root@centos7 ~]#/etc/init.d/mysql start --wsrep-new-cluster Starting MariaDB.190813 08:55:40 mysqld_safe Logging to '/var/lib/mysql/centos7.localdomain.err'. 190813 08:55:40 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql ... SUCCESS!
- 其它二個節點使用如下啓動
[root@centos7 ~]#service mysql start
- 導入一個數據庫進行測試
[root@centos7 ~]#mysql < hellodb_innodb.sql
- 查看其它節點的數據是否正常複製
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hellodb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)
- 查看集羣中相關係統變量和狀態變量
SHOW VARIABLES LIKE 'wsrep_%'; SHOW STATUS LIKE 'wsrep_%'; SHOW STATUS LIKE 'wsrep_cluster_size';
- 在三個服務器上同時在一個庫中建表,我們可以看到這三個只會有一個成功,另外兩個提示已經存在
MariaDB [hellodb]> create table t1(id int); Query OK, 0 rows affected (0.01 sec) MariaDB [hellodb]> create table t1(id int); ERROR 1050 (42S01): Table 't1' already exists MariaDB [hellodb]> create table t1(id int); ERROR 1050 (42S01): Table 't1' already exists
-
測試一下存儲過程,會比一主一從慢很多,所以會犧牲一些性能問題,一般一主一從虛擬機插入10萬條大概要15秒,但本實驗用了分多鐘。
MariaDB [hellodb]> create table testlog (id int auto_increment primary key,name char(10),age int default 20); Query OK, 0 rows affected (0.02 sec) MariaDB [hellodb]> MariaDB [hellodb]> delimiter $$ MariaDB [hellodb]> MariaDB [hellodb]> create procedure sp_testlog() -> begin -> declare i int; -> set i = 1; -> while i <= 100000 -> do insert into testlog(name,age) values (concat('wang',i),i); -> set i = i +1; -> end while; -> end$$ Query OK, 0 rows affected (0.01 sec) MariaDB [hellodb]> MariaDB [hellodb]> delimiter ; MariaDB [hellodb]> call sp_testlog; Query OK, 1 row affected (3 min 5.20 sec)
-
我們以事務方式提交,發現快了很多
MariaDB [hellodb]> begin; Query OK, 0 rows affected (0.00 sec) MariaDB [hellodb]> call sp_testlog; Query OK, 1 row affected (1.49 sec) MariaDB [hellodb]> commit; Query OK, 0 rows affected (0.42 sec)