在Ubuntu 18.04,18.10和16.04上,如何设置MariaDB Galera集群

分享于 

13分钟阅读

MySQL/MariaDB

  繁體

本教程将向您展示如何在Ubuntu 18.04、18.10和16.04服务器上设置MariaDB Galera Cluster。MariaDB是MySQL数据库服务器的开源替代品。

Galera集群是由一家芬兰公司Codership开发的开源数据复制和集群技术,Galera集群有3个版本:

  • MySQL的Galear集群:由Codership开发的原始Galera
  • MariaDB Galera集群:fork的Codership Galera
  • Percona XtraDB集群:另一个fork属于Codership Galera
  • 在本教程中,使用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端口彼此通信。

  • 3306 (标准MariaDB端口)
  • 4444 (SST端口)
  • 4567 (Galera复制端口)
  • 4568 (IST端口)
  • 你需要配置防火墙以允许从集群节点的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地址,
  • 逐一重新启动集群中现有节点上的MariaDB服务器。(仅在前一个MariaDB服务器完成重新启动之后,才重新启动下一个MariaDB服务器。)
  • 在新节点上重新启动MariaDB服务器,以便它们可以加入集群。
  • 提示:总是将奇数个节点部署到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集群。


    SET  Ubuntu  集群  gal  Mariadb  Galera