地主_的博客

沉稳,冷静,向上,热爱

读《分布式数据库架构及企业实践》---笔记二
Mycat核心概念:
    逻辑库:数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。
    逻辑表:读写数据的表就是逻辑表。
    分片表和非分片表:区别在于是否该表是否切分到多个数据库实例中。
    ER表:实体关系模型(Entity Relationship Model),思想便是子表记录与其所关联的父表记录存放在同一个数据分片上。
    全局表:例如字典表。由于其数据量不大,用处广泛,所以Mycat通过数据冗余来解决这类表的关联查询。
    分片节点和分片主机:分片主机中可能存在多个分片节点。尽量把读写压力高的分片节点均匀的放在不同节点主机上。

Mycat原理介绍:
    它拦截了用户发过来的SQL语句,首先做了一些特定的分析,例如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL语句发往后端真实数据库,并将返回的结果做适当的处理,最终返回给用户。
    
Mycat配置详解
    Mycat从1.5版本开始支持两种配置方式:Zookeeper以及本地xml方式。Mycat默认以本地xml方式启动。
    Zookeeper启动方式:如果需要配置成Zookeeper的方式启动,则应把conf目录下zk.conf文件中的loadfromzk参数设置成true。Zookeeper配置方式解决了统一配置和管理的问题,同时解决了Mycat与周边组件的协调问题。如果使用Zookeeper配置方式,则所有的配置参数都在zk-create.yaml文件中,该文件涵盖了conf目录下的schema、server等文件中的所有配置项。zk的配置方式于Zookeeper,要先安装Zookeeper并初始化其中的数据,然后执行Mycat_HOME/bin目录先初始化Zookeeper的脚本。

    server.xml配置文件:
    server.xml与系统配置有关。
    1.user标签
       
<user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
                <property name="benchmark">1111</property>
                <property name="usingDecrypt">1</property>
        </user>


        解读:user标签用于定义登录Mycat的用户和权限。在如上配置中,定义了用户名和密码都为test的用户;该用户可以访问的schema只有TESTDB,如果需要同时访问多个schema,则多个schema之间用英文逗号隔开;readOnly用来限制用户的读写权限;benchmark用来限制前端的整体连接数量,如果其值为0或不进行设置,则表示不限制连接数量;usingDecrypt用来开启密码加密功能,默认值为0表示不开启加密,值为1表示开启加密,同时使用加密程序对密码加密;
    2.system标签
      
 <system>
        <!-- 编码 -->
        <property name="charset">utf8</property>
        <!-- 指定默认的SQL解析器 -->
        <property name="defaultSqlParser">druidparser</property>
        <!-- 用于指定系统可用线程数量,默认值为机器CUP核心*每个核心运行的线程的数量。
            <property name="processors">1</property>
            指定固定线程池大小
            <property name="processorExecutor">32</property>
         -->
         <!--指定Mycat全局序列的类型:0为本地文件方式;1为数据库方式;2为时间戳序列方式。默认是本地文件方式,文件方式主要用于测试。-->
        <!--<property name="sequnceHandlerType">0</property> -->
        <!--使用MySQL的通信协议模拟一个MySQL服务器,默认为5.6,可选值为5.5或5.6-->
        <!-- <property name="fakeMySQLVersion">5.6</property> -->
        <!--分布式事务开关:0为不过滤分布式事务;1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤);2为不过滤分布式事务,但是记录分布式事务日志。主要用于控制是否予许跨库事务。Mycat从1.6版本开始支持此属性-->
        <!-- <property name="handleDistributedTransactions">0</property> -->
        <!--用于配置是否启用非堆内存处理跨分片结果集,1为开启;0为关闭-->
        <!-- <property name="useOffHeapForMerge">1</property> -->
        <!--开启SQL实时统计,1为开启、0为关闭-->
        <!-- <property name="useSqlStat">0</property> -->
        <!--  <property name="useCompression">1</property> -->
        <!--1为开启mysql压缩协议-->
        <!-- <property name="processorBufferChunk">40960</property> -->
        <!--默认是65535 64K 用于sql解析时最大文本长度 -->
        <!--<property name="maxStringLiteralLength">65535</property> -->
        <!--<property name="backSocketNoDelay">1</property> -->
        <!--<property name="frontSocketNoDelay">1</property> -->
        <!--<property name="processorExecutor">16</property> -->
        <!--
            <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
            <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
            <property name="processors">32</property> <property name="processorExecutor">32</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>
        -->
        </system>


        解读:system标签与系统配置有关。
        
    schema.xml配置文件:
    schema.xml涵盖了Mycat的逻辑库、表、分片规则、分片节点及数据源。
    1.schema标签
       
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
                <!-- auto sharding by id (long) -->
                <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />

                <!-- global table is auto cloned to all defined data nodes ,so can join
                        with any table whose sharding node is in the same data node -->
                <table name="company" primaryKey="ID" dataNode="dn3,dn2,dn1" rule="mod-long"/>
                <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
                <!-- random sharding using mod sharind rule -->
                <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3"
                        rule="mod-long" />
                <!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
                        needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"
                        rule="mod-long" /> -->
                <table name="employee" primaryKey="ID" dataNode="dn1,dn2"
                        rule="sharding-by-intfile" />
                <table name="customer" primaryKey="ID" dataNode="dn1,dn2"
                        rule="sharding-by-intfile">
                        <childTable name="orders" primaryKey="ID" joinKey="customer_id"
                                parentKey="id">
                                <childTable name="order_items" joinKey="order_id"
                                        parentKey="id" />
                        </childTable>
                        <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
                                parentKey="id" />
                </table>
                <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
                        /> -->
        </schema>


        解读:schema标签用于定义Mycat实例中的逻辑库。Mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置。如果不配置schema标签,则所有的表配置都会属于同一个默认的逻辑库。逻辑库中的概念等同于MySQL数据中的Database的概念。
            dataNode属性用于绑定逻辑库到具体的Database上...(书上解释不是很清晰,后续研究补上)
            checkSQLschema设置为true时,Mycat会把scheme字符去掉。例如select * from TESTDB.goods会变为select * from goods避免数据库执行报错。不过如果SQL语句所带的scheme字符不是配置文件指定的名字,那么MySQL不会删除这个字段。所以建议SQL语句中最好不带这个字段。
            sqlMaxLimit属性设置为某个数值时,每次执行SQL语句如果没有加上limit语句,Mycat会自动在limit语句后面加上对应的数值。如果不设置,Mycat会将查询到的数据全部返回。
    2.table标签
        table标签定义了Mycat中的逻辑表,所有需要拆分的表都需要在table标签中定义。
        name属性定义逻辑表的名称,同一个schema标签中定义的table的名字必须唯一。
        dataNode属性,该属性需要与dataNode标签中name属性值互相对应。
        rule属性指定逻辑表要使用的规则的名字,规则的名字在rule.xml中定义,必须与tableRule标签中的那么属性值一一对应。
        ruleRequired属性用于指定表是否绑定分片规则,如何配置为true,但没有配置具体的role,则程序会报错。
        primaryKey属性,逻辑表对应真实表的主键。
        type属性定义了逻辑表的类型。指定type的值是global,代表全局表;不指定type的值,代表是普通表。
    3.childTable标签
        用于定义E-R分片的子表,通过标签上的属性与父表进行关联。
        name属性用来定义子表的名称。
        joinKey属性,插入子表时会使用这个值查找父表存储的数据节点。
        parentKey属性为与父表建立关联关系的列名,程序首先获取joinKey的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得知父表存储在哪个分片上,从而确定子表存储的位置。
    4.dataNode标签
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        dataNode标签定义了Mycat中的数据节点,也就是我们通常所说的数据分片。一个dataNode标签就是一个独立的数据分片。
        name属性,定义数据节点唯一的名字,需要在table标签上应用这个名字来建立表与分片的对应关系。
        dataHost属性用于定义该分片所属的数据库实例。
        database属性用于定义该分片所属数据库实例上的具体的库。
    5.dataHost标签
      
 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="10.202.4.39:3306" user="root"
                        password="sf123456">
                        <!-- can have multi read hosts -->
                        <!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />-->
                </writeHost>
                <!--<writeHost host="hostS1" url="localhost:3316" user="root"-->
                        <!--password="123456" />-->
                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>


        该标签定义了具体的数据库实例、读写分离和心跳语句。
        name属性,唯一标识dataHost标签,供上层标签使用。
        maxCon属性,指定每个读写实例连接池的最大连接数。
        minCon属性,指定每个读写实例连接池的最小连接数。
        balance属性。负载均衡类型,目前的取值有如下4种:
            balance="0":不开启读写分离机制,所有操作都发送到当前可用的writeHost上。
            balance="1":全部的readHost与stand by writeHost都参与select语句的负载均衡,简而言之,当为双主双从模式(M1->S1, M2->S2,并且M1与M2互为主备)时,在正常情况下,M2、S1和S2都参与select语句的负载均衡。
            balance="2":所有读操作都随机地在writeHost对应的readHost上分发。
            balance="3":所有的读的请求都随机分发到writeHost对应的readHost上执行,writeHost不负担读压力。
        writeType属性。负载均衡类型,目前的取值有两种:
            writeType="0":所有写操作都发送到配置的第一个writeHost上,writeHost挂了则切到writeHost2上,重新恢复writeHost1节点后,不会再切回来,还是以writeHost2为准,切换记录在配置文件dnindex.properties中。
            writeType="1":所有写操作都随机地发送到配置的writeHost上,Mycat1.5版本以后不再推荐使用这个值。
        dbType属性。指定后端连接的数据库类型,目前除了支持二进制的MySQL协议,还支持JDBC连接的数据库,例如MongoDB、Oracle等。
        dbDriver属性。指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。因为native执行的是二进制的MySQL协议,所以可以使用MySQL和MariaDB。其他类型的数据库则需要使用JDBC驱动来支持,如果使用JDBC方式,则需要将符合JDBC4标准的驱动jar包放到MYCAT\lib目录下。
        switchType属性。-1表示不自动切换;1为默认值,表示自动切换;2表示基于MySQL主从同步的状态决定是否切换,心跳语句如下:show slave status;3表示基于MYSQL Galary Cluster的切换机制(适合集群),心跳语句如下:show status like ‘wsrep%’;
    6.heartbeat标签
        这个标签内指明了用于后端数据库进行心跳检查的语句。
    7.writeHost标签、readHost标签
        这两个标签都指定Mycat后端数据库的相关配置,用于实例化后端连接池。唯一的不同是,writeHost指定写实例,readHost指定读实例,组成这些读写实例来满足系统的要求。
        在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost半丁的所有readHost也将不可用;另一方面,Mycat会自动监测到writeHost宕机,并切换到备用的writeHost上。。
        host属性,用于标识不同的实例,对于writeHost,我们一般使用*M1;对于readHost,我们一般使用*S1。
        url属性,后端实例的连接地址,如果使用native的DBDriver,则一般为address:port形式如果使用JDBC或其他dbDriver,则需要特殊指定。在使用JDBC时,则可以写为jdbc:MySQL:localhost:3306/。
        user属性,后端存储实例的用户名。
        password属性,后端存储实例的密码。
        weight属性,在readHost中作为读节点的权重。
        usingDecrypt属性,同server.xml中usingDecrypt属性。
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27832191/article/details/72869955
个人分类: 读书笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

读《分布式数据库架构及企业实践》---笔记二

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭