云网牛站
所在位置:首页 > Linux云数据库 > 在Ubuntu 18.04/16.04上配置MariaDB Galera Cluster的方法

在Ubuntu 18.04/16.04上配置MariaDB Galera Cluster的方法

2019-03-15 20:02:25作者:陈铜稿源:云网牛站

本文介绍在Ubuntu 18.04/16.04操作系统上配置MariaDB Galera Cluster(集群)的方法,可先参考使用HAProxy在Ubuntu 18.04上设置MariaDB Galera Cluster的步骤一文。

 

在Ubuntu上设置Galera集群的先决条件

应该在群集中放置多少个节点?没有上限,但你应该总是选择一个奇数:3,5,7等等,以防止相关问题,Galera集群至少需要3个节点才能安全防范,要学习本教程,需要在Ubuntu上运行至少3个MariaDB数据库(安装参考:在Ubuntu 18.04系统上安装MariaDB 10.4的步骤),每个服务器至少有512MB RAM,在每台服务器上使用1GB或更高的RAM,以实现平稳运行和更好的性能,建议在每个节点上使用相同的硬件配置,因为群集将与最慢的节点一样慢。

在本文中,我在3个不同的数据中心使用3个Linode VPS(虚拟专用服务器),因此,如果其中一个数据中心出现断电/网络问题,我的数据库仍然可用,可以从默认的Ubuntu存储库安装MariaDB服务器,建议在服务器上安装相同的版本。

注意:

1)Galera集群仅在Linux和类Unix操作系统上运行,不支持Microsoft Windows。

2)如果你的Galera群集跨越大陆,则会有100毫秒到300毫秒的延迟,我的3台服务器之间的延迟大约是165毫秒,我还发现有时IPv6延迟明显高于IPv4延迟,有时IPv4延迟低于IPv6延迟。

所有MariaDB服务器都必须使用InnoDB或XtraDB存储引擎,因为Galera集群仅支持这两个存储引擎,对其他引擎的表的任何写入都不会复制到其他节点,要检查数据库使用的默认存储引擎,请登录MariaDB监视器并运行以下语句:

MariaDB [(none)]> show variables like 'default_storage_engine';

在Ubuntu 18.04/16.04上配置MariaDB Galera Cluster的方法

请注意,数据库可能具有使用不同存储引擎的表,要检查,请运行以下语句,将database_name替换为你的真实数据库名称:

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存储引擎,也不需要更改它。

 

一、配置群集中的每个节点

在MariaDB 10.1之前,系统管理员需要安装mariadb-galera-server软件包才能设置集群,从MariaDB 10.1开始,Galera集群功能捆绑在MariaDB中,如果在Ubuntu 18.04上运行MariaDB 10.1或更高版本,则只需再安装一个软件包:galera-3 - Galera wsrep(write-set replication)提供程序库:

sudo apt install galera-3

通常,在Ubuntu上安装MariaDB服务器时会自动安装此软件包,现在运行以下命令来编辑每个节点上的主MariaDB配置文件(如果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

说明:

第一个变量启用写集复制。

第二个变量指定wsrep库的位置,通常它是/usr/lib/galera/libgalera_smm.so, /usr/lib/libgalera_smm.so文件是一个符号链接。

第三个变量定义集群中非常节点的IP地址,以逗号分隔。

Galera仅支持InnoDB或其fork XtraDB,因此设置default_storage_engine变量非常重要。

Galera集群需要二进制日志,其格式必须为ROW。不支持基于语句或混合复制。

innodb_autoinc_locak_mode变量有3个可能的值:0,1或2,我们必须为Galera集群将其设置为2(交错锁定模式)。

Galera集群要求所有具有主键的表(不支持不可见主键),因此,在每个表上强制执行主键是个好主意。不接受没有主键的CREATE TABLE,并将返回错误。

InnoDB doublewrite buffer默认启用,使用Galera wsrep提供程序库版本3时不应更改。

你可以选择在[mysqld]单元中添加以下行:

wsrep_cluster_name = MyCluster

wsrep_node_name = MyNode1

wsrep_node_address = "IP_address_of_this_node"

innodb_flush_log_at_trx_commit=0

第一个变量设置集群的名称,在群集中的每个节点上使用相同的群集名称。

第二个变量为单个节点设置名称。

第三个变量设置单个节点的IP地址。

最后一行确保InnoDB日志缓冲区每秒写入一次文件,而不是每次事务提交,以提高性能,请注意,如果所有群集节点同时关闭,则由于此行,最后一秒的事务将丢失,如果群集节点分布在不同的数据中心,则无需担心这一点。

如果正在运行MariaDB 10.1服务器,则还需要添加以下行以禁用XA事务,因为Galera不支持它:

innodb_support_xa = 0

如果运行MariaDB 10.3,则不应添加此行,因为默认情况下它处于启用状态且无法禁用,据说在MariaDB 10.4 Galera集群中得到了完全支持。

注意:旧版Galera集群不支持查询缓存(query_cache_size),所有当前版本的MariaDB Galera都支持它。

并且你必须注释掉以下行或将绑定地址更改为0.0.0.0以使MariaDB服务器也监听公共IP地址,以便它可以与其他节点通信:

bind-address = 127.0.0.1

保存并关闭文件,同时不要立即重启MariaDB服务器。

 

二、在防火墙中打开网络端口

由于使用同步复制,Galera集群需要在所有节点之间进行持续通信,并且它们使用以下TCP端口相互通信:

3306(标准MariaDB端口)

4444(SST端口)

4567(Galera复制端口)

4568(IST端口)

需要配置防火墙以允许从群集节点的IP地址到这些端口的流量,如果使用的是UFW,则可以在每个节点上运行以下命令:

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

参考:Debian、Ubuntu、Linux Mint系统中的UFW防火墙入门教程

如果使用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

 

三、为mysqld配置AppArmor

默认情况下,AppArmor在Ubuntu上启用,它可以阻止非标准MariaDB端口上的通信,从而阻止Galera集群工作,因此我们需要添加AppArmor策略以允许MariaDB使用以下命令打开其他非标准端口:

cd /etc/apparmor.d/disable/

sudo ln -s /etc/apparmor.d/usr.sbin.mysqld

sudo systemctl restart apparmor

请注意,Ubuntu的MariaDB服务器包现在附带一个空的AppArmor配置文件(/etc/apparmor.d/usr.sbin.mysqld),有效地禁用了MariaDB的AppArmor,因此不再需要运行上述命令。

 

四、启动Cluster

现在我们需要在第一个节点上启动集群主组件,选择将数据库作为第一个节点的节点,并在第一个节点上停止MariaDB服务器:

sudo systemctl stop mariadb

然后运行以下命令以在第一个节点上启动主组件(注意:如果没有先停止MariaDB,则以下命令无效):

sudo galera_new_cluster

现在可以登录MariaDB监视器:

mysql -u root -p

并检查cluster大小:

show status like 'wsrep_cluster_size';

将看到群集中只有1个节点,显示状态,如'wsrep_cluster_size':

在Ubuntu 18.04/16.04上配置MariaDB Galera Cluster的方法

要将其他节点添加到群集,只需在其他节点上重新启动MariaDB服务器(注意:如果其他节点有其他数据库,那么这些数据库将被删除,只存在第一个节点的数据库):

sudo systemctl restart mariadb

此命令可能需要一段时间才能完成,因为当新节点加入群集时,他们需要执行快照状态传输(SST),即从第一个节点复制数据库,这会占用大量RAM和带宽,可以使用以下命令检查SST日志:

sudo journalctl -eu mariadb

其他两个节点成功加入群集后,cluster大小将更改为3:

在Ubuntu 18.04/16.04上配置MariaDB Galera Cluster的方法

如果现在在任何节点上导入新数据库,则此数据库将复制到其他节点,要检查是否已同步数据修改,请在MariaDB监视器上运行以下语句:

show status like 'wsrep_local_state_comment';

在Ubuntu 18.04/16.04上配置MariaDB Galera Cluster的方法

可以通过以下方式查看其他Galera状态:

show status like 'wsrep%';

如果任何节点(包括第一个节点)崩溃并因此被踢出群集,则只需重新启动MariaDB服务器,崩溃的节点将重新加入群集,除非群集关闭(群集中的所有节点都处于脱机状态),否则不得再次运行sudo galera_new_cluster命令。

 

五、从MariaDB Galera集群中删除节点

首先,登录MariaDB监视器并运行以下语句:

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中,这表示节点已成功删除。

要重新加入群集,只需重新启动MariaDB即可:

sudo systemctl restart mariadb

如果不希望节点再次加入群集,则删除主配置文件中的Galera相关设置并重新启动MariaDB。

 

六、将新节点添加到群集

Galera集群至少需要3个节点才能安全运行,建议您向集群添加更多节点,以使其更加强大,要向群集添加新节点,需要:

1、在新节点上的50-server.conf文件中添加Galera配置,在防火墙中打开网络端口并更新AppArmor策略。

2、在每个节点上的wsrep_cluster_address变量中添加新节点的IP地址。

3、逐个在群集中的现有节点上重新启动MariaDB服务器。(仅在上一个MariaDB服务器完成重新启动后才重新启动。)

4、在新节点上重新启动MariaDB服务器,以便它们可以加入群集。

提示:始终将奇数个节点部署到Galera集群。

 

七、关闭MariaDB Galera Cluster

当所有节点同时脱机时,群集将消失,要关闭群集,你需要关闭所有节点,首先,确保应用程序未使用数据库并同步wsrep_local_state_comment,然后逐个关闭MariaDB服务器。

要重新启动Galera群集,请在最后一个节点上运行以下命令以离开群集:

sudo galera_new_cluster

然后逐个启动其他节点上的MariaDB服务器:

sudo systemctl start mariadb

 

八、Galera Cluster Health

由于网络连接故障,有时群集中将存在网络分区,例如,如果一个节点与其他两个节点失去网络连接,则此节点将从主要组件更改为非主要组件,其他两个节点可以相互连接,它们仍然在主要组件中。

可以在MariaDB监视器上使用以下语句检查此状态:

show status like 'wsrep_cluster_status';

在Ubuntu 18.04/16.04上配置MariaDB Galera Cluster的方法

当节点位于非主要组件中时,将在该节点上禁用读取和写入查询,要将其重新加入主要组件,只需在非主要组件中的节点上重新启动MariaDB服务器:

sudo systemctl restart mariadb

 

结语

以上就是具体的操作方法,希望本文能帮助你在Ubuntu 18.04或Ubuntu 16.04上设置MariaDB Galera cluster(集群)。

 

相关主题

在Ubuntu 18.04/CentOS 7上使用HAProxy进行Galera集群高可用性

精选文章
热门文章