Cobar的使用与心得(持续更新)

关于淘宝Cobar中间件使用中一些问题总结,会在使用中不断完善该文档

1、LOAD DATA LOCAL FILE ...不支持
   mysql> load data local infile "/usr/jfy/tmp/scpcdr.txt" into table scpcdr fields TERMINATED by '|';
   ERROR 1148 (42000): The used command is not allowed with this MySQL version 
  可以不带LOCAL关键字,那则是导入文件必须在MYSQL服务器的相应目录中    
  即服务器上必须有这个绝对路径的文件:/usr/jfy/tmp/scpcdr.txt

2、关于wait_timeout的问题
      使用cobar分前端连接和后端连接,前端连接是指客户端应该程序连接cobar,后端是指cobar连接的实际的mysql数据库
      前端的wait_timeout时间是由配置文件server.xml中system段的idleTimeout这个参数决定的,默认是28800即8小时,可以改为:<property name="idleTimeout">2880000000</property>
      后端的wait_timeout时间与两个参数有关,一个是cobar后端连接池中的idleTimeout参数,另一上是mysql数据库服务器本身的wait_timeout参数
      对于mysql这边可以设置wait_timeout参数,在my.cnf中增加如下设置:
  [mysqld]
  wait_timeout = 2880000
  interactive_timeout = 2880000
      对于cobar的后端连接,由配置文件schema.xml中dataNode段的idleTimeout这个参数决定的,默认是600S即10分钟,如果10分钟空闲,cobar就会将这个连接结束掉,可以改为:<property name="idleTimeout">2880000000</property>

3、监控命令show @@backend,只会显示出cobar连接数据源的心跳连接,正常的数据连接不会显示;

4、cobar的8066端口上SET语句只支持以以下几个:
  SET AUTOCOMMIT
  SET ISOLATIONS,cobar后端连接默认的事务隔离级别是REPEATED_READ
  SET NAMES
  SET CHARACTER_SET_CLIENT/CHARACTER_SET_CONNECTION/CHARACTER_SET_RESULTS

5、关于cobar前端连接起事务的问题,BEGIN和START TRANSACTION是不支持的,要靠SET AUTOCOMMIT=0来变向起事务,事务结束后,如果后续的语句不希望起事务,那么一定要在这次事务提交中SET AUTOCOMMIT=1

6、cobar不支持prepare语句,支持call <procedure>

7、利用cobar实现程序一次连接访问多个数据库主机的MYSQL
     
如果是应用自己实现,那么先要自己连接三个MYSQL数据库,然后在程序中分别使用三个mysql连接句柄才能操作三个库,很麻烦。   

     利用cobar对前端展示三个逻辑库,如db1,db2,db3,物理上db1,db2,db3分别指向三个MYSQL数据库服务器实例,前端应用程序可以用mysql_real_query只连接cobar的一个数据库db1,然后在mysql_real_query的sql语句中就可以使用db2.t1,db3.t2这种方式访问另外两个逻辑库的表,实际上就是访问了其它两个数据库服务器上的MYSQL实例,而且你可以将访问三个库的语句封到一个事务中(当然这种事务cobar实现的是弱事务,二阶段提交的方式)。

8、今天重看了下cobar的配置文件,发现里面的一些汉字注释是乱码的,我想应该是UTF8格式的吧,我就用ultraedit将文件格式转换成了ascii格式,汉字都可以正常看了,结果悲剧来了,cobar起不来了,说配置文件错误,只好把安装包里的配置文件重新拷贝过来,再次修改。那个配置文件格式不要改,不然会出错的。

9、针对某个表按字段进行拆分到不同库中:

schema.xml:
  <schema name="wollar" dataNode="dn_wollar">
    <table name="tb3" dataNode="dn_test,dn_wifi" rule="rule1" />
  </schema>

rule.xml:
  <tableRule name="rule1">
    <rule>
      <columns>id</columns>
      <algorithm><![CDATA[ func1(${id}) ]]></algorithm>
    </rule>
  </tableRule>

  <function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong">
    <property name="partitionCount">2</property>
    <property name="partitionLength">512</property>
  </function>
  
tb3表有一个数字型的字段id,插入数据时,id % 1024的值,0-511进dn_test,512-1023进dn_wifi库

insert语句需要按标准语句书写(必须带出字段名字):
    insert into tb3 (id,val) values (512, "val_1");

如果写成如下格式将不会自动分库,而是两个库的tb3表中均会插入一条记录:
    insert into tb3 values (512, "val_1")



阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页