介绍
群集通过将更改分发到不同的服务器,为您的数据库增加了高可用性。 如果其中一个实例失败,其他实例已可用于继续服务。
集群有两种通用配置,主动 - 被动和主动 - 主动。 在主动 - 被动群集中,所有写入都在单个活动服务器上完成,然后复制到一个或多个被动服务器,这些服务器只有在活动服务器发生故障时才会接管。 一些主动 - 被动群集也允许在被动节点上执行SELECT操作。 在主动 - 主动群集中,每个节点都是读写的,对一个节点进行的更改将复制到所有节点。
在本指南中,我们将配置一个主动 - 活动的MySQL Galera集群。 为了演示的目的,我们将配置和测试三个节点,最小的可配置集群。
先决条件
为了跟进,您将需要三个Ubuntu 16.04服务器,每个服务器具有:
- 最低1GB的RAM中 。 为您的数据集供应足够的内存是必不可少的,以防止性能退化和崩溃 。 集群的内存使用很难预测,所以一定要允许大量。
- 与非root用户
sudo
特权 - 专用网络 ,如果是提供给您。
一旦所有这些先决条件到位,我们就可以安装软件。
第1步 - 将Galera存储库添加到所有服务器
MySQL,修补包括Galera集群,不包括在默认的Ubuntu存储库,所以我们将开始通过添加由Galera项目维护的外部Ubuntu存储库到所有三个服务器。
注:Codership背后的公司Galera Cluster,维护该库,但并非所有的外部存储库是可靠的。 确保只从可信来源安装。
首先,我们需要添加的存储库密钥apt-key
命令,该命令的apt-get将用于验证该包是真实的。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 44B7345738EBDE52594DAD80D669017EBC19DDBA
一旦我们在每个服务器的数据库中拥有可信密钥,我们就可以添加存储库。 我们需要运行apt-get update
,以包括封装在新的仓库后体现:
sudo add-apt-repository 'deb [arch=amd64,i386] http://releases.galeracluster.com/ubuntu/ xenial main'
sudo apt-get update
您可能会看到一个警告,签名uses weak digest algorithm (SHA1)
有GitHub上一个开放的问题,解决这个 。 在此期间,可以继续。
一旦在所有三个服务器上更新了存储库,我们就可以安装MySQL和Galera。
第2步 - 在所有服务器上安装MySQL和Galera
在所有三台服务器上运行以下命令安装一个版本的MySQL修补程序与Galera,以及Galera和几个依赖关系:
sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6
在安装过程中,将要求您设置MySQL管理用户的密码。 无论您选择什么,一旦复制开始,此根密码将被第一个节点的密码覆盖。
我们应该拥有所有必要开始配置集群件,但由于我们将依托rsync
在后面的步骤,让我们确保它安装在所有这三个,以及..
sudo apt-get install rsync
这将确认的最新版本rsync
已经可用,或提示您升级或安装。
一旦我们在三个服务器的每一个上安装了MySQL,我们就可以开始配置。
第3步 - 配置第一个节点
集群中的每个节点都需要具有几乎相同的配置。 因此,我们将在我们的第一台机器上进行所有配置,然后将其复制到其他节点。
默认情况下,MySQL的配置检查/etc/mysql/conf.d
目录从截至获取其他配置设置.cnf
。 我们将在此目录中创建一个具有所有特定于集群的指令的文件:
sudo nano /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"
第一部分修改或再声称MySQL的设置,将允许群集正常工作。 例如,Galera Cluster不会的MyISAM或类似的非事务性存储引擎工作,
mysqld
不能绑定到的IP地址本地主机。 您可以了解Galera Cluster上进行更详细的设置系统配置页面 。在“加莱拉提供程序配置”部分配置,提供了一个写设置复制API MySQL的组件。 这意味着Galera在我们的情况下,因为Galera是一个wsrep(写集复制)提供程序。 我们指定常规参数以配置初始复制环境。 这不需要任何定制,但你可以了解更多有关加莱拉配置选项 。
在“加莱拉群集配置”部分定义集群,确定通过IP地址或可解析域名,为群集创建一个名字集群成员保证成员加入正确的组。 您可以更改
wsrep_cluster_name
的东西比更有意义test_cluster
或保留原样,但你必须更新wsrep_cluster_address
与三个服务器的地址。 如果您的服务器具有专用IP地址,请在此处使用。在“加莱拉同步配置”部分定义集群如何通信和同步成员之间的数据。 这仅用于在节点联机时发生的状态传输。 对于我们的初始设置,我们使用的是
rsync
,因为它是常用的和做什么,我们需要现在。在“加莱拉节点配置”部分明确了IP地址和当前服务器的名称。 这在尝试诊断日志中的问题以及以多种方式引用每个服务器时很有用。 该
wsrep_node_address
必须你在机器的地址相匹配,但你可以选择你,以帮助您识别在日志文件中的节点想要的任何名称。
当您对群集配置文件满意后,将内容复制到剪贴板中,保存并关闭文件。
接下来, /etc/mysql/my.cnf
设置绑定地址为127.0.0.1。 这必须按顺序注释掉为我们在我们的galera.cnf`文件中正确设置它..
sudo nano /etc/mysql/my.cnf
. . .
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
. . .
现在第一个服务器已配置,我们将继续到下两个节点。
第4步 - 配置剩余节点
在每个其余节点上,打开配置文件:
sudo nano /etc/mysql/conf.d/galera.cnf
粘贴到从第一个节点复制的配置中,然后更新“Galera节点配置”以使用您设置的特定节点的IP地址或可解析域名。 最后,更新其名称,您可以将其设置为任何帮助您标识日志文件中的节点:
. . .
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
. . .
保存并退出每个服务器上的文件。 我们需要注释掉这两个服务器上的绑定地址。
sudo nano /etc/mysql/my.cnf
. . .
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
. . .
我们几乎准备好启动集群,但在我们做之前,我们将确保相应的端口已打开。
第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步 - 启动集群
首先,我们需要停止正在运行的MySQL服务,以便我们的集群可以联机。
在所有三个服务器上停止MySQL:
在所有三个服务器上使用以下命令停止mysql,以便我们可以在集群中将它们备份:
sudo systemctl stop mysql
systemctl
不显示所有服务管理命令的结果,所以要确保我们成功了,我们将使用下面的命令:
sudo systemctl status mysql
如果最后一行看起来像下面这样,命令成功。
Output. . .
Sep 02 22:17:56 galera-02 systemd[1]: Stopped LSB: start and stop MySQL.
一旦我们关闭了mysql
所有的服务器,我们就可以继续进行。
启动第一个节点:
我们已经配置了集群的方式,即上线尝试连接到其指定的至少一个其他节点的每个节点galera.cnf
文件,以获取其初始状态。 一个正常的systemctl start mysql
将失败,因为那里是与连接第一个节点上运行任何节点,所以我们需要将传递wsrep-new-cluster
参数,我们开始第一个节点。 然而,无论是systemd
也service
将正确地接受--wsrep-new-cluster
在这个时候的说法 ,所以我们需要使用启动脚本启动的第一个节点/etc/init.d
。 一旦你做到了这一点,你就可以开始与其他节点systemctl.
注意:如果你喜欢他们都与启动systemd
,一旦你有另一个节点,你可以杀死初始节点。 由于第二个节点是可用的,当您重新启动第一个与sudo systemctl start mysql
它将能够加入到正在运行的集群
sudo /etc/init.d/mysql start --wsrep-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的MySQL服务器进行日常维护,例如作为特殊维护用户的日志循环。 当我们安装了MySQL,随机生成该用户的凭据,存储在/etc/mysql/debian.cnf
,并将其插入到MySQL的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加密。