《Mycat官方文档》_笔记


mycat官网

3,Mycat中的概念

数据库中间件;介于应用与数据库之间,进行数据处理与交互的中间服务。数据库路由,结果封装处理。
逻辑库;数据库中间件可被看作一个或多个数据库集群构成的逻辑库。
逻辑表;逻辑库中的表,分片表、非分片表、ER表(表分组)、全局表(表冗余)。
分片节点;分片表所在数据库。
节点主机;数据库主机。
分片规则;表切分规则。
全局序列号;全局唯一性标识。
多租户;多租户技术,多重租赁技术。多用户环境下共用相同的系统或程序组件,并保证用户间数据隔离。方案:独立数据库、共享数据库隔离数据架构(schema)、共享数据库数据架构(tenantId)。

4,快速入门

下载地址:http://dl.mycat.io/
解压后,运行./bin/startup_nowrap.bat;连接:mysql -uroot -p123456 -P8066 -h127.0.0.1

安装与配置

源码:https://github.com/MyCATApache/Mycat-Server.git
配置文件

  • ./conf/server.xml;用户及系统变量
  • ./conf/schema.xml;节点主机、分片节点、逻辑库、逻辑表
  • ./conf/rule.xml;分片规则、规则函数

源码运行,配置vm参数:-DMYCAT_HOME=projectPath/src/main

6 Mycat防火墙配置

<firewall>
	<whitehost>
		配置允许访问的主机
		<host user="mycat" host="127.0.0.1"></host> 
	</whitehost>
	<blacklist check="true">
		配置拦截属性,校验sql操作
		<property name="selelctAllow">false</property> 
	</blacklist>
</firewall>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

7 Mycat配置

schema.xml

管理逻辑库、逻辑表、分片节点、节点主机配置。
配置详解:https://blog.csdn.net/webnum/article/details/88821218
schema标签
定义逻辑库;属性:

  • name;逻辑库名
  • dataNode;绑定分片,未配置的逻辑表查询绑定分片。绑定后可跨域查询。
  • checkSQLschema;删除逻辑库名
  • sqlMaxLimit;默认最大记录数;逻辑库为非拆分库时无效。

table标签
定义逻辑表;属性:

  • name;逻辑表名
  • dataNode;逻辑表所属的dataNode。
  • rule;rule.xml中分片规则名
  • ruleRequired;true时必须绑定分片规则
  • primaryKey;主键
  • type;逻辑表类型。全局表(type=“global”)、普通表
  • autoIncrement;主键自增,默认false
  • subTables;分表规则。单库多表?
  • needAddLimit;记录数限制,默认true。

childTable标签
定义ER分片表;属性:

  • joinKey;子表关联属性名,确定父表所在dataNode
  • parentKey;父表关联属性名
  • name、primaryKey、needAddLimit;同上

dataNode标签
定义分片节点、数据分片;属性:

  • name;分片节点名
  • dataHost;dbms实例名
  • database;具体数据库,schema

dataHost标签
定义DBMS实例组、读写分离、心跳配置;属性:

  • name;dbms实例名
  • maxCon、minCon;最大连接数、最小连接数
  • balance、writeType;读操作负载均衡、写操作负载均衡
  • dbType;数据库类型
  • dbDriver;驱动类型,native(mysql)、JDBC。
  • switchType;自动切换
  • tempReadHostAvailable;

heartbeat标签
定义心跳语句;属性:

  • connectionInitSql;初始化sql
  • writeHost/readHost标签,定义读写实例;属性:
  • host;实例名
  • url、user、password;连接信息
  • weight;读节点权重
  • usingDecrypt;密码加密,默认0否。

server.xml

配置系统、用户信息。
user标签
定义用户;标签属性:name;用户名
常用property属性:password、schemas、readOnly
system标签
定义系统属性;property子标签。

rule.xml

tableRule标签
定义表规则;

  • name属性;规则名
  • columns子标签;路由列列名,如不匹配则广播
  • algorithm子标签;路由算法

function标签
定义路由算法;

  • name属性;算法名
  • class属性;算法类
  • property子标签;算法类参数

8 Mycat的分片join

mycat跨分片join实现方式:全局表、ER分片、catletT(人工智能)

全局表

字典类表格,定义为全局表。table属性:type=“global”

ER Join

Table Group,子表的存储位置依赖于主表,并在物理上紧邻存放。
table+childTable;joinKey、parentKey指定关联属性

Share Join

解析sql,拆分为单表执行;然后把各个节点的数据汇集起来。
直接进行join连接,按ER join执行。
格式:/!mycat:catlet=demo.catlets.ShareJoin/SQL

catlet(人工智能)

自定义处理逻辑。

9 全局序列号

全局唯一标记。system-sequenceHandlerType配置方式:
0本地文件、1数据库、2本地时间戳、3分布式zkID、4递增zk
server.xml

<system><property name="sequnceHandlerType">1</property></system>
  • 1

总体两种方式:递增、时间戳。

本地文件方式

classpath:sequence_conf.properties,配置:

  • GLOBAL_SEQ.HISIDS;历史分段
  • GLOBAL_SEQ.MINID;最小值
  • GLOBAL_SEQ.MAXID;最大值
  • GLOBAL_SEQ.CURID;当前值

使用:insert into user (id,name) values (next value for MYCATSEQ_GLOBAL,‘lkk’)

数据库方式

读取数据库表,获取序列号;表字段:name、current_value、increment

本地时间戳方式

ID=64位二进制;42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)
每毫秒最多4096并发。
配置sequence_time_conf.properties:

  • WORKID;0-31
  • DATAACENTERID;0-31

分布式ZK ID生成器

规则类似本地时间戳

Zk递增方式

规则类似本地文件

10 Mycat分片规则

数据切分原则

数据冗余、table group
全局表
所有分片都持有表实例。
join时优先选择系统分片的全局表;数据更新时更新所有分片;select时随机选择分片。
ER分片表
表依赖,Table Group;子表与关联的父表放在同一分片,避免跨库。
多对多关联
表A–中间表–表B;按关系偏向表分片。
采用非主键分片时,mycat会缓存id–node。

Mycat常用分片规则

val转换:hash、取模
val–node映射:直接映射、范围映射
分片枚举
sharding-by-intfile
枚举值直接映射到节点;适用于分片字段值固定的情况,如地域。
固定分片hash算法
rule1
划分1024个槽位,分配给各分片,sum(partitionCount[i]partitionLength[i])=1024;取id二进制低10位,映射到对应分片。
算法类似redis集群寻址。
范围约定
auto-sharding-long
提前规划好分片字段范围–node映射。类似分片枚举。
取模
mod-long
批量插入时,增大事务一致性难度。
按日期分片
sharding-by-date
取模范围约束
sharding-by-pattern
取模运算和范围约束的结合;主要为后续数据迁移做准备。
一致性hash
sharding-by-murmur
解决分布式扩容问题。类似取模范围约束,对232取模;232个槽位,分配到节点数
虚拟倍数个节点上。增删节点时,只有部分区间受影响。
https://blog.csdn.net/NewxCJY/article/details/82667097

权限控制

user标签,readOnly、schemas

进阶

1 读写分离

MySQL主从复制方案
主从、主从从、双主/多主(环)
原理
1,主库事务提交前记录日志
2,从库拉取主库日志,并按日志更新本地数据。
复制方式:基于sql语句SBR、基于行RBR、混合模式MBR
Mycat支持的读写分离
mycat不负责数据同步;
、;写节点、读节点,写节点宕机后对应读节点不可用。第一个writeHost为主节点,其余均为从节点。
事务内部的一切操作,都走写节点。故读操作不要加事务。

2 高可用与集群化

MySQL高可用方案
主从复制+读写分离;heartbeat+双主复制;集群;MariaDBM Galera
Mycat高可用方案
mycat将第一个writeHost当做主节点,所有DML发往此节点。
写节点宕机后,升级下一个writeHost为主节点。
建议使用mysql主从复制+心跳检测+读写分离方式,由mycat负责主从切换。
mycat+HAProxy,保证mycat高可用

3 事务支持

单库可保证事务完整性;跨库弱XA(异常时全部回滚,commit时不保证全部成功)。
XA事务原理
分布式事务处理(DTP)模型:

  • AP;应用程序
  • TM;事务管理器
  • RM;资源管理器,一般为数据库
  • CRM;通信资源管理器,消息中间件

XA,两段式提交;处理–提交。TM必须记录事务信息(XID、RM情况),在完全提交或回滚后才能丢弃。
XA事务问题和MySQL的局限
timeout问题,两段提交增加事务时间。慢。
使用最终一致性、幂等逻辑,避免使用XA事务。
XA提交前冲突,可能导致主从不一致。

4 Mycat SQL拦截机制

执行前拦截sql;默认拦截器实现了mysql转义字符替换。
自定义:
实现 SQLInterceptor,编译后放到catlet文件夹。
修改server.xml;sqlInterceptor、sqlInterceptorType、sqlInterceptorFIle等参数。

5 Mycat注解

mycat执行流程:拦截、解析路由。注解指定dataNode、dataHost、schema。
格式:

  • /!mycat:注解表达式/SQL;前缀可为/!、/#、/**
  • /balance/;强制从写节点查询数据。主节点?

使用:

  1. 为sql语句指定分片
    /*mycat:sql=select 1 from test/CREATE PROCEDURE test_proc() BEGIN END ;
    /*mycat:sql=select 1 from test/insert into user2 select * from user1
  2. 指定节点(读节点、写节点)
    /balance/select * from user;强制从写节点查询
    /#mycat:db_type=master/ select * from travelrecord;主节点查询
    /#mycat:db_type=slave/ select * from travelrecord;从节点查询
  3. shareJoin,指定本分片join
    /*!mycat:catlet=demo.catlets.ShareJoin / select a.,b.id, b.name as tit from customer a,company b on a.company_id=b.id;
  4. 多租户支持,指定分片。
    /*!mycat : schema = test_01 */ sql ;

6 Mycat支持的catlet实现

格式:/*mycat:catlet=classFullName/SQL
1,shareJoin,指定本分片join
/!mycat:catlet=demo.catlets.ShareJoin / select a.,b.id, b.name as tit from customer a,company b on a.company_id=b.id;
2,批量插入与ID自增长结合的支持
/
!mycat:catlet=demo.catlets.BatchInsertSequence / insert into sam_test(name_)
values(‘ t1’ ),(‘ t2’ );
3,获取批量sequence值得支持
/
!mycat:catlet=demo.catlets.BatchGetSequence */SELECT mycat_get_seq(‘ MYCAT_TEST’ ,100);

7 JDBC多数据库支持

dataHost,dbDriver改为jdbc,dbType改为对应数据库名,如:oracle、mongodb等。
导入驱动文件到bin文件夹。

8 管理命令与监控

默认连接:mysql -uroot -p123456 -P9066
show @@help;查看所有命令

9 压缩协议支持

需mycat、客户端、mysql(默认开启压缩)均开启压缩。
mycat在server.xml–system–useCompression,设为1。
客户端,mysql命令行加-C,jdbc加参数useCompression=true

10 Mycat-WEB

可视化监控,基于jrds实现。

  1. 下载安装zookeeper;修改./conf/zoo_sample.cfg为zoo.cfg;运行./bin/zkServer.cmd
  2. 下载解压mycat-web,https://github.com/MyCATApache/Mycat-download/tree/master/mycat-web-1.0;运行./start.bat
  3. 访问mycat-web,localhost:8082/mycat。添加mycat及其vm监控实例;jmx端口在./conf/wrapper.conf。jmx连接信息localhost:1984。

jmx需自行开启:-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
配置示例:https://blog.csdn.net/zhxdick/article/details/50728859

原文地址:https://www.cnblogs.com/wuer888/p/14333836.html