zoukankan      html  css  js  c++  java
  • 《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

  • 相关阅读:
    卫星星下点轨迹Matlab仿真
    ARM反汇编学习
    NS 2.35 柯志亨书实验3笔记TCP UDP模拟 ——计算FTP不同参数:时延、抖动、吞吐率、丢包率awk代码
    NS 2.35 柯志亨书实验4笔记随机数产生
    摄像头驱动学习
    一次输出8bit_n4_m序列Simulink仿真Verilog实现
    NS 2.35 柯志亨书实验3笔记TCP UDP模拟
    FFT2 图像二维FFT含义解释
    有限元FEM求解一维电磁场问题 Rits法 Galerkin法
    python3+pygame实现的2048,非常完整的代码
  • 原文地址:https://www.cnblogs.com/wuer888/p/14333836.html
Copyright © 2011-2022 走看看