本文介绍在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';
请注意,数据库可能具有使用不同存储引擎的表,要检查,请运行以下语句,将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':
要将其他节点添加到群集,只需在其他节点上重新启动MariaDB服务器(注意:如果其他节点有其他数据库,那么这些数据库将被删除,只存在第一个节点的数据库): sudo systemctl restart mariadb 此命令可能需要一段时间才能完成,因为当新节点加入群集时,他们需要执行快照状态传输(SST),即从第一个节点复制数据库,这会占用大量RAM和带宽,可以使用以下命令检查SST日志: sudo journalctl -eu mariadb 其他两个节点成功加入群集后,cluster大小将更改为3:
如果现在在任何节点上导入新数据库,则此数据库将复制到其他节点,要检查是否已同步数据修改,请在MariaDB监视器上运行以下语句: show status like 'wsrep_local_state_comment';
可以通过以下方式查看其他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';
当节点位于非主要组件中时,将在该节点上禁用读取和写入查询,要将其重新加入主要组件,只需在非主要组件中的节点上重新启动MariaDB服务器: sudo systemctl restart mariadb
结语 以上就是具体的操作方法,希望本文能帮助你在Ubuntu 18.04或Ubuntu 16.04上设置MariaDB Galera cluster(集群)。
相关主题 |