如何在Ubuntu12.04服务器上使用MariaDB配置Galera集群
状态: 已弃用
本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.
请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。
介绍
在生产环境中处理关系数据库系统时,通常最好有某种复制过程。 复制允许您的数据自动传输到不同的节点。
简单的主从复制在 SQL 世界中最为常见。 这允许您使用一个“主”服务器来处理所有应用程序写入,而多个“从”服务器可用于读取数据。 可以配置故障转移和其他技术。
虽然主从复制很有用,但不如主从复制灵活。 在主-主配置中,每个节点都能够接受写入并将它们分布在整个集群中。 MariaDB 默认没有这个的稳定版本,但是一组被称为“Galera”的补丁实现了同步主-主复制。
在本指南中,我们将使用 Ubuntu 12.04 VPS 实例创建一个 Galera 集群。 我们将使用三台服务器进行演示(最小的可配置集群),但建议在生产环境中使用五个节点。
添加 MariaDB 存储库
MariaDB 和 Galera 软件包在默认的 Ubuntu 存储库中不可用。 但是,MariaDB 项目维护自己的 Ubuntu 存储库,其中包含我们需要的所有包。
在我们将为该集群配置的三台服务器上,您需要首先安装 python-software-properties
软件包。 这将为我们提供管理存储库所需的命令:
sudo apt-get update sudo apt-get install python-software-properties
现在,我们可以为 MariaDB 存储库添加密钥文件。 这将告诉我们的服务器,我们信任存储库的维护者,并且我们可以毫无问题地在其中安装包。
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
这将接受密钥文件。 现在我们在数据库中拥有了可信密钥,我们可以添加实际的存储库:
sudo add-apt-repository 'deb http://mirror.jmu.edu/pub/mariadb/repo/5.5/ubuntu precise main'
使用 Galera 补丁安装 MariaDB
我们现在可以通过 apt 界面轻松安装带有 Galera 补丁的 MariaDB。 记得先更新数据库:
sudo apt-get update sudo apt-get install mariadb-galera-server galera
在安装过程中,系统会要求您为 MariaDB 管理用户设置密码。 您可以在所有服务器实例中设置相同的密码。
如果由于某种原因,您的机器上还没有安装 rsync,您现在应该输入以下命令来安装它:
sudo apt-get install rsync
我们现在拥有开始配置集群所需的所有部分。
配置 MariaDB 和 Galera
现在我们已经在我们的三台服务器上安装了 MariaDB 和 Galera,我们可以开始配置了。
集群实际上需要共享其配置。 因此,我们将在第一台机器上完成所有配置,然后将其复制到其他节点。
在您的第一台服务器上,我们将为我们的集群创建一个包含设置的单独文件。
默认情况下,MariaDB 配置为检查 /etc/mysql/conf.d
目录中的其他文件以增强其行为。 我们可以在这个目录中创建一个包含所有集群特定指令的文件:
sudo nano /etc/mysql/conf.d/cluster.cnf
将以下配置复制并粘贴到文件中。 我们将解释您需要更改的内容以及每个部分的含义:
[mysqld] query_cache_size=0 binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 query_cache_type=0 bind-address=0.0.0.0 Galera 提供者配置 wsrep_provider=/usr/lib/galera/libgalera_smm.so #wsrep_provider_options=“gcache.size=32G” Galera 集群配置 wsrep_cluster_name=“test_cluster” wsrep_cluster_address=“gcomm:// first_ip , second_ip , third_ip ” Galera 同步配置 wsrep_sst_method=rsync #wsrep_sst_auth=user:pass Galera 节点配置 wsrep_node_address=“ this_node_ip ” wsrep_node_name=“ this_node_name ”
第一部分修改或重新声明一些 MariaDB/MySQL 设置,使 MySQL 能够正常运行。
标记为“Galera Provider Configuration”的部分用于配置提供 WriteSet 复制 API 的 MariaDB 组件。 这在我们的例子中意味着 Galera,因为 Galera 是一个 wsrep(WriteSet Replication)提供者。
我们可以指定通用参数来配置初始复制环境。 您可以在此处找到有关 Galera 配置选项 的更多信息。 通常,您不需要做太多事情来获得工作集。
“Galera Cluster Configuration”部分定义了我们将要创建的集群。 它通过 IP 地址或可解析的域名定义集群成员,并为集群创建名称以确保成员加入正确的组。
“Galera 同步配置”部分定义了集群如何在成员之间通信和同步数据。 这仅用于节点上线时发生的状态传输。 对于我们的初始设置,我们只是使用 rsync,因为它几乎可以满足我们的需求,而无需使用外来组件。
“Galera 节点配置”部分仅用于阐明当前服务器的 IP 地址和名称。 这在尝试诊断日志中的问题并能够以多种方式引用每个服务器时很有帮助。 名字可以是任何你想要的。
当您对集群配置文件感到满意时,您应该将内容复制到每个单独的节点。
请记住在每个单独的服务器上更改“Galera 节点配置”部分。
当您在每台服务器上进行此配置时,自定义“Galera 节点配置”部分,您应该保存并关闭文件。
复制 Debian 维护配置
目前 Ubuntu 和 Debian 的 MariaDB 服务器使用专门的维护用户进行日常维护。 一些不属于维护类别的任务也以该用户身份运行,包括停止 MySQL 等重要功能。
由于我们的集群环境在各个节点之间共享,在每个节点上随机生成登录凭据的维护用户将无法正确执行命令。 只有初始服务器将具有正确的维护凭据,因为其他服务器将尝试使用其本地设置来访问共享集群环境。
我们可以通过简单地将维护文件的内容复制到每个单独的节点来解决这个问题:
在您的一台服务器上,打开 Debian 维护配置文件:
sudo nano /etc/mysql/debian.cnf
您将看到一个如下所示的文件:
[client] host = localhost user = debian-sys-maint password = 03P8rdlknkXr1upf socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = debian-sys-maint password = 03P8rdlknkXr1upf socket = /var/run/mysqld/mysqld.sock basedir = /usr
我们只需要复制这些信息并将其粘贴到每个节点上的同一个文件中。
在第二个和第三个节点上,打开同一个文件:
sudo nano /etc/mysql/debian.cnf
删除当前信息并将参数从第一个节点的配置文件粘贴到这些其他服务器的文件中:
[client] host = localhost user = debian-sys-maint password = 03P8rdlknkXr1upf socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = debian-sys-maint password = 03P8rdlknkXr1upf socket = /var/run/mysqld/mysqld.sock basedir = /usr
他们现在应该完全一样了。 保存并关闭文件。
启动集群
首先,我们需要停止正在运行的 MariaDB 服务,以便我们的集群可以联机。
这很容易通过在每个节点上键入以下内容来完成:
sudo service mysql stop
当所有进程都停止运行时,您必须使用特殊参数再次启动您的第一个节点:
sudo service mysql start --wsrep-new-cluster
使用我们的集群配置,每个上线的节点都会尝试连接到其配置文件中指定的至少一个其他节点以获取其初始状态。 如果没有 --wsrep-new-cluster
参数,此命令将失败,因为第一个节点无法与任何其他节点连接。
在其他每个节点上,您现在可以像往常一样启动 MariaDB。 他们将搜索集群列表中在线的任何成员。 当他们找到第一个节点时,他们将加入集群。
sudo service mysql start
您的集群现在应该在线并且正在通信。
测试 Master-Master 复制
到目前为止,我们已经完成了这些步骤,以便我们的集群可以执行主-主复制。 我们需要对此进行测试以查看复制是否按预期工作。
在我们的一个节点上,我们可以像这样创建一个数据库和表:
mysql -u root -p mariadb_admin_password -e '创建数据库游乐场;' mysql -u root -p mariadb_admin_password -e 'CREATE TABLE playground.equipment (id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));'
这将创建一个名为 playground
的数据库和一个名为 equipment
的表。
然后我们可以通过执行将我们的第一项插入到这个表中:
mysql -u root -p mariadb_admin_password -e 'INSERT INTO playground.equipment (type, quant, color) VALUES (“slide”, 2, “blue”)'
现在我们的表中有一个值。
从 another 节点,我们可以通过键入以下内容来读取此数据:
mysql -u root -p mariadb_admin_password -e 'SELECT * FROM playground.equipment;'
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+
从同一个节点,我们可以将数据写入集群:
mysql -u root -p mariadb_admin_password -e 'INSERT INTO playground.equipment (type, quant, color) VALUES (“swing”, 10, “yellow”);'
从我们的第三个节点,我们可以通过再次查询来读取所有这些数据:
mysql -u root -p mariadb_admin_password -e 'SELECT * FROM playground.equipment;'
+----+-------+-------+--------+ | id | type | quant | color | +----+-------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | +----+-------+-------+--------+
同样,我们可以从该节点添加另一个值:
mysql -u root -p mariadb_admin_password -e 'INSERT INTO playground.equipment (type, quant, color) VALUES (“seesaw”, 3, “green”);'
回到第一个节点,我们可以看到我们的数据无处不在:
mysql -u root -p mariadb_admin_password -e 'SELECT * FROM playground.equipment;'
+----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | | 3 | seesaw | 3 | green | +----+--------+-------+--------+
如您所见,我们所有的服务器都可以写入。 这意味着我们的主-主复制功能正常。
结论
此时,您应该在服务器上配置了 Galera 集群。 这有助于在写入密集型应用程序环境中平衡负载。
如果您计划在生产环境中使用 Galera 集群,您可能需要查看其他一些状态快照传输 (sst) 代理,例如“xtrabackup”。 这将允许您非常快速地设置新节点,并且不会对您的活动节点造成大的中断。 这不会影响实际的复制,但在初始化节点时是一个问题。