当前位置:   article > 正文

Mycat学习(3)---Mycat配置文件详解_mycat balance

mycat balance

1 server.xml配置文件

server.xml配置文件包含了mycat的系统配置信息,对应的源码使systemconfig.jar。它有两个重要的标签,分别是user和system,system标签的各属性时mycat调优的关键。

1.1 user标签

user标签主要用于定义登录mycat的用户和权限。如上面定义用户名和密码均为user,该用户可以访问的schema只有TESTDB。

可以直接修改对应的属性值来修改密码,如果需要同时访问多个schema,则多个schema之间使用英文逗号隔开。

<user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
                <property name="benchmark">1111</property>
                <property name="usingDecrypt">1</property>
        </user>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

#介绍下后面两个属性
benchmark: 通过该属性来限制前端的整体连接数量。如果其值为0或者不对其进行设置,则表示不限制连接数量。

usingDecrypt: 通过设置该属性来开启密码加密功能。默认值是0,表示不开启加密,值为1说明开启密码加密功能。

1.2 system标签

这个标签的属性与系统配置有关,下面会一一介绍其属性。

  • charset属性
    配置字符集时一定要保证mycat字符集与数据库字符集的一致性。

  • defaultSqlParser属性
    由于mycat最初是时候Foundation DB的sql解析器,而后才添加的Druid的解析器。所以这个属性用来指定默认的解析器。目前的可用的取值有:druidparser和 fdbparser。使用的时候可以选择其中的一种,目前一般都使用druidparser。mycat1.4之后的版本中fdbparser属性作废。

  • processors属性
    这个属性主要用于系统可用的线程数,配置系统可用的线程数量,默认值为CPU核心X每个核心运行线程的数量。主要影响processorBufferPool、processorBufferLocalPercent、processorExecutor属性。NIOProcessor的个数也是由这个属性定义的,所以调优的时候可以适当的调高这个属性

  • processorBufferChunk属性
    这个属性指定每次分配Socket Direct Buffer的大小,默认是4096个字节。这个属性也影响buffer pool的长度。

  • processorBufferPool属性
    该属性指定bufferpool的计算比例。由于每次执行NIO读,写操作都需要使用到buffer,所以mycat初始化时会建立一定长度的buffer池来加快NIO读,写效率,减少建立buffer的时间。mycat中有两个主要的buffer池:BufferPool,ThreadLocalPool。BufferPool使用ThreadLocalPool作为二级缓存,每次从BufferPool中获取时都会优先获取ThreadLocalPool中的buffer值,如果ThreadLocalPool未命中,则会获取BufferPool中的Buffer值。ThreadLocalPool中的Buffer在每个线程内部使用。然而,BufferPool是每个NIOProcessor共享的。

  • processorBufferLocalPercent属性
    该属性用来控制ThreadLocalPool分配pool的比例大小,这个属性默认值是100.线程缓存百分比=bufferlocalpercent/processor。

  • processorExecutor属性
    这个属性主要用于指定NIOProcessor上共享的businessExecutor固定线程池大小。mycat在需要处理一些异步逻辑的时候会把任务提交到这个线程池中。新版本中这个连接池的使用频率不是很大了,可以设置一个较小的值。

  • sequenceHandlerType属性
    指定使用Mycat全局序列的属性。0为本地文件方式,1为数据库方式,2为本地时间戳方式,3为分布式zk ID生成器,4为zk递增ID生成。默认是使用本地文件方式,文件方式主要只是用于测试使用。从1.6增加两种zk的全局ID生成算法。

  • MySQL连接相关属性
    初始化MySQL的前后端连接所涉及的属性如下。

    • packetHeaderSize: 指定MySQL协议中报文长度,默认值为4个字符。
    • maxPacketSize:指定MySQL协议可以携带的数据的最大大小,默认值为16MB。
    • idleTimeout:指定连接的空闲时间的超时长度。如果某个连接的空闲时间超过- idleTimeout的值,则该连接将关闭,并回收资源,单位为毫秒,默认为30分钟。
    • charset:初始化连接字符集,默认是utf8。
    • txIsolation:初始化连接的事务隔离级别。ru-1,rc-2,rr-3,se-4;这个值取整数,表示对应的隔离级别。
    • sqlExecuteTimeout:执行SQL语句的超时时间,若SQL语句的执行时间超过这个值,则会直接关闭连接,单位为秒,默认值为300秒。
  • 心跳属性

    • processorCheckPeriod: 清理NIOProcessor前后端空闲,超时,关闭连接的时间间隔,单位为毫秒,默认为1秒。
    • dataNodeidleCheckPeriod:对后端连接进行空闲,超时检查的时间间隔,单位毫秒,默认为300秒。
    • dataNodeHeaderbeatPeriod:对后端连接的所有读,写库发起心跳的间隔时间,单位为毫秒,默认为10秒。
  • 服务相关属性
    这里介绍与mycat服务相关的属性,主要影响外部系统对mycat的感知。

    • bindIP: 服务器监听的IP地址,默认为0.0.0.0
    • serverPort: 定义mycat的使用端口,默认值为8066
    • managerPort:定义mycat管理端口,默认值为9066
  • fakeMySQLversion属性
    mycat使用mysql的通信协议模拟了一个mysql服务器,默认为5.6版本。若非特许,不需要更改,从Mycat1.6开始支持此属性。

  • 分布式事务开关属性
    handleDistributedTransaction是分布式事务开关:0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务只涉及全举表,则不过滤);2为不过滤分布式事务,但是记录分布式事务日志。从mycat1.6版本开始支持此属性。

  • useOffHeapForMerge属性
    该属性用于配置是否启用非堆内存处理跨分片结果集,1为开启,0为关闭,mycat从1.6开始支持。

  • 全局表一致性检测
    其原理是通过在全局表中增加_MYCAT_OP_TIME字段来进行一致性检测,为bigint类型。create语句通过mycat执行时会自动添加上该字段,其他情况需要手动添加。1为开启,0为关闭,mycat从1.6版本开始支持。

  • useSqlStat属性
    开启SQL实时统计,1为开启,0为关闭。

2 schema.xml配置文件

schema.xml作为mycat中重要的配置文件之一,涵盖了mycat的逻辑库,表,分片规则,分片节点及数据源。schema.xml配置文件中有7个标签,下面来一一介绍。

2.1 schema标签

schema标签用于定义mycat实例中的逻辑库,mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用schema标签来划分这些不同的逻辑库。如果不配置schema标签,所有的表配置,会属于同一个默认的逻辑库。

逻辑库的概念和mysql数据库中Datebase的概念相同,我们在查询这两个逻辑库中的表的时候,需要切换到该逻辑库下才可以查到所需要的表。

<schema name="TESTDB" checkSQLschema="false" >
.....
</schema>
  • 1
  • 2
  • 3
  • dataNode属性
    该属性用于绑定逻辑库到某个具体的database上,如果定义了这个属性,那么这个逻辑库就不能工作在分库分表模式下了。也就是说对这个逻辑库的所有操作会直接作用到绑定的dataNode上,这个schema就可以用作读写分离和主从切换,具体如下配置:

    <schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    <!—这里不能配置任何逻辑表信息-->
    </schema>
    
    • 1
    • 2
    • 3

    那么现在USERDB就绑定到dn1所配置的具体database上,可以直接访问这个database。当然该属性只能配置绑定到一个database上,不能绑定多个dn。

  • checkSQLschema属性
    当该值设置为 true 时,如果我们执行语句select * from TESTDB.travelrecord;则MyCat会把语句修改为select * from travelrecord;。即把表示schema的字符去掉,避免发送到后端数据库执行时报ERROR 1146 (42S02): Table‘testdb.travelrecord’ doesn’t exist,不过,即使该值设置为true,如果语句所带的schema名字不是shcema指定的名字,那么mycat不会删除这个schema。

  • sqlMaxlimit属性
    当该值设置为某个数值时,每条执行的sql语句,如果没有加上limit语句,mycat也会自动的加上所对应的值。如果不设置该值,mycat会默认把查询到的信息全部展示处理,造成过多的输出。所以,正常使用中,还是尽量加入该值,用于减少过多的数据返回。如果sql语句中显式指定了limit的大小,不受该属性的约束。需要注意的是,** 如果运行的schema为非拆分库的,那么该属性不会生效,需要手动添加limit语句。**

2.2 table标签

table标签定义了逻辑表,所有需要拆分的表都需要在这个标签中定义。

<table name="address" primaryKey="autoIndex" rule="sharding-by-murmur" dataNode="dn1,dn2" />
  • 1

table标签的属性如下:

  • name属性
    定义逻辑表的表名,这个名字就如同在数据库中执行create table命令指定的名字一样,同一个schema标签中定义的表名必须是唯一的。
  • dataNode属性
    定义这个逻辑表所属的dataNode,该属性的值需要和dataNode标签中name属性的值相互对应。
  • rule属性
    该属性用于指定逻辑表要使用的规则的名字,规则名字在rule.xml中定义,必须与tableRule标签中name属性属性值对应。
  • ruleRequired属性
    该属性用于指定表是否绑定分片规则,如果配置为true,但没有配置具体rule的话,程序会报错。
  • primaryKey属性
    该逻辑表对应真实表的主键,例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的DN上,如果使用该属性配置真实表的主键。难么MyCat会缓存主键与具体DN的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的DN,但是尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给具体的DN,来获得数据。
  • type属性
    该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和“普通表”两种。 全局表:global。 普通表:不指定该值为global的所有表
  • autoincrement属性
    MySQL对于自增长主键使用last_insert_id()是不会返回结果的,只会返回0.所以,只有对定义了自增长主键的表应用last_insert_id()才可以返回主键的值。mycat目前提供了自增长主键功能,但是如果对应的mysql没有定义auto_increment属性,那么mycat层调用last_insert_id()也是不会返回结果的。由于insert操作时没有带入分片键,所以mycat会先取下这个表对应的全局序列,然后赋值给分片键。如果要使用这个功能,则最好配合数据库模式的全局序列。使用autoIncrement="true"指定这个表使用自增长主键,这样mycat才不会抛出“分片键找不到”的异常。这个功能默认是禁用的,值为false。
  • subTables
    使用subTable="t_order$1-2, t_order3"方式添加,目前mycat在1.6版本以后才开始支持分表,并且dataNode在分表条件下只能配置一个,不支持各种条件的join查询。
  • needAddlimit限制
    指定表是否需要自动的在每个语句后面添加limit限制,由于使用了分库分表,数据量有时会特别巨大,这时候执行查询语句,如果恰巧又忘记了添加数量限制,那么就会查询所有的数据。所以mycat就自动的为我们加上limit 100.如果,语句中有limit就不会再次添加了。该属性默认值为true。
2.3 childTable标签

childTable标签用于定义E-R分片的子表,通过标签上的属性与父表进行关联。

  • name属性
    定义子表的表名
  • joinKey属性
    插入子表的时候会使用这个列的值查找父表存储的数据节点。
  • parentKey属性
    属性指定的值一般为与父表建立关联关系的列名。程序首先获取joinkey的值,再通过parentKey属性指定的列名产生的查询语句,通过执行该语句得到父表存储在那个分片上,从而确定子表存储位置。
  • primarykey属性
    同table标签
  • needAddLimit属性
    同table标签
2.4 dataNode标签

dataNode标签定义了mycat中的数据节点,也就是数据分片。一个dataNode标签就是一个独立的数据分片。

<dataNode name="dn2" dataHost="host02" database="db" />

#使用host02主机上数据实例中db物理数据库,这就组成一个数据分片,使用dn2标识这个分片。
  • 1
  • 2
  • 3
  • name属性
    定义数据节点的名字,这个名字需要是唯一的,我们需要在table标签上应用这个名字,来建立表与分片对应的关系。
  • dataHonet属性
    该属性用于定义该分片属于那个数据库实例,属性值是引用datahost标签定义的name属性。
  • database属性
    该属性用于定义该分片属于那个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是:实例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。
2.5 dataHost标签

作为Schema.xml中最后的一个标签,该标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。现在我们就解析下这个标签。一个dataHost标签的属性如下:
在这里插入图片描述

  • name属性
    唯一标识dataHost标签,供上层标签使用。
  • macCon属性
    指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。
  • minCon属性
    指定每个读写实例连接池的最小连接,初始化连接池的大小。
  • balance属性
    负载均衡类型,目前的取值有以下4种。

balance=0: 不开启读写分离,所有读操作都发送到当前可用的writeHost上。
balance=1: 全部的readHost与Stand by writeHost都参与select语句的负载均衡,简而言之,当双主双从模式(M1–>S1, M2—>S2,并且M1与M2互为主备)时,在正常情况下,M2,S1和S2都参与select的负载均衡。
balance=2: 所有的读操作都随机在writeHost,readHost上分发。
balance=3: 所有的读请求都随机分配到writeHost对应的readHost上执行,writeHost不负担读压力,注意balance=3只在mycat1.4之后版本中有效。

  • writeType属性
    负载均衡类型,目前的取值有3种:
  1. writeType=“0”, 所有写操作都发送到可用的writeHost上。
  2. writeType=“1”,所有写操作都随机的发送到readHost。
  3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
  • dbType属性
    指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。如mongodb,spark等。
  • dbDriver属性
    指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持。
  • switchType属性

-1:表示不自动切换。
1: 默认值,表示自动切换
2: 表示基于MySQL主从同步状态决定是否切换,心跳语句: show slave status.
3: 表示基于mysql galary cluster的切换机制,适合mycat1.4之上的版本,心跳语句show status like “%esrep%”;

  • tempReadHostAvailable属性
    如果配置了writehost,下面的readhost依旧可用。
  • heratbeat标签
    这个标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。mycat1.4中主从切换语句必须是show slave status。
  • writeHost标签,readHost标签
    这两个标签指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组合这些读写实例来满足系统的要求。

在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。

  • host属性:用于标识不同的实例,对于writehost,一般使用M1;对于readhost一般使用S1.
  • url属性:后端实例连接地址,如果使用native的dbDriver,则一般为address:port这种形式,用JDBC或其他的dbDriver,则需要特殊指定。当使用JDBC时则可以这么写:jdbc:mysql://localhost:3306/
  • user属性:后端存储实例的用户名。
  • password属性:后端存储实例的密码
  • weight属性:在readHost中作为读节点的权重(mycat1.4版本之后才有的)
  • usingDecrypt属性:同server.xml中。

3 rule配置文件

rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标签。在具体使用过程中可以按照需求添加tableRule和function。
在这里插入图片描述

3.1 tableRule标签

这个标签定义表规则,定义的表的规则在schema.xml中引用
name属性指定唯一的名字,用于标识不同的表规则,内嵌的rule标签则指定对物理表中的那一列进行拆分和使用什么路由算法。
columns内指定要拆分的列名字。
algorithm使用function标签中的name属性。连接表规则和具体路由算法。当然,多个表规则可以连接到同一个路由算法上。

3.2 function标签
      name指定算法的名字。
  • 1

class指定路由算法具体的类名字。
    property为具体算法需要用到的一些属性。
在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号