本教程将向您展示如何在Ubuntu 18.04、18.10和16.04服务器上设置MariaDB Galera Cluster。MariaDB是MySQL数据库服务器的开源替代品。
Galera集群是由一家芬兰公司Codership开发的开源数据复制和集群技术,Galera集群有3个版本:
在本教程中,使用MariaDB Galera集群。
所有的MariaDB服务器都必须使用InnoDB或XtraDB存储引擎,因为Galera集群仅支持这两个存储引擎。要检查数据库使用的默认存储引擎,请登录到MariaDB monitor,并运行以下语句:
MariaDB [(none)]> show variables like 'default_storage_engine';
请注意,数据库可能有使用不同存储引擎的表,若要检查,请运行以下语句。
MariaDB [(none)]> select table_name,engine from information_schema.tables where table_schema = 'database_name' and engine = 'myISAM';
如果发现使用InnoDB以外的存储引擎的表,可以将它更改为InnoDB。例如若要将表从使用MyISAM更改为InnoDB,请运行
MariaDB [(none)]> use database_name;
MariaDB [(none)]> alter table table_name engine = InnoDB;
第一个语句选择特定的数据库,第二个语句将把表的存储引擎更改为InnoDB,默认的3个数据库(information_schema,mysql和performance_schema)中的表不使用InnoDB/XtraDB存储引擎,不需要更改它。
步骤1:配置集群中的每个节点
在MariaDB 10.1之前,系统管理员需要安装mariadb-galera-server
包,以便设置集群,从MariaDB 10.1开始,Galera集群特性被捆绑到MariaDB,如果在Ubuntu 18.04上运行MariaDB 10.1或更高版本,你只需要安装一个软件包:galera-3-Galera wsrep(写集复制)。
sudo apt install galera-3
通常,当你在Ubuntu上安装MariaDB服务器时,这个软件包会自动安装,现在运行以下命令来编辑每个MariaDB配置文件的node,如果Ubuntu服务器上不存在50-server.cnf
文件,就编辑/etc/mysql/my.cnf
或/etc/my.cnf
配置文件。
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
在[mysqld]
单元中添加以下配置。
[mysqld]
# Galera Cluster configurations
wsrep_on = ON
wsrep_provider = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_address ="gcomm://IP_address_of_node1,IP_address_of_node2,IP_address_of_node3"
default_storage_engine = InnoDB
binlog_format = row
innodb_autoinc_lock_mode = 2
innodb_force_primary_key = 1
innodb_doublewrite = 1
可以选择在[mysqld]
单元中添加以下行。
wsrep_cluster_name = MyCluster
wsrep_node_name = MyNode1
wsrep_node_address ="IP_address_of_this_node"
innodb_flush_log_at_trx_commit=0
如果你正在运行MariaDB 10.1 server,还需要添加以下行来禁用XA事务,因为Galera不支持它。
innodb_support_xa =0
如果运行MariaDB 10.3,则不应添加此行,因为它在默认情况下处于启用状态,并且不能禁用,据说它在MariaDB 10.4 Galera集群中得到完全支持。
注:旧版本的Galera集群不支持查询缓存(查询缓存大小),所有当前版本的MariaDB Galera都支持它。
必须注释掉以下行,或者将绑定地址更改为0.0.0.0,以便让MariaDB服务器侦听外部IP地址,以便它能够与其他节点通信。
bind-address = 127.0.0.1
保存,并管理文件,不重新启动MariaDB服务器。
步骤2:在防火墙中打开网络端口
由于使用了同步复制,Galera集群需要所有节点之间的持续通信,并且使用下面的TCP端口彼此通信。
你需要配置防火墙以允许从集群节点的IP地址到这些端口的通信,如果使用UFW,就可以在每个node上运行以下命令。
sudo ufw insert 1 allow in from IP_Address_of_node1
sudo ufw insert 1 allow in from IP_Address_of_node2
sudo ufw insert 1 allow in from IP_Address_of_node3
如果使用iptables,那么运行以下命令。
sudo iptables -I INPUT -p tcp --source IP_address_of_node1 -j ACCEPT
sudo iptables -I INPUT -p tcp --source IP_address_of_node2 -j ACCEPT
sudo iptables -I INPUT -p tcp --source IP_address_of_node3 -j ACCEPT
步骤3:为mysql d配置AppArmor
在Ubuntu上默认启用了AppArmor,它可以阻止非标准MariaDB端口上的通信,阻止Galera集群工作,所以我们需要添加AppArmor策略,允许MariaDB用以下命令打开其他非标准端口。
cd /etc/apparmor.d/disable/
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld
sudo systemctl restart apparmor
注意,MariaDB的服务器软件包AppArmor现在提供了更有效的禁用(/etc/apparmor.d/usr.sbin.mysqld
)的命令。
步骤4:启动集群
现在我们需要在第一个node上启动集群主组件,选择一个数据库节点作为第一个节点,并在第一个节点上停止MariaDB服务器。
sudo systemctl stop mariadb
然后运行以下命令在第一个node上启动主组件,注意:如果不首先停止MariaDB,就以下命令无效。
sudo galera_new_cluster
现在你可以登录到MariaDB监视器。
mysql -u root -p
并检查集群大小。
show status like 'wsrep_cluster_size';
您会看到集群中只有1个节点。
要向集群添加其他节点,只需在其他节点上重新启动MariaDB服务器,(注意:如果其他节点具有其他数据库,则这些数据库将被删除。
sudo systemctl restart mariadb
此命令可能需要一段时间才能完成,因为当新节点加入集群时,它们需要执行快照状态传输(SST),换句话说,是从第一个节点复制数据库,这会消耗大量内存和带宽。可以用以下命令检查SST日志:
sudo journalctl -eu mariadb
其他两个节点成功加入集群后,集群大小将更改为3.
要检查数据修改是否已同步,请在MariaDB监视器中运行以下语句。
show status like 'wsrep_local_state_comment';
通过以下方式检查其他Galera状态:
show status like 'wsrep%';
如果任何一个节点(包括第一个)崩溃并因此被踢出集群,则只需重启MariaDB服务器,崩溃的节点将重新加入集群。除非集群关闭sudo galera_new_cluster
(集群中的所有节点均脱机),否则不能再次运行命令。
从MariaDB Galera集群中删除节点
首先,登录到MariaDB monitor,并运行以下语句:
show status like 'wsrep_local_state_comment';
如果状态已同步,则可以通过停止MariaDB服务器从集群中安全地删除该节点。
sudo systemctl stop mariadb
在其他两个节点上,在MariaDB监视器中运行以下语句。
show status like 'wsrep%';
wsrep_cluster_size
更改为2,丢弃节点的IP地址不再在wsrep_incoming_address
中列出,这表示node已成功删除。
要重新加入集群,只需再次重新启动MariaDB。
sudo systemctl restart mariadb
如果不希望node再次加入集群,请删除主配置文件中的Galera相关设置,并重新启动MariaDB。
要删除节点而不停止MariaDB服务器,您需要锁定表。
MariaDB [(none)]> flush tables with read lock;
这样,您可以使用mysqldump创建备份。之后,解锁该节点的表以重新加入集群。
MariaDB [(none)]> unlock tables;
向集群添加新节点
Galera集群需要至少3个节点作为崩溃安全节点,建议你向集群添加更多节点,使它更健壮,要向集群添加新节点,你需要:
50-server.conf
文件中添加Galera配置,在防火墙中打开网络端口,并更新AppArmor策略,wsrep_cluster_address
变量中为每个node添加新节点的IP地址,提示:总是将奇数个节点部署到Galera集群。
关闭或重新启动MariaDB Galera集群
当所有节点同时处于脱机状态时,集群将消失,要关闭集群,你需要关闭所有节点,首先,确保应用程序没有使用数据库,并且wsrep_local_state_comment
被同步,然后逐个关闭MariaDB服务器。
要重新启动Galera集群,请在最后一个节点上运行以下命令以离开集群。
sudo galera_new_cluster
然后依次在其他节点上启动MariaDB服务器。
sudo systemctl start mariadb
Galera集群健康
有时由于网络连接失败,群集中将有一个网络分区。例如,如果一个节点与其他两个节点失去网络连接,则该节点将从主要组件更改为非主要组件。其他两个节点可以彼此连接,它们仍然位于主组件中。
可以在MariaDB监视器上使用以下语句检查此状态。
show status like 'wsrep_cluster_status';
我希望本教程可以帮助您在Ubuntu 18.04、18.10或Ubuntu 16.04上设置MariaDB Galera集群。要将其重新加入主要组件,只需在非主要组件中的节点上重新启动MariaDB服务器。
sudo systemctl restart mariadb
结论
我希望本教程可以帮助您在Ubuntu 18.04、18.10或Ubuntu 16.04上设置MariaDB Galera集群。