介绍

  • 支持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. Session, Token, OAuth 鉴权那些事儿

    鉴权那些事 整体思路 无论什么样的服务, Web 服务总是不能绕开鉴权这个话题的, 通过有效的鉴权手段来保护网站数据, 来为特定用户提供服务. 整体来说, 有三种方式: Session-Cookie ...

  2. python3 str(字符串)

    __add__函数 (在后面追加字符串) s1 ='Hello' s2 = s1.__add__(' boy!') print(s2) #输出:Hello boy! __contains__(判断是否 ...

  3. JavaScript -- 原型:prototype的使用

    JavaScript -- 原型:prototype的使用 在 JavaScript 中,prototype 是函数的一个属性,同时也是由构造函数创建的对象的一个属性. 函数的原型为对象. 它主要在函 ...

  4. LeetCode算法题-Longest Harmonious Subsequence(Java实现)

    这是悦乐书的第270次更新,第284篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是594).我们定义一个和谐数组是一个数组,其最大值和最小值之间的差 ...

  5. tomcat报异常Invalid character found in method name. HTTP method names must be tokens

    最近监控了一下测试环境的日志,突然出现如下一个异常 由Error parsing HTTP request header可以看出是由于解析请求头出错导致的,但是它属于DEBUG级别的异常,虽然不影响系 ...

  6. Ambari Metrics 详解

    Ambari Metrics 原理 Ambari Metrics System 简称为 AMS,它主要为系统管理员提供了集群性能的监察功能.Metrics 一般分为 Cluster.Host 以及 S ...

  7. springcloud ribbon 客户端负载均衡用法

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is ...

  8. particles.js在vue上的运用

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

  9. AQS框架源码分析-AbstractQueuedSynchronizer

    前言:AQS框架在J.U.C中的地位不言而喻,可以说没有AQS就没有J.U.C包,可见其重要性,因此有必要对其原理进行详细深入的理解. 1.AQS是什么 在深入AQS之前,首先我们要搞清楚什么是AQS ...

  10. NSSM安装服务

    NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行.同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大.它的特点如下: 支持普通 ...