2.0 DragonHADatasource

2017-11-09 23:00:21 4,513 0

    DragonHADatasource是一个支持读写分离的数据源,只需要在项目中引入依赖,代码无需做任何修改,就可以实现读写分离功能。

为了体验DragonHADatasource的读写分离功能,读者应该先配置一下数据库的主从关系。以mysql为例,关于如何配置mysql主从,网上的教程有很多,也可以参考笔者编写的:http://www.tianshouzhi.com/api/tutorials/mysql

DragonHADatasource工作原理

        在读写分离的情况下,存在一个主库和多个从库。我们需要配置多个普通的数据源分别连接每个库。如下图中演示了配置了3个druid数据源,然后将这个三个数据源交给DragonHADatasource进行管理。

Image.png

由于DragonHADatasource实现了JDBC规范定义的API,因此可以直接与ORM框架进行整合。当业务要执行一条sql时,dragon首先会判断sql的类型,总的来说,dragon中定义的sql类型分为2类:读sql(走从库)、写sql(走主库)

1、读sql:目前dragon认为以下四种sql类型select, show, debug, explain属于读sql

2、写sql:除了读sql中定义的4种类型,其他的sql都认为是写sql,如insert、update、delete等。

DragonHADatasource的重要特性

1、权重:权重分为读权重(read weight)和写权重(write weight)。DragonHADatasource支持为其管理多个普通数据源(如druid)配置权重。

连接主库数的据源

    因为主库只有一个。我们通常设置连接主库的数据源writeWeight>0,readWeight=0。writeWeight只需要>0即可,具体值是多少是无关紧要的。

连接从库的数据源

    对于连接从库的数据源,我们要配置writeWeight=0,readWeight>0。因为从库此外权重还起到流量调整的作用,例如,在主从配置的时候,经常会有多个从库,不同的从库可能性能不同,我们希望性能较好的从库可以承担更多的查询请求,此时我们就可以把连接这个从库的读权重设置的大一点。举例来说,两个连接从库的数据源的读权重如下所示:

Image.png

2、强制走主库:默认情况下,所有的数据库更新sql都会走主库。但是有些场景下,读sql也希望走主库。dragon提供了2种方式让开发人员自定义要走主库的sql。另外,事务中的sql都会走主库。

3、高可用:在存在多个从库的情况下,如果某个从库异常宕机了或者不能正常提供服务了,DragonHADatasource会自动感知到,从而将这台从库隔离,之后的查询请求,将不会再路由到这个从库中。此外,DragonHADatasource还会定时检测这个从库服务是否恢复了正常,一旦检测到可以正常提供服务,之后的查询请求又可以路由到这个从库上。 

补充

实现读写分离,还有其他方案,例如利用haproxy的,也有利用Spring提供的AbstractRoutingDataSource的。但是最优雅的方案,还是利用一个本身就支持读写分离功能的数据源(DragonHADatasource)。在某些情况下,这种好处非常明显,例如对于一个已有的应用,要进行读写分离功能,但是为了避免风险又不想修改原来的业务代码,此时只需要将数据源换为DragonHADatasource即可,业务代码无需做任何更改,即可实现读写分离功能。