分布式数据存储--mycat

  在我们的分布式系统中,基本都会根据每个子系统来设计数据库,这些数据库除本身业务的表外一般还会有基础系统的表,这样就会出现一个数据同步的问题:如何将每个系统相同的表数据要保持一致,面对这种需求,mycat为我们提供了一个解决方案。

一、mycat的定义

  mycat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

  简单的来说:mycat是基于数据库的中间件,用来协调切分后的数据库,使其可以统一管理。

  mycat的架构图

  

  根据mycat的定义中介绍了一个名词:数据库切分。

  数据库切分顾名思义,就是将数据库拆成多个,主要有两种方式

  1.垂直切分

  垂直切分就是将表按照不同的业务,分散存储到各个数据库。这是一个按业务维度的切分方式。

  优点:垂直切分后数据库业务逻辑会非常清晰,拆分的规则也是根据业务来,数据库维护也很简单。

  缺点:垂直切分后,由于表分散到了各个数据库,导致事务处理会很麻烦。

  2.水平切分

  水平切分是在垂直切分条件下,若有数据量较大或并发量较高的数据表,可以将其的数据量进行切分,分散存到多个数据库。

  优点:不存在单库大数据,高并发的性能瓶颈。

  缺点:数据多次扩展难度和维护量极大。

  针对这两种分库策略,mycat将它们的优点整合起来,使得更加可用。

二、mycat的成员

  mycat切库架构图

  

1.逻辑库

  mycat对外暴露的一个数据库,用户可以直接操作这个库,这也是对外唯一的入口。

2.逻辑表

  用户读写数据的表就是逻辑表,通常由一个或多个物理表组成。

3.数据节点

  数据切分后,一个大表被分到不同的分片数据库上面,每个分片所在的数据库就是分片数据节点。可以看做是物理库提供的业务表。

4.数据主机

  数据节点物理库所在的主机。

三、mycat的使用

  1.mycat安装

  我们这里采取docker安装:

  拉取镜像:

docker pull longhronshens/mycat-docker

  2.sever.xml文件

  sever.xml文件主要是用来配置我们的mycat基本信息,如连接地址、用户名和密码、防火墙等等。

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
    - you may not use this file except in compliance with the License. - You 
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    - - Unless required by applicable law or agreed to in writing, software - 
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    License for the specific language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
    <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
        <property name="sequnceHandlerType">0</property>
        <property name="processorBufferPoolType">0</property>
        <!--默认是65535 64K 用于sql解析时最大文本长度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <!--
            <property name="serverPort">8066</property> <property name="managerPort">9066</property> 
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
        <property name="handleDistributedTransactions">0</property>
            <!--
            off heap for merge/order/group/limit      1开启   0关闭
        -->
        <property name="useOffHeapForMerge">1</property>
        <!--
            单位为m
        -->
        <property name="memoryPageSize">1m</property>
        <!--
            单位为k
        -->
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <!--
            单位为m
        -->
        <property name="systemReserveMemorySize">384m</property>
        <!--是否采用zookeeper协调切换  -->
        <property name="useZKSwitch">true</property>
    </system>
    <user name="root">
        <property name="password">root</property>
        <property name="schemas">test</property>
    </user>
</mycat:server>

  在server.xml文件中常用的几个标签:

  2.1 user标签

    <user name="root">
        <property name="password">root</property>
        <property name="schemas">test</property>
    </user>

  name属性表示其用户名,

  property标签则是设置其登录密码以及要使用的分库脚本

  2.2 system标签

  表示所有的配置都和系统有关。

  2.3 filrewarll标签

  防火墙设置标签

  3. schema.xml配置文件

  schema.xml配置文件主要是用来配置我们的逻辑库与物理库,也就是我们的分配库脚本。

  

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="test" checkSQLschema="false" sqlMaxLimit="100">
        <table name="user"   primaryKey="id"  autoIncrement="true"  dataNode="dn1" rule="userrule" />
    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="127.0.0.1" user="root"
                   password="root">
            <readHost host="hostS2" url="127.0.0.1" user="root" password="root" />
        </writeHost>
    </dataHost>
</mycat:schema>

   3.1 schema标签

    <schema name="test" checkSQLschema="false" sqlMaxLimit="100">
        <table name="user"   primaryKey="id"  autoIncrement="true"  dataNode="dn1" rule="userrule" />
    </schema>

  schema标签表示我们的逻辑库,他有三个属性

  name:逻辑库名。

  checksqlSchema:检查sql语句是否带表名,这是mysql5.7提出的严格sql语句标准,建议设置false。

     sqlMaxLimit:检查查询语句有没有带limit,如果没有带,则自动加上limit X,X为设置的值。

  3.2 table标签

  table标签表示mycat的逻辑表,它的属性有:

  name:逻辑表名

  dataNode:数据节点

  rule:分片规则

  primaryKey:主键

  3.3 dataNode标签

 <dataNode name="dn1" dataHost="localhost1" database="db1" />

     dataNode标签配置的是我们具体的数据节点,它表示的某个具体的物理主机中,某个具体数据库,它的属性有:

  name:节点名

  datahost:节点主机

  database:节点数据库(实际的物理库)

  3.4 datahost

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

  datahost配置的就是我们的节点主机,除了作为配置逻辑库的脚本外,还能够配置mysql的主从复制(后面在来看):

  name:主机名

  maxCon:主机最大连接数

  minCon: 主机最少连接数

  balance:读写分离开关,这是作为主从复制时的配置项

  writeType:负载均衡策略,值为0先发到第一个主服务器;值为1时,写操作在多个写服务器上随机执行。

  dbtype:数据库类型,如:mysql

  dbdriver:驱动方式,如果是mysql数据库,就用native

  switchType:当主机意外宕机后,切换一个从机当主机(高可用)

  slaveThreshold:时间延迟,这是主从复制的配置,如果当从机接受的数据时间和当前时间偏差过大,就不会接收这条数据,而这个偏差值就是我们设置的值

  3.5 wirteHost标签

  writeHost标签就是我们的物理库,它的属性有:

  url:数据库连接地址

  user:数据库账号

  password:密码

  

猜你喜欢

转载自www.cnblogs.com/daijiting/p/12899898.html
今日推荐