介绍
集群通过将更改分发到不同服务器来增加数据库的高可用性,如果其中一个实例失败,就其他实例很快就可以继续服务。
集群有两个一般的配置,主动被动和主动主动,在活动的被动集群中,所有写入都是在一个活动服务器上完成的,然后复制到一个或多个被动服务器,一些主动被动集群还允许被动节点上的SELECT
操作,在活动活动集群中,每个node都被读写,并且对一个的更改将复制到。
MySQL数据库是一个开源关系数据库管理系统,它是SQL数据库,加莱拉是一个数据库集群解决方案,允许你使用同步复制来设置多个主集群,Galera自动处理保持不同节点上的数据的同步,同时允许你向集群中的节点发送读写查询,你可以在官方网站上了解更多关于Galera的信息文档页面。
在本指南中,你将配置一个活动的MySQL Galera集群,为了进行演示,你将配置,并测试三个将在集群中充当节点的Ubuntu 18.04 液滴,这个节点的数量是最小的可配置集群。
前提条件
除了以下步骤之外,还需要一个digitalOcean帐户:
sudo
权限的非根用户,sudo
权限设置非root用户的帮助,请遵循我们的初始Server Setup,Ubuntu 18.04教程虽然本教程中的步骤已经针对DigitalOcean lot进行了编写和测试,但是其中大部分步骤也适用于启用了私有网络的non-DigitalOcean服务器。
步骤1 —将MySQL存储库添加到所有服务器
在这个步骤中,你将把相关的MySQL和Galera软件包库添加到你的三个服务器中,以便能够安装本教程中所使用的MySQL和Galera的正确版本。
注:galera集群后面的公司编码维护Galera存储库,但请注意并非所有外部存储库都可靠,确保仅从可靠来源代码安装。
在本教程中,你使用MySQL版本5.7,首先,将Galera项目维护的外部Ubuntu存储库添加到所有三个服务器。
在所有三个服务器上更新存储库之后,就可以与Galera一起安装MySQL了。
首先,在所有三个服务器上,使用apt-key
命令添加Galera存储库密钥,APT包管理器使用该密钥来验证包是否可信:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
几秒钟后,你将收到以下输出:
Output
Executing: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBA gpg: key D669017EBC19DDBA: public key "Codership Oy " imported gpg: Total number processed: 1 gpg: imported: 1
一旦在每个服务器的数据库中有了可信密钥,就可以添加存储库,为此,在每台服务器上的galera.list
/etc/apt/sources.list.d/
目录中创建一个新文件:
sudo nano /etc/apt/sources.list.d/galera.list
在文本编辑器中,添加以下行,这将使APT package manager可以使用适当的存储库:
/etc/apt/sources.list.d/galera
deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu bionic main
deb http://releases.galeracluster.com/galera-3/ubuntu bionic main
保存,并关闭每个服务器上的文件(按CTRL +X
,Y
,然后按ENTER
)。
Codership存储库现在可用于所有三个服务器,然而,你需要指导apt
更喜欢它他的Codership库,以确保它安装了软件的修补版本,为此,在每个服务器的/etc/apt/preferences.d/
目录中创建另一个galera.pref
的新文件:
sudo nano /etc/apt/preferences.d/galera.pref
将以下行添加到文本编辑器:
/etc/apt/preferences.d/galera
# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001
保存,并关闭该文件,然后在每台服务器上运行以下命令,以便包括来自新存储库的软件包清单:
sudo apt update
现在你已经成功地在所有三个服务器上添加了包存储库,接下来可以在下一节安装MySQL。
步骤2 —在所有服务器上安装MySQL
在此步骤中,你将在三个服务器上安装MySQL包。
在所有三个服务器上运行以下命令,以安装修补过的MySQL版本,以便与Galera以及Galera包一起使用。
sudo apt install galera-3 mysql-wsrep-5.7
你被要求确认是否要继续安装,输入Y
以继续安装,在安装期间,还会要求你为MySQL管理用户设置密码,设置强密码,并按ENTER
继续。
安装MySQL后,你将禁用默认的AppArmor配置文件,以确保Galera正常工作,官方Galera文档,服装是Linux的内核模块,通过安全配置文件为服务提供访问控制功能。
通过在每个服务器上执行以下命令禁用AppArmor:
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
此命令将MySQL配置文件的符号链接添加到disable
目录,在引导时禁用配置文件。
然后,运行以下命令删除已经在内核中加载的MySQL定义。
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
安装MySQL,并禁用第一个服务器上的AppArmor配置文件后,对其他两个服务器重复这些步骤。
现在你已经成功地在三个服务器上安装了MySQL,接下来可以在下一节继续配置步骤。
步骤3 —配置第一个node
在这一步中,将配置你的第一个,集群中的每个节点都需要有几乎相同的配置,因此,你将在第一台机器上完成所有配置,然后将其复制到其他节点。
默认情况下,MySQL配置为检查/etc/mysql/conf.d
目录以从以.cnf
结尾的文件中获取其他配置设置,在你的第一台服务器上,用所有特定于集群的指令在此目录中创建一个文件:
sudo nano /etc/mysql/conf.d/galera.cnf
将以下配置添加到文件中,配置指定了不同的集群选项,关于当前服务器和集群中其他服务器的详细信息,以及复制相关的设置,注意,配置中的IP地址是你各自服务器的专用地址;用适当的IP地址替换突出显示的行。
/etc/mysql/conf./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_Node_IP,Second_Node_IP,Third_Node_IP"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
mysqld
不能绑定到localhost
的IP地址,你可以在Galera集群中更详细地了解这些设置系统配置页面wsrep_cluster_name
更改为比test_cluster
更有意义或保留它的内容,但是必须使用你的三个服务器的专用IP地址更新wsrep_cluster_address
Galera Synchronization Configuration
部分定义了集群如何在成员之间通信和同步数据,这只用于在节点联机时发生的状态转移,对于的初始设置, 使用rsync
,因为它通常是可用的,现在你需要它Galera Node Configuration
部分阐明了IP地址和当前服务器的名称,当尝试诊断日志中的问题,并且以多种方式引用每个服务器时,这很有用,wsrep_node_address
必须与所在的计算机的地址匹配,但可以选择名称以帮助你识别日志文件中的node如果对集群配置文件满意,请将内容复制到剪贴板,然后保存,并关闭该文件。
现在已经成功配置了第一个node,接下来你可以继续配置下一节中的其余节点。
步骤4 —配置其余节点
在此步骤中,将配置其余两个节点,在第二个node上,打开配置文件:
sudo nano /etc/mysql/conf.d/galera.cnf
粘贴到从第一个node复制的配置中,然后更新Galera Node Configuration
以使用 设置的特定node的IP地址或可解析域名,最后,更新它的名称,可以将它设置为帮助你识别日志文件中的node:
. . .
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
. . .
保存,并退出文件。
完成这些步骤后,在第三个node上重复这些步骤。
你几乎准备好启动集群,但在执行之前,请确保在防火墙中打开了适当的端口。
步骤5 —在每个服务器上打开防火墙
在此步骤中,将配置防火墙,以便打开内部节点通信所需的端口,在每台服务器上,运行以下命令检查防火墙的状态:
sudo ufw status
在这种情况下,只有SSH允许通过:
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)
由于这里只允许使用SSH流量,所以你需要为MySQL和Galera流量添加规则,如果你尝试启动集群,它将会,因为这些防火墙规则而失败。
Galera可以使用四个端口:
3306
和使用mysqldump
方法的状态快照传输在本例中,你将在安装时打开所有4个端口,确认复制正常工作之后,你需要关闭没有实际使用,并限制集群中服务器的端口。
使用以下命令打开端口:
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
注:根据服务器上 运行的其他程序,你可能希望立即限制访问,UFW Essentials:通用防火墙规则和命令指南可以帮助你。
在第一个node上配置防火墙之后,在第二个和第三个node上创建相同的防火墙设置。
现在已经成功配置了防火墙,接下来就可以在下一步中启动集群了。
步骤6 —启动集群
在此步骤中,你将启动MySQL Galera集群,但是,首先,你将启用MySQL systemd
服务,以便在服务器重新启动时自动启动MySQL。
允许MySQL在所有三个服务器上引导时启动
在所有三个服务器上使用以下命令来启用MySQL systemd
服务:
sudo systemctl enable mysql
你将看到以下输出,它显示了服务已成功链接到启动服务列表:
Output
Created symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.
既然已经启用了mysql
在所有服务器上引导时启动,就可以开始启动集群了。
打开第一个node
要启动第一个node,你需要使用一个特殊的启动脚本,配置集群的方式,每个联机的node将尝试连接到其galera.cnf
状态中指定的至少一个其他node来获取其初始状态,通过使用允许systemd
传递--wsrep-new-cluster
参数的mysqld_bootstrap
脚本,正常的systemctl start mysql
会失败,因为第一个node没有运行节点。
在第一个服务器上运行以下命令:
sudo mysqld_bootstrap
此命令在成功执行时不会显示输出,此脚本成功后,node将作为集群的一部分注册,通过以下命令看到它:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
输入密码后,你将看到以下输出,指示集群中有一个node:
Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+
在其余节点上,你可以正常启动,他们将搜索在线集群列表的成员,当他们找到一个成员时,他们会Join集群。
打开第二个node
现在你可以打开第二个,启动mysql
:
sudo systemctl start mysql
成功执行时不显示输出,你将看到当每个node联机时,集群大小会增加:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
你将看到以下输出指示第二个node已加入了集群,并且有两个节点总共有两个节点。
Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
打开第三个node
现在是时候提出第三个node了,启动mysql
:
sudo systemctl start mysql
运行以下命令查找集群大小:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
你将看到以下输出,表明第三个node已经加入集群,并且集群中的节点总数是3.
Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+
此时,整个集群处于联机状态,并成功通信,接下来,通过在以下部分中测试复制来确保工作设置。
步骤7 —测试复制
你已经完成了到这个的步骤,以便集群能够从node执行复制到其他node (称为主动活动复制),在此步骤中,你将测试复制是否按预期工作。
写入第一个node
首先,在第一个node上进行数据库更改,以下命令将创建一个名为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");'
在前面的命令中,CREATE DATABASE
语句创建一个叫playground
的数据库,CREATE
语句在playground
数据库中创建一个名为equipment
的表,这个表有一个名为id
和其他列的自动递增标识符列,定义type
列,quant
列和color
列,分别存储设备的类型,数量和颜色,INSERT
语句插入类型为slide
,数量2
和颜色blue
的条目。
现在你的表中有一个值。
在第二个node上读写
接下来,查看第二个node以验证复制是否正常工作:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
在第一个node上输入的数据在第二个上可见,证明复制工作正常:
Output
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+
从相同的node中,将数据写入集群:
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
在第三个node上读写
从第三个node中,通过再次查询该表来读取所有这些数据:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
你将看到下面显示两行的输出:
Output
+----+-------+-------+--------+ | id | type | quant | color | +----+-------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | +----+-------+-------+--------+
同样,你可以从此node中添加另一个值:
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'
在第一个node上阅读
回到第一个node,可以验证你的数据是否随处可用:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
将看到以下输出,指示第一个node上的行可用。
Output
+----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | | 3 | seesaw | 3 | green | +----+--------+-------+--------+
现在已经成功验证,你可以向所有节点写入,并正确执行复制。
结论
此时,你已经配置了3个节点Galera测试集群,如果计划在生产环境中使用,集群,建议你从不小于5个节点开始。
在使用生产之前,需要查看一些其他状态快照传输(sst )代理,比如xtrabackup,它允许你快速设置新的节点,并且没有大量中断,这不会影响实际复制,但在初始化节点时是一个问题。
可能还对MySQL的其他集群解决方案感兴趣,在这种情况下,你可以查看如何在ubuntu18.04上创建多节点MySQL集群教程,如果要尝试托管数据库解决方案,请参见digitalOcean Managed Databases文档。