如何在Ubuntu上使用MariaDB的10.1配置Galera Cluster16.04服务器

介绍

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

集群有两种通用配置,主动 - 被动和主动 - 主动。 在主动 - 被动群集中,所有写入都在单个活动服务器上完成,然后复制到一个或多个被动服务器,这些服务器只有在活动服务器发生故障时才会接管。 一些主动 - 被动群集也允许在被动节点上执行SELECT操作。 在主动 - 主动群集中,每个节点都是读写的,对一个节点进行的更改将复制到所有节点。

在本指南中,我们将配置一个主动 - 活动的MariaDB Galera集群。 为了演示的目的,我们将配置和测试三个节点,最小的可配置集群。

先决条件

要跟进,您将需要:

一旦所有这些先决条件到位,我们就可以安装MariaDB。

第1步 - 将MariaDB 10.1储存库添加到所有服务器

MariaDB 10.1不包括在默认的Ubuntu存储库中,所以我们将首先将MariaDB项目维护的外部Ubuntu存储库添加到我们的三个服务器。

注:MariaDB的是一个受人尊敬的供应商,但并不是所有的外部存储库是可靠的。 确保只从可信来源安装。

首先,我们将添加与该MariaDB的存储库密钥apt-key命令,这容易将使用来验证包是真实的。

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

一旦我们在数据库中具有可信密钥,我们就可以添加存储库。 我们需要运行apt-get update ,以包括封装在新的仓库后体现:

sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.1/ubuntu xenial main'
sudo apt-get update

注意:您必须运行update添加库后。 否则,您将从Ubuntu软件包安装版本10.0,它不包含Galera软件包。

一旦在所有三个服务器上更新了存储库,我们就可以安装MariaDB。 有一点要注意的是MariaDB的,它最初是作为一简易替换为MySQL,因此在很多配置文件和启动脚本,你会看到mysql ,而不是mariadb 出于一致性的缘故,我们使用mysql本指南在任何可以工作。

第2步 - 在所有服务器上安装MariaDB

10.1版本开始,MariaDB的服务器和MariaDB的加莱拉Server软件包组合,所以安装mariadb-server会自动安装加莱拉和几个依赖关系:

sudo apt-get install mariadb-server

在安装过程中,将要求您设置MariaDB管理用户的密码。 无论您选择什么,一旦复制开始,此根密码将被第一个节点的密码覆盖。

我们应该拥有所有必要开始配置集群件,但由于我们将依托rsync在后面的步骤,让我们确保它的安装。

sudo apt-get install rsync

这将确认的最新版本rsync已经可用,或提示您升级或安装。

一旦我们在三台服务器上安装了MariaDB,我们就可以开始配置了。

第3步 - 配置第一个节点

集群中的每个节点都需要具有几乎相同的配置。 因此,我们将在我们的第一台机器上进行所有配置,然后将其复制到其他节点。

默认情况下,MariaDB的配置检查/etc/mysql/conf.d目录从截至获取其他配置设置.cnf 我们将在此目录中创建一个具有所有特定于集群的指令的文件:

sudo nano /etc/mysql/conf.d/galera.cnf

将以下配置复制并粘贴到文件中。 您将需要更改以红色突出显示的设置。 我们将解释每个部分的含义如下。

/etc/mysql/conf.d/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_ip,second_ip,third_ip"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
  • 第一部分修改或再断言MariaDB的/ MySQL的设置,将允许群集正常工作。 例如,Galera Cluster不会的MyISAM或类似的非事务性存储引擎工作, mysqld不能绑定到的IP地址本地主机。 您可以了解Galera Cluster上进行更详细的设置系统配置页面

  • 在“加莱拉提供程序配置”部分配置,提供了一个写集复制的API MariaDB的组件。 这意味着Galera在我们的情况下,因为Galera是一个wsrep(WriteSet复制)提供程序。 我们指定常规参数以配置初始复制环境。 这不需要任何定制,但你可以了解更多有关加莱拉配置选项

  • 在“加莱拉群集配置”部分定义集群,确定通过IP地址或可解析域名,为群集创建一个名字集群成员保证成员加入正确的组。 您可以更改wsrep_cluster_name的东西比更有意义test_cluster或保留原样,但你必须更新wsrep_cluster_address与三个服务器的地址。 如果您的服务器具有专用IP地址,请在此处使用。

  • 在“加莱拉同步配置”部分定义集群如何通信和同步成员之间的数据。 这仅用于在节点联机时发生的状态传输。 对于我们的初始设置,我们使用的是rsync ,因为它是常用的和做什么,我们需要现在。

  • 在“加莱拉节点配置”部分明确了IP地址和当前服务器的名称。 这在尝试诊断日志中的问题以及以多种方式引用每个服务器时很有用。 wsrep_node_address必须你在机器的地址相匹配,但你可以选择你,以帮助您识别在日志文件中的节点想要的任何名称。

当您对群集配置文件满意后,将内容复制到剪贴板中,保存并关闭文件。

第4步 - 配置剩余节点

在每个其余节点上,打开配置文件:

sudo nano /etc/mysql/conf.d/galera.cnf

粘贴到从第一个节点复制的配置中,然后更新“Galera节点配置”以使用您设置的特定节点的IP地址或可解析域名。 最后,更新其名称,您可以将其设置为任何帮助您标识日志文件中的节点:

/etc/mysql/conf.d/galera.cnf
. . .
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
. . .

保存并退出每个服务器上的文件。 我们几乎准备好启动集群,但在我们做之前,我们将确保相应的端口已打开。

第5步 - 在每个服务器上打开防火墙

在每个服务器上,让我们检查防火墙的状态:

sudo ufw status

在这种情况下,只允许SSH通过:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

由于在这种情况下只允许ssh流量,我们需要为MySQL和Galera流量添加规则。 如果我们尝试启动集群,我们将失败,因为防火墙规则。

Galera可以使用四个端口:

  • 3306对于使用mysqldump方法的MySQL客户端连接和状态快照传输。
  • 4567对于Galera群集复制流量,组播复制在此端口上同时使用UDP传输和TCP。
  • 4568用于增量状态传输。
  • 4444用于所有其他状态快照传输。

在我们的示例中,当我们进行设置时,我们将打开所有四个端口。 一旦我们确认复制正常,我们就要关闭我们实际上没有使用的任何端口,并将流量限制在集群中的服务器。

使用以下命令打开端口:

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

注:根据还有什么是你的服务器上运行,你可能想限制访问的时候了。 UFW要领:通用防火墙规则和命令指南可以帮助这一点。

第6步 - 启动集群

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

在所有三个服务器上停止MariaDB:

在所有三个服务器上使用以下命令停止mysql,以便我们可以在集群中将它们备份:

sudo systemctl stop mysql

systemctl不显示所有服务管理命令的结果,所以要确保我们成功了,我们将使用下面的命令:

sudo systemctl status mysql

如果最后一行看起来像下面这样,命令成功。

Output . . . 
Aug 19 02:55:15 galera-01 systemd[1]: Stopped MariaDB database server.

一旦我们关闭了mysql所有的服务器,我们就可以继续进行。

启动第一个节点:

要启动第一个节点,我们需要使用一个特殊的启动脚本。 我们已经配置了集群的方式,即上线尝试连接到其指定的至少一个其他节点的每个节点galera.cnf文件,以获取其初始状态。 如果不使用galera_new_cluster脚本,让systemd传递的--wsrep-new-cluster参数,一个正常systemctl start mysql因为有与连接第一个节点上运行任何节点会失败。

sudo galera_new_cluster

当此脚本成功时,该节点将注册为集群的一部分,我们可以使用以下命令查看它:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

在其余的节点上,我们就可以开始mysql正常进行。 他们将搜索在线的集群列表的任何成员,因此当他们找到一个集群时,他们将加入集群。

打开第二个节点:

启动mysql

sudo systemctl start mysql

我们应该看到每个节点上线时我们的集群规模增加:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

启动第三个节点:

启动mysql

sudo systemctl start mysql 

如果一切运行良好,群集大小应设置为三:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

此时,整个集群应该在线并进行通信。 然而,在我们测试复制之前,还有一个配置细节要注意。

第7步 - 配置Debian维护用户

目前,Ubuntu和Debian的MariaDB服务器进行日常维护,例如作为特殊维护用户的日志循环。 当我们安装MariaDB的,随机生成该用户的凭据,存储在/etc/mysql/debian.cnf ,并插入到MariaDB的的mysql数据库。

当我们提出了我们的群集,从第一节点的密码被复制到其他节点,所以在值debian.cnf不再匹配在数据库中的口令。 这意味着使用维护帐户的任何东西将尝试使用配置文件中的密码连接到数据库,并且除第一个节点之外的所有节点都将失败。

要纠正这一点,我们将我们的第一个节点的复制debian.cnf到其余节点。

从第一个节点复制:

打开debian.cnf用文本编辑器文件中:

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

尽管在文件的顶部有警告说“不要Touch!”,我们需要使集群的更改工作。 您可以自信地删除当前信息并粘贴第一个节点配置中的内容。 他们应该是完全一样的现在。 保存并关闭文件。

更新第三个节点:

在第三个节点上,打开同一个文件:

sudo nano /etc/mysql/debian.cnf

删除当前信息并粘贴第一个节点配置中的内容。 保存并关闭文件。

这种不匹配不会影响我们测试复制的能力,但最好尽早处理,以避免以后出现故障。

注意:你完成之后,你可以测试维护帐户能够从当地提供的密码连接debian.conf如下:

sudo cat /etc/mysql/debian.cnf

从输出中复制密码。 然后连接到mysql

mysql -u debian-sys-maint -p

在提示时,提供您复制的密码。 如果你可以连接,一切都很好。

如果不是,验证文件中的密码与第一个节点相同,然后替换以下:

update mysql.user set password=PASSWORD('password_from_debian.cnf') where User='debian-sys-maint';

重复以测试其余节点。

第8步 - 测试复制

我们已经完成了这一步,以便我们的集群可以执行从任何节点到任何其他节点的复制,称为主动 - 主动或主 - 主复制。 让我们测试看看复制是否按预期工作。

写入第一个节点:

我们将首先在第一个节点上进行数据库更改。 下面的命令将创建一个数据库名为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");'

我们现在在表中有一个值。

在第二个节点上读写:

接下来,我们将查看第二个节点以验证复制是否正常:

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

如果复制正在工作,我们在第一个节点上输入的数据将在第二个节点上可见:

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

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

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

在第三节点上的读写:

从第三个节点,我们可以通过查询再次读取所有这些数据:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Output   +----+-------+-------+--------+
   | id | type  | quant | color  |
   +----+-------+-------+--------+
   |  1 | slide |     2 | blue   |
   |  2 | swing |    10 | yellow |
   +----+-------+-------+--------+

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

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

在第一个节点上读取:

回到第一个节点,我们可以验证我们的数据在任何地方都可用:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Output   +----+--------+-------+--------+
   | id | type   | quant | color  |
   +----+--------+-------+--------+
   |  1 | slide  |     2 | blue   |
   |  2 | swing  |    10 | yellow |
   |  3 | seesaw |     3 | green  |
   +----+--------+-------+--------+

我们测试了我们可以写到所有的节点,并且正在正确执行复制。

结论

在这一点上,您应该有一个工作的三节点Galera测试集群配置。 如果您计划在生产环境中使用Galera集群,建议您从至少五个节点开始。

生产使用之前,你可能想看看一些的其他状态快照传输(SST)的代理商 ,如“xtrabackup”,它允许您设置新的节点非常迅速,没有大的中断到活动节点。这并不影响实际复制,但是当节点被初始化时是一个问题。

最后,如果你的群集成员都没有在专用网络上,您还需要建立SSL来保护您的数据在服务器之间移动。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏