介绍

  • 支持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. hive笔记:复杂数据类型-map结构

    map 结构 1. 语法:map(k1,v1,k2,v2,…)   操作类型:map ,map类型的数据可以通过'列名['key']的方式访问 案例: select deductions['Feder ...

  2. LeetCode算法题-Set Mismatch(Java实现)

    这是悦乐书的第279次更新,第295篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第147题(顺位题号是645).集合S最初包含从1到n的数字. 但不幸的是,由于数据错误 ...

  3. C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

    这里因为的原因是https请求要检查证书,有些证书不正确的,网页不会正常展示内容,而会返回链接不安全,是否继续.不安全的链接是否继续. 详情参考: C#动态调用webService出现 基础连接已经关 ...

  4. Failed to start /etc/rc.d/rc.local Compatibility

    查看/var/log/message Jun :: root systemd: Started Network Manager. Jun :: root systemd: Starting LSB: ...

  5. particles.js在vue上的运用

    转:https://www.jianshu.com/p/c52b3e91c94f 知乎的首页后面的粒子动效总觉得很炫酷,搜了一下,发现是用particles.js编写的.刚好目前的项目是利用vue框架 ...

  6. 修改xampp-apache访问目录

    文章转自 https://my.oschina.net/u/3618644/blog/1569972 问题来源: 一般情况下,每个项目占用一个根目录,而不是一个根目录下面有多个项目. 比如说,安装xa ...

  7. 洛谷 P1439 【模板】最长公共子序列

    \[传送门啦\] 题目描述 给出\(1-n\)的两个排列\(P1\)和\(P2\),求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数\(n\), 接下来两行,每行为\(n\)个数,为 ...

  8. 使用BigQuery分析GitHub上的C#代码

    一年多以前,Google 在GitHub中提供了BigQuery用于查询的GitHub上的开源代码(open source code on GitHub available for querying) ...

  9. js 移除数组元素

    //移除数组元素 Array.prototype.remove = function(val) { var index = this.indexOfArr(val); if (index > - ...

  10. vue应用或者是项目其实就是 实例(完成基本逻辑) + 组件(单文件组件,全局组件,局部组件,内置组件)来完成 ;

    以上! 组件里面包含HTML,css, js,也就是一个完整的功能!