高吞吐量到mysql,安全插入?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高吞吐量到mysql,安全插入?相关的知识,希望对你有一定的参考价值。
我从单个websocket连接接收了很多并发级别的数据。数据以json格式输入,需要进入表名,需要进入4列的数据(所有4个都是int或double,以便了解数据类型和比例)。
例如,假设我每秒获得1000行数据,需要转到大约100个不同的表(每秒每表10行)。我对mysql(特别是MariaDB)中的这种数据规模相对较新。在我开始这个之前,我是否需要担心这么快写入数据库?如果我在插入完成之前得到另一个查询,是否会有积压/可能会丢失未插入的数据?无论如何,我可以判断我是否缺少数据?
我的计划是在python中编写,但是如果这将是问题,可以适应C ++(只有这将是一个问题,不一定只是为了提高性能)。
完整数据流:
Websocket处理程序:
连接:WSS://..../streams =流1&.. stream100
回调:@process_data(msg)
def process_data(msg):
#msg exp: {"table":"stream1", "v1":100, "v2":101, "v3":.000005, "v4":.0002}
connection.execute("""INSERT INTO {}
VALUES ({}, {}, {}, {})
""".format(
msg['table'],
msg['v1'],
msg['v2'],
msg['v3'],
msg['v4']
)
)
而我每秒大约有1000个消息。
TL; DR:我会丢失数据/搞砸这个设置吗?它工作在一个小的基础上有两个流(我想,但我不知道我是否已经丢失数据),但我需要大幅度扩展它。
对不起,如果这是一个愚蠢的问题。
编辑:MyMaths!=“好”
主要的开销是MySQL,而不是Python或C ++,因此不要更改应用程序语言。
100 INSERTs
/秒是我使用的截止 - 比这慢,而MySQL / MariaDB“只是开箱即用”。比这更快,你可能需要一些调整。
在可行的情况下,通过在单个INSERT
语句中插入多行来获得良好的提升。我认为python有一个特殊的要求。一次插入100行(到一个表中)的速度大约是每个INSERT
一行的10倍。
SSD可能会给你10倍。
已经有1M /秒的基准测试 - 但这不仅适用于价格适中的硬件上的凡人。
可以为InnoDB更改一些可调参数。 (例如,innodb_flush_log_at_trx_commit=2
)。
至于“缺失数据” - 这是代码另一面的问题。如果它无法跟上,那么MySQL方面只会变得更好而且更好。
我假设python有一个很好的库来解析JSON?
如果通过“streams”,你的意思是“线程”,那么你每个线程也必须有一个连接,除非你将数据反馈给一个线程来完成所有的写操作。无论哪种方式都可行。
为什么有100张桌子?如果所有表基本相同,那么它可能是一个“坏”的架构设计。
构建测试框架以压力测试代码。如果你得到2000 /秒,那么代码应该足够好,可以稳定地做到1000 /秒。
如果你需要超过1000 /秒,请参阅http://mysql.rjweb.org/doc.php/staging_table
PS:1000/100不等于100。
以上是关于高吞吐量到mysql,安全插入?的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端Eureka 服务信息Eureka 发现管理Eureka 安全配置Eureka-HA(高可用) 机制Eur(代码片段