我正在考虑将Galera Active-Active与五个MySQL节点一起使用。节点位于负载均衡器后面,应用程序可以写入任何节点。
我的应用程序每秒大约对同一个表读取/写入/更新1000次。写入数据通常约为100k。
典型的数据库逻辑如下:
(1)进行选择以查看数据库中是否存在数据
(2)如果没有,请插入数据
(3)更多处理
(4)更新一些数据
选择(1)每天大约发生7500万次。每天大约进行一百万次插入(2)和更新(4)。
A。我认为Galera会不断锁定表,导致写入和更新速度变慢,对吗?
B。我认为节点之间的数据同步可能需要几秒钟甚至更长的时间是正确的,因此存在选择(1)将报告尚未插入数据但实际上已经完成插入(2)的风险,但是还没有与所有节点同步?
答案 0 :(得分:1)
首先,请注意(1)仅是建议性的。也就是说,(1)可能会说“数据不存在”,但是(2)会发现一个数据在那儿。还是直到COMMIT
才会发现?
请在列表中添加任何START TRANSACTION
和COMMIT
。同时,尽管我建议将(1)放在交易之外,但我将假设整个4个步骤都在一次交易中。
节点相距多远(ping时间)?如果它们在同一建筑物中,则同步 可能只需要毫秒。 (我说“ 可能”,因为每秒1K的操作可能会有些压力。)
我认为这可能是最好的:
(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%的成功)。而是玩数字游戏,使您通常做最优化的事情,但随后却很少见到这种奇怪的情况,而不会明显损害性能。