Zabbix :: 在不修改程序的前提下,如何用OneProxy给底层的MySQL扩容?

Zabbix数据库往往是一个公司里最繁忙的数据库,但其设计却是单库结构的,所以我们在Zabbix和MySQL数据库之间架设了OneProxy中间件,并启用事务调试功能,运行一整天后得到了一份统计信息,有效地反映了Zabbix如何访问数据库中的表。

从统计信息中可以看出来,“history”和“history_int”两个表具有非常大的写入压力;而“history”、 “history_int”、 “history_str”、 “trends”、 “trends_int”等表则常常出现在同一个查询或同一个事务中,这些表应当位于同一个库中才能满足Zabbix应用程序要求。如果我们准备将前面的五个表移到其他的MySQL里做垂直分库,可以发现这些表和其他的表(如:“actions”、 “event”、 “items”等)还有少量的关联(可以通过执行频率看出来),拆分方案分析与敲定后,只要研究一下源代码就可以完成垂直拆分。

另外可以考虑启用读写分离方案来对Zabbix的数据库进行透明扩容,由于Zabbix数据库的写入压力极大,关键问题是如何提升备库的恢复速度。首先可以用OneSQL来提升主库性能以及备库的恢复性能,然后可以将写入压力较大的表透明地分到多个不同的数据库下,以便开启MySQL 5.6的并行恢复功能。

zabbix_multiple_db_split

可以利用同义词功能来避免修改Zabbix程序的源代码,只需要对不在“Zabbix”数据库的表建一个同义词即可, 比如“profiles”同义词指向“profiles.profiles”,OneProxy会对所有SQL中的表做透明的替换。新浪微博手机业务已于一年前使用OneProxy的读写分离方案来解决Zabbix监控系统的大量查询压力,运行一直很平稳。

${ONEPROXY_HOME}/oneproxy --keepalive --proxy-address=:3307 \
  ......
  --proxy-table-synonym=profiles:profiles.profiles \
  --proxy-table-synonym=history:hisdb.history \
  ......
  --log-file=${ONEPROXY_HOME}/oneproxy.log \
  --pid-file=${ONEPROXY_HOME}/oneproxy.pid

对于“history”以及相关的表,可以使用OneProxy的水平分表功能来将大表切分成小表,以方便数据的定期清理,也不需要对Zabbix程序作出修改。

{
   "table"      : "history",
   "pkey"       : "itemid",
   "type"       : "int",
   "method"     : "crc32",
   "partitions" :
      [
        {"db":"hisdb1", "suffix":"_0", "group":"default" },
        {"db":"hisdb2", "suffix":"_1", "group":"default" },
        {"db":"hisdb3", "suffix":"_2", "group":"default" },
        {"db":"hisdb4", "suffix":"_3", "group":"default" }
      ]
}

单库分表功能忆经在我们的测试环境上运行有一段时间,一切都很正常,下一步我们将搭建Slave节点来实施读写分离方案。对于其他的程序,比如WordPress、 Dupral等,也可以使用同样的方法来扩容。如果谁家的Zabbix数据库访问压力非常大,可以联系我们,大家一起来实施一个Zabbix分库分表方案。