我在3个节点上设置了Galera集群。 它完美的读取数据。 我已经做了简单的应用程序来对集群进行一些testing。 不幸的是,我不得不说,当我尝试做一些写作时,群集完全失败。 也许它可以configuration不同或我做错了什么?
我有一个简单的存储过程:
CREATE PROCEDURE testproc(IN p_idWorker INTEGER) BEGIN DECLARE t_id INT DEFAULT -1; DECLARE t_counter INT ; UPDATE test SET idWorker = p_idWorker WHERE counter = 0 AND idWorker IS NULL limit 1; SELECT id FROM test WHERE idWorker = p_idWorker LIMIT 1 INTO t_id; SELECT ABS(MAX(counter)/MIN(counter)) FROM TEST INTO t_counter; SELECT COUNT(*) FROM test WHERE counter = 0 INTO t_counter; IF t_id >= 0 THEN UPDATE test SET counter = counter + 1 WHERE id = t_id; UPDATE test SET idWorker = NULL WHERE id = t_id; SELECT t_counter AS res; ELSE SELECT 'end' AS res; END IF; END $$
现在我简单的C#应用程序在不同的线程中创build了3个MySQL客户端,每个客户端每隔100ms执行一次程序,直到列'counter'= 0时没有logging。
不幸的是 – 大约过了10秒后,情况变糟了。 在服务器上有进程'query_end'永远不会结束。 之后 – 你不能更新testing表,MySQL返回:
错误1205(HY000):locking超时超时; 尝试重新启动事务
。 你甚至不能重新启动MySQL。 你可以做的是重新启动服务器,有时整个群集。 当你做大规模的书面/更新时,Galera集群是如此不可靠? 难以置信。
我们有几乎相同的问题 – 当我们更新失败,locking超时。 我们目前的策略是使用1台服务器进行后台进程和大量写入,并将其他2台服务器用于实时Web服务器。
如果您使用HAProxy,这非常容易 – 但我们也必须对代码进行一些更改。
到目前为止,它似乎工作得更好,但是我们一定会看到它在几周内运行良好(当我们没有遇到同样的问题时)。
根据我们的经验,
几个星期后,我可以说这些变化确实造成了很大的变化。 我认为最重要的变化是分析后台进程并安排它们,所以它们不重叠(或者不重叠)。
改变服务器,所以只有一台服务器主要用于写入,另外两台服务器用于读取,改善了我们在繁忙的后台进程中的用户体验。
我们做的第三步是改善我们的后台进程。 在一次交易中,程序员放下桌子,从头开始重build。 我们对此进行了更改,首先检查是否需要更改,然后更新该行。 这极大地改善了这个过程的性能。
我们的经验是,在Galera集群中读取速度非常快,但是写入速度可能会非常慢,特别是在执行大量写入操作时。 我们在一开始就有一些打嗝,不得不重新进入整个桌子 – 这是数据库的一大杀手。 另一件让我们的服务器崩溃的事情是,binlog填满了服务器的磁盘,崩溃了服务器。 还要确保将所有数据库更改为Innodb表,否则数据丢失是可能的。 我们的程序员之一将所有的日志表设置为MyISAM – 假设我们在这个过程中丢失了一些日志。
但毕竟我可以说Galera现在工作的很好。 如果您不得不更新数据库服务器或进行其他维护,那将是非常好的,因为如果您要closures一个节点来进行维护,这不是一个大问题。
我知道已经很晚了,但是我会留下一些关于Galera集群的经验。 我们的应用程序正在做约160-200插入/秒,我们尽可能多的读取。 在晚上,这是less得可怜的,但在白天,这是我们的平均水平,它可以达到雇用率。 我们可能与您的应用程序不在同一个环境中,但是当我们从标准MySQL转换到Galera时,帮助我们的是将我们的应用程序设置为自动提交每个事务,并立即删除您在此问题中描述的行为。
在使用PySQLPool库的python中,我们必须在查询包装中添加这样一行:
PySQLPool.getNewQuery(self.connection, commitOnEnd=True)
然后,我们面对的另一个问题是,它不足以写入表格。 我们发现一个足够快的方法是使用innodb_flush_log_at_trx_commit选项。 由于我们可以承受1秒的交易损失,我们在my.cnf中设置了这样的设置:
innodb_flush_log_at_trx_commit = 0
有了这两个简单的设置,我们现在正在使用Galera进行一年多的生产,3台服务器在我们的应用程序中运行良好。
最好。