OneProxy :: 不同线程处理不同任务,实现Proxy类软件的高性能并发处理

OneProxy是一款商业的基于MySQL协议的数据库代理软件,可以透明实现多结点强一致性的读流量分摊,也可以帮助应用快速实现成熟稳定的Sharding扩展方案,并可以和Spark对接进接进行数据分析和机器学习。在200并发以上时,可以做到无损转发,即做到和直连MySQL后端一样的并发QPS,在高性能的背后是用不同的线程来处理各种不同的任务。在这里来看一下有哪些后台线程:

  • 独立监听线程:只负责工作端口和管理端口的监听。这里使用了连接缓存来优化了内存分配,使之可以支持每秒钟20000个的连接速率;接到连接后马上转交给工作事件线程或管理事件线程来处理后续的交互, 实现了专职的监听线程。
  • 工作事件线程:处理工作端口的事件转发,采用异步消息(epoll/event)机制实现网络包的高性能转发,没有任何慢的处理逻辑(比如创建到后端MySQL的数据库连接等),可以说是纯消息转发工作。可配置多个线程,以提升效率。
  • 管理事件线程:处理管理端口的事件转发,采用异步消息(epoll/event)机制实现网络包的高性能转发,没有任何慢的处理逻辑,纯消息转发工作。独立出来,可以保证OneProxy的管理端口命令(比如多结点信息同步等)不会被工作负载影响。
  • 状态检测线程:循环检测后端MySQL节点的状态(判断是否可用,是否可读写),每500ms检测一次,可敏感地处理后端异常情况。
  • 复制检测线程:循环检测后端MySQL节点的复制时延状况,对Master结点进行Checkpoint操作,对Slave结点查询Checkpoint时间点,以实现一致性的读流量分摊。可以分别调节频率,以优化提升读流量分摊的效果。
  • 连接管理线程:检测连接池中的连接使用情况,根据连接池的Min & Max设置来创建或销毁到后端的数据库连接。使用这个线程来避免在工作事件线程中创建远程连接,影响事件转发效率。
  • 集群同步线程:多个OneProxy结点之间组成同一个集群时,需要在多个结点之间同步一些状态信息。包括选择主OneProxy节点,并从主OneProxy结点同步后端节点状态信息、检查不同OneProxy节点的NTP时间差异等。
  • VIP维护线程:如果配置了VIP地址,则由此线程在主OneProxy节点上启用VIP地址,并通知其他从OneProxy节点停止VIP地址,并定期 检测VIP地址的可用性,以及发送ARP包来广播VIP地址。
  • 性能监控线程:由独立的线程来收集和计算两个时间点内(可以通过参数指定时间间隔)的SQL执行性能数据。
  • 查询缓存线程:定期清理过期的查询缓存项(如果使用了查询缓存功能)。
  • 临控页面线程:负责内置的HTTP Server的Web请求,用来展示OneProxy的性能监控数据,比如SQL的执行频率、时长、记录数等。
  • 性能归档线程:负责将OneProxy收集的SQL运行性能数据保存到MySQL数据库中,以方便使用Grafana工具做历史趋势分析。
  • 日志刷新线程:负责将错误日志刷出到文件,以确保工作事件线程和管理事件线程不会受到文件读写操作的影响。

如果是非企业版本,则前三个线程(监听线程、工作事件线程、管理事件线程)合并为一个(即只能使用单个Core的能力),因此非企业版本的OneProxy在性能上要比企业版本的差,在这里友情提醒一下OneProxy用户,如果你的业务量增长比较快,或业务量忆经比较高,需要关注OneProxy是否成为系统瓶颈。