Mycat的配置和使用
1. Mycat简介:
MyCAT是一款由阿里Cobar演变而来的用于支持数据库,读写分离、分表分库的分布式中间件。MyCAT支持Oracle、MSSQL、MYSQL、PG、DB2关系型数据库,同时也支MongoDB等非关系型数据库。MyCAT原理:MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。
分析:所有的数据库请求都将先访问Mycat,由Mycat与数据库交互,数据库将数据返回给程序。实际数据库可能有多个,他们也被称为多节点,或多切片。
2.windows安装
下载链接:Mycat
cmd进入bin目录。
安装:
mycat install
启动:mycat start
关闭:mycat stop
3.使用
3.1 文件目录:
–bin 启动目录
–conf 配置文件存放配置文件的目录:
–server.xml:是Mycat服务器参数调整和用户授权的配置文件。
–schema.xml:是逻辑库定义和表以及分片定义的配置文件。
–rule.xml: 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT。
–log4j.xml: 日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题。
–autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties,sequence_db_conf.properties 分片相关的id分片规则配置文件
–lib MyCAT自身的jar包或依赖的jar包的存放目录。
–logs MyCAT日志的存放目录。日志存放在logs/log中,每天一个文件
3.2 分表分库
在server.xml下添加一个用户,例如
1 | <!-- 连接用户名,默认端口是8066 --> |
运行mycat,使用navicat,输入以上用户名密码,即可连接,连接后即可看到逻辑数据库
配置schema.xml,配置数据库的表结构,配置分片
1 | <!-- 数据库配置,与server.xml中的数据库对应 --> |
修改rule.xml 的mod-long节点数,上面配置了两个节点,所以这里count值为2,1
2
3
4
5<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<!-- count值与分片个数相同 -->
<property name="count">2</property>
</function>
重启mycat,验证是否生效。在对应两个切片下创建user表,连接逻辑数据库,插入数据,这时会根据节点数取模算法。关于分片取模算法: 根据id进行取模 根据数据库集群的数量(或者说是表数量,mycat里面一个表对应一个库)1
2insert into user (id,name,sex) values (1,'anna','woman');
insert into user (id,name,sex) values (2,'bob','man');
此时两个节点数据库下各有一条数据(插入数据节点是0开始计算的,意思就是你插入id=1的数据,1%2=1,那就是第二个节点dn2),大功告成。这时如果在逻辑数据库上执行 select * from user
的原理其实执行的是:select * from dn1.user
和select * from dn2.user
,
最后把结果集给mycat进行封装 然后返回给客户端。
带条件查询:select * from db1.user where id =1
mycat会进行转换 1%3=1 在dn2上!转换成select * from dn2.user where id = 1
,即一次就能查出结果。
分页查询:select * from user limit 0,2
此时它会往两个节点里发送请求(select * from dn1.user limit 0,2
, select * from dn2.user limit 0,2
),谁先返回则返回谁的结果(不信可以多运行几次sql)。
解决办法:select * from user order by id desc limit 0,1
,加上排序后,返回的结果为两个节点所有数据排序后再分页的结果。
bug
解决办法:修改schema.xml文件,checkSQLschema=”fasle”,改为true1
<schema name="MYCAT_DB" checkSQLschema="true" sqlMaxLimit="100">
3.3 Mysql主从复制
3.3.1 主库配置:
1.编辑linux目录下/etc/my.cnf (mysql的配置文件路径)vim /etc/my.cnf
2.在文件的 [mysqld] 下 添加以代码1
2
3
4
5
6
7
8
9[mysqld]
#示开启二进制日志,并把二进制日志前缀改为mysql-bin
log-bin = mysql-bin
#随意数字,只要和从库不相等即可
server-id = 6
#表示需要备份的数据库为test
binlog-do-db = test
#表示需要备份的数据库为mycat下的user表
binlog-do-db = mycat.user
3.在mysql中创建一个用户create user 'myslave'@'%' identified by '123456';
4.给myslave用户配置主从复制的权限:grant replication slave on *.* to 'myslave'@'%' identified by '123456';
5.刷新权限:flush privileges;
6.查看主服务状态:show master status;
3.3.2 从库配置
1.编辑mysql安装目录下的my.ini,如果没有自行百度,添加一个my.ini
2.在文件my.ini的[mysqld] 下 添加以代码(注意:中文注释后要把编码格式改成utf-8,不然可能重启mysql服务不了)1
2
3
4
5
6
7
8
9[mysqld]
#示开启二进制日志,并把二进制日志前缀改为mysql-bin
log-bin = mysql-bin
#随意数字,只要和主库不相等即可
server-id = 2
#表示需要备份的数据库为test
binlog-do-db = test
#表示需要备份的数据库为mycat下的user表
binlog-do-db = mycat.user
3.在从库依次执行以下语句1
2
3
4
5change master to master_host='101.132.191.145',master_user='mytest(slave账户用户名)',master_password='123456(密码)',master_log_file='mysql-bin.000021(对应主库数据库的file的值)',master_log_pos=400(对应主库的position的值);
stop slave;
start slave;
show slave status;
效果:在主库test创建一个user表,从库也会同时创建
原理:
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
注意:你同步的数据库必须主从都有,每一次改变主数据库数据,他的position值都会变化。就要重新执行上面的配置语句了
待续。。。。