zoukankan      html  css  js  c++  java
  • MyCat(1.1)Mycat基本介绍

    【1】学习目的

    (1)掌握在数据库负载增大时的处理方法

    (2)理解mycat的基础概念

    (3)掌握mycat基础配置和监控方法

    【2】Mycat的前世今生

    官网:http://mycat.io/

    下载:http://dl.mycat.io/

      在2008年,阿里开发了开源数据库中间件 Amoeba,支持高可用、数据过滤、负载均衡等等

      在2012年,阿里开发了开源数据库中间件 Cobar,开源之后就没有维护了

      在2013年,阿里开发了开源数据库中间件 Mycat,Mycat社区非常火爆且该中间件好用

              在2017年,mycat 已经发展到1.6版本

            在2019-12-23,好像mysql已经进入2.0许久,但一直没有发布正式版

    【3】Mycat的主要功能

    【3.1】分布式数据库系统中间层

      APP=》数据库中间层=》Mysql等关系型数据库(MongoDB等nosql也可以)

        

      作用:实现读写分离、读负载均衡、数据库连接池管理(统一控制连接数量)、屏蔽后端数据库的一些变更(比如分库分表)

    【3.2】实现数据库的读写分离

      

      (1)读写分离,顾名思义,就是把写操作应用在主库,把读操作应用到从库。

         (2)Mycat支持读负载均衡

      (3)Mycat支持后端MySQL高可用(指的是,我们在配置的时候,指定一台从机器也可以完成写的功能,主宕机后,该从机器会接收写请求,但其他从库并不会重新指定新主库到该机器),所以一般情况是需要配合Mysql的高可用策略(比如MHA、MMM、PXC、MGR)等带有自动故障转移的高可用方案来使用。

    【3.3】数据库的垂直与水平拆分

    利用Mycat配置好,就可以实现切分与访问逻辑,不用在应用程序端再做代码判断访问等。

    (1)数据库垂直拆分:

    分库:其实就是把不同业务模块分到不同的数据库(可以每个库都在一个实例里,也可以每个库在不同实例里)中去。

      

     (2)数据库水平拆分

    在单机上:可以看成是分表,把一个大表,拆分成多个表结构相同的表来共同存储表数据

    在多机上:这种叫做分库分表,也就是说在单表水平分表的情况下,把每一个分的表都放到一个库(实例上去)上去。

      

    【4】Mycat的应用场景

      (1)需要进行读写分离的场景(支持数据库端多种拓扑方案,如主从、主主、MHA、PXC等)

      (2)需要进行分库分表的场景(支持一千亿的单表分片)

      (3)多租户场景(什么是多租户?就是有多个应用程序共用一个数据中心,大家都连Mycat,彼此感受不到对方的存在,互不影响。最常见的就是我们现在的云服务)

      (4)数据统计系统(如报表系统,海量数据实时查询的一种方式)

      (5)HBASE的一种替代方案(HBASE:基于hadoop的列存储)

      (6)需要使用同样的方式查询多种数据库的场景(比如MYSQL、MongoDB)

    【5】Mycat的优势

      (1)基于阿里的Cobar系统开发,开源系统(有一个好爸爸就是优势)

      (2)开发社区活跃(证明用的人多,维护的人多,经验和解决方案就多)

      (3)完全开源可以自定义开发,且经历过大规模、大范围的使用,解决方案多

      (4)支持多种关系型及NOSQL数据库

      (5)基于JAVA平台开发,支持多种平台部署,可移植性好

      (6)具有多种行业和项目中应用的成功案例

    【6】Mycat的基本概念

    【6.1】Mycat中的数据库——逻辑库

      把后端Mysql物理数据库,封装成逻辑库,如下图,把db01~db03封装成逻辑库User_DB.

      可以以视图的概念去理解它,可以隐藏后端数据库结构分布的复杂性。

        

    【6.2】Mycat中的数据库——逻辑表

      把后端Mysql物理数据库的表,封装成逻辑表。如下图,把分库分表技术(即一个表分成多个子表,且每个子表分布在不同的数据库)在Mycat层封装成一个统一供访问的逻辑视图数据库User_db,其逻辑表为user_inf。

      可以以视图的概念去理解它,可以隐藏后端数据库结构分布的复杂性。

          

    【7】Mycat关键特性

    【7.1】关键特性

      (1)支持SQL92标准:以此来解析SQL进行SQL路由  

      (2)支持多种Mysql集群:如一主一从,一主多从,多主多从,多主集群

      (3)支持JDBC链接数据库:通过它来连接多种关系型数据库与nosql数据库(mongodb)

      (4)支持NOSQL数据库:如mongodb

      (5)支持自动故障切换,高可用性:它只是指定一个主库故障后的从库用于写而已(不同于MHA等高可用架构)

      (6)支持读写分离:可以用SQL路由来把读写操作分离开来

      (7)支持全局表:把一个全局表自动分部到所有节点上

      (8)支持独有的基于ER关系的分片策略:把子表与父表自动分配到同一个节点上,避免跨库

      (9)支持一致性HASH分片:解决分片扩容问题,实际使用时建议在一台机器上建立足够多的分片,不能满足需求时,可以再把部分分片迁移到其他机器上。

      (10)支持多平台部署:是因为使用JAVA开发,很好的集成了JAVA的可移植性

      (11)支持全局序列号:解决分片表全局唯一ID问题。

    【7.2】核心重点特性

      (1)支持多种Mysql集群:如一主一从,一主多从,多主多从,多主集群

      (2)支持自动故障切换,高可用性:它只是指定一个主库故障后的从库用于写而已(不同于MHA等高可用架构)

      (3)支持读写分离:可以用SQL路由来把读写操作分离开来

      (4)支持全局表:把一个全局表自动分部到所有节点上

      (5)支持一致性HASH分片:解决分片扩容问题,实际使用时建议在一台机器上建立足够多的分片,不能满足需求时,可以再把部分分片迁移到其他机器上。

      (6)支持全局序列号:解决分片表全局唯一ID问题。

       (7)默认端口为8066和9066,8066为服务端口,9066为管理端口

    【8】支持特性功能

      • 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
      • 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
      • 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
      • 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
      • 基于Nio实现,有效管理线程,解决高并发问题。
      • 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
      • 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
      • 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
      • 支持多租户方案。
      • 支持分布式事务(弱xa)。
      • 支持XA分布式事务(1.6.5)。
      • 支持全局序列号,解决分布式下的主键生成问题。
      • 分片规则丰富,插件化开发,易于扩展。
      • 强大的web,命令行监控。
      • 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、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)

    【9】一些常见的缺陷

    不知道现在是否修复,需要去多验证

    • 由于对堆外内存的使用不当,导致高并发操作时对同一片内存可能发生“double free",从而造成JVM异常,服务崩溃。 #4
    • XA事务漏洞:包乱序导致客户端崩溃 #21
    • where关键字写错时,会忽视后面的where条件,会得到错误的结果,比如select * from customer wher id=1;#126
    • 对于一些隐式分布式事务,例如insert into table values(节点1),(节点2);原生mycat直接下发,这样当某个节点错误时,会造成该SQL执行了一部分
    • 权限黑名单针对同一条sql只在第一次生效。#92
    • 聚合/排序的支持度非常有限,而且在很多场景下还存在结果不正确、执行异常等问题 #43,#31,#44
    • 针对between A and B语法,hash拆分算法计算出来的范围有误#23
    • 开启全局表一致性检查时,对全局表的处理存在诸多问题,例如不能alter table、insert...on duplicate...时不更新时间戳、update...in ()报错等#24#25,#26 ,#5
    • 多值插入时,全局序列生成重复值 #1
    • ER表在一个事务内被隔离,不能正确插入子表数据#13
    • sharding-join结果集不正确#17

    参考:

      imooc Mycat入门及应用

  • 相关阅读:
    自动化测试知识点汇总(200421)
    Mac_使用allure 生成测试报告
    mac_使用Charles抓取Firefox 链接
    工具列表
    Appium_iOS_Safari测试脚本(2)
    日志学习(一)
    java中==和equals的区别(转)
    jackson使用localdatetime转换json出现问题
    js复习--基础
    复习下CSS-零碎要点
  • 原文地址:https://www.cnblogs.com/gered/p/12082605.html
Copyright © 2011-2022 走看看