我正在考虑使用具有五个MySQL节点的Galera Active-Active。节点位于负载均衡器之后,应用程序可以写入任何节点。
我的应用程序每秒大约读/写/更新同一个表1000次。写入通常是100k左右的数据。
典型的DB逻辑如下所示:
(1)执行select操作,查看数据库中是否存在数据
(2)如果不是,则插入数据
(3)更多处理
(4)更新部分数据
select (1)每天大约会发生7500万次。插入(2)和更新(4)每天大约有100万次。
答:我认为Galera将不断地锁定表,从而导致写入和更新速度变慢,这是正确的吗?
B.我认为节点之间的数据同步可能需要几秒钟或更长时间,因此存在select (1)报告数据尚未插入的风险,但实际上insert (2)已经完成,但只是还没有与所有节点同步?
发布于 2018-11-06 07:03:06
首先,要知道(1)只能是建议的。也就是说,(1)可能会说“数据不存在”,但随后(2)会发现数据在那里。或者直到COMMIT才会发现
请在您的列表中添加任何START TRANSACTION和COMMIT。同时,我将假设所有4个步骤都在一个事务中,尽管我建议将(1)放在事务之外。
节点之间的距离(ping时间)有多远?如果它们位于同一建筑物中,则同步可能只需要几毫秒。(我之所以说“可能”,是因为每秒1000次操作可能会有一定的压力。)
我认为这可能是最好的:
(1) See if row exists -- 98% of the time, this will avoid doing the rest.
BEGIN;
(2), (3), (4); -- check after each step; 1% of collisions will be caught here
COMMIT; -- again check; still another 1% get caught here.也就是说,放弃追求完美(一次测试就能达到100%)。取而代之的是,玩一个数字游戏,这样你通常会做最优的事情,但随后不会频繁地捕捉到奇怪的情况,从而不会明显影响性能。
https://stackoverflow.com/questions/53149916
复制相似问题