帮酷LOGO
0 0 评论

正文
文章标签:Balance  Proxy  Ubuntu  load-balance  负载均衡(Load Balancer)  

介绍

proxySQL是开源MySQL代理服务器,意味着它充当MySQL服务器和访问它数据库的应用程序之间的中介,ProxySQL可以通过在多个数据库服务器的池之间分配流量来提高性能,还可以通过在一个或多个数据库服务器发生故障时自动故障转移到备用数据库来提高可用性。

在本指南中,你将把ProxySQL设置为多个有自动故障转移的MySQL服务器的负载平衡器 ,例如,本教程使用了3个MySQL服务器的多主复制集群,但是你也可以使用类似的方法与其他集群配置一起使用。

前提条件

要遵循本教程,你需要:

按照此初始Ubuntu 16.04服务器安装教程建立一台Ubuntu 16.04服务器,包括sudo非root用户和防火墙,服务器将成为你的ProxySQL实例。

配置了3个MySQL服务器以形成多主复制组,按照如何在Ubuntu 16 04上配置MySQL组复制方式设置,在"选择单主或多主"部分中,按照多重主复制组的说明进行操作。

步骤1-安装ProxySQL

ProxySQL开发人员在他们的GitHub发布页面上提供了官方所有ProxySQL版本的Ubuntu包,因此我们从那里下载最新的包版本,并且安装它。

你可以找到最新的软件包发布列表 ,命名约定是 proxysql_version-distribution.debversion是类似于1.4.4版本的字符串,distribution是一个类似于64-bit Ubuntu 16.04的ubuntu16_amd64类似的字符串。

下载最新的官方软件包,该软件包在写入/tmp目录时是1.4.4.


cd /tmp
curl -OL https://github.com/sysown/proxysql/releases/download/v1.4.4/proxysql_1.4.4-ubuntu16_amd64.deb

-i标志表示我们希望从指定的文件中安装。


sudo dpkg -i proxysql_*

此时,你不再需要.deb文件,因此你可以删除它。


rm proxysql_*

接下来,我们需要一个MySQL客户端应用程序以连接到ProxySQL实例,这是因为ProxySQL在内部使用MySQL兼容接口执行管理任务,使用mysql命令行工具,它是Ubuntu存储库中可用的mysql-client包的一部分。

更新软件包库以确保得到最新的预绑定版本,然后安装mysql-client包。


sudo apt-get update
sudo apt-get install mysql-client

你现在有运行ProxySQL的所有要求,但是该服务在安装后,不会自动启动,因此请立即手动启动。


sudo systemctl start proxysql

ProxySQL现在应使用其默认配置运行,你可以使用systemctl进行检查。


systemctl status proxysql

输出将类似于以下内容:


Output● proxysql.service - LSB: High Performance Advanced Proxy for MySQL
 Loaded: loaded (/etc/init.d/proxysql; bad; vendor preset: enabled)
 Active: active (running) since Thu 2017-12-21 19:19:20 UTC; 5s ago
 Docs: man:systemd-sysv-generator(8)
 Process: 12350 ExecStart=/etc/init.d/proxysql start (code=exited, status=0/SUCCESS)
 Tasks: 23
 Memory: 30.9M
 CPU: 86ms
 CGroup: /system.slice/proxysql.service
 ├─12355 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql
 └─12356 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql


一个 active (running) 行表示ProxySQL已安装并正在运行。

接下来,我们通过设置用于访问ProxySQL的管理界面的密码来提高安全性。

步骤2-设置ProxySQL管理员密码

首次启动新的ProxySQL安装时,它将使用程序包提供的配置文件来初始化它所有配置变量的默认值,初始化之后,ProxySQL将它配置存储在数据库中,通过命令行进行管理和修改。

要在ProxySQL中设置管理员密码,我们连接到该配置数据库,并且更新相应的变量。

首先,访问管理接口,将提示你输入密码,在默认安装中是admin


mysql -u admin -p -h 127.0.0.1 -P 6032 --prompt='ProxySQLAdmin> '

-u指定要连接的用户,这里是管理员,这是管理任务(比如,更改配置设置)的默认用户,-h 127.0.0.1告诉mysql连接到本地ProxySQL实例,因为ProxySQL不监听mysql默认的套接字文件,所以我们需要明确地定义它,-P指定要连接的端口,ProxySQL接口的管理在6032上监听,--prompt是一个可选标志,它更改默认提示,通常为mysql> ,在这里,我们将其改为 ProxySQLAdmin> 为了明确说明我们已连接到ProxySQL管理界面,当我们还将连接到复制的数据库服务器上的MySQL接口时,这将有助于避免混淆,

连接后,你将看到ProxySQLAdmin>提示符:


ProxySQL administration console promptWelcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 2
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

ProxySQLAdmin>

通过在global_variables数据库中更新(UPDATE )admin-admin_credentials配置变量更改管理帐户密码,记住要更改 password 在下面的命令中键入你所选择的安全密码。


UPDATE global_variables SET variable_value='admin:password' WHERE variable_name='admin-admin_credentials';


OutputQuery OK, 1 row affected (0.00 sec)

由于ProxySQL的配置系统的工作原理,这个更改不会立即生效,它由三个独立的层组成:


LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;

这些admin命令只处理与管理命令行接口相关的变量,ProxySQL公开类似的命令,比如,mysql,来处理其配置的其他部分,我们将在本教程的后面使用。

现在已安装ProxySQL,并且以新的管理员密码运行,设置3个MySQL节点,以便ProxySQL可以监控它们,保持ProxySQL接口保持打开状态,因为稍后使用它。

步骤3-在MySQL中配置监控

ProxySQL需要与MySQL节点进行通信才能评估它状况,为此,它必须能够使用专用用户连接到每个服务器。

在这里,我们在MySQL节点上配置必要的用户,并安装其他SQL功能,以允许ProxySQL查询组复制状态。

因为MySQL组复制已经运行,所以必须只在组的单个成员上执行以下步骤。

在第二个终端中,用一个MySQL节点登录到一个服务器。


ssh sammy@your_mysql_server_ip_1

下载包含一些必需功能的SQL文件,以便让ProxySQL组复制支持正常工作。


curl -OL https://gist.github.com/lefred/77ddbde301c72535381ae7af9f968322/raw/5e40b03333a3c148b78aa348fd2cd5b5dbb36e4d/addition_to_sys.sql

你可以使用less addition_to_sys.sql查看文件的内容。

准备好后,执行文件中的命令。 你将被提示输入MySQL管理密码,


mysql -u root -p < addition_to_sys.sql

如果命令成功运行,则不会产生输出,在这种情况下,所有MySQL节点现在都将公开ProxySQL识别组复制状态所需的功能。

接下来,我们必须创建一个专用用户,ProxySQL将使用该用户来监控实例的运行状况。

打开MySQL交互式提示,它将提示你再次输入root密码。


mysql -u root -p

然后创建专用用户monitor ,请务必将密码更改为安全密码。


CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitorpassword';

授予用户权限查询服务器的MySQL状态到monitor用户。


GRANT SELECT on sys.* to 'monitor'@'%';

最后,应用更改。


FLUSH PRIVILEGES;

由于组复制,一旦将用于运行状况监控的用户添加到一个MySQL节点上,它将在所有三个节点上完全配置。

接下来,我们需要使用该用户的信息更新ProxySQL,以便它可以访问MySQL节点。

步骤4-在ProxySQL中配置监控

要在监控节点时配置ProxySQL以便使用新用户帐户,我们UPDATE配置适当的配置变量,这与我们在步骤2.中设置管理员密码的方式非常相似。

回到ProxySQL管理界面,将mysql-monitor_username变量更新为新帐户的用户名。


UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';

这次,注意使用mysql代替admin来更新这些变量,因为我们正在修改MySQL配置变量。


LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

监控帐户已在所有端点上配置,下一步是告诉ProxySQL有关节点本身的信息。

步骤5-将MySQL节点添加到ProxySQL Server池

为了使ProxySQL知道三个MySQL节点,我们需要告诉ProxySQL如何在它们的主机组(即指定的节点集)之间分配它们,每个主机组都由一个正数来标识,如12 ,使用ProxySQL查询路由时,主机组可以将不同的SQL查询路由到不同的主机集。

在静态复制配置中,可以任意设置主机组,但是,ProxySQL的组复制支持会自动将复制组中的所有节点划分为四个逻辑状态:

writer,它是可以接受更改数据的查询的MySQL节点,ProxySQL确保将所有主节点保持在该组中的最大定义数量之内,
backup writer,也是可以接受更改数据的查询的MySQL节点,然而,这些节点没有被指定为writer; 超过定义的维护writer数量的主节点被保留在本组中,如果writer失败,则提升为writer,
reader是不能接受查询更改数据的MySQL节点,应该作为只读节点使用,ProxySQL仅在这里放置从属节点,
offline,适用于由于缺乏连接性或流量缓慢等问题而出现异常的节点。

每种状态都有相应的主组,但是数字组标识符没有自动分配。

在这里,使用1为offline组2writer组,3作为 reader 组,4为backup writer组。

若要设置这些标识符,请在mysql_group_replication_hostgroups配置表中创建有这些变量和值的新行。


INSERT INTO mysql_group_replication_hostgroups (writer_hostgroup, backup_writer_hostgroup, reader_hostgroup, offline_hostgroup, active, max_writers, writer_is_also_reader, max_transactions_behind) VALUES (2, 4, 3, 1, 1, 3, 1, 100);

这些是在此行中设置的其他变量,以及每个变量的作用:

active设置为1,可以监控这些主机组的ProxySQL ,max_writers定义了多少节点可以作为写入器,我们在这里使用3,因为在多个主要配置中,所有节点都可以处理,所以使用3 (节点的总数),writer_is_also_reader设置为1,指示ProxySQL将writer视为reader,max_transactions_behind在将node分类为脱机之前设置延迟事务的最大数目,

现在ProxySQL知道如何在主机组之间分配节点,我们可以将MySQL服务器添加到池中,为此,我们需要将每个服务器的IP地址和初始主机组分成表,其中包含服务器ProxySQL 。

在下面的命令中添加三个MySQL服务器,确保替换这些命令中的例子IP地址。


INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.1', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.2', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.3', 3306);

这里,2值将所有这些节点初始化为writer,而3306设置默认的MySQL端口。

和以前一样,将这些更改迁移到运行时并将它们保存到磁盘中,以便让更改生效。


LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

ProxySQL现在应该按照指定的那样在主机组之间分配节点,通过对runtim330e_mysql_servers表执行SELECT查询来检查,它公开了服务器ProxySQL正在使用的当前状态。


SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;


Output+--------------+-------------+--------+
| hostgroup_id | hostname | status |
+--------------+-------------+--------+
| 2 | 203.0.113.1 | ONLINE |
| 2 | 203.0.113.2 | ONLINE |
| 2 | 203.0.113.3 | ONLINE |
| 3 | 203.0.113.1 | ONLINE |
| 3 | 203.0.113.2 | ONLINE |
| 3 | 203.0.113.3 | ONLINE |
+--------------+-------------+--------+
6 rows in set (0.01 sec)

在结果表中,每个服务器列出两次: 每个主机组ID 23,表示所有3个节点都是writer和reader,所有节点都标记为ONLINE,表示它们已准备好使用。

然而,在使用它们之前,我们必须配置用户凭据来访问每个node的MySQL数据库。

步骤6 - 创建MySQL用户

ProxySQL充当负载平衡器; 最终用户连接到ProxySQL,然后ProxySQL将该连接依次传递到所选的MySQL节点,为了连接到单个节点,ProxySQL重用了它使用的凭据。

为了允许访问位于复制节点上的数据库,我们需要创建一个有与ProxySQL相同的凭据的用户帐户,并向该用户授予必要的权限。

和步骤3一样,必须只在组的单个成员上执行以下步骤,你可以选择任何一个成员。

创建一个叫playgrounduser的新用户,用密码playgroundpassword标识。


CREATE USER 'playgrounduser'@'%' IDENTIFIED BY 'playgroundpassword';

为完全访问playground测试数据库提供权限,从原始组复制教程


GRANT ALL PRIVILEGES on playground.* to 'playgrounduser'@'%';

然后应用更改并退出提示。


FLUSH PRIVILEGES;
EXIT;

通过直接在node上尝试使用新配置的凭证来验证用户是否已经正确地创建了该用户。

使用新用户打开MySQL接口,该界面将提示你输入密码。


mysql -u playgrounduser -p

登录后,在playground数据库上执行测试查询。


SHOW TABLES FROM playground;


Output+----------------------+
| Tables_in_playground |
+----------------------+
| equipment |
+----------------------+
1 row in set (0.00 sec)

显示在原始复制教程中创建的equipment表的表中表的可见列表确认用户已在节点上正确创建。

现在可以从MySQL接口断开,但是要保持终端与服务器打开,使用它在最后的步骤中运行测试。


EXIT;

现在我们需要在ProxySQL服务器中创建相应的用户。

步骤7-创建ProxySQL用户

最终配置步骤是允许ProxySQL与playgrounduser用户连接,并将这些连接传递给节点。

为此,我们需要在mysql_users表中设置配置变量,该表包含用户凭据信息,在ProxySQL接口中,将用户名。密码和默认主机组添加到配置数据库(作为编写器组的2 ),


INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('playgrounduser', 'playgroundpassword', 2);

将配置迁移到运行时,并且保存到磁盘以便让新配置生效。


LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

为了验证我们是否可以使用这些凭据连接到数据库节点,请打开另一个终端窗口,并通过SSH到ProxySQL服务器,我们以后仍然需要管理提示,所以不要关闭它。


ssh sammy@your_proxysql_server_ip

ProxySQL监听传入客户端连接的端口6033,因此尝试使用playgrounduser和端口6033连接实际的数据库(不是管理界面),你将提示你输入密码,这是示例中的playgroundpassword


mysql -u playgrounduser -p -h 127.0.0.1 -P 6033 --prompt='ProxySQLClient> '

这里,我们提示设置为ProxySQLClient>,以便可以将它与管理界面提示区分开来,我们将在测试最终配置时使用。

提示应打开,这意味着凭据已被ProxySQL本身接受。


ProxySQL client promptWelcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 31
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

ProxySQLClient>

执行一个简单的语句来验证ProxySQL是否将连接到其中一个节点,这个命令查询数据库的主机名,并返回服务器主机名作为惟一的输出。


SELECT @@hostname;

根据配置,该查询应由ProxySQL向我们分配给编写器主机组的三个节点中的一个,输出应类似于下面的内容,其中 member1 是一个MySQL节点的主机名。


Output+------------+
| @@hostname |
+------------+
| member1 |
+------------+
1 row in set (0.00 sec)

这样就完成了配置,允许ProxySQL在三个MySQL节点之间实现负载平衡连接。

在最后一步,我们验证ProxySQL可以在数据库上执行读写语句,并且即使某些节点出现故障也可以处理查询。

步骤8-验证ProxySQL配置

我们知道ProxySQL和MySQL节点之间的连接正常,因此最后的测试是确保数据库权限允许从ProxySQL读取和写入语句,并确保当其中的某些节点仍在执行这些语句小组失败了。

在ProxySQL客户端提示中执行SELECT语句以验证我们是否可以从playground数据库中读取数据。


SELECT * FROM playground.equipment;

输出应类似于以下内容,其中包含在组复制教程中创建的三个项,这意味着我们已经通过ProxySQL从MySQL数据库成功读取了数据。


Output+----+--------+-------+--------+
| id | type | quant | color |
+----+--------+-------+--------+
| 3 | slide | 2 | blue |
| 10 | swing | 10 | yellow |
| 17 | seesaw | 3 | green |
+----+--------+-------+--------+
3 rows in set (0.00 sec)


INSERT INTO playground.equipment (type, quant, color) VALUES ("drill", 5,"red");

然后执行前面的SELECT命令以验证数据是否已插入。


SELECT * FROM playground.equipment;

输出中的新行意味着我们已通过ProxySQL成功地将数据写入了MySQL数据库。


Output+----+--------+-------+--------+
| id | type | quant | color |
+----+--------+-------+--------+
| 3 | slide | 2 | blue |
| 10 | swing | 10 | yellow |
| 17 | seesaw | 3 | green |
| 24 | drill | 5 | red |
+----+--------+-------+--------+
4 rows in set (0.00 sec)

我们知道ProxySQL现在可以完全使用数据库了,但是如果服务器出现故障会怎样?

从一个MySQL服务器的命令行中,停止MySQL进程来模拟失败。


systemctl stop mysql

数据库停止后,尝试从ProxySQL客户端提示符再次查询equipment表中的数据。


SELECT * FROM playground.equipment;

输出不应改变; 你仍然可以看到设备列表,如前所示,这意味着ProxySQL已经注意到其中一个节点发生故障,并切换到另一个节点来执行该语句。

通过从ProxySQL管理提示符查询runtime_mysql_servers表,我们可以检查它,如步骤5.所示。


SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;

输出将如下所示:


Output+--------------+-------------+---------+
| hostgroup_id | hostname | status |
+--------------+-------------+---------+
| 1 | 203.0.113.1 | SHUNNED |
| 2 | 203.0.113.2 | ONLINE |
| 2 | 203.0.113.3 | ONLINE |
| 3 | 203.0.113.2 | ONLINE |
| 3 | 203.0.113.3 | ONLINE |
+--------------+-------------+---------+
6 rows in set (0.01 sec)

现在我们避开了我们停止的节点,这意味着它暂时被认为不可访问,因此所有流量都将分布在其余两个在线节点上。

ProxySQL会不断地监控这个节点的状态,如果它可以正常工作,把它上线,如果它超过了我们在步骤4中设定的超时阈值标记它已经离线。

让我们测试一下此监视,切换回MySQL服务器,并且备份该节点。


systemctl start mysql

请稍候,然后再次从ProxySQL管理提示符查询runtime_mysql_servers表。


SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;

ProxySQL将迅速注意到该节点再次可用,并将它标记为在线:


Output+--------------+-------------+--------+
| hostgroup_id | hostname | status |
+--------------+-------------+--------+
| 2 | 203.0.113.1 | ONLINE |
| 2 | 203.0.113.2 | ONLINE |
| 2 | 203.0.113.3 | ONLINE |
| 3 | 203.0.113.1 | ONLINE |
| 3 | 203.0.113.2 | ONLINE |
| 3 | 203.0.113.3 | ONLINE |
+--------------+-------------+--------+
6 rows in set (0.01 sec)

你可以对另一个节点(或其中两个节点)重复进行此测试,以查看是否至少有一个节点正常运行,你将能够自由地将数据库用于只读和读写访问。

结束语

在本教程中,你将ProxySQL配置为在多主组复制拓扑中的多个启用写操作的MySQL节点之间负载均衡SQL查询,这种配置可以通过跨多个服务器分发负载来提高重数据库使用的性能,它还可以提供故障转移功能,以防某个数据库服务器脱机。

但是,在这个我们仅以一个节点拓扑为例。ProxySQL还为许多其他MySQL拓扑提供了强大的查询缓存,路由和性能分析,有关ProxySQL的特性以及如何在解决不同的数据库管理问题,你可以在官方ProxySQL博客ProxySQL Wiki上阅读更多内容 。



文章标签:Ubuntu  Proxy  Balance  load-balance  负载均衡(Load Balancer)  

正文

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语