Mycat实现分布式postgreSQL集群

1、mycat 简介

         Mycat 是一个开源的分布式数据库系统,是由阿里开源Cobar演化而来,解决之前cobar存在的问题。比如:假死(cobar的前端使用NIO,后端采用阻塞模式并未实现NIO,一旦数据库当前线程池占用后,即便再简单的SQL,或者试图建立新链接,数据库都会无法响应。)、数据一致性?(一旦cobar假死之后,如果实现了cobar高可用,并配置了心跳检测。心跳检测失败后cobar会进行主从切换 ,这就导致cobar,认为数据库宕机了,切换其他节点进行数据库操作,但实际上只是因为数据库阻塞。这就可能多个节点数据库都在进行写操作,从而严重影响数据库的数据的一致性。)等等一系列的问题。 mycat实现了 MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库。

          目前采用mycat作为分布式数据库架构的企业案例

简单的说,MyCAT就是:

        1、一个彻底开源的,面向企业应用开发的“大数据库集群”

        2、支持事务、ACID、可以替代Mysql的加强版数据库

        3、一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server

        4、结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

        5、一个新颖的数据库中间件产品

 

2、原理      

        Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

        更多原理请参看官网

        mycat源码地址

        监控系统

3、准备

        本次测试在ubuntu环境下,打算使用四个数据库,做两个分片,并且每个分片上实现读写分离,所有需要四个数据库。

        我们本机启动一个postgresql数据库,推荐大家使用docker官方安装三个postgresql的镜像,比较简单,也不怕出错。安装 docker。并执行一下两条命令:

         1、docker pull postgres

         2、docker run --name postgres -e POSTGRES_PASSWORD=123456 -p 54321:5432 \ -v /etc/data/pgdata:/var/lib/postgresql/data-d postgres

         3、 启动以上的四个数据库。

         到此准备工作已经ok。注意在步骤2中修改密码,主机映射地址。          

4|、开始

        1、在mycat的conf目录下修改server.xml; 这里是配置访问分布式数据库统一的数据库、用户名、密码。当然也可以配置权限。步骤4里面所有的配置的意义以及更多意义更多配置方式请参考mycat 官网权威指南

                   <user name="postgresmycat">
                             <property name="password">postgresmycat</property>
                            <property name="schemas">postgresmycats</property>
                  </user>                                

        2、在mycat的从conf目录下修改schema.xml;这里主要是进行分片,暂时不考虑主从复制,只是做了分布式和读写分离。这一块很庞杂,比如全局表、E-R关系分片等。都是围绕分片展开。另外本次测试数据库id并不是自增的。修改至如下:其中配置细节请参考官网权威指南

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/&quot;>

     <!-- 自动取模分片 -->
    <schema name="postgresmycats" checkSQLschema="false" sqlMaxLimit="100">
        <!-- primarykey="id" autoIncrement="true" -->
        <table name="tb_user" dataNode="mydn3,mydn4" rule="sharding-by-murmur" primaryKey="id"       />
        <table name="tb_student" dataNode="mydn3,mydn4"  rule="user-mod-long"  />

        <!-- 全局表 -->
        <!--  <table name="province" type="global" dataNode="mydn3,mydn4" />  -->
        <!-- E-R关系分片
         <table name="customer" dataNode="dn1,dn2,dn3" rule="auto-sharding-long-customer">
                <childTable name="orders" joinKey="customer_id" parentKey="id"/>
         </table>            -->

    </schema>
    
    <dataNode name="mydn3" dataHost="myhost3" database="IIOSS_IoT"/>
    <dataNode name="mydn4" dataHost="myhost4" database="IIOSS_IoT"/> 


    <dataHost name="myhost3" maxCon="100" minCon="10" balance="3" writeType="0" dbType="postgresql"
 dbDriver="jdbc" slaveThreshold="100" switchType="1">
        <heartbeat>select user</heartbeat><!-- 注意这里的心跳检测命令跟mysql的有点不同 -->
        <writeHost host="hostM3" url="jdbc:postgresql://localhost:54321/IIOSS_IoT" user="postgres" password="123456">
            <readHost host="hostS3" url="jdbc:postgresql://localhost:5432/IIOSS_IoT" user="postgres" password="123456"/>
        </writeHost>
    </dataHost>
    <dataHost name="myhost4" maxCon="100" minCon="10" balance="3" writeType="0" dbType="postgresql" dbDriver="jdbc"

 slaveThreshold="100" switchType="1">
        <heartbeat>select user</heartbeat>
        <writeHost host="hostM4" url="jdbc:postgresql://192.168.0.112:5432/IIOSS_IoT" user="postgres" password="123123">
            <readHost host="hostS4" url="jdbc:postgresql://192.168.0.122:5432/IIOSS_IoT" user="postgres" password="123123"/>
        </writeHost>
    </dataHost>

</mycat:schema>

         3、设置分片规则,修改mycat的conf目录下的rule.xml,添加如下内容:

    <tableRule name="user-mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="student-mod-long">
        <rule>
            <columns>user_id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>

          4、启动mycat,进行测试,mycat配置后的完整实例。测试代码springboot做的简单测试代码,下载,运行,其实就是给数据库insert,之后我们分别在配置的各个数据库中查看,会发现数据取余分散在这些数据库中。

         5、  也可以省略4步骤,使用命令插入数据,根据1步骤中配置的mycat连接方式:mysql -upostgresmycat -ppostgresmycat -h127.0.0.1 -P8066

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Mycat是一个开源的分布式数据库中间件,可以将多个数据库实例组织成一个逻辑库,并提供高可用、负载均衡和横向扩展等功能。Mycat通过将数据水平切分并存储在不同的数据库实例中,实现分布式分布式事务是指跨多个数据库实例的事务操作。在分布式场景下,一个事务可能涉及多个数据库实例的读写操作。Mycat提供了分布式事务的支持,通过在Mycat中引入分布式事务协调器,实现多个数据库实例中的事务一致性。 在Mycat中,分布式事务的实现主要依赖于两个核心组件:分布式事务协调器TCC(Try-Confirm-Cancel)和分布式锁机制。 首先,Mycat使用TCC协调器来管理分布式事务的各个阶段。在事务操作开始时,TCC协调器负责向所有参与者发送Try请求,各个参与者在Try阶段执行相应的业务逻辑,并进行资源的预留和锁定。在所有参与者的Try都成功之后,TCC协调器再发送Confirm请求,各个参与者进行业务的真正提交操作,并释放相应的锁资源。如果任何一个参与者在Try或Confirm阶段操作失败,TCC协调器会发送Cancel请求,各个参与者执行业务的回滚操作。 其次,Mycat还使用分布式锁机制来保证分布式事务中的并发性和一致性。在事务的Try阶段,分布式锁的机制可用于防止多个事务对同一资源进行并发的读写操作,从而避免了数据的脏读和不一致的状态。 总之,Mycat分布式分布式事务的实现,通过引入TCC协调器和分布式锁机制,使得多个数据库实例之间的事务操作可以保持一致性和并发性。这为分布式环境下的数据操作提供了更加可靠和高效的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值