如何在 Ubuntu 12.04 服务器上使用 MariaDB 配置 Galera 集群

金钱(警告)

** 状态:** 被贬值

如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:

** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。

** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本编写的指南。

介绍


在处理生产环境中的关系数据库系统时,通常最好使用某种类型的复制程序,复制可以自动将数据传输到不同的节点。

一个简单的主奴隶复制是SQL世界中最常见的,这允许您使用一个服务器来处理所有应用程序的写作,而多个奴隶服务器可以用来读取数据。

虽然主奴隶复制是有用的,但它并不像主奴隶复制那样灵活。在主奴隶配置中,每个节点都能接受写作并在整个集群中分发它们。

在本指南中,我们将使用 Ubuntu 12.04 VPS 实例创建一个 Galera 集群,我们将使用三个服务器用于演示目的(最小的可配置集群),但为生产情况推荐五个节点。

添加 MariaDB 存储库


MariaDB 和 Galera 包在默认的 Ubuntu 存储库中不可用,但是 MariaDB 项目为 Ubuntu 保留了自己的存储库,这些存储库包含了我们所需要的所有包。

在我们将为这个集群配置的三个服务器中,您需要先安装python-software-properties包,这将为我们提供管理我们的库所需的命令:

1sudo apt-get update
2sudo apt-get install python-software-properties

现在,我们可以添加MariaDB存储库的关键文件,这将告诉我们的服务器,我们信任存储库的维护者,我们可以毫无问题地在它们中安装包。

1sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db

现在我们在数据库中有可信密钥,我们可以添加实际的存储库:

1sudo add-apt-repository 'deb http://mirror.jmu.edu/pub/mariadb/repo/5.5/ubuntu precise main'

使用 Galera 补丁安装 MariaDB


现在我们可以通过 apt 界面轻松安装 MariaDB 与 Galera 补丁,请记住先更新数据库:

1sudo apt-get update
2sudo apt-get install mariadb-galera-server galera

在安装过程中,您将被要求为 MariaDB 管理用户设置密码,您可以在所有服务器实例中设置相同的密码。

如果出于某种原因,您还没有安装 rsync 在您的机器上,您应该通过键入现在安装它:

1sudo apt-get install rsync

我们现在有所有必要的零件来开始配置我们的集群。

配置 MariaDB 和 Galera


现在我们已经在三台服务器上安装了 MariaDB 和 Galera,我们可以开始配置。

集群实际上需要共享其配置,因此,我们将在第一台机器上完成所有配置,然后将其复制到其他节点。

在您的第一个服务器上,我们将创建一个单独的文件,为我们的集群设置。

默认情况下,MariaDB 被配置为检查 /etc/mysql/conf.d 目录以获取额外的文件以增强其行为。

1sudo 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 Provider Configuration
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# wsrep_provider_options="gcache.size=32G"

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://first_ip,second_ip,third_ip"

# Galera Synchronization Congifuration
wsrep_sst_method=rsync
# wsrep_sst_auth=user:pass

# Galera Node Configuration
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 复制) 提供商。

我们可以指定一般参数来配置初始复制环境. 您可以在这里找到有关 Galera 配置选项的更多信息。

Galera 集群配置部分定义了我们将创建的集群,它根据 IP 地址或可解除的域名定义了集群成员,并为集群创建了一个名称,以确保成员加入正确的组。

Galera Synchronization Configuration部分定义了集群将如何在成员之间通信和同步数据. 这仅用于节点上网时发生的状态转移。

Galera Node Configuration 部分仅用于澄清 IP 地址和当前服务器的名称,这在尝试诊断日志中的问题时非常有用,并且可以以多种方式参考每个服务器。

当您对集群配置文件满意时,您应该将内容复制到每个单个节点。

请记住在每个服务器上更改Galera Node Configuration部分。

当您在每个服务器上有此配置时,与Galera Node Configuration部分自定义,您应该保存和关闭文件。

复制 Debian 维护配置


目前,Ubuntu和Debian的MariaDB服务器使用一个特殊的维护用户来进行常规维护,一些不属于维护类别的任务也作为这个用户运行,包括停止MySQL等重要功能。

随着我们的集群环境在各个节点之间共享,在每个节点上随机生成登录凭证的维护用户将无法正确执行命令. 只有初始服务器将有正确的维护凭证,因为其他用户将尝试使用其本地设置访问共享集群环境。

我们可以通过简单地将维护文件的内容复制到每个单个节点来解决这个问题:

在您的服务器中,打开 Debian 维护配置文件:

1sudo nano /etc/mysql/debian.cnf

你会看到一个看起来像这样的文件:

 1[client]
 2host     = localhost
 3user     = debian-sys-maint
 4password = 03P8rdlknkXr1upf
 5socket   = /var/run/mysqld/mysqld.sock
 6[mysql_upgrade]
 7host     = localhost
 8user     = debian-sys-maint
 9password = 03P8rdlknkXr1upf
10socket   = /var/run/mysqld/mysqld.sock
11basedir  = /usr

我们只需要复制这些信息并将其粘贴到每个节点的相同文件中。

在第二和第三节点上,打开相同的文件:

1sudo nano /etc/mysql/debian.cnf

删除当前信息并将第一个节点的配置文件中的参数粘贴到这些其他服务器的文件中:

 1[client]
 2host     = localhost
 3user     = debian-sys-maint
 4password = 03P8rdlknkXr1upf
 5socket   = /var/run/mysqld/mysqld.sock
 6[mysql_upgrade]
 7host     = localhost
 8user     = debian-sys-maint
 9password = 03P8rdlknkXr1upf
10socket   = /var/run/mysqld/mysqld.sock
11basedir  = /usr

它们应该是完全相同的现在. 保存和关闭文件。

启动集群


首先,我们需要停止运行MariaDB服务,以便我们的集群可以在线。

这可以通过在每个节点上键入这些来轻松完成:

1sudo service mysql stop

当所有流程停止运行时,您必须使用特殊参数重新启动第一个节点:

1sudo service mysql start --wsrep-new-cluster

通过我们的集群配置,每个连接到网络的节点都试图连接到其配置文件中指定的至少一个节点,以获得其初始状态。

在其他每个节点上,您现在可以像正常情况下一样启动MariaDB,他们会搜索在线的集群列表中的任何成员,当他们找到第一个节点时,他们会加入集群。

1sudo service mysql start

你的集群现在应该在线和沟通。

测试硕士复制


到目前为止,我们已经通过了这些步骤,以便我们的集群能够执行大师复制,我们需要测试这一点,看看复制是否按预期工作。

在我们的一个节点上,我们可以创建这样的数据库和表:

mysql -u root -pmariadb_admin_password -e 'CREATE DATABASE playground;'
mysql -u root -pmariadb_admin_password -e 'CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));'

这将创建一个名为游乐场的数据库和一个名为设备的表。

然后我们可以将我们的第一个项目插入到这个表中,执行:

mysql -u root -pmariadb_admin_password -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue")'

我们现在在我们的桌子上有一个价值。

another node,我们可以通过键入读取这些数据:

mysql -u root -pmariadb_admin_password -e 'SELECT * FROM playground.equipment;'

1+----+-------+-------+-------+
2| id | type  | quant | color |
3+----+-------+-------+-------+
4|  1 | slide |     2 | blue  |
5+----+-------+-------+-------+

从同一个节点,我们可以将数据写入集群:

mysql -u root -pmariadb_admin_password -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

从我们的第三节点,我们可以通过重新查询读取所有这些数据:

mysql -u root -pmariadb_admin_password -e 'SELECT * FROM playground.equipment;'

1+----+-------+-------+--------+
2| id | type  | quant | color  |
3+----+-------+-------+--------+
4|  1 | slide |     2 | blue   |
5|  2 | swing |    10 | yellow |
6+----+-------+-------+--------+

再一次,我们可以从这个节点中添加另一个值:

mysql -u root -pmariadb_admin_password -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

回到第一个节点,我们可以看到我们的数据到处都是可用的:

mysql -u root -pmariadb_admin_password -e 'SELECT * FROM playground.equipment;'

1+----+--------+-------+--------+
2| id | type   | quant | color  |
3+----+--------+-------+--------+
4|  1 | slide  |     2 | blue   |
5|  2 | swing  |    10 | yellow |
6|  3 | seesaw |     3 | green  |
7+----+--------+-------+--------+

正如您所看到的,我们所有的服务器都可以写入,这意味着我们有正确的主复制功能。

结论


在此时刻,您应该在您的服务器上配置一个 Galera 集群,这可以帮助在密集写作的应用环境中平衡负载。

如果您计划在生产情况下使用Galera集群,您可能想看看一些其他状态快照传输(STT)代理,如额外备份。这将允许您非常快地设置新的节点,而不会对您的活跃节点造成大干扰。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus