linux - 大家对PHP多进程与MySQL的高并发瓶颈是怎么处理的
需求
- 我每天执行一个定时任务,把一个具有千万条数据的日志分割成一些小的日志文件;
- 然后启动多个PHP进程,分别对这些小日志文件中的每行数据进行处理,处理过程是这样的:每个PHP进程从各自负责的日志文件中逐行读取,然后根据该行中的一个标识去数据库中查找是否有了该记录,如果没有则插入该行,如果已经存在了就更新(该行的数据与数据库中的数据进行合并);
引发的问题
这样就出现了一个问题,就是可能存在多个PHP进程对同一条数据都在做处理,如果用Mysql锁机制可以避免这个问题,但是这样的话,就出现另一个问题,就是MySQL的高并发瓶颈,因为我是多个PHP进程同时在进行,一个进程要等待另一个进程解锁后,才能操作数据库。
这样我前面所做的分割日志、启动多个进程这些操作就失去意义了,因为我在前面做日志分析时,启的进程再多,运行的再快,到最后全都会卡在高并发操作数据库这个瓶颈上,不知道大家对这类问题是怎么处理的?
回复内容:
需求
- 我每天执行一个定时任务,把一个具有千万条数据的日志分割成一些小的日志文件;
- 然后启动多个PHP进程,分别对这些小日志文件中的每行数据进行处理,处理过程是这样的:每个PHP进程从各自负责的日志文件中逐行读取,然后根据该行中的一个标识去数据库中查找是否有了该记录,如果没有则插入该行,如果已经存在了就更新(该行的数据与数据库中的数据进行合并);
引发的问题
这样就出现了一个问题,就是可能存在多个PHP进程对同一条数据都在做处理,如果用Mysql锁机制可以避免这个问题,但是这样的话,就出现另一个问题,就是MySQL的高并发瓶颈,因为我是多个PHP进程同时在进行,一个进程要等待另一个进程解锁后,才能操作数据库。
这样我前面所做的分割日志、启动多个进程这些操作就失去意义了,因为我在前面做日志分析时,启的进程再多,运行的再快,到最后全都会卡在高并发操作数据库这个瓶颈上,不知道大家对这类问题是怎么处理的?
写过类似的东西,像这种需要多次更新同一账号数据的时候,我们的做法是处理完数据后不立即存入mysql,
而是放在了redis中,后面的数据更新都在redis修改,
在redis积累了数千条数据后在异步的写一次数据到mysql,效果不错
卤煮的场景多进程处理建议只负责数据处理,处理完的放redis,在单独用一个脚本定时检测redis
达到条件的时候(一定条数或时间)存一次数据到mysql
上面的两种方法都可行
建主键索引,使用 upsert 语句是最便捷的解决方法。如上 @felix021 大神所言。
另外,使用缓存(Memcache 或者 redis )异步写入数据也不错,只是开发代价要高一些。
加队列。做daemon执行队列操作。
如果只是日志数据的话,题主可以直接用你那个标记记录的唯一表示当做主键|唯一键,直接往数据里面插东西,啥也不用管。
这样的话既不会锁表也不用去检查这条记录有没有存在。
1,读加缓存。
2,写加队列。
3,推荐Redis。
4,分库分表分机器。

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Causes and solutions for errors when using PECL to install extensions in Docker environment When using Docker environment, we often encounter some headaches...

The page is blank after PHP connects to MySQL, and the reason why die() function fails. When learning the connection between PHP and MySQL database, you often encounter some confusing things...

Wordpress site file access is restricted: troubleshooting the reason why .txt file cannot be accessed recently. Some users encountered a problem when configuring the mini program business domain name: �...

Solution to permission issues when viewing Python version in Linux terminal When you try to view Python version in Linux terminal, enter python...

Running multiple PHP versions simultaneously in the same system is a common requirement, especially when different projects depend on different versions of PHP. How to be on the same...

Many website developers face the problem of integrating Node.js or Python services under the LAMP architecture: the existing LAMP (Linux Apache MySQL PHP) architecture website needs...

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

Regarding the problem of removing the Python interpreter that comes with Linux systems, many Linux distributions will preinstall the Python interpreter when installed, and it does not use the package manager...
