mycat 使用
介绍
-
支持SQL92标准
-
支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
-
遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
-
基于心跳的自动故障切换,读写分离,MySQL主从,以及galera cluster集群。
-
支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
-
基于Nio实现,有效管理线程,解决高并发问题。
-
支持数据的多片自动路由与聚合,sum,count,max等常用的聚合函数,跨库分页。
-
支持全局序列号,解决分布式下的主键生成问题。
-
分片规则丰富,插件化开发,易于扩展。
-
强大的web,命令行监控。
-
支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
-
集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。
mysql主从(集群)
安装略过,环境说明
角色 ip地址 主机名 server_id Master 192.168.132.131 master 131 Slave1 192.168.132.132 master-bak 132 Slave2 192.168.132.133 slave2 133 mha-slave(mycat&mha-manager)
安装及配置mycat
mycat安装到 slave2 服务器,与mha-manager同一台服务器
配置java环境
[root@slave2 logs]# tail -n3 /etc/profile export JAVA_HOME=/usr/local/java/jdk1.8.0_151 export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH=$PATH:${JAVA_HOME}/bin [root@slave2 logs]# source /etc/profile [root@slave2 logs]# java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
安装Mycat服务
[root@slave2 ~]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz [root@slave2 ~]# tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz [root@slave2 ~]# cd /usr/local/mycat/ [root@slave2 mycat]# ll 总用量 12 drwxr-xr-x 2 root root 190 4月 10 06:53 bin drwxrwxrwx 2 root root 6 3月 1 2016 catlet drwxrwxrwx 4 root root 4096 4月 10 11:38 conf drwxr-xr-x 2 root root 4096 4月 10 06:53 lib drwxrwxrwx 3 root root 74 4月 10 11:39 logs -rwxrwxrwx 1 root root 217 10月 28 2016 version.txt [root@slave2 mycat]# tail -n2 /etc/profile export MYCAT_HOME=/usr/local/mycat export PATH=$PATH:$MYCAT_HOME/bin
[root@slave2 mycat] source /etc/profile
配置文件修改(conf目录)
server.xml(修改前先备份)
#将文字下面的取消注释
<!--默认是65535 64K 用于sql解析时最大文本长度 --> <property name="maxStringLiteralLength">65535</property> <property name="sequnceHandlerType">0</property> <property name="backSocketNoDelay">1</property> <property name="frontSocketNoDelay">1</property> <property name="processorExecutor">16</property> #修改最后user为如下所示: <user name="root"> <property name="password">root</property> <property name="schemas">TESTDB</property> #这里为mycat的逻辑数据库,用来将数据写入到这个库里,然后自动分发到mysql集群各个库 </user> #注意不能加上 <property name="readOnly">true</property> 否则mycat数据库将不能写入
配置schema.xml文件(修改前注意备份)
#可以将 <mycat:schema> 内的内容清空,并写入如下配置
[root@slave2 mycat]# cat conf/schema.xml <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 这里的数据库(name)要与server.xml中设置的数据库相同 --> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" > #表示mycat逻辑数据库,用于接收数据写入,这里的dataNode要与下面dataNode的name相同 </schema>
<dataNode name="dn1" dataHost="master" database="test_switch" /> #这里的name为自定义,dataHost为自定义,database为数据库集群中真是存在的数据库,用于接收mycat虚拟库分发过来的数据 <!-- <dataNode name="dn2" dataHost="master-bak" database="test_switch" /> --> <!-- <dataNode name="dn3" dataHost="slave2" database="test_switch" /> --> <dataHost name="master" maxCon="1000" minCon="10" balance="1" #name要与上面dataNode定义的name一样 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.132.131:3306" user="root" #这里定义用于接收mycat虚拟数据库数据的mysql集群中数据库的信息,writehost里为写入的数据库 password="root"> <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.132.132:3306" user="root" password="root" /> #定义只读的数据库,表示只往writehost指定的节点写数据,readhost指定的节点只读数据 <readHost host="hostS3" url="192.168.132.133:3306" user="root" password="root" /> </writeHost> </dataHost> </mycat:schema>
说明:dataHost中的 balance 为设置读写分离的机制:
1表示开启读写分离机制,全部的readhost和writehost均参与select语句的负载均衡
0表示不开启,所有读操作都发送到当前可用的writehost上
2表示所有读操作随机分发到writehost和readhost上
3表示虽有读请求随机分发到writehost对应的readhost上执行,writehost不负担读压力
writeType表示写模式
0 表示 所有的操作发送到配置的第一个writehost
1 表示随机分配到所有的writehost
2 表示不执行写操作
switchType表示切换的模式
1 表示自动切换
0 表示不自动切换
2 表示基于mysql主从复制的状态决定是否切换,心跳语句为show slave status
3 表示基于cluster的切换机制,
启动/关闭 mycat
#启动 /usr/local/mycat/bin/mycat start #关闭 /usr/local/mycat/bin/mycat stop
#日志
/usr/local/mycat/logs/wrapper.log
登录管理端口,9066,查看是否有默认的逻辑数据库
#登录mycat数据库
[root@slave2 mycat]# mysql -uroot -proot -h 192.168.132.133 -P9066 #由于mycat配置在slave2上,所以通过-h 本地ip查看 mysql> show databases; +----------+ | DATABASE | +----------+ | TESTDB | +----------+ 1 row in set (0.00 sec) #查看数据读写入口 mysql> show @@datasource; +----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+ | DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD | +----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+ | dn1 | hostM1 | mysql | 192.168.132.131 | 3306 | W | 0 | 10 | 1000 | 11 | 0 | 0 | | dn1 | hostS2 | mysql | 192.168.132.132 | 3306 | R | 0 | 3 | 1000 | 4 | 0 | 0 | | dn1 | hostS3 | mysql | 192.168.132.133 | 3306 | R | 0 | 3 | 1000 | 4 | 0 | 0 | +----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+ 3 rows in set (0.04 sec)
如果要操作mycat数据库,要连接8066端口,如果用9066连接并创建库和表,会报 ERROR 1003 (HY000): Unsupported statement
[root@slave2 mycat]# mysql -uroot -proot -h 192.168.132.133 -P8066
#创建表,并插入数据
mysql> use TESTDB mysql> create table test_Table(id INT,name VARCHAR(32)); mysql> insert into test_Table values(1,"aedsd") mysql> insert into test_Table values(2,"aedfadasffasd")
登录mysql-cluster(或主从)查看数据写入情况(主库从库均看)
[root@master ~]# mysql -uroot -proot mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test_switch | +--------------------+ 5 rows in set (0.00 sec)
#由于schema.xml里配置的与TESTDB交互的数据库是test_switch,所以进入这个库查看
mysql> use test_switch Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------------+ | Tables_in_test_switch | +-----------------------+ | test_Table | +-----------------------+ 1 row in set (0.00 sec) mysql> select * from test_Table; +------+---------------+ | id | name | +------+---------------+ | 1 | aedfa | | 2 | aedfadasffasd | +------+---------------+ 2 rows in set (0.00 sec)
发现从TESTDB插入的数据在mysql主库中已经有了
分库分表
配置
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 数据库配置,与server.xml中的数据库对应 --> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="test1" dataNode="dn1" /> #表示将数据写到dataNode 为dn1的主机数据库中 <table name="test2" dataNode="dn1" /> <table name="test3" dataNode="dn1" /> <table name="users" dataNode="dn1" />
<!--表示将user_id数据写入到节点dn1和dn2中--> <table name="user_id" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long" /> #这里rule的值要与rule.xml中tableRule 的name所指定的值 </schema> <!-- 分片配置 --> <dataNode name="dn1" dataHost="master" database="test_switch" /> <dataNode name="dn2" dataHost="master-bak" database="test_switch" /> <!-- 物理数据库配置 只写--> <dataHost name="master" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user();</heartbeat> <writeHost host="hostM1" url="192.168.132.131:3306" user="root" password="root">
</writeHost> </dataHost> <dataHost name="master-bak" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user();</heartbeat> <writeHost host="hostS1" url="192.168.132.132:3306" user="root" password="root"> </writeHost> </dataHost> </mycat:schema>
说明:
test1、test2、test3、users这些表都只写入节点dn1,也就是192.168.132.131这个服务,而user_id写入了dn1、dn2两个节点,也就是192.168.132.131、192.168.132.132这两台服务器。分片的规则为:mod-long,即将数据平均拆分
主要关注rule属性,rule属性的内容来源于rule.xml这个文件,Mycat支持10种分表分库的规则,基本能满足你所需要的要求,其他数据库中间件好像都没有这么多。
<tableRule name="mod-long"> <rule> <columns>id</columns> #这里为字段 <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">2</property> #这里的数字取决于要平均往几台数据库写数据 </function>
mysql主从读写分离
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 数据库配置,与server.xml中的数据库对应 --> <schema name="lunch" checkSQLschema="false" sqlMaxLimit="100"> <table name="lunchmenu" dataNode="dn1" /> <table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1" /> </schema> <!-- 分片配置 --> <dataNode name="dn1" dataHost="test1" database="lunch" /> <!-- 物理数据库配置 --> <dataHost name="test1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user();</heartbeat> <writeHost host="hostM1" url="192.168.132.131:3306" user="root" password="root"> <readHost host="hostM1" url="192.168.132.132:3306" user="root" password="root"> </readHost> </writeHost> </dataHost> </mycat:schema>
datahost也只有一台,但是writehost添加了readhost,balance改为1,表示读写分离。
以上配置达到的效果就是102.168132.131为主库,192.168.132.132为从库。
性能监控
下载zookeeper并安装
[root@slave2 ~]# wget https://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz [root@slave2 ~]# tar zxvf zookeeper-3.4.10.tar.gz [root@slave2 ~]# cd zookeeper-3.4.10/conf/ [root@slave2 conf]# cp zoo_sample.cfg zoo.cfg [root@slave2 conf]# ../bin/zkServer.sh start [root@slave2 conf]# lsof -i :2181 #端口起来即可
下载mycat-web并安装
[root@slave2 ~]# wget https://raw.githubusercontent.com/MyCATApache/Mycat-download/master/mycat-web-1.0/Mycat-web-1.0-SNAPSHOT-20160617163048-linux.tar.gz [root@slave2 ~]# mv Mycat-web-1.0-SNAPSHOT-20160617163048-linux.tar.gz Mycat-web-1.0.tar.gz [root@slave2 ~]# tar zxvf Mycat-web-1.0.tar.gz [root@slave2 ~]# cd mycat-web/ [root@slave2 mycat-web]# cd mycat-web/WEB-INF/classes/ [root@slave2 classes]# ls com jdbc.properties log4j2.xml mybatis mycat.properties org spring #mycat.properties里面可以修改zookeeper的地址,默认不用修改,直接启动即可 [root@slave2 classes]# sh /root/mycat-web/start.sh &
访问 http://ip:8022/mycat
新增mycat配置
新增mysql节点
查看监控