Mycat数据库中间件

版权声明:write by DGHxj https://blog.csdn.net/DGHxj_/article/details/84000631

Mycat介绍

      中间件:代理;

      面向企业的开源的数据库集群,性能极高;淘宝正在使用;

      京东,美团;

      数据库中间件历史:

            amoeba:变形虫

                 分布式高可用结构不稳定

            cobar:Mycat前身

                    数据库中间件原理

                    

                    cober容易出现后端的物理服务器假死现象;

                   

Mycat特点

      1、高性能的读写分离

      2、100亿级别的大表水平分片,集群并行计算

      3、整合多种数据源的输入和输出

            

Mycat核心概念

      1、Mycat核心组件的概念

            逻辑库(对应数据库):Mycat中间提供客户端传入sql,拦截sql根据配置解析

            翻译要到物理库执行的真正sql语句;

            客户端在连接Mycat后可以操作数据库语句,表格语句等等;

            客户端在连接Mycat看到的数据库叫做逻辑库

                 (并不是真正的数据库,数据可以来源一个物理库,也可以来源于多个物理库)

                  

            逻辑库在Mycat中需要使用<schema>标签完成配置,在schema.xml文件中配置

            逻辑表:逻辑库数据的细分分配

            分片表:

                 

                 表格的整体数据量过大时,mycat将会使用多个物理库中的真实表格对应做逻辑分片表

                 的数据分片存储,这种表格在mycat叫做分片表

            非分片表

                 数据存储时,整体数据量不够海量时,可以使用非分片表存储,相对来说

                 非分片表比分片表配置简单;

            全局表

                  企业中一些工具表格,字典表,它们的共同特点是:数据变动稳定,数据量不大,这种表格

                  需要和业务表做非常多的关联查询,为了底层数据查询时不做过多的跨库操作,global全局

                  表示为每个物理库中都复制一份

                  工具表、字典表:

                        业务中很多逻辑,都不是用字符表示的

                        通信成功:200状态码

                        通信异常:500

                        通信成功:400

                        数字代表特殊含义的情况,可以记录在数据库中某个工具表或字典表中;

                              

            ER表

                    mycat独有

                    分片表的一种特殊情况,多个分片表有关系的时候,经常做关联查询,如果多个分片表格

                    中相关的数据,但是切分到的存储物理库不同,会导致关联查询/相关数据查询时造成底层的非常大量的

                    跨库操作;

                    

                    以订单和订单商品为例,一旦分片表格设置完成,很有可能2个表格相关的数据被切分到了不同的物理库,

                    相关数据查询时,mycat底层夸库操作非常多,造成查询的效率非常低下;

                    mycat就全球第一次提出ER表的概念; 

                    ER表根据相关内容的设定主表(t_order)使用table标签配置,从表不能使用纯粹的分片表格设置

                    需要在table下指定(childtable),根据主表的切分逻辑完成从表的切分;

                     

Mycat中的配置文件

      配置文件

            根目录的conf中有两个核心的配置文件,配置内容实现:

                   读写分离、高可用替换、分布式存储、ER分片表逻辑。

            server.xml

                  包括2个重要标签

                  system:配置mycat启动时占用的系统的一些资源属性(注释掉的不需要动,保持默认)

                  user:指定当前登陆的用户信息;

                           属性:

                                name表示登录当前的mycat的用户名

                                password表示登录密码

                                schemas表示当前这个用户可以查看的逻辑库,以“,”分隔

                                        这里的名称必须和schema.xml中的schema标签名称对应

                                readOnly表示当前用户只读,不能操作写

                                quarantine标签:安全措施可以设置白名单黑名单

                                        whitehost:白名单列表

                                        blacklist:黑名单列表

            schema.xml:当前mycat代理的数据库集群的设定

                  逻辑库,分片/非分片表,ER表,读写分离,高克用替换

                  标签结构

                  schema:逻辑库

                       table:逻辑表

                             childtable:逻辑表的从逻辑表

                  dataNode:数据分片节点的配置,一个数据分片node对应的数据库结构可能很简单

                                     也可能很复杂,指向一个dataHost

                  dataHost:

                        heartbeat:心跳检测,语句不一样,替换逻辑可能不同

                        writeHost:写操作的数据库节点(也可以读)

                              readHost:与当前writeHost相关的(主从)读节点(只读)

                  每个标签的属性

                         schema:name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"

                              name:逻辑库名称

                              checkSQLschema:例如sql语句“select * from tb_item”,mycat拦截,将其表格名称根据当前属性的设定进行修改,

                                                              false不会自动检查逻辑库名称,不拼接逻辑库名字“select * from tb_item”,

                                                              可能会导致无法找到逻辑库执行后续逻辑,true自动检测,

                                                              会拼接逻辑库名字“select * from TESTDB.tb_item”

                              sqlMaxLimit:一种查询的保护措施,执行查询语句时,自动配置的分页数据,只差前100条,在没有limit时

                         table:<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" type="global"/>

                              name:逻辑表名称,配置和真实数据库的表名最好相同

                              dataNode:对应一个,多个数据库节点的标签,多个值表示分片,单个值表示非分片

                              rule:数据分片的计算规则,auto-sharding-long,利用long整型的id值进行范围划分

                                      (0-500万(index0),500万-1000万(index1),1000万-1500万(index2))

                              primaryKey:指向表格的主键,最好与真实字段一致

                              type:表格类型,默认不是global

                         childtable:从表

                              <childTable name="orders" primaryKey="ID" joinKey="order_id"parentKey="id">

                              name:从表名称,保持和数据库真是表格一致

                              primaryKey:主键名称

                              joinKey:从表中外键字段;必须和真实数据库的从表外键字段名一致

                              parentKey:主表的字段名,必须和主表与从表的外键相关,对应主表的字段名称

                         dataNode标签:数据节点

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

                              name:表示名称,逻辑库,逻辑表指向的依据

                              dataHost:指向真实管理数据库的标签名称dataHost

                              database:真实数据库名称,逻辑库和所有真实数据库名称一致

                         dataHost:管理数据分片的真实数据库的标签,内不包含真实数据库信息

                              <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql"

                              dbDriver="native" switchType="1"  slaveThreshold="100">

                              name:名称,与datanode指向对应

                              maxCon:底层数据库的连接最大数

                              minCon:底层数据库的连接最小数

                              balance:值是0,1,2,3,分别表示对当前dataHost中维护的数据库门的读操作逻辑

                                      0:不开启读写分离,所有的读写操作都在最小的索引号的writeHost(第一个)

                                      1:全部的readHost和备用的writeHost都参与读数据的平衡,去过读的请求过多,

                                            负责写的第一个writeHost也分担一部分

                                      2:所有的读操作,都随机的在所有的writeHost和readHost上进行

                                      3:所有的读操作,都到writeHost对应的readHost上进行(备用的writeHost不参加了)

                                           在集群中没有配置readHost的情况下,读都到第一个writeHost完成

                              writeType:控制当前dataHost维护的数据集群的写操作

                                     0:所有的写操作都在第一个writeHost标签的数据库进行

                                     1:所有的写操作,都随机分配到所有的writeHost(mycat1.5完全不建议配置了)

                              dbtype:数据库类型(不同数据库配置不同名称,mysql)

                              dbDriver:数据库驱动,native,动态获取

                              switchType:切换的逻辑

                                     0:故障不切换;

                                     1:故障切换,当前写操作的writeHost故障,进行切换,切换到下一个writeHost

                              slaveThreshold:标签中的<heartbeat>用来检测后端数据库的心跳sql语句;

                                                          本属性检查从节点与主节点的同步情况(延迟时间数)

                                                          配合心跳语句show slave status;

                                                          读写分离时,所有的readHost的数据都可靠。

Mycat的安装

      1 基于jdk运行(云主机略)

      2 获取安装包

            /home/resources

            #cp /home/resources/Mycat***.tar.gz ./

            将文件拷贝到software

      3 解压

            #tar -xf Mycat***.tar.gz

            

      4 测试运行

            mycat的根目录中bin保存了mycat的核心运行命令文件

            mycat

            #mycat console

            

猜你喜欢

转载自blog.csdn.net/DGHxj_/article/details/84000631