MyCat笔记
Mycat是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。 Mycat是一个开源的分布式数据库系统,用户可以将它看作是一个数据库代理,Mycat后端可以支持MYSQL、SQL SERVER、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种Nosql方式的存储,在最终用户看来,无论是那种存储方式,在Mycat里都是一个传统的数据库,支持标准的SQL语句进行数据的操作。 Mycat本身并不存储数据,数据是在后端存储的,因此数据可靠性及事务等都是后端保证的,默认端口是8066,建议对于分片表,尽量使用基础的SQL,因为这样能达到最佳性能。 Mycat是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让我们的架构具备很强的适应性和灵活性。借助于ELK可以对数据访问瓶颈和热点一目了解然,根据这些统计分析数据,我们可以自动或手工调整后端存储,将不同的表映射到不同的存储引擎上,而整个应用的代码一行也不用改变。 Mycat拦截用户发过来的sql语句,首先去SQL语句做一些特定分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回结果做适当的处理,最终返回给用户。 Mycat应用场景
在云计算时代,数据库中间件可以以多租户的形式给一个或多个应用提供服务,每个应用访问的可能是一个独立或是共享的物理库,常见的如阿里云数据库服务器RDS。 关键概念分片表(t_node就是属于分片表,数据按照规则被分到dn1,dn2两个分片节点上):
name定义逻辑表的表名,这个名字就如同我们在数据库中执行create table命令指的名字一样,同一个schema标签中定义的名字必须唯一。
rule属性 此属性用于指定逻辑表要使用的规则名字,规则名字在rule.xml中定义,必须与tableRule标签中name属性值一一对应。 ruleRequired属性 该属性用于指定表是否绑定分片规则,如果配置为true,但没有配置具体rule的话,程序会报错。 primaryKey属性 该逻辑表对应真实表的主键,例:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的DN上,如果使用该属性配置真实表的主键,那么mycat会缓存主键与具体DN的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的DN. type属性 该属性定义了逻辑表的类型,目前逻辑表只有全局表和普通表两种类型
autoIncrement属性 mysql对非自增长主键,使用last_insert_id()是不会返回结果的,只会返回0.所以只有定义了自增长主键的表才可以用last_insert_id()返回主键值。 mycat目前提供了自增长主键功能,但是如果对应的mysql节点上数据表,没有定义auto_increment,那么在mycat层调用last_insert_id()也是不会返回结果的。 由于insert操作的时候没有带入分片键,mycat会先取下这个表对应的全局序列,然后赋值给分片键,这样才能正常的插入到数据库中,最后使用last_insert_id()才会返回插入的分片键值。使用此功能,最好配合使用数据库模式的全局序列。 needAddLimit属性 此属性默认true,指定表是否需要自动的在每个语句后面加上limit限制,由于使用了分库分表,数据量有时会特别巨大,这时候执行查询语句,如果恰巧又忘记了加上数量限制的话,那么查询所有数据,会比较费时,所以mycat就自动为我们加上limit 100. childTable标签childTable用于定义ER分片的子表,通过标签上的属性与父表进行关联 定义子表的表名 joinKey属性 插入子表的时候会使用这个列的值查找父表存储的数据节点 parentKey属性 此属性指定的值一般为与父表建立关联关系的列名,程序首先获取joinkey的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上,从而确定子表存储的位置。 parmaryKey属性 同table标签所描述的 needAddLimit属性 同table标签所描述的 dataNode标签
dataNode标签定义了mycat中的数据节点,也就是我们通常说的数据分片,一个dataNode标签就是一个独立的数据分片。 例子中所表述的意思为:使用名字为lch3307数据库实例上的db1物理数据库,这就组成一个数据分片,最后,我们使用名字dn1标识这个分片。 dataNode标签的相关属性 定义数据节点的名字,这个名字需要是唯一的,我们需要在table标签上应用这个名字,来建立表与分片对应的关系。 dataHost属性 该属性用于定义该分片属于那个数据库实例的,属性值是引用dataHost标签上定义的name属性 database属性 该属性用于定义该分片属于哪个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是实例+具体的库,因为每个库上建立的表和结构是一样的,所以这样做就可以轻松的对表进行水平拆分。 dataHost标签此标签直接定义了具体的数据库实例,读写分离配置和心跳语句
dataHost相关属性 唯一标识dataHost标签,供上层标签使用 maxCon属性 指定每个读写实例连接池的最大连接,也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。 minCon属性 指定每个读写实例连接池的最小连接,初始化连接池的大小 balance属性 负载均衡类型,目前的取值有3种
writeType属性 负载均衡类型,目前的取值有3种
dbType属性 指定后端连接的数据库类型,目前支持二进制的MYSQL协议,还有其他使用JDBC连接其他的数据库. dbDriver属性 指定连接后端数据库使用的Driver,目前可选native和JDBC.使用native的话,因这个值执行的是二进制的mysql协议。 heartbeat标签这个标签内指明用于和后端数据库进行心跳检查的语句,例如mysql可以使用select user(),oracle可以用select 1 from dual等 writeHost、readHost标签这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池,唯一不同的是,writeHost指定写实例,readHost指定读实例。 在一个dataHost内可以定义多个writeHost和readHost,但是如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动检测到,并切换到备用的writeHost上去。
url属性
user、password属性 存储实例的用户名和密码 server.xmlserver.xml几乎保存了所有mycat需要的系统配置信息,其在代码内直接映射类为SystemConfig类。 user标签
定义登录mycat的用户和权限,property标签则是具体声明的属性值,schemas控制用户可访问的schema,同时访问多个用逗号隔开。 system标签此标签内嵌套的所有property标签都与系统配置有关 defaultSqlParser属性 由于mycat最初是使用FoundationDB的SQL解析器,而后才添加的Druid的解析器,所以这个属性用来指定默认的解析器,目前可用的取值有:druidparser和fdbparser。 processors属性 这个属性主要用于指定系统可用的线程数,默认值为Runtime.getRuntime().availableProcessors()方法返回的值,主要影响processorBufferPool、processorBufferLocalPercent、processorExecutor属性。NIOProcessor的个数也是由这个属性定义的,所以调优的时候可以适当的调高此属性。 processorBufferChunk属性 此属性指定每次分配Socket Direct Buffer的大小,默认是4096个字节,这个属性也影响buffer pool的长度。 processorBufferPool属性 此属性指定bufferPool计算比例值,由于每次执行NIO读、写操作都需要使用到buffer,系统初始化的时候会建立一定长度的buffer池来加快读、写的效率,减少建立buffer的时间。 Mycat中有两个主要的buffer池
BufferPool由ThreadLocalPool组合而成,每次从BufferPool中获取buffer都会优先获取ThreadLocalPool中的buffer,未命中之后才会去获取BufferPool中的buffer.也就是说ThreadLocalPool是作为BufferPool的二级缓存,每个线程内部自己使用的。 当然,这其中还有一些限制条件需要线程的名字是由$_开头,然而BufferPool上的buffer则是每个NIOProcessor都共享的。
processorBufferLocalPercent属性 前面提到了ThreadLocalPool,这个属性就是用来控制分配这个pool的大小用的,但其也并不是一个准确的值,也是一个比例值,默认为100.
processorExecutor属性 此属性主要用于指定NIOProcessor上共享的businessExecutor固定线程池大小。mycat在需要处理一些异步逻辑的时候会把任务提交到这个线程池中,新版中这个连接池的使用频率不是很大,可以设置一个较小的值。 sequnceHandlerType属性 指定使用MYCAT全局序列的类型,0为本地文件方式,1为数据库方式,默认是本地文件方式,主要用于测试使用。 TCP连接的相关属性
上面的三个属性,分别由
各自设置前后端TCP连接参数,MYCAT在每次建立前、后端连接的时候都会使用这些参数初始化连接,可以按系统要求适当调整这些buffer的大小。 MYSQL连接相关属性 初始化mysql前后端连接的涉及到的一些属性
周期间隔相关属性 mycat中有几个周期性的任务来异步处理一些需要的工作,这些属性在系统调优的过程中是必不可少的。
服务相关属性 服务属性主要会影响外部系统对mycat的感知
rule.xmlrule.xml里定义了我们对表进行拆分所涉及到的规则定义,我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。此文件里面主要有tableRule和function这两个标签。 tableRule标签此标签定义表规则
name属性指定唯一的名字,用于标识不同的表规则 内嵌的rule标签则指定对物理表中的哪一列进行拆分和使用什么路由算法 columns内指定要拆分的列名字 algorithm使用function标签中的name属性,连接表规则和具体路由算法,当然,多个表规则可以连接到同一个路由算法上。 function标签
name指定算法的名字 class指定路由算法具体的类名字 property为具体算法需要用到的一些属性 MyCAT的JOIN在分布式环境中,跨分片的表关联是最复杂,最难解决的一个问题
性能建议:
Mycat目前版本支持跨分片的join,主要实现的方式有四种.
全局表将字典或符合字典表特性的一些表定义为全局表,从另外一个方面,很好的解决了数据join的难题。
配置 全局表配置比较简单,不用写Rule规则 相关内容
|