Mycat 网络通信模块源码

本文探讨了Mycat数据库中间件中不同类型的I/O模型,包括阻塞型、非阻塞同步及非阻塞异步I/O。重点介绍了Reactor和Proactor模式在NIO与AIO中的应用,以及它们在实际场景中的表现差异。

Mycat 用户手册:
系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步型.
阻塞型I/O意味着控制权直到调用操作结束了才会回到调用者手里. 结果调用者被阻塞了, 这段时间了做不了任何其它事情. 更郁闷的是,在等待IO结果的时间里,调用者所在线程此时无法腾出手来去响应其它的请求,这真是太浪费资源了。拿read()操作来说吧, 调用此函数的代码会一直僵在此处直至它所读的socket缓存中有数据到来.
相比之下,非阻塞同步是会立即返回控制权给调用者的。调用者不需要等等,它从调用的函数获取两种结果:要么此次调用成功进行了;要么系统返回错误标识告诉调用者当前资源不可用,你再等等或者再试度看吧。比如read()操作, 如果当前socket无数据可读,则立即返回EWOULBLOCK/EAGAIN,告诉调用read()者“数据还没准备好,你稍后再试”。
在非阻塞异步调用中,稍有不同。调用函数在立即返回时,还告诉调用者,这次请求已经开始了。系统会使用另外的资源或者线程来完成这次调用操作,并在完成的时候知会调用者(比如通过回调函数)。拿Windows的ReadFile()或者POSIX的aio_read()来说,调用它之后,函数立即返回,操作系统在后台同时开始读操作。
在以上三种IO形式中,理论上,非阻塞异步是性能最高、伸缩性最好的。
同步和异步是相对于应用和内核的交互方式而言的,同步需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。
对于JAVA的API来说:

  • java.net.Socket就是典型的阻塞型IO
  • java NIO非阻塞同步
  • java AIO非阻塞异步
    MyCAT起源于Cobar,Cobar前端为NIO后端为BIO,后端就是通过java.net.Socket进行读写,所以Cobar后端每次进行读写都会造成线程阻塞,后端能支持的连接总数就成为瓶颈所在。
    MyCAT在基于Cobar改版时,直接采用了Java 7的AIO,前后端都实现了非阻塞异步。由于Linux并没有真正实现AIO,实际测试下来,AIO并不比NIO快,反而性能上比NIO还要慢。所以MyCAT在2014年下半年,做了一次网络通信框架的大调整,改为同时支持AIO和NIO,通过启动参数让用户来选择哪种方式。虽然现在AIO比NIO慢,但是MyCAT仍然保留了AIO实现,就是为了等Linux真正实现AIO后,可以直接支持。
    Reactor和Proactor
    MyCAT同时实现了NIO和AIO,为了便于读者更清楚理解代码实现,先介绍NIO和AIO分布对应的两种设计模式:Reactor和Proactor
    一般情况下,I/O 复用机制需要事件分享器(event demultBossiplexor). 事件分享器的作用,即将那些读写事件源分发给各读写事件的处理者,就像送快递的在楼下喊: 谁的什么东西送了, 快来拿吧。开发人员在开始的时候需要在分享器那里注册感兴趣的事件,并提供相应的处理者(event handlers),或者是回调函数; 事件分享器在适当的时候会将请求的事件分发给这些handler或者回调函数。
    涉及到事件分享器的两种模式称为:Reactor和Proactor. Reactor模式是基于同步I/O的,而Proactor模式是和异步I/O相关的. 在Reactor模式中,事件分离者等待某个事件或者应用或操作的状态发生(比如文件描述符可读写,或者是socket可读写),事件分离者就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。
    而在Proactor模式中,事件处理者(或者代由事件分离者发起)直接发起一个异步读写操作(相当于请求),而实际的工作是由操作系统来完成的。发起时,需要提供的参数包括用于存放读到数据的缓存区,读的数据大小,或者用于存放外发数据的缓存区,以及这个请求完后的回调函数等信息。事件分离者得知了这个请求,它默默等待这个请求的完成,然后转发完成事件给相应的事件处理者或者回调。举例来说,在Windows上事件处理者投递了一个异步IO操作(称有overlapped的技术),事件分离者等IOCompletion事件完成. 这种异步模式的典型实现是基于操作系统底层异步API的,所以我们可称之为“系统级别”的或者“真正意义上”的异步,因为具体的读写是由操作系统代劳的。
    Reactor与Proactor两种模式的场景区别:
    下面是Reactor的做法:
    1. 等待事件响应 (Reactor job)
    2. 分发 “Ready-to-Read” 事件给用户句柄 ( Reactor job)
    3. 读数据 (user handler job)
    4. 处理数据( user handler job)
      下面再来看看真正意义的异步模式Proactor是如何做的:
    5. 等待事件响应 (Proactor job)
    6. 读数据 (Proactor job)
    7. 分发 “Read-Completed” 事件给用户句柄 (Proactor job)
    8. 处理数据(user handler job)
      从上面可以看出,Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.
      最后结合下面的两张图更容易理解(这是别人的图,非原创):\

Mycat 网络通信模块源码

转载于:https://blog.51cto.com/superhakce/2089816

<think>我们正在讨论Mycat的优势和特点。根据引用内容,Mycat是一个开源的分布式数据库中间件,它实现了MySQL协议,可以看作是一个数据库代理。以下是根据引用内容总结的Mycat的主要优势和特点: 1. **透明性**:Mycat对前端应用表现为一个MySQL数据库(使用8066端口,而非MySQL的3306端口),因此可以使用熟悉的MySQL客户端和对象映射框架连接[^2]。这使得应用迁移到Mycat时代码改动最小。 2. **数据存储与可靠性**:Mycat本身不存储数据,数据存储在后端的数据库(如MySQL)中,因此数据可靠性和事务由后端数据库保证[^1]。这样Mycat可以借助成熟的数据库存储引擎(如InnoDB)的特性。 3. **分库分表**:Mycat的核心功能是分表分库,能够将大表水平分割成多个小表,分布存储在后端多个数据库服务器上,从而解决单库性能瓶颈问题[^5]。4.**读写分离**:Mycat可以配置读写分离,将读操作分发到多个从库,写操作发送到主库,从而提高系统的读性能[^3]。 5. **容灾备份**:Mycat支持高可用架构,当后端数据库出现故障时,可以自动切换到备用节点,保证服务的连续性[^3]。6.**多租户支持**:Mycat可用于多租户应用开发,通过分库分表实现租户数据的隔离,适合云平台基础设施[^3]。 7. **灵活性和适应性**:Mycat的架构设计使得系统具备很强的适应性和灵活性。通过配置,可以将不同的表映射到不同的存储引擎上,而应用代码无需改变[^3]。 8. **智能优化**:Mycat计划提供智能优化模块,能够分析系统的数据访问瓶颈和热点,根据统计数据进行自动或手工调整后端存储,优化性能[^3]。9.**序列支持**:Mycat提供了全局序列号的支持,例如通过存储过程设置序列值(如`mycat_seq_setval`)[^4],这对于分布式环境下生成唯一ID非常重要。 10. **多协议支持**:Mycat后端不仅支持MySQL原生协议,还可以通过JDBC协议与大多数主流数据库(如Oracle、SQLServer等)通信[^5],具有较好的扩展性。 综上所述,Mycat作为一个分布式数据库中间件,主要优势在于其透明性、数据分片、读写分离、高可用性以及灵活的多租户支持,能够有效提升数据库系统的性能和扩展性,同时保持与MySQL的兼容性,降低开发者的学习成本。§§相关问题§§1. Mycat在分库分表时如何保证数据的一致性?2.Mycat的读写分离具体是如何实现的?3.Mycat支持哪些类型的全局序列(sequence)?4.Mycat如何实现高可用和故障切换? 5. Mycat与MySQL在性能上有哪些差异?</think>### Mycat的优势和特点介绍 Mycat是一款开源的分布式数据库中间件,核心定位是解决大数据量、高并发场景下的数据库性能瓶颈问题。其主要优势和特点如下: #### 1. **MySQL协议透明兼容** - Mycat实现了MySQL协议,前端应用可直接使用MySQL客户端工具连接(默认端口8066)[^2][^5]。 - 支持主流ORM框架,对应用层代码几乎零侵入,迁移成本低[^2]。 #### 2. **分布式架构核心能力** - **分库分表**:将大表水平拆分为多个小表,分布到不同数据库节点,解决单库容量和性能瓶颈[^3][^5]。 - **读写分离**:自动将写操作路由到主库,读操作分发到从库,提升并发处理能力[^3]。 - **多租户支持**:通过逻辑库隔离不同租户数据,适合SaaS应用[^3]。 #### 3. **数据可靠性与事务保障** - Mycat本身不存储数据,数据持久化和ACID事务由后端数据库(如MySQL)保证[^1]。 - 可无缝集成InnoDB等成熟存储引擎,确保数据一致性[^1]。 #### 4. **智能化运维与扩展性** - **弹性扩缩容**:动态添加/移除数据库节点,无需停服[^3]。 - **智能优化**:未来版本将提供热点分析功能,自动识别访问瓶颈并调整存储策略[^3]。 - **多后端支持**:通过JDBC协议兼容Oracle/SQL Server等数据库[^5]。 #### 5. **高可用与容灾** - 支持数据库故障自动切换,结合心跳检测实现高可用[^3]。 - 提供全局序列号生成器(如时间戳、存储过程),确保分布式ID唯一性[^4]。 #### 6. **性能优化特性** - 对分片表推荐使用原生SQL以获得最佳性能,避免ORM额外开销[^2]。 - 结果集合并优化,减少网络传输消耗[^5]。 > **典型应用场景**:电商分库分表(订单表水平拆分)、金融系统读写分离、云平台多租户数据隔离等[^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值