美文网首页
mycat 入门配置

mycat 入门配置

作者: 烟雾袅绕 | 来源:发表于2019-01-10 15:19 被阅读17次
不多说,直接上配置
1:下载安装mycat, 这里下载的是1.6稳定版本(mac)

mycat 官方网站:http://www.mycat.io/

下载完成之后直接解压就可以了,不用做其他配置

2:环境准备

使用上一篇中mysql 的主从配置的服务,库,表等数据的基础上配置mycat
数据准备我会放在csdn 上,大家可以去下载使用https://download.csdn.net/download/weixin_39405439/10908396
数据准备完成之后开始修改mycat 的配置

Mycat的配置文件,在conf目录下面有:server.xml、schema、rule.xml,以及ehcache.xml、log4j2.xml,我们主要使用前三个

首先配置server.xml , 其他内容不做修改,只做user 修改,修改成自己的登录账户
用户名:root
密码:  123456
逻辑数据库名:db_store,db_user
是否为只读数据库 :false
<user name="root">
    <property name="password">123456</property>
    <property name="schemas">db_store,db_user</property>
    <property name="readOnly">false</property>
</user>
2:配置schema.xml 配置数据库表的表结构,配置分片
注意一点checkSQLschema="true" 这里要配置成true, 如果是false 使用工具连接mycat 打开数据库表会报
There is no primary key here. Update will only use exact matching of the old values of the columns here. Thus, it may update more than one record.

1064 -  find no Route:SELECT * FROM `db_store`.`employee` LIMIT 0,1000
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="db_store" checkSQLschema="true" sqlMaxLimit="100">
        <!-- auto sharding by id (long) -->
        <table name="store" dataNode="db_store_dataNode" primaryKey="storeID" />
        <table name ="employee" dataNode="db_store_dataNode" primaryKey="employeeID"/>
    </schema>

    <schema name="db_user" checkSQLschema="true" sqlMaxLimit="100">
        <table name="data_dictionary" type="global" dataNode="db_user_dataNode1,db_user_dataNode2" primaryKey="dataDictionaryID"/>
        <table name ="users" dataNode="db_user_dataNode$1-2" primaryKey="userID" rule="mod-long">
            <childTable name="user_address"  joinKey="userID" parentKey="userID" primaryKey="addressID" />
        </table>

    </schema>


    <!--节点配置-->

    <dataNode name="db_store_dataNode" dataHost="db_storeHOST" database="db_store" />
    <!-- db_user -->
    <dataNode name="db_user_dataNode1" dataHost="db_userHOST1" database="db_user" />
    <dataNode name="db_user_dataNode2" dataHost="db_userHOST2" database="db_user" />

    <!--节点主机配置-->
    <dataHost name="db_storeHOST" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="10.211.55.6:3306" user="root"
                   password="root">
            <!-- can have multi read hosts -->
            <readHost host="hostS1" url="localhost:3306" user="root" password="root" />
        </writeHost>
    </dataHost>

<!-- 配置db_user的节点主机 -->
    <dataHost name="db_userHOST1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="userHost1" url="10.211.55.6:3306" user="root"  password="root">
        </writeHost>
    </dataHost>
    
    <dataHost name="db_userHOST2" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="userHost2" url="localhost:3306" user="root"  password="root">
        </writeHost>
    </dataHost>

</mycat:schema>
3:配置 rule.xml

由于我这里使用的分片规则是由mycat已经提供的,所有就不需要单独在进行配置,上面的schema.xml 中使用的rule="mod-long"
columns 指按表中的哪个字段进行取模 ,这里要注意修改

<tableRule name="mod-long">
        <rule>
            <columns>userID</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
4:使用navicat 连接mycat ,与连接数据库一样的道理
图片.png

连接成功之后,进入mycat 就可以看到,两个数据节点主机之前创建的数据了


图片.png
5:对上面的配置进行测试

首先我们来测试 store 表中配置的读写分离
由于之前配置了数据库的主从配置,所以在配置mycat 的时候写数据一定要在master 数据库上, 如果我手动在navicat中删除了从库的store表中的一条记录,你会发现mycat中也会查询不到删除的这条记录了,然而主表master中的store 中还有刚刚删除的这条记录,说明mycat 读的是从表,

这里需要注意,如果手动删除了从表的数据,这时候主从就保持不一致了,如果在主表中做任何操作好像都不会再同步到主表了,不知道有没有好的方式,我是这样解决的
先停掉从表
1:进入从表mysql中执行 stop slave;
2:然后进入master sql中使用show master status;查看当前的postion
3:在进入从表的mysql 中执行 ,把master_log_pos 修改为刚在主表中的位置
change master to master_host='10.211.55.6', 
master_port=3306,
master_user='slave1', 
master_password='slave1',
master_log_file='master-bin.000002',
master_log_pos=1885;
4:启动从表的同步
start slave;
然后就可以在实现主从同步了

然后在测试,如果在mycat 中的store表中新增一条数据,可以发现数据会先同步到master中,然后在通过主从配置的关系同步到slave从表中

6:测试全局表配置,全局表一般指的是一些数据字典,枚举,不易发生该表的数据,比如省市区这样的固定数据,分库之后需要保持每个库都是一样的数据

type="global" 其中这个属性代表全局表,测试在mycat 的data_dictionary 中插入数据,惊喜的发现,在两个两个服务器的mysql 中都有了刚刚插入的数据,这里并不是主从同步,在上文中主从同步主库配置文件中binlog-do-db=db_store,只做了db_store的同步,而db_user 并没有做主从同步,而是因为mycat 的配置原因

<table name="data_dictionary" type="global" dataNode="db_user_dataNode1,db_user_dataNode2" primaryKey="dataDictionaryID"/>
7:ER 表测试 ,ER表指的是关联表,分库后为保证外键表与主键表在同一个数据库而设计,比如保单提交要插入用户数据,以及关联的用户地址数据表,那么mycat 会根据配置关系将两个表中的数据保持插入进同一个A库,不会一个在A库一个在B库的情况

在mycat 中执行两个有关联关系的数据表,会发现,有关联关系的必然会保存在同一个库中

到此处,mycat的基本配置已经完成,需要完整数据及配置的可以进入csdn 进行下载
https://download.csdn.net/download/weixin_39405439/10908396

mycat 的分片规则,就不在配置了,都是一些修改数据测试,晚点有时间可以在更新上来

相关文章

网友评论

      本文标题:mycat 入门配置

      本文链接:https://www.haomeiwen.com/subject/eloorqtx.html