在Ubuntu 18.04服务器上,如何使用MySQL配置Galera集群

分享于 

24分钟阅读

Linux

  繁體 雙語


介绍

集群通过将更改分发到不同服务器来增加数据库的高可用性,如果其中一个实例失败,就其他实例很快就可以继续服务。

集群有两个一般的配置,主动被动和主动主动,在活动的被动集群中,所有写入都是在一个活动服务器上完成的,然后复制到一个或多个被动服务器,一些主动被动集群还允许被动节点上的SELECT操作,在活动活动集群中,每个node都被读写,并且对一个的更改将复制到。

MySQL数据库是一个开源关系数据库管理系统,它是SQL数据库加莱拉是一个数据库集群解决方案,允许你使用同步复制来设置多个主集群,Galera自动处理保持不同节点上的数据的同步,同时允许你向集群中的节点发送读写查询,你可以在官方网站上了解更多关于Galera的信息文档页面

在本指南中,你将配置一个活动的MySQL Galera集群,为了进行演示,你将配置,并测试三个将在集群中充当节点的Ubuntu 18.04 液滴,这个节点的数量是最小的可配置集群。

前提条件

除了以下步骤之外,还需要一个digitalOcean帐户

  • 启用了专用网络的Three Ubuntu 18.04雾滴,每个都有一个无sudo权限的非根用户,
  • 要在三个雾滴上建立专用网络,请遵循私有Networking Quickstart指南
  • 有关使用sudo权限设置非root用户的帮助,请遵循我们的初始Server Setup,Ubuntu 18.04教程
  • 虽然本教程中的步骤已经针对DigitalOcean lot进行了编写和测试,但是其中大部分步骤也适用于启用了私有网络的non-DigitalOcean服务器。

    步骤1 —将MySQL存储库添加到所有服务器

    在这个步骤中,你将把相关的MySQL和Galera软件包库添加到你的三个服务器中,以便能够安装本教程中所使用的MySQL和Galera的正确版本。

    注:galera集群后面的公司编码维护Galera存储库,但请注意并非所有外部存储库都可靠,确保仅从可靠来源代码安装。

    在本教程中,你使用MySQL版本5.7,首先,将Galera项目维护的外部Ubuntu存储库添加到所有三个服务器。

    在所有三个服务器上更新存储库之后,就可以与Galera一起安装MySQL了。

    首先,在所有三个服务器上,使用apt-key命令添加Galera存储库密钥,APT包管理器使用该密钥来验证包是否可信:

  • 
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
    
    
  • 几秒钟后,你将收到以下输出:

    Output
    Executing: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBA gpg: key D669017EBC19DDBA: public key "Codership Oy " imported gpg: Total number processed: 1 gpg: imported: 1

    一旦在每个服务器的数据库中有了可信密钥,就可以添加存储库,为此,在每台服务器上的galera.list/etc/apt/sources.list.d/目录中创建一个新文件:

  • 
    sudo nano /etc/apt/sources.list.d/galera.list
    
    
  • 在文本编辑器中,添加以下行,这将使APT package manager可以使用适当的存储库:

    /etc/apt/sources.list.d/galera
    
    deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu bionic main
    deb http://releases.galeracluster.com/galera-3/ubuntu bionic main
    
    

    保存,并关闭每个服务器上的文件(按CTRL +XY,然后按ENTER)。

    Codership存储库现在可用于所有三个服务器,然而,你需要指导apt更喜欢它他的Codership库,以确保它安装了软件的修补版本,为此,在每个服务器的/etc/apt/preferences.d/目录中创建另一个galera.pref的新文件:

  • 
    sudo nano /etc/apt/preferences.d/galera.pref
    
    
  • 将以下行添加到文本编辑器:

    /etc/apt/preferences.d/galera
    
    # Prefer Codership repository
    Package: *
    Pin: origin releases.galeracluster.com
    Pin-Priority: 1001
    
    

    保存,并关闭该文件,然后在每台服务器上运行以下命令,以便包括来自新存储库的软件包清单:

  •  
    sudo apt update
    
    
  • 现在你已经成功地在所有三个服务器上添加了包存储库,接下来可以在下一节安装MySQL。

    步骤2 —在所有服务器上安装MySQL

    在此步骤中,你将在三个服务器上安装MySQL包。

    在所有三个服务器上运行以下命令,以安装修补过的MySQL版本,以便与Galera以及Galera包一起使用。

  • 
    sudo apt install galera-3 mysql-wsrep-5.7
    
    
  • 你被要求确认是否要继续安装,输入Y以继续安装,在安装期间,还会要求你为MySQL管理用户设置密码,设置强密码,并按ENTER继续。

    安装MySQL后,你将禁用默认的AppArmor配置文件,以确保Galera正常工作,官方Galera文档服装是Linux的内核模块,通过安全配置文件为服务提供访问控制功能。

    通过在每个服务器上执行以下命令禁用AppArmor:

  • 
    sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
    
    
  • 此命令将MySQL配置文件的符号链接添加到disable目录,在引导时禁用配置文件。

    然后,运行以下命令删除已经在内核中加载的MySQL定义。

  • 
    sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
    
    
  • 安装MySQL,并禁用第一个服务器上的AppArmor配置文件后,对其他两个服务器重复这些步骤。

    现在你已经成功地在三个服务器上安装了MySQL,接下来可以在下一节继续配置步骤。

    步骤3 —配置第一个node

    在这一步中,将配置你的第一个,集群中的每个节点都需要有几乎相同的配置,因此,你将在第一台机器上完成所有配置,然后将其复制到其他节点。

    默认情况下,MySQL配置为检查/etc/mysql/conf.d目录以从以.cnf结尾的文件中获取其他配置设置,在你的第一台服务器上,用所有特定于集群的指令在此目录中创建一个文件:

  • 
    sudo nano /etc/mysql/conf.d/galera.cnf
    
    
  • 将以下配置添加到文件中,配置指定了不同的集群选项,关于当前服务器和集群中其他服务器的详细信息,以及复制相关的设置,注意,配置中的IP地址是你各自服务器的专用地址;用适当的IP地址替换突出显示的行。

    /etc/mysql/conf./galera,cnf
    
    [mysqld]
    binlog_format=ROW
    default-storage-engine=innodb
    innodb_autoinc_lock_mode=2
    bind-address=0.0.0.0
    
    # Galera Provider Configuration
    wsrep_on=ON
    wsrep_provider=/usr/lib/galera/libgalera_smm.so
    
    # Galera Cluster Configuration
    wsrep_cluster_name="test_cluster"
    wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"
    
    # Galera Synchronization Configuration
    wsrep_sst_method=rsync
    
    # Galera Node Configuration
    wsrep_node_address="This_Node_IP"
    wsrep_node_name="This_Node_Name"
    
    
  • 第一部分修改或断言允许集群正常工作的MySQL设置,例如Galera不能使用MyISAM或类似的非事务性存储引擎,并且mysqld不能绑定到localhost的IP地址,你可以在Galera集群中更详细地了解这些设置系统配置页面
  • "Galera提供程序配置"部分配置提供WriteSet复制API的MySQL组件,这意味着Galera在你的情况下,因为Galera是一个wsrep (WriteSet复制)提供者,指定用于配置初始复制环境的常规参数,这不需要定制,但你可以进一步了解文档中的Galera配置选项
  • "Galera集群配置"部分定义集群,通过IP地址或可解析的域名标识集群成员,并为集群创建名称,以确保组成员Join正确,可以将wsrep_cluster_name更改为比test_cluster更有意义或保留它的内容,但是必须使用你的三个服务器的专用IP地址更新wsrep_cluster_address
  • 这个Galera Synchronization Configuration部分定义了集群如何在成员之间通信和同步数据,这只用于在节点联机时发生的状态转移,对于的初始设置, 使用rsync,因为它通常是可用的,现在你需要它
  • Galera Node Configuration部分阐明了IP地址和当前服务器的名称,当尝试诊断日志中的问题,并且以多种方式引用每个服务器时,这很有用,wsrep_node_address必须与所在的计算机的地址匹配,但可以选择名称以帮助你识别日志文件中的node
  • 如果对集群配置文件满意,请将内容复制到剪贴板,然后保存,并关闭该文件。

    现在已经成功配置了第一个node,接下来你可以继续配置下一节中的其余节点。

    步骤4 —配置其余节点

    在此步骤中,将配置其余两个节点,在第二个node上,打开配置文件:

  • 
    sudo nano /etc/mysql/conf.d/galera.cnf
    
    
  • 粘贴到从第一个node复制的配置中,然后更新Galera Node Configuration以使用 设置的特定node的IP地址或可解析域名,最后,更新它的名称,可以将它设置为帮助你识别日志文件中的node:

    /etc/mysql/conf./galera,cnf
    
    . . .
    # Galera Node Configuration
    wsrep_node_address="This_Node_IP"
    wsrep_node_name="This_Node_Name"
    . . .
    
    
    

    保存,并退出文件。

    完成这些步骤后,在第三个node上重复这些步骤。

    你几乎准备好启动集群,但在执行之前,请确保在防火墙中打开了适当的端口。

    步骤5 —在每个服务器上打开防火墙

    在此步骤中,将配置防火墙,以便打开内部节点通信所需的端口,在每台服务器上,运行以下命令检查防火墙的状态:

  •  
    sudo ufw status
    
    
  • 在这种情况下,只有SSH允许通过:

    Output
    Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

    由于这里只允许使用SSH流量,所以你需要为MySQL和Galera流量添加规则,如果你尝试启动集群,它将会,因为这些防火墙规则而失败。

    Galera可以使用四个端口:

  • 用于MySQL客户端连接的3306和使用mysqldump方法的状态快照传输
  • Galera集群复制通信,多播复制在此端口上同时使用UDP传输和TCP
  • 用于增量状态转移
  • 用于所有其他状态快照传输
  • 在本例中,你将在安装时打开所有4个端口,确认复制正常工作之后,你需要关闭没有实际使用,并限制集群中服务器的端口。

    使用以下命令打开端口:

  • 
    sudo ufw allow 3306,4567,4568,4444/tcp
    
    
  • sudo ufw allow 4567/udp
  • 注:根据服务器上 运行的其他程序,你可能希望立即限制访问,UFW Essentials:通用防火墙规则和命令指南可以帮助你。

    在第一个node上配置防火墙之后,在第二个和第三个node上创建相同的防火墙设置。

    现在已经成功配置了防火墙,接下来就可以在下一步中启动集群了。

    步骤6 —启动集群

    在此步骤中,你将启动MySQL Galera集群,但是,首先,你将启用MySQL systemd服务,以便在服务器重新启动时自动启动MySQL。

    允许MySQL在所有三个服务器上引导时启动

    在所有三个服务器上使用以下命令来启用MySQL systemd服务:

  • 
    sudo systemctl enable mysql
    
    
  • 你将看到以下输出,它显示了服务已成功链接到启动服务列表:

    Output
    Created symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.

    既然已经启用了mysql在所有服务器上引导时启动,就可以开始启动集群了。

    打开第一个node

    要启动第一个node,你需要使用一个特殊的启动脚本,配置集群的方式,每个联机的node将尝试连接到其galera.cnf状态中指定的至少一个其他node来获取其初始状态,通过使用允许systemd传递--wsrep-new-cluster参数的mysqld_bootstrap脚本,正常的systemctl start mysql会失败,因为第一个node没有运行节点。

    在第一个服务器上运行以下命令:

  • 
    sudo mysqld_bootstrap
    
    
  • 此命令在成功执行时不会显示输出,此脚本成功后,node将作为集群的一部分注册,通过以下命令看到它:

  • 
    mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
    
    
  • 输入密码后,你将看到以下输出,指示集群中有一个node:

    Output
    +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+

    在其余节点上,你可以正常启动,他们将搜索在线集群列表的成员,当他们找到一个成员时,他们会Join集群。

    打开第二个node

    现在你可以打开第二个,启动mysql

  • 
    sudo systemctl start mysql
    
    
  • 成功执行时不显示输出,你将看到当每个node联机时,集群大小会增加:

  • 
    mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
    
    
  • 你将看到以下输出指示第二个node已加入了集群,并且有两个节点总共有两个节点。

    Output
    +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+

    打开第三个node

    现在是时候提出第三个node了,启动mysql

  • 
    sudo systemctl start mysql
    
    
  • 运行以下命令查找集群大小:

  • 
    mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
    
    
  • 你将看到以下输出,表明第三个node已经加入集群,并且集群中的节点总数是3.

    Output
    +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+

    此时,整个集群处于联机状态,并成功通信,接下来,通过在以下部分中测试复制来确保工作设置。

    步骤7 —测试复制

    你已经完成了到这个的步骤,以便集群能够从node执行复制到其他node (称为主动活动复制),在此步骤中,你将测试复制是否按预期工作。

    写入第一个node

    首先,在第一个node上进行数据库更改,以下命令将创建一个名为playground的数据库,并创建此数据库的内部表equipment

  • 
    mysql -u root -p -e 'CREATE DATABASE playground;
    
    
  • CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
  • INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'
  • 在前面的命令中,CREATE DATABASE语句创建一个叫playground的数据库,CREATE语句在playground数据库中创建一个名为equipment的表,这个表有一个名为id和其他列的自动递增标识符列,定义type列,quant列和color列,分别存储设备的类型,数量和颜色,INSERT语句插入类型为slide,数量2和颜色blue的条目。

    现在你的表中有一个值。

    在第二个node上读写

    接下来,查看第二个node以验证复制是否正常工作:

  • 
    mysql -u root -p -e 'SELECT * FROM playground.equipment;'
    
    
  • 在第一个node上输入的数据在第二个上可见,证明复制工作正常:

    Output
    +----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+

    从相同的node中,将数据写入集群:

  • 
    mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
    
    
  • 在第三个node上读写

    从第三个node中,通过再次查询该表来读取所有这些数据:

  • 
    mysql -u root -p -e 'SELECT * FROM playground.equipment;'
    
    
  • 你将看到下面显示两行的输出:

    Output
    +----+-------+-------+--------+ | id | type | quant | color | +----+-------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | +----+-------+-------+--------+

    同样,你可以从此node中添加另一个值:

  • 
    mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'
    
    
  • 在第一个node上阅读

    回到第一个node,可以验证你的数据是否随处可用:

  • 
    mysql -u root -p -e 'SELECT * FROM playground.equipment;'
    
    
  • 将看到以下输出,指示第一个node上的行可用。

    Output
    +----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | | 3 | seesaw | 3 | green | +----+--------+-------+--------+

    现在已经成功验证,你可以向所有节点写入,并正确执行复制。

    结论

    此时,你已经配置了3个节点Galera测试集群,如果计划在生产环境中使用,集群,建议你从不小于5个节点开始。

    在使用生产之前,需要查看一些其他状态快照传输(sst )代理,比如xtrabackup,它允许你快速设置新的节点,并且没有大量中断,这不会影响实际复制,但在初始化节点时是一个问题。

    可能还对MySQL的其他集群解决方案感兴趣,在这种情况下,你可以查看如何在ubuntu18.04上创建多节点MySQL集群教程,如果要尝试托管数据库解决方案,请参见digitalOcean Managed Databases文档


    相关文章