在 Debian/Ubuntu 上安装 MariaDB Galera 集群

一份由 Erkan Yanar 撰写的 MariaDB Howto 文档。

这是一份关于在 Debian/Ubuntu 上安装 MariaDB Galera 集群的 Howto 文档。因为很多人在安装 MariaDB Galera 集群时遇到问题,freenode 上 #maria 频道的 elenst 强迫我写下这份 Howto 🙂

实际上,安装 MariaDB Galera 集群非常简单,最终甚至有点无聊。这份 Howto 文档是为 Debian 7.1 (Wheezy) 和 Ubuntu 12.04 (Precise) 编写(并测试)的。

我们需要什么

在我们的设置中,我们假设有 3 个节点(node01、node02、node03),每个节点有一个接口。我们假设使用以下 IP 地址:172.16.8.5、172.16.8.6 和 172.16.8.4。所有节点上需要安装以下三个软件包

  • rsync
  • galera
  • mariadb-galera-server

由于 Galera 不随分发版仓库一起提供,请访问仓库配置器并按照说明添加适合您系统的仓库。请记住在第 3 步(选择版本)中选择“5.5”。完成此操作后,您可以直接跳到安装软件包

添加仓库

或者,您可以直接执行以下步骤。

Debian Wheezy

apt-get install python-software-properties
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
add-apt-repository 'deb http://mirror3.layerjet.com/mariadb/repo/5.5/debian wheezy main'
apt-get update

Ubuntu Precise

apt-get install python-software-properties
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
add-apt-repository 'deb http://mirror3.layerjet.com/mariadb/repo/5.5/ubuntu precise main'
apt-get update

是的,它们几乎相同。🙂

安装软件包

(为不耐烦的人提供的另一个快捷方式)

DEBIAN_FRONTEND=noninteractive apt-get install -y rsync galera mariadb-galera-server

安装软件包后,每个节点上都会有一个正在运行的 MariaDB 服务器。但它们都没有被配置为在 MariaDB Galera 集群中作为节点运行。

配置 Galera

所以接下来我们需要做一些配置。有一个 MariaDB 配置部分和一个配置 Galera 的部分(以 wsrep_ 开头)。由于本 Howto 文档只进行最基本和简单的安装,您只需将 IP 地址(记住:172.16.8.5、172.16.8.6、172.16.8.4)替换为您的 IP 地址即可。
这将需要定义 wsrep_cluster_address 变量(一个启动中的 mysqld 联系以加入集群的节点列表)。

以下配置文件必须分发到所有节点上。我们使用一个独立的配置文件 /etc/mysql/conf.d/galera.cnf 并包含以下设置

[mysqld]
#mysql settings
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
#galera settings
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="my_wsrep_cluster"
wsrep_cluster_address="gcomm://172.16.8.5,172.16.8.6,172.16.8.4"
wsrep_sst_method=rsync

仅供参考:wsrep_provider 的共享库由已安装的 galera 软件包提供。

我们还可以通过更改 wserp_cluster_name 的值来更改集群名称,使其符合我们的风格。此设置也可用作控制集群访问的共享密钥。通过 wsrep_cluster_address,您可以看到我们设置的 IP 地址。wsrep_sst_method 指定用于同步节点的方法。虽然也有 mysqldumpxtrabackup 可用,但我更喜欢 rsync,因为它易于配置(即,它不需要在节点上设置任何凭据)。如果您考虑使用 xtrabackup 方法,别忘了安装 xtrabackup。

启动 Galera 集群

首先,我们在所有节点上停止 mysqld。

node01# service mysql stop
node02# service mysql stop
node03# service mysql stop

配置文件(galera.cnf)已经分发到所有节点,所以接下来我们启动第一个 mysqld。这个节点会初始化/启动集群(创建一个 GTID)。

node01# service mysql start --wsrep-new-cluster

为了查看是否一切正常,我们将检查集群大小状态变量。

node01# mysql -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 1            |
+--------------+

如果您看到以上输出,太棒了!这就是我们期望的结果。现在集群已经存在,我们让接下来的节点启动并加入集群即可。

node2# service mysql start
[ ok ] Starting MariaDB database server: mysqld . . . . . . . . . ..
[info] Checking for corrupt, not cleanly closed and upgrade needing tables..
node01:/home/debian# ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)

现在我们可以忽略上面的错误。这个节点仍然能正常启动。

让我们在这里暂停一下,快速检查。由于我们正在运行一个集群,因此在 node01node02 上执行以下命令并不重要。

mysql -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 2            |
+--------------+

如果您看到以上输出,非常好!现在让我们启动第三个节点

node3# service mysql start
[ ok ] Starting MariaDB database server: mysqld . . . . . . . . . ..
[info] Checking for corrupt, not cleanly closed and upgrade needing tables..
node03:/home/debian# ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)

node03# mysql -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 3            |
+--------------+

好的,我们完成了。我们有一个正在运行的 MariaDB Galera 集群 o/

玩转 Debian/Ubuntu init 脚本

但由于 Debian/Ubuntu 的一些特殊之处,我们必须修复一些问题。

还记得我们在启动 node02 和 node03 时看到的错误吗?发生了什么?嗯,Debian/Ubuntu 在它们的 init 脚本中使用了一个特殊用户('debian-sys-maint'@'localhost'),该用户的凭据存储在 /etc/mysql/debian.cnf 中。此用户用于在启动 MySQL 时进行一些检查。这些检查我认为根本就不应该放在服务脚本中。

我们可以简单地忽略它,但这个用户也被用来关闭 mysqld。这也不是必需的,因为发送 SIGTERM 信号就足以关闭 mysqld 了 :/

由于我们将数据从 node01 复制到了所有其他节点,node02node03 上的 /etc/mysql/debian.cnf 中的凭据不匹配。因此,我们无法关闭这两个节点上的 mysqld。

node02# service mysql stop
[FAIL] Stopping MariaDB database server: mysqld failed!

因此,我们必须通过将 /etc/mysql/debian.cnf 从第一个节点(node01)复制到所有其他节点来修复它。这样数据和配置文件就再次拥有相同的数据了。

之后,我们就能够关闭守护进程了

node02# service mysql stop
[ ok ] Stopping MariaDB database server: mysqld.

太好了。

所以如果我们有一个合适的 init 脚本,这份 Howto 文档就会更短 😉

关注这个 Bug 🙂

享受您的 MariaDB Galera 集群,玩得开心!

— Erkan Yanar

感谢 teuto.net 为我提供了一个 OpenStack 租户,以便我可以运行此 Howto 的测试。