欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mycat入门使用及安装教程(Demo实现)

程序员文章站 2022-03-02 17:26:55
简单定义 mycat是一个可以用于mysql读写分离和高可用的中间件,一个微mysql server 的超级,一个能平滑扩展支持数亿大表的分布式数据库,一个可管控多种关系数据库的数据库,一个平滑从...

简单定义


mycat是一个可以用于mysql读写分离和高可用的中间件,一个微mysql server 的超级,一个能平滑扩展支持数亿大表的分布式数据库,一个可管控多种关系数据库的数据库,一个平滑从关系数据升级到大数据的应用中间件,其前身是阿里的cobar项目。

关键特性


支持mysql,ocrcle,db2,sqlserver,postgresql等db的常见sql语法

遵循mysql原生协议,跨平台,跨数据库的通用中间件代理

基于心跳的自动故障切换,支持读写分离,支持mysql主从,一级galera cluster集群

基于nio实现,有效管理线程,解决高并发问题。

支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。

支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。

支持通过全局表,er关系的分片策略,实现了高效的多表join查询。

支持多租户方案。

支持分布式事务(弱xa)。

支持xa分布式事务(1.6.5)。

支持全局序列号,解决分布式下的主键生成问题。

分片规则丰富,插件化开发,易于扩展。

强大的web,命令行监控。

支持前端作为mysql通用代理,后端jdbc方式支持oracledb2、sql server 、 mongodb 、巨杉。

支持密码

支持服务降级

支持ip白名单

支持sql黑名单、sql注入攻击拦截

支持prepare预编译指令(1.6)

支持非堆内存(direct memory)聚合计算(1.6)

支持postgresql的native协议(1.6)

支持mysql和oracle存储过程,out参数、多结果集返回(1.6)

支持zookeeper协调主从切换、zk序列、配置zk化(1.6)

支持库内分表(1.6)

集群基于zookeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。

mycat监控


支持对mycat、mysql性能监控

支持对mycat的jvm内存提供监控服务

支持对线程的监控

支持对操作系统的cpu、内存、磁盘、网络的监控

mycat前世今生


2013年阿里的cobar在社区使用过程中发现存在一些比较严重的问题,及其使用限制,经过mycat发起人第一次改良,第一代改良版——mycat诞生。 mycat开源以后,一些cobar的用户参与了mycat的开发,最终mycat发展成为一个由众多软件公司的实力派架构师和资深开发人员维护的社区型开源软件。

2014年mycat首次在上海的《中华架构师》大会上对外宣讲,更多的人参与进来,随后越来越多的项目采用了mycat。

2015年5月,由核心参与者们一起编写的第一本官方权威指南《mycat权威指南》电子版发布,累计超过500本,成为开源项目中的首创。

2015年10月为止,mycat项目总共有16个committer。

截至2015年11月,超过300个项目采用mycat,涵盖银行、电信、电子商务、物流、移动应用、o2o的众多领域和公司。

截至2015年12月,超过4000名用户加群或研究讨论或测试或使用mycat。

mycat是基于开源cobar演变而来,我们对cobar的代码进行了彻底的重构,使用nio重构了网络模块,并且优化了buffer内核,增强了聚合,join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。1.4 版本以后 完全的脱离基本cobar内核,结合mycat集群管理、自动扩容、智能优化,成为高性能的中间件。

mycat安装与使用


下载:

具体下载哪个版本以发布为准,推荐1.4,1.5.

安装:

下载的文件直接解压即可。

运行:

linux:

./mycat start 启动

./mycat stop 停止

./mycat console 前台运行

./mycat restart 重启服务

./mycat pause 暂停

./mycat status 查看启动状态

win:

直接运行startup_nowrap.bat

内存配置:

启动前,一般需要修改jvm配置参数,打开conf/wrapper.conf文件,如下行的内容为2g和2048,可根据本机配置情况修改为512m或其它值。 以下配置跟jvm参数完全一致,可以根据自己的jvm参数调整。

java additional parameters
wrapper.java.additional.1=
wrapper.java.additional.1=-dmycat_home=.
wrapper.java.additional.2=-server
wrapper.java.additional.3=-xx:maxpermsize=64m
wrapper.java.additional.4=-xx:+aggressiveopts
wrapper.java.additional.5=-xx:maxdirectmemorysize=100m
wrapper.java.additional.6=-dcom.sun.management.jmxremote
wrapper.java.additional.7=-dcom.sun.management.jmxremote.port=1984
wrapper.java.additional.8=-dcom.sun.management.jmxremote.authenticate=false
wrapper.java.additional.9=-dcom.sun.management.jmxremote.ssl=false
wrapper.java.additional.10=-xmx100m
wrapper.java.additional.11=-xms100m
wrapper.java.additional.12=-xx:+useparnewgc
wrapper.java.additional.13=-xx:+useconcmarksweepgc
wrapper.java.additional.14=-xx:+usecmscompactatfullcollection
wrapper.java.additional.15=-xx:cmsfullgcsbeforecompaction=0
wrapper.java.additional.16=-xx:cmsinitiatingoccupancyfraction=70

以下配置作废:

wrapper.java.initmemory=3

wrapper.java.maxmemory=64

mycat连接测试:

测试mycat与测试mysql完全一致,mysql怎么连接,mycat就怎么连接。

推荐先采用命令行测试:

mysql -uroot -proot -p8066 -h127.0.0.1

如果采用工具连接,1.4,1.3目前部分工具无法连接,会提示database not selected,建议采用高版本,navicat测试。1.5已经修复了部分工具连接。

mycat配置入门

配置:

–bin 启动目录

–conf 配置文件存放配置文件

逻辑库配置:

配置server.xml

添加两个mycat逻辑库:user,pay: system 参数是所有的mycat参数配置,比如添加解析器:defaultsqlparser,其他类推 user 是用户参数。

<system>
<property name="defaultsqlparser">druidparser</property>
</system>
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">user,pay</property>
</user>

编辑schema.xml

修改datahost和schema对应的连接信息,user,pay 垂直切分后的配置如下所示:

schema 是实际逻辑库的配置,user,pay分别对应两个逻辑库,多个schema代表多个逻辑库。

datanode是逻辑库对应的分片,如果配置多个分片只需要多个datanode即可。

datahost是实际的物理库配置地址,可以配置多主主从等其他配置,多个datahost代表分片对应的物理库地址,下面的writehost、readhost代表该分片是否配置多写,主从,读写分离等高级特性。

以下例子配置了两个writehost为主从。

<schema name="user" checksqlschema="false" sqlmaxlimit="100" datanode="user" />
<schema name="pay"  checksqlschema="false" sqlmaxlimit="100" datanode="pay" >
   <table name="order" datanode="pay1,pay2" rule="rule1"/>
</schema>
<datanode name="user" datahost="host" database="user" />
<datanode name="pay1" datahost="host" database="pay1" />
<datanode name="pay2" datahost="host" database="pay2" />
<datahost name="host" maxcon="1000" mincon="10" balance="0"
   writetype="0" dbtype="mysql" dbdriver="native">
   <heartbeat>select 1</heartbeat>
   <!-- can have multi write hosts -->
   <writehost host="hostm1" url="192.168.0.2:3306" user="root" password="root" />
   <writehost host="hostm2" url="192.168.0.3:3306" user="root" password="root" />
</datahost>

mycat逻辑库、系统参数配置

配置mycat环境参数

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!doctype mycat:server system "server.dtd">
<mycat:server xmlns:mycat="https://org.opencloudb/">
   <system>
      <property name="defaultsqlparser">druidparser</property>
    </system> 
 </mycat:server>

如例子中配置的所有的mycat参数变量都是配置在server.xml 文件中,system标签下配置所有的参数,如果需要配置某个变量添加相应的配置即可,例如添加启动端口8066,默认为8066。

<property name="serverport">8066</property>

其他所有变量类似。

配置mycat逻辑库与用户

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!doctype mycat:server system "server.dtd">
<mycat:server xmlns:mycat="https://org.opencloudb/">
<user name="mycat">
    <property name="password">mycat</property>
    <property name="schemas">testdb</property>
</user>
 </mycat:server>

如例子中配置的所有的mycat连接的用户与逻辑库映射都是配置在server.xml 文件中,user标签下配置所有的参数,例如例子中配置了一个mycat用户供应用连接到mycat,同时mycat 在schema.xml中配置后了一个逻辑库testdb,配置好逻辑库与用户的映射关系。

逻辑库、表分片配置

配置逻辑库(schema)

mycat作为一个中间件,实现mysql协议那么对前端应用连接来说就是一个数据库,也就有数据库的配置,mycat的数据库配置是在schema.xml中配置,配置好后映射到server.xml里面的用户就可以了。

<?xml version="1.0" encoding="utf-8"?>
<!doctype mycat:schema system "schema.dtd">
<mycat:schema  xmlns:mycat="https://org.opencloudb/">
  <schema name="testdb" checksqlschema="true" sqlmaxlimit="100" datanode="dn1">
      <table name="t_user" datanode="dn1,dn2" rule="sharding-by-mod2"/>
      <table name="ht_jy_login_log" primarykey="id" datanode="dn1,dn2" rule="sharding-by-date_jylog"/>
  </schema>
  <datanode name="dn1" datahost="localhost1" database="mycat_node1"/>
  <datanode name="dn2" datahost="localhost1" database="mycat_node2"/>

  <datahost name="localhost1" writetype="0" switchtype="1" slavethreshold="100" balance="1" dbtype="mysql" maxcon="10" mincon="1" dbdriver="native">
    <heartbeat>show status like 'wsrep%'</heartbeat>
    <writehost host="hostm1" url="127.0.0.1:3306" user="root" password="root" >
    </writehost>  
  </datahost>
</mycat:schema >

上面例子配置了一个逻辑库testdb,同时配置了t_user,ht_jy_login_log两个分片表。

逻辑表配置

<table name="t_user" datanode="dn1,dn2" rule="sharding-by-mod2"/>

table 标签 是逻辑表的配置 其中

name代表表名,

datanode代表表对应的分片,

mycat默认采用分库方式,也就是一个表映射到不同的库上,

rule代表表要采用的数据切分方式,名称对应到rule.xml中的对应配置,如果要分片必须配置。

配置分片(datanode)

  <datanode name="dn1" datahost="localhost1" database="mycat_node1"/>
  <datanode name="dn2" datahost="localhost1" database="mycat_node2"/>

表切分后需要配置映射到哪几个数据库中,mycat的分片实际上就是库的别名,例如上面例子配置了两个分片dn1,dn2 分别对应到物理机映射datahost localhost1 的两个库上。

配置物理库分片映射(datahost)

  <datahost name="localhost1" writetype="0" switchtype="1" slavethreshold="100" balance="1" dbtype="mysql" maxcon="10" mincon="1" dbdriver="native">
    <heartbeat>show status like 'wsrep%'</heartbeat>
    <writehost host="hostm1" url="127.0.0.1:3306" user="root" password="root" >
    </writehost>  
  </datahost>

mycat作为数据库代理需要逻辑库,逻辑用户,表切分后需要配置分片,分片也就需要映射到真实的物理主机上,至于是映射到一台还是一台的多个实例上,mycat并不关心,只需要配置好映射即可,例如例子中:

配置了一个名为localhost1的物理主机(datahost)映射。

heartbeat 标签代表mycat需要对物理库心跳检测的语句,正常情况下生产案例可能配置主从,或者多写 或者单库,无论哪种情况mycat都需要维持到数据库的数据源连接,因此需要定时检查后端连接可以性,心跳语句就是来作为心跳检测。

writehost 此标签代表 一个逻辑主机(datahost)对应的后端的物理主机映射,例如例子中写库hostm1 映射到127.0.0.1:3306。如果后端需要做读写分离或者多写 或者主从则通过配置 多个writehost 或者readhost即可。

mycat 表切分规则配置

表切分规则

<?xml version="1.0" encoding="utf-8"?>
<!doctype mycat:rule system "rule.dtd">
<mycat:rule  xmlns:mycat="https://org.opencloudb/">
  <tablerule name="sharding-by-hour">
    <rule>
      <columns>createtime</columns>
      <algorithm>sharding-by-hour</algorithm>
    </rule>
  </tablerule>

  <function name="sharding-by-hour" class="org.opencloudb.route.function.latestmonthpartion">
    <property name="splitoneday">24</property>
  </function>

</mycat:rule >

数据切分中作为表切分规则中最重要的配置,表的切分方式决定了数据切分后的性能好坏,因此也是最重要的配置。

如上面例子配置了一个切分规则,名为sharding-by-hour 对应的切分方式(function )是按日期切分,该配置中:

tablerule

name 为schema.xml 中table 标签中对应的 rule=”sharding-by-hour” ,也就是配置表的分片规则,

columns 是表的切分字段: createtime 创建日期。

algorithm 是规则对应的切分规则:映射到function 的name。

function

function 配置是分片规则的配置。

name 为切分规则的名称,名字人员取,但是需要与tablerule 中匹配。

class 是切分规则对应的切分类,写死,需要哪种规则则配置哪种,例如本例子是按小时分片:org.opencloudb.route.function.latestmonthpartion

property 标签是切分规则对应的不同属性,不同的切分规则配置不同。