设计 XtraDB 集群

Designing XtraDB cluster

我们有一个应用程序,其中包含所有连接到同一个 Percona 数据库实例的微服务。目前它只是一个具有 16 cores/32 GB 内存且没有复制的实例。我们的一个问题是,有时我们的一个微服务会对数据库造成如此高的负载(甚至只是读取),这使得所有微服务都无法使用。

我们正在考虑创建一个由三个节点组成的 Percona 集群,并为每个微服务选择节点。大多数 "write" 的服务将连接到一个实例,其余服务将连接到另外两个实例。这样,如果某些微服务导致高读取负载,它不应该完全淹没我们的基础设施。

我的问题:

  1. 这是个好主意吗?难道我们不应该让 ProxySQL 处理拆分流量吗? ProxySQL 可能意味着没有隔离。
  2. 我们是应该拥有更多 CPU 更少的实例,还是拥有更多 CPU 的更少实例?在高负载的情况下,拥有更多实例意味着 运行 微服务有更多隔离。
  3. 让节点具有不同的 CPU 是个好主意吗?例如,与 "reading instances".
  4. 相比,让 "writing instance" 具有更多 CPU
  5. 如果我们将微服务指向 "their Percona instance",当它们的实例完全死亡时,我们是否仍然可以拥有某种 HA?

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

  1. 是的,这是个好主意。将 ProxySQL 与 PXC 一起使用也是一个好主意。通过使用 ProxySQL,您可以: A) 通过将两个节点放入同一主机组来实现 "writer" HA,一个具有超高权重 (10000000),另一个具有低权重 (10)。如果高权重节点下线,ProxySQL 将无缝开始向其他节点发送流量。 B) 将所有节点放入一个单独的 "reader" 具有相同权重的主机组,从而负载平衡写入流量。 C) 如果需要,创建一个只有 1 个节点的第三个主机组,并创建一个查询规则以模式匹配模式、用户或您的 "high load" 查询的查询模式,并直接执行到该特定节点。 ProxySQL 还可以让您缓存一些重要的查询。

  2. 就个人而言,除非您知道您的网络坚如磐石,否则我会选择较少的 CPU 实例。在 PXC 中,所有节点必须同步确认所有交易。您拥有的节点越多,这些操作的延迟时间就越长。您可以提交的最快时间是两个最慢节点之间的时间。请确保您的节点数始终为奇数,除非您使用 pc.weight 设置进行了高级设置(但这很难正确设置)。

  3. 与MySQL一般来说,所有节点应该是相同的配置。如果你的主人比奴隶厉害,一般来说,奴隶的音量是跟不上的。使用 PXC,这意味着您将更频繁地体验流量控制事件,这可能会转化为应用程序停顿。如果 node2 不能写得像 node1 一样快,node2 发出流量控制消息,(求救),要求其他节点在它赶上时慢下来。

  4. 是的,使用 #1 中描述的 ProxySQL。

旁注,查询优化是解决问题的第一方法"speed things up." 不要总是用硬件来解决问题。花时间检查您的慢速查询日志并尝试改进查询是值得的。有时,单个索引可以产生 night/day 差异。

免责声明:我是 Percona 的高级讲师,已经讲过无数次全天的 PXC 和 ProxySQL 强化教程课程。

看来问题出在你的 尖刺 上。而且您需要尽快处理洪水,因为用户期望获得那些热票。

添加队列只会增加复杂性并在操作快速时减慢处理速度。所以 "Don't queue it, just do it." 进一步注意队列将被过渡复制到其他节点,从而使 enqueue/dequeue 可能比简单地响应请求更慢!

连接 - 做点什么 - 断开连接需要时间。很多时候并没有真正参与 "something",而是围绕它进行开销。我发现如果活动连接少于 10 个,事情 运行 会很顺利。但是如果超过 10 个设法开始,那么 InnoDB 就会开始绊倒自己。

曾经去过拥挤的商店吗?假设在所有过道中都有可容纳 200 人和手推车的空间。但是,如果您尝试拥有 210 名购物者,那么每个人都会放慢脚步,只是想争夺一个位置。吞吐量下降,可能到了人们想要放弃购物车离开的地步。见过前面排长队的商店吗?他们通过不允许超过 200 名同时购物者解决了这个问题!

因此,您的问题的解决方案可能在 MySQL 之外。如果您有一个网页前端 MySQL,请限制它以限制它正在使用的 'threads' 的数量。例如,Apache 有这样的功能,加上一个 "backlog" 用于在连接到 Apache 级别排队。 MySQL 有 max_connectionsbacklog 可能以相同的方式工作,但 max_connections (151) 的默认值太高了。 151名学生挤在便利店的汽水机周围可能是一个更好的比喻。

更多 个节点/更多 CPU 可能 也可能不会 成为答案的一部分;这取决于 "something".

取出了什么锁

监控Threads_running;如果它增长到几十个以上,那么我怀疑我的评论适用。如果监控程序无法连接以检查 GLOBAL STATUS,那么我知道它适用。