mysql killed进程不结束_优秀的数据库产品——MySQL 云数据库服务

作为一种低成本,高性能,高可靠性和开放源代码的数据库产品,MySQL已在Internet公司中广泛使用。 例如,淘宝有数千个MySQL服务器。 尽管NoSQL在过去两年中发展迅速,新产品层出不穷,但NoSQL在企业中的应用对开发人员的要求相对较高,而MySQL具有成熟的中间件和运维工具,并形成了良性的生态系统。 因此,在当前应用阶段,MySQL仍然是主要组件,NoSQL是次要组件。

在过去的一年中,我们在MySQL托管平台方面做了很多工作,设计并实现了一个UMP(Unifield MySQL平台)系统,以提供低成本和高性能的MySQL云数据库服务。 。 开发人员从平台申请MySQL实例资源,并通过平台提供的单个条目访问数据。 UMP系统在内部维护和管理资源池,并以透明形式提供一系列服务,例如主从热备份,数据备份,迁移,灾难恢复,读写分离以及数据库和表划分。 该平台通过在物理机上运行多个MySQL实例来降低成本,并实现资源隔离,根据需要分配和限制CPU,内存和I / O资源,同时支持数据服务而不影响前提。 根据用户业务的发展动态地扩大和收缩。

架构演进

UMP系统的第一个版本基于MySQL Proxy 0.8版修复了多个错误,并修改了代理插件中管理用户连接和数据库连接的状态机过程; 使用Lua脚本来获取用户身份验证信息和中央数据库中的后台数据库地址以验证用户; 建立了与后台数据库的连接以及转发数据包的逻辑(如图1所示)。

9ae8bb376d85e91380134b5c1c73269f.png

图1 UML系统的第一个版本(当时称为RDS系统)使用MySQL Proxy

在第一个版本的开发和部署期间,我们逐渐认识到了几个问题。

首先,MySQL Proxy 0.8对多线程的支持相对简单和粗鲁。 多个工作线程共享同一消息队列,并同时侦听同一套接字对通道。 当新事件进入消息队列时,套接字对将写入一个字节,并且所有睡眠线程都将被唤醒以争夺互斥体以从消息队列中获取任务。 此实现存在几个问题:首先,它会导致“休克组”现象,唤醒多个线程,但只有一个线程需要完成任务。 其次,任务的CPU亲和力相对较差,在同一状态机上触发的事件将在多个处理器之间来回切换。 此外,MySQL Proxy中使用了全局Lua锁,并且只允许一个工作线程执行Lua脚本(计划在0.9版中进行改进)。 因此,在多线程模式下,MySQL Proxy的性能远远不能随CPU内核数量的增加而线性增长,甚至16个内核的性能也不如4个内核。 使用单进程模式时,需要在物理计算机上部署多个进程以有效利用计算机的处理能力,但是这会给部署,监视和服务升级带来麻烦。

其次,由于MySQL Proxy的框架在功能上不容易扩展,因此难以实现用户的连接数限制,QPS限制,主从切换,读写分离,子数据库子 -table和其他功能。

最后,近年来,MySQL Proxy社区并不活跃,并且C语言对开发人员技能有相对较高的要求。 很难要求所有团队成员共同开发平衡优雅与正确性的代码。

因此,我们决定用Erlang语言重写代理服务器,以替换原始的MySQL代理模块。 目前,整个项目有50,000行Erlang源代码,30,000行C / C ++源代码和20,000行其他语言源代码。

为什么选择Erlang语言

Erlang是一种结构化,动态和功能性的编程语言。 普遍的说法是,Erlang是面向并发的,这主要意味着Erlang用该语言定义了Erlang过程的概念和行为(本文中提到的“ Erlang过程”是指Erlang语言过程中的定义以区别于此) 来自熟悉的操作系统过程)。 与操作系统的进程/线程相比,Erlang进程也是并发执行的一个单元,但是它特别轻巧。 它是在Erlang虚拟机中管理和调度的“绿色进程”,即用户模式进程。(如图2所示)。 例如,在关闭了HiPE和SMP支持的Erlang虚拟机中,新创建的进程仅占用309个字(Word,在64位服务器上为8个字节)。 其中,233个单词是堆空间(包括堆栈)。 创建和结束进程大约需要1-3微秒,而Erlang虚拟机可以同时支持成千上万个或更多的进程。

b2998b6597406f7d9bd4c75664c13d72.png

图2 Erlang的轻量级过程

当涉及到Erlang语言时,您必须提及OTP(开放电信平台)。 OTP是用于开发分布式,高度容错的Erlang应用程序的框架和平台。 例如,一个Erlang节点连接到Erlang集群并在其中注册,发现集群中的其他节点,并通过RPC与它们通信。 这些在OTP的内核服务中实现。 OTP和Erlang紧密相关,因此通常称为Erlang / OTP,因此从严格意义上讲,我们应该选择Erlang / OTP来构建UMP系统。 Erlang / OTP是开发分布式,高度容错应用程序所需元素的良好抽象,包括网络编程框架,序列化和反序列化,容错和热部署。

为了支持并发,服务器使用多进程/多线程模型,即每个进程/线程都处理一个客户端连接。 但是,由于操作系统资源的原因,每个服务器可以处理的并发连接数并不高,并且由于进程/线程上下文切换开销而影响了系统性能。 高并发,高性能服务器的开发通常使用事件驱动的状态机模型,底层使用非阻塞I / O(Linux中的epoll,BSD系统中的kqueue,Java中的nio)或异步I / O,或用于事件通知的异步I / O框架,例如C / C ++下的ACE,boost :: asio,libevent,Java下的MINA等。在业务层,状态机用于表示每个客户端连接,并且 I / O事件和超时事件驱动状态机跳转。 每个进程/线程可以处理数千个客户端连接。 和更多与流程/多线程模型相比,尽管事件驱动的状态机模型具有更高的并发性和更好的性能,但是很难将业务逻辑表示为状态机。 相比之下,多进程/多线程模型中的业务逻辑可以实现为顺序执行的代码,这很容易开发。

Erlang / OTP中的网络编程模型结合了两者的优点。 每个Erlang进程都处理一个客户端连接,并且业务逻辑按顺序执行。 Erlang过程非常轻巧。 可以认为每个Erlang进程都是状态机,堆和堆栈上的数据就是该状态机的状态。 Erlang进程在接收到数据包或其他进程发送的消息后执行处理例程,这相当于状态机的跳转,因此还具有高并发和高性能的优点。

Erlang / OTP定义了“外部术语格式”协议,以相互转换Erlang数据结构和二进制字符串,并使用C在Erlang虚拟机中实现。当跨节点通信时,它遵循此协议。 因此,开发人员无需考虑序列化和反序列化问题。

在容错方面,Erlang进程的数据空间相互隔离,并且没有共享内存。 因此,一个Erlang进程的崩溃将不会影响其他Erlang进程的操作,也不会导致Erlang虚拟机崩溃。 OTP提供了监督树机制和心脏模块。 前者在检测到Erlang进程崩溃时恢复,而后者在发现Erlang虚拟机失去响应时重新启动程序。

Erlang / OTP提供了一种热部署方法,可以避免服务升级期间的空闲时间。 此外,OTP还提供了一些工具来在系统运行时观察系统状态。 例如,lcnt工具可以计算虚拟机中的锁和冲突数量,以指导系统优化。

当前系统架构

在设计UMP系统时,我们遵循以下原则。

系统在外部维护单个入口,在内部维护单个资源池。

确保服务的高可用性并消除单点故障。

确保系统具有弹性和可伸缩性,并且可以动态添加和删除计算和存储节点。

保证分配给用户资源也具有弹性和可伸缩性,并且资源彼此隔离。

UMP系统中的角色包括:控制器服务器,代理服务器,代理服务器,API / Web服务器,日志分析服务器和信息统计服务器。 图3是当前UMP系统的体系结构图。 UMP系统依赖于Mnesia,LVS,RabbitMQ,ZooKeeper等开源组件。

32888e62b46fb93728485032c9da1d60.png

图3当前的UMP系统架构图

Mnesia是OTP提供的分布式数据库。 它与MySQL NDB位于同一扇门,是爱立信在1990年代中期为电信业务开发的数据产品。 Mnesia支持事务,支持透明数据分片,使用两阶段锁来实现分布式事务,并且可以线性扩展到至少50个节点。

从CAP理论的角度来看,Mnesia更倾向于牺牲可用性,以换取属于CP阵营的强一致性。 但是,它也提供脏的读写操作,可以绕过事务管理来操纵数据。 此时,不能保证一致性,这与AP系统有些相似。 在工程实践中,我们使用事务来修改关键数据(例如路由表),并使用脏写接口来写入非关键数据(例如用户状态信息),并使用脏读接口来读取数据。

Controller服务器为UMP集群提供各种管理服务,实现元数据存储,集群成员管理,MySQL实例管理,故障恢复,备份,迁移和扩展等功能。 Controller服务器运行一组Mnesia分布式数据库服务。 系统元数据(例如集群成员,用户配置和状态信息以及用户名到后端MySQL实例地址的映射关系(路由表))存储在Mnesia中。 ,其他服务器组件通过向Controller服务器发送请求来获取用户数据。

为了实现高可用性,系统中将部署多个Controller服务器。 他们通过ZooKeeper提供的分布式锁定算法选举一位领导者。 该负责人负责安排和监视各种系统任务,例如创建和删除数据库。 实例,备份和迁移等。这些系统任务可以分为多个步骤,并且它将涉及系统中的多个组件,例如主库,从属库和代理服务器等,并且还需要提供一种在发生故障时回滚的方法。 因此,我们使用类似的工作流程来实现。 每个系统任务都分为Erlang进程的多个阶段。 执行完每个步骤后,中间状态将保留到Mnesia中,然后跳转到下一步。 如果任务由于节点故障而停止,则领导者可以检测并重新启动任务。 任务重新启动后,它将从失败的最后一个“断点”继续执行。

API / Web服务器为用户提供系统管理界面。 它们是基于开源项目Mochiweb和Chicago Boss开发的。 Mochiweb提供HTTP / HTTPS服务,而Chicago Boss由Nginx的作者之一Evan Miller开发,并提供类似于Rails的MVC框架。 与Rails相比,Erlang开发的框架具有对并发性的良好支持。 每个请求都占用一个轻量级的Erlang进程。 尽管Rails最近引入了多线程安全性,但是在处理每个请求时它仍然是排他性的。 对于整个过程,有必要使用多进程模型来处理并发请求,并通过诸如Phusion Passenger之类的应用服务器分发它们。

代理服务器为用户提供对MySQL数据库的访问权限。 它完全实现了MySQL协议。 用户可以使用现有的MySQL客户端连接到代理服务器。 代理服务器通过用户名获取用户的认证信息。 对资源配额(例如最大连接数,QPS,IOPS等)和后台MySQL实例的地址(列表)进行限制,然后将用户的SQL查询请求转发到正确的MySQL实例。

除了数据路由的基本功能之外,代理服务器还实现以下功能:资源限制,屏蔽MySQL实例故障,读写分离,子数据库和子表分离以及记录用户 访问日志。 代理服务器是无状态的。 服务器的停机时间不会影响系统中的其他服务器。 这只会导致连接到代理的用户断开连接。 多个代理服务器使用LVS HA解决方案实现负载平衡连接后,LVS会将其定向到其他代理。

代理服务器部署在运行MySQL进程的计算机上,用于管理每台物理计算机上的MySQL实例,执行创建,删除,备份,迁移和主从切换之类的操作,收集并分析 MySQL进程的统计信息,bin日志和慢速查询日志。

日志分析服务器将存储和分析来自代理服务器的用户访问日志,并为用户实现实时索引,以查询一段时间内的慢日志和统计报告。 信息统计服务器使用RRDtool定期收集收集的用户连接,QPS值和MySQL实例的进程状态以进行统计,这些信息可以显示在Web界面上,并且将来还可以提供灵活的资源分配和自动的MySQL实例迁移 。 依据。

UMP系统中节点之间的通信(不包括直接通过TCP的大型数据流(如SQL查询和日志的传输)直接用作通过RabbitMQ进行消息通信的中间件,以确保可靠性 发送的邮件中。 ZooKeeper主要扮演配置服务器,分布式锁和监视所有MySQL实例的角色。

在多个组件的协同操作下,整个系统为用户实现了透明的灾难恢复,读写分离,子库和表划分的功能。 在系统内,多个小规模用户共享同一个MySQL实例,中型用户垄断一个MySQL实例,多个MySQL实例共享同一台物理计算机,以实现资源虚拟化并降低总体成本。 在资源隔离方面,通过结合使用Cgroup限制MySQL进程资源和Proxy服务器端限制QPS,UMP系统可以在确保用户服务质量的同时实现资源虚拟化。 另外,UMP系统全面使用SSL数据库连接,数据访问IP白名单,记录用户操作日志,SQL拦截等技术来保护用户的数据安全。

结论

天猫公司的Jushi Tower平台已使用UMP系统的某些组件(例如代理服务器和日志分析服务器)为电子商务和ISV提供安全的数据云服务。 此外,UMP系统还用于淘宝的店铺装修平台为开发人员提供数据服务。 在下一阶段,我们希望UMP系统可以进一步降低企业的数据存储成本。

有兴趣的朋友可以一起来探讨一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值