mycat初步认识

在这里插入图片描述

mycat

原理

主要根据对sql的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。

子主题 2

分片

拆分

  • 水平拆分
    • 要把一个表按照某种规则把数据划分到不同表或数据库里
    • 常用规则
      • *ID
      • *日期
      • *特定字段取模
    • 优点
      • *拆分规则抽象好,join操作基本可以数据库内完成
      • *不存在单库大数据,高并发的性能瓶颈
      • *应用端改造少
      • *提高了系统稳定性和负载能力
    • 缺点
      • *拆分规则难以抽象
      • *分片事务一致性难以解决
      • *数据多次扩展难度跟维护量极大
      • *跨库join性能较差
  • 垂直拆分
    • 表按模块划分到不同数据库表中
    • 一般按照业务表进行分类,划分为不同的业务、模块库,耦合度越低,越容易做垂直拆分,
    • 跨库Join,采用共享数据源或分库接口调用,根据资源和数据规模、负载而定
    • 优点
      • *拆分后业务清晰,拆分规则明确
      • *系统之间整合或扩展容易
      • *数据库维护简单
    • 缺点
      • *部分业务表无法Join,只能通过接口方式解决,提高了系统复杂度
      • *受每种业务不同的限制存在单库性能瓶颈,不容易扩展跟性能提高
      • *事务处理复杂

总结

  • c.水平拆分和垂直拆分共同缺点
    • *分布式事务处理困难
    • *跨节点join困难
    • *扩数据源管理复杂
  • d.切分总则
    • *能不切分的尽量不切分
    • *如果要切分,选择合适的切分规则,提前规划好
    • *数据库切分尽量通过数据冗余或表分组来降低跨库join
    • *业务尽量使用少的多表join

使用场景

(1)单纯读写分离,此时配置最为简单,支持读写分离、主从切换

(2)分库分表,对记录超过1000万的表进行水平拆分,最大支持1000亿单表水平拆分

(3)多租户应用,每个应用一个数据库,但程序只需连接MyCAT,程序不改变,实现多租户化

(4)报表系统,借住MyCAT分表能力,处理大规模的报表统计

(5)替代Hbase,分析大数据

(6)海量实时数据查询

概念

逻辑库(schema)

  • 逻辑库是mycat中间件层配置的对应实际一个或多个业务数据库集群构成
    • 子主题 1

逻辑表(table)

  • a.逻辑表是mycat切分到多个数据库或者不切分对应用程序显示的统一的表。
  • b.分片表是原有的大表,经过分片,分布在不同数据库、相同数据库的保留相同表结构,但数据不同的表。
  • c.非分片表是未做切分的表。
  • d.ER表基于E-R关系分片策略,子表记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组保证数据join不会跨库操作。
  • e.全局表,业务系统中变化不大、数据量不大(十万以下),但又需要经常关联的表,mycat采用冗余在各个节点一个份来完成。

分片节点(dataNode)

  • 数据库分片后,一个大表被切分到不同的分片数据库上,每个表分片所在的数据库就是分片节点。

分片主机(dataHost)

  • 分片节点所在的服务器,数据切分后,每个分片节点不一定都会独占一台服务器,同一个分片服务器可能存储多个分片节点,尽量使读写压力高的分片节点均衡的放在不同的节点主机上。

分片规则(rule)

  • 按照某种业务规则把数据分到某个分片节点上的规则,就是分片规则。(分片规则非常重要,直接决定后续数据处理复杂度)

全局序列号(sequence)

  • 当数据库分片后,原有的主键约束在分布式条件下无法使用,因此需要引入外部机制保证数据唯一表示,这种保证全局的数据唯一表示机制就是全局序列号(sequence)。

多租户

  • 多用户的环境共用相同的系统、程序组件,并且确保各用户间数据的隔离性。
  • a.一个用户一个数据库,隔离级别最高、安全性最好,费用最高
  • b.共享数据库,隔离数据架构,每个用户一个schema
  • c.共享数据库,共享数据架构,共享database、schema,通过表tenantID区分租户数据

schema

  • table1
    • dataNode
      • datanode
      • datanode1
        • datahost
          • writehost
          • readhost
        • database
    • tablename
    • tableprimarykey
    • teblerule
  • table2
  • schema.xml
<?xml version="1.0"?>

<mycat:schema xmlns:mycat=“http://io.mycat/”>

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
	<table name="h" primaryKey="ID" dataNode="ddn1,ddn2,ddn3,ddn4,ddn5,ddn6,ddn7,ddn8" rule="mod-long" />
	<table name="h1" primaryKey="ID" dataNode="ddn1,ddn2,ddn3,ddn4,ddn5,ddn6,ddn7,ddn8" rule="mod-long" />
</schema>

	<dataNode name="ddn1" dataHost="localhost1" database="db1" />
    <dataNode name="ddn2" dataHost="localhost1" database="db2" />
    <dataNode name="ddn3" dataHost="localhost1" database="db3" />
    <dataNode name="ddn4" dataHost="localhost1" database="db4" />
    <dataNode name="ddn5" dataHost="localhost2" database="db1" />
    <dataNode name="ddn6" dataHost="localhost2" database="db2" />
    <dataNode name="ddn7" dataHost="localhost2" database="db3" />
    <dataNode name="ddn8" dataHost="localhost2" database="db4" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
		  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
	<heartbeat>select user()</heartbeat>
	<writeHost host="hostM1" url="localhost:3306" user="root"
			   password="19941101">
		<readHost host="hostS2" url="localhost:3306" user="root" password="19941101" />
	</writeHost>

</dataHost>

<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
		  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
	<heartbeat>select user()</heartbeat>
	<writeHost host="hostM2" url="localhost:3306" user="root"
			   password="19941101">
		<readHost host="hostS2" url="localhost:3306" user="root" password="19941101" />
	</writeHost>

</dataHost>

</mycat:schema>

    * 


*XMind: ZEN - Trial Version*

猜你喜欢

转载自blog.csdn.net/qq_31443653/article/details/83306462