介绍

  • 支持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配置

新增mysql节点

查看监控

mycat 使用的更多相关文章

  1. MyCat源码分析系列之——结果合并

    更多MyCat源码分析,请戳MyCat源码分析系列 结果合并 在SQL下发流程和前后端验证流程中介绍过,通过用户验证的后端连接绑定的NIOHandler是MySQLConnectionHandler实 ...

  2. MyCat源码分析系列之——SQL下发

    更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlo ...

  3. MyCat源码分析系列之——BufferPool与缓存机制

    更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...

  4. MyCat源码分析系列之——前后端验证

    更多MyCat源码分析,请戳MyCat源码分析系列 MyCat前端验证 MyCat的前端验证指的是应用连接MyCat时进行的用户验证过程,如使用MySQL客户端时,$ mysql -uroot -pr ...

  5. MyCat源码分析系列之——配置信息和启动流程

    更多MyCat源码分析,请戳MyCat源码分析系列 MyCat配置信息 除了一些默认的配置参数,大多数的MyCat配置信息是通过读取若干.xml/.properties文件获取的,主要包括: 1)se ...

  6. 开源分布式数据库中间件MyCat源码分析系列

    MyCat是当下很火的开源分布式数据库中间件,特意花费了一些精力研究其实现方式与内部机制,在此针对某些较为重要的源码进行粗浅的分析,希望与感兴趣的朋友交流探讨. 本源码分析系列主要针对代码实现,配置. ...

  7. mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离

    数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了 ...

  8. 【无私分享:ASP.NET CORE 项目实战(第十三章)】Asp.net Core 使用MyCat分布式数据库,实现读写分离

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 MyCat2.0版本很快就发布了,关于MyCat的动态和一些问题,大家可以加一下MyCat的官方QQ群:106088787.我 ...

  9. mycat入门教程

    github https://github.com/MyCATApache/Mycat-Server myCat介绍 myCat的诞生,要从其前身Amoeba和Cobar说起. Amoeba(变形虫) ...

  10. Mycat 全局系列号

    标签:utf8 概述 本篇文章介绍mycat怎样在分库分表的情况下保证主键的全局唯一方法,接下来就来分析三种方法各自的优缺点. 配置 文件方式获取 1.修改server配置文件 vim server. ...

随机推荐

  1. 第一个 java 程序

    java程序的运行机制 JVM实现了跨平台 JDK > JRE > JVM java Development Kit(JDK)包含:JRE,以及增加编译器和调试器等用于程序开发的文件 Ja ...

  2. 【原】Java学习笔记020 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 成员方法的参数列表 ...

  3. tcp、udp、ip、icmp报文格式分析

    TCP .UDP .IP. ICMP协议报文格式分析 Tcp报文格式: Wireshark抓包如图: 源端口/目的端口(16bit): 在TCP报文中包涵了源端口/目的端口,源端口标识了发送进程,目的 ...

  4. formatter的使用

    1.目的 如图所示,实现行编辑栏中的编辑删除,以及在时间建议中显示上中下旬 可参考easyui官方文档中所写的关于datagrid列属性:http://www.jeasyui.net/plugins/ ...

  5. 英语进阶系列-A06-本周总结

    本周总结 目录Content 英语进阶系列-A01-再别康桥 英语进阶系列-A02-英语学习的奥秘 英语进阶系列-A03-英语升级练习一 英语进阶系列-A04-英语升级练习二 英语进阶系列-A05-英 ...

  6. day9-基础函数的学习(四)

    这几天一直赶着写写作业,博客的书写又落下了,要加油鸭,开写 今日份目录 1.内置函数 2.递归函数 开始今日份总结 1.内置函数 内置函数就是python内部包含的函数,总计有68种,不过有些事真的天 ...

  7. MySQL数据库引擎类别和更换方式

    MySQL数据库引擎类别 能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEA ...

  8. Facebook第三方网页登录(JavaScript SDK)

    文档网址:https://developers.facebook.com/docs/facebook-login/web#logindialog 一.应用配置  https://www.faceboo ...

  9. Asp.Net Core SignalR 与微信小程序交互笔记

    什么是Asp.Net Core SignalR Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给 ...

  10. 区块链代币(Token)笔记 — — 术语

    前言 接触区块链和数字货币差不多有大半年时间,一直在赶项目进度,现在有空整理补习一下相关的知识,只谈代币不谈区块链