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>

说明:

我在192.168.132.131、192.168.132.132均有数据库test_switch。
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节点

查看监控

  

原文地址:https://www.cnblogs.com/FRESHMANS/p/8819053.html