介绍

  • 支持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         
Slave1 192.168.132.132 master-bak         
Slave2 192.168.132.133 slave2         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..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) -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--linux.tar.gz
[root@slave2 ~]# cd /usr/local/mycat/
[root@slave2 mycat]# ll
总用量
drwxr-xr-x root root 4月 : bin
drwxrwxrwx root root 3月 catlet
drwxrwxrwx root root 4月 : conf
drwxr-xr-x root root 4月 : lib
drwxrwxrwx root root 4月 : logs
-rwxrwxrwx root root 10月 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"></property>
<property name="sequnceHandlerType"></property>
<property name="backSocketNoDelay"></property>
<property name="frontSocketNoDelay"></property>
<property name="processorExecutor"></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="" 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="" minCon="" balance="1"              #name要与上面dataNode定义的name一样
writeType="0" dbType="mysql" dbDriver="native" switchType="" slaveThreshold="">
<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 |
+----------+
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 | | W | | | | | | |
| dn1 | hostS2 | mysql | 192.168.132.132 | | R | | | | | | |
| dn1 | hostS3 | mysql | 192.168.132.133 | | R | | | | | | |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
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()); mysql> insert into test_Table values(,"aedsd")
mysql> insert into test_Table values(,"aedfadasffasd")

登录mysql-cluster(或主从)查看数据写入情况(主库从库均看)

[root@master ~]# mysql -uroot -proot

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_switch |
+--------------------+
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 |
+-----------------------+
row in set (0.00 sec) mysql> select * from test_Table;
+------+---------------+
| id | name |
+------+---------------+
| | aedfa |
| | aedfadasffasd |
+------+---------------+
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="">
<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="" minCon="" balance="" writeType="" 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="" minCon="" balance="" writeType="" 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"></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="">
<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="" minCon="" balance="" writeType="" 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..tar.gz
[root@slave2 ~]# cd zookeeper-3.4./conf/
[root@slave2 conf]# cp zoo_sample.cfg zoo.cfg [root@slave2 conf]# ../bin/zkServer.sh start
[root@slave2 conf]# lsof -i : #端口起来即可

下载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--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配置

mycat 使用-LMLPHP

mycat 使用-LMLPHP

新增mysql节点

mycat 使用-LMLPHP

查看监控

mycat 使用-LMLPHP

05-02 07:53