我的雇主开发了一个网络应用程序,我们提供软件即服务的条款,我们的客户.为了允许具有大量数据的多个客户存储在数据库中,我们选择让应用程序为每个租户创建一个模式。因此,如果我们有5位顾客,我们就会得到一些类似于
mysql> show schemas;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| tenant_1a |
| tenant_d2 |
| tenant_yf |
| tenant_ok |
| tenant_8n |
+--------------------+编辑:数字和字母代表大约32个字符长的散列。
租户模式名称实际上不是数字,而是创建过程中某些事实的散列。所以在创造之前是无法预测的。这使我们无法预先准备查询规则。
目前,我们对此很在行,只运行一个mariadb集群,该集群由三个节点组成,位于一个最大规模的重新连接路由均衡器之后。但是我们最终会遇到一个障碍,在这个集群中添加节点是不行的,因为总的数据大小不适合磁盘和/或表的数量会影响性能。
为了保持应用程序数据库层的复杂性,我们的devs希望我们从应用程序的角度来处理路由透明的问题:他们希望应用程序只与一个“服务器”对话,而不关心哪个租户的物理位置。
为了将我们的应用程序集群扩展到多个mariadb集群,我们可以使用maxscales模式,它在所有连接的子集群上公开所有模式,就好像只有一个服务器一样。这完全符合我们的发展期望。
现在,几个月前,ProxySQL进入了数据库代理领域,并声称性能更好,同时具有更大的灵活性。
我们可以根据硬编码的模式名称路由查询,但不要这样做,因为这意味着每次创建/删除租户时都要创建/更新它们。
如果有的话,我们如何能够使用proxysql查询规则复制maxscales模式的动态行为?
发布于 2017-03-05 07:41:45
您可以在这里找到答案:可以有多个侦听器吗? ( Groups)。
简而言之:ProxySQL的查询规则支持模式名的路由。
为了简单起见,让我们假设您有3个不同的集群,我们将这3个集群称为HG11、HG21和HG31。服务器为10.10.X.Y。为了增加一些复杂性,我们还将启用读/写拆分,其中读取器是HG12、HG22、HG32。
INSERT INTO mysql_servers (hostgroup_id,hostname) VALUES
(11,"10.10.10.1"),
(12,"10.10.10.1"), (12,"10.10.10.2"), (12,"10.10.10.3"),
(21,"10.10.20.1"),
(22,"10.10.20.1"), (22,"10.10.20.2"), (22,"10.10.20.3"),
(31,"10.10.30.1"),
(32,"10.10.30.1"), (32,"10.10.30.2"), (32,"10.10.30.3");启用复制主机组
INSERT INTO mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) VALUES
(11,12),(21,22),(31,32);创建读/写拆分规则
INSERT INTO mysql_query_rules (rule_id, active, match_digest, flagOUT) VALUES
(1,1,'^SELECT.*FOR UPDATE',100),
(2,1,'^SELECT',200),
(3,1,'.*',100);分片,将流量发送给主人
INSERT INTO mysql_query_rules (active, flagIN, schemaname, destination_hostgroup, apply) VALUES
(1,100, "shard001", 11, 1),
(1,100, "shard002", 11, 1),
(1,100, "shard003", 11, 1),
(1,100, "shard004", 11, 1),
...
(1,100, "shard050", 21, 1),
(1,100, "shard051", 21, 1),
(1,100, "shard052", 21, 1),
(1,100, "shard053", 21, 1),
(1,100, "shard054", 21, 1),
...
(1,100, "shard100", 21, 1),
(1,100, "shard101", 31, 1),
...
(1,100, "shard150", 31, 1);分片,向奴隶发送流量
INSERT INTO mysql_query_rules (active, flagIN, schemaname, destination_hostgroup, apply)
SELECT 1, 200, schemaname, destination_hostgroup+1 , 1 FROM mysql_query_rules WHERE flagIN=100;将所有内容加载到运行时:
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;最后,将所有内容保存到磁盘:
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;关于“没有办法让proxysql处理哪个模式是哪个hg本身的问题?”:答案是否定的,这是有意的。每个HG可能有相同的模式:除了经典的"mysql“、"information_schema”、"performance_schema“之外,还可以有其他用于其他目的的模式(任何真正的)。我们不能要求ProxySQL理解这些模式,并自动创建规则。
另外,您可能已经在两个不同的服务器中创建了一个tenant_1模式,但是一个服务器有生产数据,另一个服务器有测试数据:您不希望ProxySQL自动添加这两个服务器。
最后,由于使用在管理界面上执行的简单SQL查询可以轻松地重新配置ProxySQL,如果您想要自动加载新模式,可以简单地创建一个脚本,该脚本连接到每个HG,列出模式,如果缺少则连接到创建规则的ProxySQL。脚本可以非常简单,但也应该具有排除不应该包含的模式的逻辑。
或者,您可以使用配置管理工具(如厨师、Ansible、木偶、领事等)创建被推送到ProxySQL的配置。
https://dba.stackexchange.com/questions/165711
复制相似问题