mysql 为每个用户创建单独的Docker数据库容器是否是一种好的做法

s4chpxco  于 2022-10-31  发布在  Mysql
关注(0)|答案(3)|浏览(139)

我正在运行一个财务相关的门户网站,涉及数百万的借记信用交易在MySQL中,得到一个特定用户的余额在一定的限制,即与300万行变得缓慢。
现在,我正在考虑为每个用户创建单独的MySQL容器,并在每个容器中只记录相关的用户事务,我相信这将是快速计算任何用户的余额。我有大约20万用户,我想知道为每个用户创建单独的MySQL容器是否可行?或者我应该采取任何其他方法。谢谢

f0brbegy

f0brbegy1#

我不建议为每个用户提供单独的MySQL示例。
我在以前的工作中在Docker容器中运行MySQL。即使在非常强大的服务器上,我们也只能在每台服务器上运行大约30个MySQL示例,否则就会耗尽资源。如果每个示例在大多数时间都处于空闲状态,可能会运行更多的示例。无论如何,您将需要数百或数千台服务器来完成您所描述的任务,并且随着用户数量的增加,您需要不断添加服务器。
您是否考虑过,如果每个用户的数据位于不同的MySQL示例中,您将如何生成报表?生成有关任何单个用户的报表都可以,但您可能还需要有关所有用户的汇总财务活动的报表。您无法运行跨MySQL示例的单个查询,因此您必须对每个示例执行一个查询,并编写自定义代码来合并结果。
当您需要执行备份、升级、模式更改、错误监视等操作时,您也将有更多的工作要做。这些操作任务中的每一项都将乘以示例的数量。
你没有描述你的数据是如何组织的,也没有描述你运行的任何特定查询,但是有一些技术可以优化查询,而不需要将数据拆分到多个MySQL示例中。这些技术包括索引、缓存、分区或升级到更强大的服务器。在拆分数据之前,你应该学习这些优化技术。因为最终得到的只是数千个没有经过充分优化的小示例。

bq8i3lrv

bq8i3lrv2#

我有大约2万个用户,我想知道为每个用户创建单独MySQL容器是否可行
不,绝对不是。虽然Docker容器相对较轻,但其中的20 K是很多的,这将需要大量额外的资源(内存、磁盘、CPU)。
在某个限制(即3百万行)下获得特定用户的余额变得缓慢。
有几件事你可以尝试去做。
1.首先,尝试优化数据库/查询(可以与垂直扩展相结合-通过为数据库使用更强大的服务器)
1.启用复制(如果尚未启用)并使用辅助示例进行读取查询
1.使用partitioning and/or sharding

ckx4rj1h

ckx4rj1h3#

我知道这是亵渎神灵的,但对于这样的表,我喜欢使用两个表。(顽皮的部分是冗余。)

  • 历史记录--所有交易的详细信息。
  • 本期--本期余额

您似乎只有History,但经常需要为单个用户计算Current。如果您在运行时维护它,它将运行得更快。
此外,我将做以下工作:

  • 为所有操作提供存储过程。典型的操作是向History中添加一行,并更新Current中的一行。
  • 永远不要在History中添加UPDATEDELETE行。如果需要更正,则添加另一行,比如说,添加一个负金额。(我认为,无论如何,这都是“正确的”会计实践。)
  • 一旦你做了这个设计上的改变,你的问题就没有意义了,历史不需要频繁地进行大规模扫描。
  • 使用InnoDB(而不是MyISAM)。
  • 另一件可能有用的事情--将History上的主要索引从
PRIMARY KEY(id),
INDEX(user_id)

PRIMARY KEY(user_id, id),  -- clusters a user's rows together
  INDEX(id)   -- this keeps AUTO_INCREMENT happy

相关问题