mycat配置数据库读写分离

 

一.配置数据库主从复制,读写分离的前提先配置主从复制,否则会造成写库和读库数据不一致;可参照本人主从复制博客http://www.cnblogs.com/zrlbiog/p/8041947.html

二.mycat安装

   1.安装jdk

   2.下载mycat

     下载mycat:https://github.com/MyCATApache/Mycat-download
     # tar xf Mycat-server-1.4-release-20151019230038-linux.tar.gz
        # mv mycat /usr/local/

   3.配置mycat中jdk文件路径

     # cd /usr/local/mycat/conf/
     # vim wrapper.conf
        # Java Application
        wrapper.java.command=/usr/java/jdk1.7.0_79/bin/java
     4.mycat  schema.xml配置文件

  Schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 癿逻辑库、表、分片规则、 DataNode 以及 DataSource。schema 标签用二定义MyCat 实例中癿逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。

     # cp schema.xml schema.xml.bak
     # vim schema.xml

                  如下图为安装mycat之后schema.xml配置文件,逐个介绍各个节点:

      

schema标签
属性名 数量限制 备注
dataNode 任意String (0..1) 该属性用于绑定逻辑库到某个具体的database上
checkSQLschema Boolean (1) 如果设置为true,mycat会将表示schema的字符去掉;例如 select *from  TESTDB.travelrecord
修改为 select *from travelrecord  避免发送到后端数据库报找不到表的错误; 需要注意的是即使设置为true,如果语句所带的并非是schema所带的名字,例如  select *from aa.travelrecord是不会删除aa的; (就是schema的name属性配置的值)
sqlMaxLimit Integer (1) 当该值设置为某个数值时。每条执行癿 SQL 询句,如果没有加上 limit 询句,MyCat 会自动加上所对应
的值。例如设置值为 100,执行 select * from TESTDB.travelrecord; 的效果和执行  select * from
TESTDB.travelrecord limit 100;相同

               

table标签
属性名 数量限制 备注
dataNode String (1..*) 定义这个逻辑表所属的 dataNode, 该属性的值需要和 dataNode 标签中 name 属忓的值相对应。
rule String (0..1) 该属性用于指定逻辑表要使用的规则名字,规则名字在 rule.xml 中定义,必项与 tableRule 标签中 name 属性值一一对应
ruleRequired boolean (0..1) 该属性用于指定表是否绑定分片规则,如果配置为 true,但没有配置具体 rule 的话 ,程序会报错
primaryKey String (1)

诠逻辑表对应真实表的主键,例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的 DN 上,如果使用该属忓配置真实表的主键。那么 MyCat 会缓存主键与具体 DN 的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送询句给具体的 DN,但是尽管
配置该属忓,如果缓存幵没有命中的话,还是会发送语句给具体的DN,来获得数捤

type String (0..1) 该属性定义了逻辑表的类型,目前逻辑表只有'全局表'和‘普通表’两种类型。对应配置: 全局表:global  普通表:不指定该值为global的所有表
autoIncrement boolean (0..1)

mysql 对非自增长主键,使用 last_insert_id()是不会返回结果的,只会返回 0。所以,叧有定义了自增长主
键的表才可以用 last_insert_id()返回主键值。

mycat 目前提供了自增长主键功能,但是如果对应癿 mysql 节点上数据表,没有定义 auto_increment,那
么在 mycat 层调用 last_insert_id()也是不会返回结果的。

由二 insert 操作的时候没有带入分片键,mycat 会先取下这个表对应的全局序列,然后赋值给分片键。这样
才能正常的插入到数据库中,最后使用 last_insert_id()才会返回插入的分片键值。

如果要使用这个功能最好配合使用数据库模式的全局序列。

使用 autoIncrement=“true” 指定这个表有使用自增长主键,这样 mycat 才会不抛出分片键找不到的异常。

使用 autoIncrement=“false” 来禁用这个功能,当然你也可以直接删除掉这个属性。默认就是禁用的。

name String (1) 定义逻辑表的表名,返个名字就如同我在数捤库中执行 create table 命介指定名字一样,同个 schema 标
签中定义的名字必项唯一
subTables String (1)  
needAddLimit boolean (0..1)  指定表是否雹要自动的在每个语句后面加上 limit 限制,默认为true

 

 

      

childTable标签
属性名 数量限制 备注
name String (1) 定义字表的表名
joinKey String (1) 插入子表的时候会使用这个列的值查找父表存储的数据节点
parentKey String (1) 属性指定的值一般为与父表建立关联关系的列名。程序首先获取joinKey的值,再通过parmentKey属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上。从而确定子表存储的位置。
primaryKey String (0..1) 同table表描述
needAddLimit boolean (0..1) 同上

 

 

dataNode标签
属性名 数量限制 备注
name String (1) 定义数据节点的名字,这个名字需要是唯一的,我们需要在 table 标签上应用返个名字,来建立表与分片对应的关系
dataHost String (1) 该属性用于定义该分片属于哪个数捤库实例的,属性值是引用 dataHost 标签上定义的 name 属性。
database String (1) 该属性用于定义该分片属性属于哪个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是:实例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样就可以轻松做到水平切分。

 

 

dataHost标签:作为Schema.xml中最后一个标签,该标签在mycat逻辑库中也是最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。
属性名 数量限制 备注
maxCon Integer (1) 指定每个读写实例连接池的最大链接.也就是说,标签内嵌套的writeHost,readHost标签都会使用这个属性的值来实例化出连接池的最大连接数
minCon Integer (1) 连接池的最小连接,初始化连接池的大小
balance Integer (1)

负载均衡类型:

1.balance="0",不开启读写分离,所有操作都发送到当前可用的writeHost上

2.balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡3.

3.balance=“2”,所有读操作都随机的在writeHost、readHost上分发

4.balance=3“,所有读请求随机的分发到writeHost对应的readHost执行,writeHost不负担读压力,注意balance=“3”只在1.4及其以后版本有

writeType Integer (1)

负载均衡类型:

1.writeType="0",所有的写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后为准,切换记录在配置文件中:dnindex.properties

2.writeType="1",所有写操作都随机发送到配置的writeHost,1.5之后废弃不推荐

dbType String (1) 指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用jdbc连接的数据库。例如:mongodb、oracle、spark等。
dbDriver String (1) 指定连接后端数据库使用的driver,目前可选的值有native和jdbc。使用native的话,因为这个值执行的二进制的mysql协议,所以可以使用mysql和maridb。其它类型的数据库则需要使用jdbc驱动来支持。
如果使用jdbc的话需要将符合jdbc4标准的驱动jar包放到mycat\lib目录下,并检测驱动jar包中包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver。
name String (1) 唯一标识dataHost标签,供上层标签使用

 

    下面提供一个自己配置的schema文件

     可参照上述列举的标签介绍来看;

     (1)<schema name="TD_OA" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
      这里的TD_OA就是我们所宣称的数据库名称,必须和server.xml中的用户指定的数据库名称一致。添加一个dataNode="dn1",是指定了我们这个库只有在dn1上,没有分库。

    (2)<dataNode name="dn1" dataHost="localhost1" database="TD_OA" />
      这里只需要改database的名字,worm就是你真是的数据库上的数据库名,可根据自己的数据库名称修改。

  5.将mycat命令添加到配置文件中

    # vim /etc/profile
    export PATH=/usr/local/mycat/bin:$PATH
    # source /etc/profile

 6.创建管理用户

    主库上对mycat用户授权如下:

    用户:mycat_1 密码:123456端口:3306

    权限:insert,delete,update,select

    命令:grant insert,delete,update,select on TD_OA.* to mycat_1@'192.168.228.%' identified by '123456';
       flush privileges;

    从库上mycat_r用户授权如下:
    用户:mycat_2 密码:123456端口:3306
    权限: select

    grant select on TD_OA.* to mycat_2@'192.168.228.%' identified by '123456';
    flush privileges;

    提示:由于主库和从库是同步mysql数据库复制的,所以从库上的mycat用户会自动和主库的一致,即无法实现只读select的授权
    revoke insert,update,delete on TD_OA.* from mycat@'192.168.8.%'; #<=回收insert update delete 权限

    修改mycat配置文件
    vim /usr/local/mycat/conf/server.xml
   
    注意:

    ①这里配置的是可以连接主库的两个用户

    用户:mycat 密码:pass 给予此用户TD_OA数据库增删改查的权限。

    用户:mycat_r 密码:pass 给予此用户TD_OA数据库读的权限。

    ②这里的TD_OA,不一定是你数据库上的真实库名,可以任意指定,只要接下来和schema.xml的配置文件的库名统一即可。

 7.启动mycat

  # mycat console #<=通过console命令启动mycat,这样方便提取信息
  Running Mycat-server...
  wrapper  | --> Wrapper Started as Console
  wrapper  | Launching a JVM...
  wrapper  | JVM exited while loading the application.
  jvm 1    | Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: oawebserver002: oawebserver002:      Temporary failure in name resolution
  解决:编辑Hosts文件将主机名和IP绑定
  # vim /etc/hosts
  192.168.228.128 oawebserver002
  # mycat restart使配置生效

  在客户端连接mysql主库服务器:
   # yum install -y mysql
  # mysql -umycat -ppass -h192.168.228.128 -P8066

 8.测试

   数据库连接信息配置为mycat账户

              数据库连接工具查看数据信息:128为写库/129为读库/mycat为拥有 curd权限的用户

      

 

           先测试读是否是从129读数据,手动向129添加一条数据,发现页面中确实多了一条数据,128中数据是保持不变的,因此证明确实是从129中读取数据;实际上mycat用户下的user虚拟表取的是读库中的数据;

   

    测试写操作是否是操作的是128库,因为两个库做了主从复制, 因此如果是写入128库那么129会从128复制数据,这样两个库的数据是一直保持一致的,如果写入129那么主库不会去从库同步数据,这样两个库的数据是不一样的; 先把129库中刚刚新增的一条数据删除; 或者可以先把主从服务停止来测试更明显;

 

posted @ 2017-12-26 17:16  北境  阅读(1062)  评论(0编辑  收藏  举报