我们有一个包含微服务的应用程序,所有微服务都连接到相同的Percona数据库实例。当前,它只是一个实例,具有16核/ 32 GB内存,没有复制。我们的问题之一是,有时我们的一种微服务会导致数据库上如此高的负载(甚至只是读取),这会使所有微服务无法使用。

我们正在考虑创建一个由三个节点组成的Percona集群,并为每个微服务选择节点。大部分“写入”的服务将连接到一个实例,其余的将连接到其他两个实例。这样,如果某些微服务导致读取的高负载,则不应完全淹没我们的基础架构。

我的问题:


这是个好主意吗?我们不应该让ProxySQL处理流量拆分吗? ProxySQL可能意味着没有隔离。
我们应该宁愿拥有更多实例但CPU较少还是要拥有更少实例而拥有更多CPU?在高负载的情况下,拥有更多实例将意味着对运行微服务的更多隔离。
具有不同CPU的节点是一个好主意吗?例如,与“读取实例”相比,让“写入实例”具有更多的CPU。
如果我们将微服务定向到“其Percona实例”,那么当它们的实例完全消失时,我们还可以拥有某种HA吗?


注意:我们可能会在GCE中使用Percona XtraDB点击部署:https://console.cloud.google.com/marketplace/details/click-to-deploy-images/percona?project=goout-cloud&folder&organizationId=74390800864

最佳答案

是的,这是个好主意。将ProxySQL与PXC一起使用也是一个好主意。通过使用ProxySQL,您可以:A)通过将两个节点放入同一个主机组中来实现“ writer” HA,一个节点的权重超高(10000000),另一个节点的权重低(10)。如果高权重节点脱机,则ProxySQL将无缝开始向其他节点发送流量。 B)将所有节点放入具有相同权重的单独“读取器”主机组中,从而实现负载平衡写流量。 C)如果需要,请创建一个仅包含1个节点的第3个主机组,并创建一个查询规则以对“高负载”查询的模式,用户或查询模式进行模式匹配,然后直接执行至该特定节点。 ProxySQL还可以让您缓存其中一些繁琐的查询。
就个人而言,除非您知道您的网络坚如磐石,否则我会选择CPU数量较少的实例。在PXC中,所有节点必须同步ACK所有事务。您拥有的节点越多,这些操作所花费的等待时间就越长。您可以提交的最快速度是两个最慢节点之间的时间。请确保您的节点数始终为奇数,除非您使用pc.weight设置进行了高级设置(但这很难做到)。
通常,对于MySQL,所有节点都应具有相同的配置。一般来说,如果您的主服务器比从服务器更强大,则从服务器将无法跟上音量。使用PXC,这意味着您将更频繁地体验流控制事件,这些事件可能会导致应用程序停顿。如果node2无法像快速的node1一样写入,则node2发出流控制消息(要求帮助),要求其他节点在追赶时放慢速度。
是的,按照#1中所述使用ProxySQL。


附带说明,查询优化是“加快速度”的第一方法。不要总是把硬件扔在问题上。值得花时间检查缓慢的查询日志并尝试改善查询。有时,一个索引可以使夜晚/白天变得不同。

免责声明:我是Percona的高级讲师,并提供了许多全日制PXC和ProxySQL密集型教程课程。

关于mysql - 设计XtraDB集群,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51486658/

10-14 19:32