在 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
指定用于同步节点的方法。虽然也有 mysqldump
和 xtrabackup
可用,但我更喜欢 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)
现在我们可以忽略上面的错误。这个节点仍然能正常启动。
让我们在这里暂停一下,快速检查。由于我们正在运行一个集群,因此在 node01
或 node02
上执行以下命令并不重要。
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
复制到了所有其他节点,node02
和 node03
上的 /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 的测试。
很棒的 howto,谢谢!
centOS/Red Hat 发行版呢?
你好 MeMo,
如果您对 CentOS 的 HOWTO 感兴趣,我们可能会在未来几天发布 🙂
谢谢这份 howto。
关于客户端/Connector J 方面我有两个问题
1) 您使用的是从 mysql.com 下载的标准 Java Connector 还是另一个特定的连接器?
2) 您是否需要使用例如
jdbc:mysql:loadbalance://192.168.4.104,192.168.4.103,192.168.4.102/testdb
作为数据库 URL 语法?还是您需要在集群前端设置一个虚拟 IP,驱动程序连接到该虚拟 IP?
谢谢,
Romain。
你好 Romain,
MariaDB 提供了自己的 LGPL 连接器:https://mariadb.com/kb/en/about-the-mariadb-java-client/
当然,Oracle 提供的标准 Connector/J 也应该能工作。
您提供的语法是正确的,但是它不检查节点故障,所以最好使用 SkySQL Maxscale 或 HAProxy 进行负载均衡。
对于 CentOS,可以使用 “yum install MariaDB-manager” 进行安装,但在 Ubuntu 中使用 “apt-get” :)。你们是否计划准备 MariaDB-manager 的安装包,以便简单地使用 “apt-get install MariaDB-Manager” 进行安装?
在 Debian Jessie 下,参数 “–wsrep-new-cluster” 似乎不起作用。为了解决这个问题,我使用 “wsrep_cluster_address = gcomm://” 启动了第一个服务器,换句话说,没有提供 IP 地址。在此状态下,我启动了下一个节点和第三个节点,它们都配置了所有三个 IP 地址。然后我在第一个节点上添加了 IP 地址,并重启了服务,瞧!可能有更正确的方法,但这对我奏效了。
我试了这个镜像,但它似乎离线了。使用 http://mirrors.n-ix.net/mariadb/repo/5.5/debian 则工作正常
只需将第 3 行替换为
add-apt-repository ‘deb http://mirrors.n-ix.net/mariadb/repo/5.5/debian wheezy main’
谢谢!
你好 Jan,
我在 3 个 Debian 8 节点上设置了 galera,但是,如果我重启 mysql,会收到关于绑定 0.0.0.0 的错误。
日志中没有错误,我该如何解决?
提前感谢