MyCat基础

MyCat

  • MyCat起源于阿里巴巴Cobar,一个可以用于MySQL读写分离和高可用的分布式数据库中间件,也可以充当分库分表中的数据库路由器
  • MyCat基于Java开发,实现了MySQL的二进制传输协议,巧妙地将自己伪装成一个MySQL Server,兼容了市面上的MySQL客户端工具和应用。

功能:分库分表

  1. 根据路由算法,对数据库进行水平拆分

    引入MyCat的优缺点:
    优点:通过中间层代理,规避了多数据源处理问题,对上层应用完全透明,有利于系统的扩展
    缺点:调用链增长,对系统性能有一定损耗

  2. 支持基于MySQL主从复制状态的高级读写分离控制机制,一旦检测到MySQL主从同步出错或者主从同步延时超过预期值,将自动排除readHost,防止程序读到很久的旧数据


下载 & 安装

  • 前往http://dl.mycat.io/下载MyCat
  • MyCat依赖于JDK7
  • adduser mycatchown,将MyCat目录所有者设置为mycat
  • 配置环境变量,加入JAVA_HOMEMYCAT_HOME
  • /conf目录下配置server.xmlschema.xmlrule.xml

使用:方法与MySQL相同

  1. MySQL命令行连接,如:mysql -h172.19.33.200 -P8066 -uroot -p123456 -Dmycat -e "select count(*) from test"
  • -P:Port,端口号,默认8066
  • -D:Database,指定连接的数据库
  • -e:execute,需要执行的SQL语句
  1. MySQL连接工具,如Navicat
  2. JDBC连接

原理

MyCat的原理很简单,就是“拦截”——拦截用户的SQL,进行分片(dataNode)分析、路由分析、读写分离分析、缓存分析等,然后发往真实的后端数据库,将返回结果进行适当的处理后再发给用户

MyCat架构图


基础概念

1.逻辑库(schema

上层应用不需要直到全部数据库的存在,同样也不想知道数据库中间件MyCat的存在,所以数据库中间件可以看作是一个或多个数据库集群构成的逻辑库。
Schema

2.逻辑表(table

既然有逻辑库就会有逻辑表,对于上层应用来说,读写数据的表就是逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不分片,只由一个表组成。
Table

注意:MyCat中同一个schema不允许出现相同的表名,即使是在不同的dataNode上也不行

(1).分片表

数据量很大的表,要切分到多个数据库,每个分片都有一部分数据,所有分片构成了完整数据。

1
2
<!--  分片表t_node,数据按照规则被分到dn1和dn2两个分片节点  -->
<table name="t_node" primaryKey="vid" autoIncrement="true" dataNode="dn1,dn2" rule="rule1" />

或使用$number1-number2表示从number1number2这么多个节点

单个节点不需要占位符$,比如dn_cart_1;多个节点才需要占位符:dn_cart_$1-5

1
2
3
4
5
6
7
8
<!--  SHOPPINGCART分为512张表  -->
<table name="SHOPPINGCART" subTables="SHOPPINGCART_$1-512"
primaryKey="CART_NUMBER" rule="ShoppingCartSubTableRule"
dataNode="dn_cart_$1-17"/>
<!-- 17个dataNode,从1到17 -->
<!--<dataNode name="dn_cart_1" dataHost="dh_cart_1" database="cart_000" saDataNode="false" saReadable="true"/>-->
<!-- 省略 2~16 -->
<!--<dataNode name="dn_cart_17" dataHost="dh_cart_17" database="cart_017" saDataNode="false" saReadable="true"/>-->

subTblLocRule="flat"表示将数据均匀分到子表

1
<table dataNode="dn_cart_$1-17" name="SHOPPINGCART_$1-512" primaryKey="ID" subTblLocRule="flat"/>

(2).非分片表

有的表数据量不大,不需要切分。

1
<table name="t_node" primaryKey="vid" autoIncrement="true" dataNode="dataNode3" />

(3).ER表

表分组Table Group):
子表的记录与所关联的父表的记录存放在同一个数据分片(schema)上,保证了JOIN操作不会跨库操作

1
2
3
4
<table name="customer" dataNode="dn1,dn2" rule="sharding-by-intfile">
<!-- orders.customer_id = customer.id -->
<childTable name="orders" joinKey="customer_id" primaryKey="id" />
</table>

(4).全局表(公共表)

对于那些变动不频繁、数据总量不大(不超过10W条记录)的表,通过数据冗余来解决这类表的JOIN,即所有分片(schema)都有一份数据的拷贝

3.分片节点(dataNode

数据切分后,一个大表被分到不同的分片数据库上,每个表分片所在的数据库就是分片节点。

4.节点主机(dataHost

数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一台机器上可以有多个分片数据库,这样的一台物理机就是一个节点主机(dataHost

5.分片规则(rule

数据切分规则。

6.全局序列号(sequence

数据切分后,原有的关系数据库主键约束在分布式条件下无法使用,需要引入外部机制保证数据唯一性标识。

7.多租户

多用户共享系统和程序组件,但是数据隔离。

(1).独立数据库

每个用户一个数据库。

  • 优点:如果故障,数据恢复简单
  • 缺点:维护成本、购置成本高

(2).共享数据库,隔离数据架构

多个用户公用数据库,但是每个租户一个schema

  • 优点:单个数据库可以支持更多租户
  • 缺点:如果出现故障,数据恢复比较困难,设计别的租户的数据

(3).共享数据库,共享数据架构

多个租户共享同一个数据库、同一个schema在表中通过TenantID区分租户

  • 优点:成本最低,单个数据库支持的租户更多
  • 缺点:隔离级别最低、数据安全性最低;数据备份和恢复困难

MyCat目录结构

  • version.txt: 版本信息
  • logs: 日志路径
  • lib: jar包路径
  • conf: 配置文件
  • catlet: 自定义代码
  • bin: 操作命令,如启动/停止/重启……

1.conf:MyCat配置

可以参考《MyCat配置文件备份》

<1>.server.xml:服务器相关

映射代码中的SystemConfig类,保存了全部系统配置信息。

(1)system:系统属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</system>
<!-- 是否支持分布式事务 -->
<property name="xaEnabled">false</property>
<!-- 分布式事务开关:为了控制是否允许跨库事务 -->
<!-- 0:不过滤分布式事务 -->
<!-- 1:过滤分布式事务(如果只涉及全局表则不过滤) -->
<!-- 2:不过滤分布式事务,但是记录分布式事务日志 -->
<property name="handleDistributedTransactions">0</property>
<!-- MyCat使用端口:默认8066 -->
<property name="serverPort">8066</property>
<!-- MyCat管理端口:默认9066 -->
<property name="managerPort">9066</property>
<property name="charset">utf8</property>
<!-- 默认SQL解析器,1.4后废除fdbparser,默认druidparser -->
<property name="defaultSqlParser">druidparser</property>
<!-- 系统可用线程数,默认为机器CPU核心数 -->
<!-- 主要影响processorBufferPool、processorBufferLocalPercent、processorExecutor -->
<!-- NIOProcessor个数也由此属性定义,所以调优可以适当提高此属性 -->
<property name="processor">10</property>
</system>
1.processorBufferChunck

指定每次分配Socket Direct Buffer的大小,默认4096字节,这个属性和processor都影响Buffer Pool的长度。如果一次性获取的数过大,Buffer不够用,经常告警,可以适当调大。

2.processorBufferPool

指定Buffer Pool计算比例值。由于每次执行NIO读、写操作都需要使用buffer,系统初始化的时候会建立一定的长度buffer pool来加快读、写效率,减少建立buffer的时间。
MyCat中主要的两个buffer pool:

  1. BufferPool
  2. ThreadLocalPool

    BufferPool是由ThreadLocalPool组合而成的,每次从BufferPool获取buffer都会有先获取ThreadLocalPool中的buffer,未命中才会去获取BufferPool中的buffer。也就是说ThreadLocalPool是作为BufferPool的二级缓存,每个线程内部使用的BufferPool上的buffer则是每个NIOProcessor共享的。

  • processorBufferPool = ProcessorBufferChunk(4096) * processors * 1000
  • BufferPool总长度 = processorBufferPool / ProcessorBufferChunk:如果得出结果不是ProcessorBufferChunk的整数倍,则结果 + 1
3.processorBufferLocalPercent

用于控制ThreadLocalPool的大小,默认100。

  • 线程缓存百分比 = processorBufferLocalPercent / processors
  • ThreadLocalPool长度 = 线程缓存百分比 * BufferPool长度 / processorBufferLocalPercent
4.processorExecutor

指定NIOProcessor上共享的businessExecutor固定线程池大小,是处理异步逻辑的线程池,新版本中使用较少了,可以设置一个较小的值。

5.MySQL连接相关属性
  • packetHeaderSize:MySQL协议报文头长度,默认4

  • maxPacketSize:MySQL协议可以携带的最大数据长度,默认16M

  • idleTimeOut:指定连接的空闲超时时间,默认30分钟,单位ms

  • chaset:默认utf8

  • txIsolation:前端连接的初始化事务隔离级别,只在初始化时使用,后续会根据客户端传过来的属性对后端数据库连接进行同步。默认RR,数字3。

    RU = 1
    RC = 2
    RR = 3
    SERIALIZABLE = 4

  • sqlExecutoTimeout:SQL执行超时时间

  • 6.心跳属性
  • processorCheckPeriod:清理NIOProcessor上前后端空闲、超时和关闭连接的间隔时间,默认1秒,单位ms

  • dataNodeIdleCheckPeriod:对后端连接进行空闲、超时检查的时间间隔,默认300秒,单位ms

  • dataNodeHeartbeatPeriod:对后端所有读、写库发起心跳检测的时间间隔,默认10秒,单位ms

7.useOffHeapForMerge:是否使用非堆内存处理跨分片结果集

使用堆外内存(Direct Memory)处理跨分片结果集的Merge/order by/group by/limit

(2)user:用户

通过user属性可以配置多租户。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<user name="root">
<property name="password">123456</property>
<!-- 配置可访问的schema,多个可以用逗号隔开,如果不配置默认全部都可以访问 -->
<property name="schemas">TESTDB</property>
<property name="readOnly">false</property>
<!-- 连接服务降级处理,当前端整体连接数到达基准值时,对来自该账户的请求开始拒绝连接,0表示不限制 -->
<property name="benchmark">11111</property>
<property name="usingDecrypt">1</property>
<!-- 对schema及其下的table进行精细化的DML权限管理 -->
<privileges check="true">
<schema name="TESTDB" dml="0010" showTables="custome/sql">
<table name="tbl_user" dml="0110"></table>
<table name="tbl_dynamic" dml="1111"></table>
</schema>
</privileges>
</user>
(3)firewall防火墙:白名单 & 黑名单

详细配置参考《MyCat权威指南》第6章,可以通过黑名单防止SQL注入

1
2
3
4
5
6
7
8
9
10
11
12
<!--  防火墙  -->
<firewall>
<!-- 白名单,白名单以外的host无法登录 -->
<whitehost>
<host user="mycat" host="127.0.0.1"></host>
</whitehost>
<!-- 黑名单,黑名单SQL不允许执行 -->
<blacklist check="true">
<!-- 不允许执行select -->
<property name="selectAllow">false</property>
</blacklist>
</firewall>

<2>.schema.xml:数据库相关(读写分离、主从切换)

包括库结构(schema)、表(table)、逻辑分片节点(dataNode)、物理节点(dataHost)。

dataNode是分片数据库,dataHost是主机,一个dataHost主机上可以有多个dataNode数据库,即dataNode = database@dataHost
多个库在同一台主机上是允许的,但是没有实际意义,因为无法降低单主机的负载

  • MyCat支持读写分离,但是不负责MySQL主从同步
  • 通过心跳检测,实现高可用的自动主备切换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!--  schema用于定义MyCat中的逻辑库,可以有多个  -->
<!-- checkSQLschema=true时,如果查询时带有schema会自动删除,防止报错 -->
<!-- sqlMaxLimit=n时,select...from后会自动加上limit n-->
<schema name="mycat" checkSQLschema="false" sqlMaxLimit="">
<!-- table用于定义MyCat中的逻辑表 -->
<!-- name:逻辑表表名-->
<!-- dataNode:将逻辑库绑定到具体的逻辑分片节点dataNode上 -->
<!-- 可以使用“$x-y”进行逻辑节点批量配置 -->
<!-- rule:逻辑表要使用的规则名称,即rule.xml的tableRule name -->
<table name="MYCAT_TEST" dataNode="mysql$0-99,mysql$100-199" rule="mod-long" />
<!-- ruleRequired: -->
<!-- 表是否绑定分片规则,如果true,没有配置具体rule,程序报错 -->
<!-- primaryKey: -->
<!-- 逻辑表对应真实表的主键 -->
<!-- type: -->
<!-- 逻辑表类型:目前只有全局表global和普通表 -->
<!-- autoIncrement: -->
<!-- 自增长主键 -->
<!-- subTables -->
<!-- 分表,最多一个,且开启分表则不支持JOIN语句 -->
<!-- needAddLimit: -->
<!-- 默认true,需要自动在每个表后加limit限制 -->
</schema>

<!-- dataNode逻辑节点,即数据分片:dataNode= database @ dataHost -->
<dataNode name="mysql$0-99" dataHost="mysql1" database="db$0-99" />
<dataNode name="mysql$100-199" dataHost="mysql2" database="db$100-199" />

<!-- dataHost物理节点 -->
<!-- balance:读写分离 -->
<!-- writeType:负载均衡 -->
<!-- switchType:主从切换——通过心跳检测,实现高可用的自动切换 -->
<!-- maxCon:每个读写实例连接池的最大连接,也就是说writeHost和readHost连接池的最大连接数都是这个值 -->
<!-- dbDriver:支持native(二进制MySQL协议)和JDBC -->
<dataHost name="mysql1" maxCon="10000" minCon="10"
balance="0"
writeType="0" dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<!-- 心跳语句 -->
<heartbeat>select user()</heartbeat>
<!-- 写节点,可以有多个 -->
<!-- 如果writeHost宕机:①其下所有readHost不可用;②切换到备用writeHost -->
<writeHost host="mysql202" url="172.19.33.198:3306" user="mycat" password="123456">
<!-- 读节点,可以有多个 -->
<!-- weight:配置readHost的权重 -->
<!-- usingDecrypt:是否对密码加密 -->
<readHost host="mysql203" url="172.19.33.199:3306" user="mycat" password="123456" />
</writeHost>
</dataHost>
balance:读写分离
  1. balance="0":不开启读写分离,所有读操作都被发送到writeHost
  2. balance="1":全部的readHoststandby writeHost参与读操作的负载均衡
  3. balance="2":全部的读操作随机在writeHostreadHost分发
  4. balance="3"所有读操作随机分发到writeHost对应的readHost执行,writeHost不承担读压力
writeType:负载均衡
  1. writeType="0":所有写操作发往配置好的第一个writeHost,第一个挂了切换到第二个,重启以切换后的为准,切换记录在:dnindex.properties
  2. writeType="1":所有写操作随机发往配置的writeHost,MyCat 1.5后废弃。
switchType:主从切换
  1. switchType="-1":不自动切换

  2. switchType="1":默认值,表示自动切换

  3. switchType="2"基于MySQL主从同步的状态决定是否切换,心跳语句为show slave status

    show slave status是主从切换语句。

  4. switchType="3":基于MySQL galary cluster的自动切换,心跳语句为show slave status like 'wsrep%'

childTable标签:ER表
1
2
3
4
<table name="customer" dataNode="dn1,dn2" rule="sharding-by-intfile">
<!-- orders.customer_id = customer.id -->
<childTable name="orders" joinKey="customer_id" primaryKey="id" />
</table>

用于定义ER分片的子表,通过标签上的属性与父表关联

  • name:定义子表的表名。

  • joinKey:插入子表时会使用这个列的值查找父表存储的数据节点。

  • parentKey:与父表建立关联关系的列名。

    先获取joinKey的值,再根据parentKey属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上,从而确定子表存储的位置。

  • primaryKey:主键

  • needAddLimit:是否需要自动加limit


3.rule.xml:分片规则相关

包括表路由配置(tableRule)、路由规则函数(function)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!--  表路由  -->
<tableRule name="rule1">
<rule>
<!-- columns:对物理表中的哪一列进行拆分 -->
<columns>CRATETIME</columns>
<!-- algorithm:使用何种路由算法,对应function name -->
<algorithm>murmur</algorithm>
</rule>
</tableRule>

<!-- 路由算法 -->
<!-- name:算法名 -->
<!-- class:算法具体对应类 -->
<!-- property:算法具体属性 -->
<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property>
<!-- count是要分片的数据库节点数量,必须指定 -->
<property name="count">2</property>
<!-- 一个实际数据库节点必须映射为160个虚拟数据库节点 -->
<property name="virtualBucketTimes">160</property>
1.分片枚举:PartitionByFileMap

通过在配置文件中配置可能的枚举ID,自己配置分片,比如有些业务需要按照省份或来做保存,但是全国省份是固定的。
如果碰到没有配置的枚举值,就会由于不识别而报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<tableRule name="sharding-by-intfile">
<rule>
<columns>user_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>

<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<!-- mapFile:分片配置文件 -->
<property name="mapFile">partition-hash-int.txt</property>
<!-- type:0:Integer;1:String-->
<property name="type">0</property>
<!-- defaultNode:小于0表示不设置默认节点,大于等于0表示设置 -->
<property name="defaultNode">0</property>
</function>

<!--partition-hash-int.txt:
10000=0
10010=1
DEFAULT_NODE=1-->
2.固定分片hash算法:PartitionByLong
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<tableRule name="rule1">
<rule>
<columns>user_id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>

<function name="func1" class="io.mycat.route.function.PartitionByLong">
<!-- 分片个数列表 -->
<property name="partitionCount">2,1</property>
<!-- 分片长度列表 -->
<property name="partitionLength">256,512</property>
<!-- 分区为:256 + 256 + 512 -->
</function>
3.范围约定:AutoPartitionByLong

提前规定分片字段某个范围属于哪个分片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<tableRule name="auto-sharding-long">
<rule>
<columns>user_id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>

<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<!-- mapFile:分片配置文件 -->
<property name="mapFile">autopartition-long.txt</property>
<!-- defaultNode:小于0表示不设置默认节点,大于等于0表示设置 -->
<property name="defaultNode">0</property>
</function>

<!--autopartition-long.txt:
0-500M=0
500M-1000M=1
1000M-1500M=2-->
4.取模:PartitionByMod

对分片字段取模进行分区。

1
2
3
4
5
6
7
8
9
10
11
<tableRule name="mod-long">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- % count -->
<property name="count">3</property>
</function>
5.按日期(天)分片:PartitionByDate
6.取模范围约束:PartitionByPattern
7.截取数字做hash求模范围约束:PartitionByPrefixPattern
8.应用指定:PartitionDirectBySubString
9.截取数字hash解析:PartitionByString
10.一致性hash:PartitionByMurmurHash

参考《一致性hash原理》
数据迁移需要手工迁移,未提供自动迁移方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<tableRule>
<rule>
<columns>user_id</columns>
<algorithm>murmur</algorithm>
</rule>
<tableRule>

<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property>
<!-- 分片数量 -->
<property name="count">2</property>
<!-- 一个实际节点默认被映射为160个虚拟节点,这是为了保证数据的均匀性 -->
<property name="virtualBucketTimes">160</property>
<!-- 节点权重,没有指定权重的节点默认是1。
以.property文件的格式填写,
以0~(count-1)的整数值(即节点索引)为key,
以节点权重为value(所有权重必须是正整数,否则以1代替) -->
<property name="weightMapFile">weightMapFile</property>
<!-- 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了该属性,
会把虚拟节点的一致性hash值和物理节点的映射按行输出到该文件,
如果不指定,就不会输出 -->
<property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
</function>
11.按单月小时拆分:LatestMonthPartition
12.范围取模分片:PartitionByRangeMod
13.日期范围hash分片:PartitionByRangeDateHash
14.冷热数据分片:PartitionByHotDate
15.自然月分片:PartitionByMonth
16.crc32slot分片算法:PartitionByCRC32PreSlot

2.bin:操作命令

  • 启动/停止/重启:bin/mycat start / stop / restart
  • 日志直接输出控制台:bin/mycat console
  • 查看版本:show @@version
  • 查看连接信息:show @@connection
  • 查看后端连接状态:show @@backend
  • 查看缓存:show @@cache
  • 查看数据状态:show @@datasource
  • 查看执行的SQL:show @@sql
  • 查看执行的SQL的统计信息:show @@sql.sum
  • 进入管理端口:mysql -h172.19.33.200 -P9066

    进入管理端口后,通过show @@help;可以查看所有管理命令


MyCat内存分层管理(JVM

MyCat内存分为3块:

  1. 结果集处理内存:分为堆外内存Direct Memory和堆内存Heap Memory
  2. 系统预留内存:Heap Memory
  3. 网络处理内存:全部是堆外内存Direct Memory

JVM参数:-Xmx1024m -Xmn512m -XX:MaxDirectMemorySize=2048m -Xss256K -XX:+UseParallelGC避免OOM,减少full gc时间,提高MyCat响应速度


MyCat不支持的SQL语句

MyCat是根据分片字段来进行路由的,所以记住一个原则:
SQL语句中最好是显式表明分片字段,否则MyCat就会去遍历所有节点,效率不高

SELECT

  1. 跨分片(dataHost实体库)的交叉查询

  2. 跨节点(dataNode)的联合查询

    比如:用户库的表 和 平台库的表 做联合查询

  3. 不支持3表及其以上跨库JOIN

    MyCat目前只支持2表JOIN

INSERT

  1. 插入的字段不含分片字段

    比如:插入tbl_user_base_info却没有提供user_id

  2. 插入的分片字段找不到对应的分片

  3. 复制插入insert into ... select ...

  4. 多行插入insert into table(c1,c2) values (v1,v2), (v3,v4)

UPDATE

  1. 更新的列包含分片列
  2. 多表更新:update a, b set a.nation='China', b.pwd=’123456’ where a.id=b.id;
  3. 跨表复杂更新:update a, b set a.nation='China' where a.id=b.id;

    但是支持子查询方式:update a, b set a.nation='China' where id in (select id from b);

DELETE

  1. 跨表复杂删除:delete a from a join b on a.id=b.id;

    但是支持子查询方式:delete from a where a.id in (select id from b);

其他

  1. 不支持存储过程
  2. 不支持自定义函数
  3. ORDER BY字段必须出现在SELECT
  4. 谨慎使用子查询,外层查询没有分片条件的话,会在所有分片上执行

MyCat高可用性

目前来说,MyCat没有实现集群,但是可以通过HAProxy来做负载均衡

MyCat计划在2.0引入MyCat Load Balancer基于Nginx实现负载均衡。
通过ZooKeeper对集群进行管理,实现主从切换。


MyCat分布式事务

2PA:先执行,如果出错就回滚,否则提交


发展

MyCat 2.0:全部重构MyCat,打造真正的分布式数据库中间件。

MyCat 2.0 架构图

  • 完全实现分布式事务
  • ZooKeeper:协调主从切换、管理MyCat集群
  • MyCat Load Balancer:基于Nginx负载均衡组件(可以用于替换HAProxy
  • MyCat-eye:多中心配置管理、可视化配置与智能监控、自动运维、在线扩容、数据迁移、智能优化……
  • MyCat Server支持XA事务,无状态路由,支持1000亿大表
  • MyCat Booster:本地SQL加速、实时流机制、自动扩容
-------------本文结束感谢您的阅读-------------

本文标题:MyCat基础

文章作者:DragonBaby308

发布时间:2019年08月12日 - 22:37

最后更新:2019年10月15日 - 20:44

原始链接:http://www.dragonbaby308.com/mycat/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%