主要功能:
- 同步复制
- 真正的multi-master,即所有节点可以同时读写数据库
- 自动的节点成员控制,失效节点自动被清除
- 新节点加入数据自动复制
- 真正的并行复制,行级
-
用户可以直接连接集群,使用感受上与MySQL完全一致
优势:
因为是多主,所以不存在Slavelag(延迟)
不存在丢失交易的情况
同时具有读和写的扩展能力
更小的客户端延迟
节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的
1.创建集群用户(所有节点)
systemctl start mysql
mysql_secure_installation
GRANT ALL ON *.* TO 'galera'@'192.168.8.%' IDENTIFIED BY 'mypassword';
FLUSH
PRIVILEGES;
说明:在选用的初始化节点上创建该用户即可,其它节点加入集群后会自动同步
https://mariadb.com/kb/en/mariadb/galera-cluster-system-variables/#wsrep_on
cat >/etc/my.cnf.d/galera_common.cnf <<HERE
[mysqld]
wsrep-cluster-name = "test_cluster"
wsrep-provider
=
wsrep-provider-options = "gcache.size=256M;gcache.page_size=128M"
wsrep-sst-auth = "galera:mypassword"
binlog-format = row
default-storage-engine = InnoDB
innodb-doublewrite = 1
innodb-autoinc-lock-mode = 2
innodb-flush-log-at-trx-commit = 2
innodb-locks-unsafe-for-binlog = 1
HERE
sed -i '1i
提示:配置集群的最简配置可以参看/opt/mariadb/support-files/wsrep.cnf,且有相关解释,非常人性化
# Options that need to be customized:
#
#
#
# The rest of defaults should work out of the box.
3.初始化集群(db00)
db00: 192.168.8.100
cat >/etc/my.cnf.d/galera_db00.cnf <<HERE
[mysqld]
wsrep-node-name = "db00"
wsrep-sst-receive-address = 192.168.8.100
wsrep-node-incoming-address = 192.168.8.100
bind-address = 192.168.8.100
wsrep_sst_method = rsync
wsrep-cluster-address
=
HERE
yum -y install lsof rsync
/etc/init.d/mysql stop
/etc/init.d/mysql
start
SHOW STATUS LIKE
'wsrep%';
[root@db00 ~]# /etc/init.d/mysql stop
Shutting
down MySQL.. SUCCESS!
[root@db00 ~]# /etc/init.d/mysql start --wsrep-new-cluster
Starting
MySQL.. SUCCESS!
说明:用哪个节点来初始化无所谓,早期的版本mariadb-galera-10.0.x初始化,是用空值gcomm://来表示新的集群,mariadb-10.1.x版本已经废止了,由wsrep-new-cluster参数取代
wsrep_sst_method
-
Description:
Method used for taking the state snapshot transfer (sst). The command wsrep_sst_
will then be called, so a custom script can be written for this purpose. SeeCodership Scriptable State Snapshop page for details. Existing valid values include rsync
(the default), mysqldump
,xtrabackup
and xtrabackup-v2
, which use those respective methods to perform the state snapshop transfer, orskip
.skip
skips the transfer and should only be used temporarily, for example when starting the cluster and manually restoring data. See also the mysqldump and Xtrabackup articles. Note that the rsync
and mysqldump
SST methods support GTID. However, the xtrabackup-v2
andxtrabackup
SST methods currently do not support GTID. The xtrabackup-v2
sst method was introduced in MariaDB Galera 5.5.37 and 10.0.10. -
Scope:
Global -
Dynamic:
Yes - Default
Value:
rsync
- Valid
Values:
rsync
,mysqldump
,xtrabackup
,xtrabackup-v2
提示:rsync(需要安装rsync,lsof), rsync,mysqldump都会有READ LOCK的情况,xtrabackup-v2没有,但也有若干限制,请根据实际业务来选定或调整同步方式
xtrabackup安装请参看MariaDB备份还原修复
实测,开始是以rsync方式同步的集群,后改为xtrabackup-v2,非常顺畅,可以无缝切换同步方式
4.配置并启动其余集群节点(db01,db02)
db01: 192.168.8.101
cat >/etc/my.cnf.d/galera_db01.cnf <<HERE
[mysqld]
wsrep-node-name = "db01"
wsrep-sst-receive-address = 192.168.8.101
wsrep-node-incoming-address = 192.168.8.101
bind-address = 192.168.8.101
wsrep-sst-method = rsync
wsrep-cluster-address
=
HERE
yum -y install lsof rsync
/etc/init.d/mysql restart
[root@db01 ~]#
/etc/init.d/mysql restart
Shutting down MySQL... SUCCESS!
Starting
MySQL..SST in progress, setting sleep higher.
SUCCESS!
db02: 192.168.8.102
cat >/etc/my.cnf.d/galera_db02.cnf <<HERE
[mysqld]
wsrep-node-name = "db02"
wsrep-sst-receive-address = 192.168.8.102
wsrep-node-incoming-address = 192.168.8.102
bind-address = 192.168.8.102
wsrep-sst-method = rsync
wsrep-cluster-address
=
HERE
yum -y install lsof rsync
/etc/init.d/mysql restart
[root@db02 ~]# /etc/init.d/mysql restart
Shutting down MySQL... SUCCESS!
Starting
MySQL..SST in progress, setting sleep higher.
SUCCESS!
5.查看集群状态
[root@db00 ~]# netstat -tunlp|grep mysqld
tcp
tcp
3306负载数据存储,4567负载集群维护
SHOW
STATUS LIKE 'wsrep%';
[root@db00 ~]# mysql -uroot -p
Enter
password:
Welcome to the
MariaDB monitor.
Your MariaDB connection id is 7
Server version: 10.0.24-MariaDB-wsrep MariaDB Server, wsrep_25.13.raf7f02e
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep%';
+------------------------------+----------------------------------------------------------+
|
Variable_name
+------------------------------+----------------------------------------------------------+
|
wsrep_local_state_uuid
|
wsrep_protocol_version
|
wsrep_last_committed
|
wsrep_replicated
|
wsrep_replicated_bytes
|
wsrep_repl_keys
|
wsrep_repl_keys_bytes
|
wsrep_repl_data_bytes
|
wsrep_repl_other_bytes
|
wsrep_received
|
wsrep_received_bytes
|
wsrep_local_commits
|
wsrep_local_cert_failures
|
wsrep_local_replays
|
wsrep_local_send_queue
|
wsrep_local_send_queue_max
|
wsrep_local_send_queue_min
|
wsrep_local_send_queue_avg
|
wsrep_local_recv_queue
|
wsrep_local_recv_queue_max
|
wsrep_local_recv_queue_min
|
wsrep_local_recv_queue_avg
|
wsrep_local_cached_downto
|
wsrep_flow_control_paused_ns | 0
|
wsrep_flow_control_paused
|
wsrep_flow_control_sent
|
wsrep_flow_control_recv
|
wsrep_cert_deps_distance
|
wsrep_apply_oooe
|
wsrep_apply_oool
|
wsrep_apply_window
|
wsrep_commit_oooe
|
wsrep_commit_oool
|
wsrep_commit_window
|
wsrep_local_state
|
wsrep_local_state_comment
|
wsrep_cert_index_size
|
wsrep_causal_reads
|
wsrep_cert_interval
|
wsrep_incoming_addresses
|
wsrep_evs_delayed
|
wsrep_evs_evict_list
|
wsrep_evs_repl_latency
|
wsrep_evs_state
|
wsrep_gcomm_uuid
|
wsrep_cluster_conf_id
|
wsrep_cluster_size
|
wsrep_cluster_state_uuid
|
wsrep_cluster_status
|
wsrep_connected
|
wsrep_local_bf_aborts
|
wsrep_local_index
|
wsrep_provider_name
|
wsrep_provider_vendor
|
wsrep_provider_version
|
wsrep_ready
|
wsrep_thread_count
+------------------------------+----------------------------------------------------------+
57 rows in set (0.00 sec)
wsrep_ready为ON,则说明MariaDB Galera 集群已经正确运行了。
wsrep_cluster_size 标明了组成集群的节点个数
如上,3个集群节点都己成功正常运行。
6.统一修改集群地址并重启
wsrep-cluster-address = gcomm://192.168.8.100,192.168.8.101,192.168.8.102
MariaDB [(none)]> SHOW VARIABLES LIKE 'wsrep%'G
*************************** 1. row ***************************
Variable_name: wsrep_auto_increment_control
*************************** 2. row ***************************
Variable_name: wsrep_causal_reads
*************************** 3. row ***************************
Variable_name: wsrep_certify_nonpk
*************************** 4. row ***************************
Variable_name: wsrep_cluster_address
*************************** 5. row ***************************
Variable_name: wsrep_cluster_name
*************************** 6. row ***************************
Variable_name: wsrep_convert_lock_to_trx
*************************** 7. row ***************************
Variable_name: wsrep_data_home_dir
*************************** 8. row ***************************
Variable_name: wsrep_dbug_option
*************************** 9. row ***************************
Variable_name: wsrep_debug
*************************** 10. row ***************************
Variable_name: wsrep_desync
*************************** 11. row ***************************
Variable_name: wsrep_dirty_reads
*************************** 12. row ***************************
Variable_name: wsrep_drupal_282555_workaround
*************************** 13. row ***************************
Variable_name: wsrep_forced_binlog_format
*************************** 14. row ***************************
Variable_name: wsrep_load_data_splitting
*************************** 15. row ***************************
Variable_name: wsrep_log_conflicts
*************************** 16. row ***************************
Variable_name: wsrep_max_ws_rows
*************************** 17. row ***************************
Variable_name: wsrep_max_ws_size
*************************** 18. row ***************************
Variable_name: wsrep_mysql_replication_bundle
*************************** 19. row ***************************
Variable_name: wsrep_node_address
*************************** 20. row ***************************
Variable_name: wsrep_node_incoming_address
*************************** 21. row ***************************
Variable_name: wsrep_node_name
*************************** 22. row ***************************
Variable_name: wsrep_notify_cmd
*************************** 23. row ***************************
Variable_name: wsrep_on
*************************** 24. row ***************************
Variable_name: wsrep_osu_method
*************************** 25. row ***************************
Variable_name: wsrep_provider
*************************** 26. row ***************************
Variable_name: wsrep_provider_options
*************************** 27. row ***************************
Variable_name: wsrep_recover
*************************** 28. row ***************************
Variable_name: wsrep_replicate_myisam
*************************** 29. row ***************************
Variable_name: wsrep_restart_slave
*************************** 30. row ***************************
Variable_name: wsrep_retry_autocommit
*************************** 31. row ***************************
Variable_name: wsrep_slave_fk_checks
*************************** 32. row ***************************
Variable_name: wsrep_slave_threads
*************************** 33. row ***************************
Variable_name: wsrep_slave_uk_checks
*************************** 34. row ***************************
Variable_name: wsrep_sst_auth
*************************** 35. row ***************************
Variable_name: wsrep_sst_donor
*************************** 36. row ***************************
Variable_name: wsrep_sst_donor_rejects_queries
*************************** 37. row ***************************
Variable_name: wsrep_sst_method
*************************** 38. row ***************************
Variable_name: wsrep_sst_receive_address
*************************** 39. row ***************************
Variable_name: wsrep_start_position
*************************** 40. row ***************************
Variable_name: wsrep_sync_wait
40 rows in set (0.00 sec)
三.测试
A.任意节点读写
1.在节点db02上导入了一个zabbix.sql的库
[root@db02 ~]# mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS zabbix CHARACTER SET utf8"
Enter
password:
[root@db02 ~]# mysql -uroot -p zabbix
Enter password:
2.在db01上查看
[root@db01 ~]# mysql -uroot -p
Enter
password:
Welcome to the
MariaDB monitor.
Your MariaDB connection id is 10
Server version: 10.0.24-MariaDB-wsrep MariaDB Server, wsrep_25.13.raf7f02e
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
|
Database
+--------------------+
| information_schema |
|
mysql
| performance_schema |
|
zabbix
+--------------------+
4 rows in set (0.01 sec)
MariaDB [(none)]> USE zabbix;
Database changed
MariaDB [zabbix]> SELECT alias,name,surname FROM users;
+-------+--------+---------------+
| alias |
name
+-------+--------+---------------+
| Admin | Zabbix | Administrator |
| guest
|
+-------+--------+---------------+
2 rows in set (0.00 sec)
B.节点宕机
[root@db02 ~]# mysql -uroot -p -e "SHOW STATUS LIKE 'wsrep_local_state_comment'"
Enter
password:
+---------------------------+--------+
|
Variable_name
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
[root@db02 ~]# service mysql stop
Shutting
down MySQL..... SUCCESS!
[root@db00 ~]# mysql -uroot -p -e "SHOW STATUS LIKE 'wsrep_local_state_comment'"
Enter
password:
+---------------------------+--------+
|
Variable_name
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
当节点恢复后,会自动加入到集群,非常方便
四.关闭/启动整个集群
A.关闭
在所有集群节点上执行service mysql stop即可
注意:最后关闭的节点非常重要,因为它维护着集群最新的状态,所以在启动的时候必须最先启动,否则,在启动其它节点的会因找不到初始节点而报连接超时的错误
160415
160415
160415
} joined {
} left {
} partitioned {
})
160415
160415
160415
160415
160415
160415
160415
160415
160415
160415
160415
160415 01:21:00 mysqld_safe mysqld from pid file /opt/mariadb/mysqld.pid ended
B.启动
最先启动最后关闭的mysql节点,实测,仍然无法启动集群
如果忘记了哪个最后关闭的,可以通过集群初始化的节点重启初始化下,如:
[root@db00 ~]# /etc/init.d/mysql start --wsrep-new-cluster
Starting
MySQL.. SUCCESS!
[root@db00 ~]# mysql -uroot -p -e "SHOW STATUS LIKE 'wsrep_local_state_comment'"
Enter
password:
+---------------------------+--------+
|
Variable_name
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
[root@db01 ~]# service mysql start
Starting
MySQL... SUCCESS!
[root@db02 ~]# service mysql start
Starting MySQL... SUCCESS!
五.Galera监控
示例脚本/opt/mariadb/support-files/wsrep_notify
查看MySQL版本: SHOW GLOBAL VARIABLES
LIKE 'version';
查看wsrep版本: SHOW GLOBAL STATUS LIKE
'wsrep_provider_version';
查看wsrep有关的所有变量: SHOW VARIABLES LIKE
'wsrep%' G
查看Galera集群状态: SHOW STATUS LIKE
'wsrep%';
监控状态参数说明
集群完整性检查:
wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群
wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的。如果值不同,说明该节点被临时"分区"了。当节点之间网络连接恢复的时候应该会恢复一样的值
wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接。
wsrep_cluster_status:集群组成的状态。如果不为"Primary",说明出现"分区"或是"split-brain"状况
节点状态检查:
wsrep_ready:该值为ON,则说明可以接受SQL负载。如果为Off,则需要检查wsrep_connected
wsrep_connected:
如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集
群。(可能是wsrep_cluster_address或wsrep_cluster_name等配置错造成的。具体错误需要
查看错误日志)
wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因
复制健康检查:
wsrep_flow_control_paused:表示复制停止了多长时间。即表明集群因为Slave延迟而慢的程度。值为0~1,越靠近0越好,值为1表示复制完全停止。可优化wsrep_slave_threads的值来改善
wsrep_cert_deps_distance:有多少事务可以并行应用处理。wsrep_slave_threads设置的值不应高出该值太多。
wsrep_flow_control_sent:表示该节点已经停止复制了多少次
wsrep_local_recv_queue_avg:表示slave事务队列的平均长度。slave瓶颈的预兆。最慢的节点的
wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高。这两个值较低的话,相对更好
检测慢网络问题:
wsrep_local_send_queue_avg:网络瓶颈的预兆。如果这个值比较高的话,可能存在网络瓶冲突或死锁的数目
wsrep_last_committed:最后提交的事务数目
wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目