Mycat 配置及优化【转】
前言
Mycat 是一个数据库分库分表中间件
MyCAT 是作为通用代理设计的,后端是以 Mysql协议 和 JDBC 的方式连接数据库,可以支持 Oracle、DB2、SQL Server 、 mongodb、mysql

这里简单分享一下 Mycat 中的概念及配置的相关基础 ,详细内容可以参考 官方文档 、 Mycat-Server 和 Get Start
Tip: 当前的最新版本为 Mycat server 1.5 GA
概要
概念
数据库中间件

Mycat 其实只是一个数据中间件,或数据库代理
Tip: 所有难搞定的事情都可以通过中间件有效处理,中间件能有效解耦并专注于特定领域问题,LVM、LVS、MQ 都是这个思路(房屋中介,银行也都是这个思路)
所以Mycat没有存储引擎,本身并不存储数据,只是起到了请求分析,拆解,路由与结果聚合的作用,为前端应用提供统一接口,Mycat 与后端的数据库集群有机组合才一起构成一个分布式数据库系统
逻辑库(schema)

类似于LVM中VG的概念(VG由一个或多个PV构成),逻辑库是由一个或多个后端数据库构成的,展示给应用的是一个单一视图,是分布式数据库在逻辑上的一个抽象
逻辑表(table)
- 逻辑表
与数据库中表相对应的,分布式数据表在逻辑上的一个抽象
- 分片表
数据表切分后的一个部分(原表的一个真子集)
- 非分片表
没有分片的表,就是非分片表
- ER表
保留了实体关系特性的表,就是ER表
关系型数据库是基于实体关系模型的相关理论来构建的数据库,表与表间有依赖关系,通过表分组(Table Group) 让有依赖的表在同一实例库中从而避免了数据Join不会跨库操作
- 全局表
全局表是所有分片上都有一份完整拷贝的表
字典表或符合字典特性的表可以被设置为全局表
有以下特点的表,被称作字典表:
- 变动不频繁
- 数据量总体变化不大
- 数据规模不大(很少超过十万条记录)
- 会与其它表发生关联
这类表可以通过冗余来解决join问题,也就是所有的分片都放上一份数据的拷贝来避免跨分片联查
Tip: 数据冗余和表分组是解决跨分片数据join的好思路,也是数据切分规划的重要规则

分片节点(dataNode)
每个表分片所在的数据库就是分片节点
节点主机(dataHost)
分片节点所在的服务器就是节点主机
Tip: 尽量将读写压力高的分片节点均衡放在不同的节点主机上,以避免单节点主机并发数限制
分片规则(rule)
分片规则就是切分数据的规则
全局序列号(sequence)
保证数据全局唯一性标识的外部机制就是全局序列号
Tip: 单机(单实例)环境下的主键约束在分布式环境中将失效,因此得通过外部机制以全局视角来保证数据唯一性
多租户
多租户技术也叫多重租凭技术,就是在确保用户间数据隔离的前提下实现在多用户环境中共用相同系统或程序等软硬件资源的一种软件架构技术

Tip: web 中广范使用的 VirtualHost 就是一种典型的多租户技术,多租户技术是为了更充分的使用到现有资源,同时不失权限控制的一种技术
- 独立数据库
- 共享数据库,隔离数据架构
- 共享数据库,共享数据架构
隔离级别越来越低,共享程度越来越高,均摊成本越来越低
整体关系

配置
Mycat 的大部分配置都是以 XML 的格式设定的
[root@h102 mycat]# ll conf/schema.xml
-rwxrwxrwx 1 root root 4129 Feb 17 10:30 conf/schema.xml
[root@h102 mycat]# ll conf/rule.xml
-rwxrwxrwx 1 root root 4510 Feb 17 10:30 conf/rule.xml
[root@h102 mycat]# ll conf/server.xml
-rwxrwxrwx 1 root root 2507 Feb 17 10:30 conf/server.xml
[root@h102 mycat]# ll conf/wrapper.conf
-rwxrwxrwx 1 root root 4318 Feb 24 21:20 conf/wrapper.conf
[root@h102 mycat]#
| Conf | Comment |
|---|---|
| conf/wrapper.conf | JVM运行环境配置 |
| conf/server.xml | 用来定义系统相关变量 |
| conf/schema.xml | 用来定义逻辑库,表,分片节点 |
| conf/rule.xml | 用来定义分片规则 |
wrapper.conf
我们使用这个文件来配置JVM的相关运行参数
[root@h102 conf]# cat wrapper.conf | egrep "(Xm|MaxDirectMemorySize)"
#wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G
wrapper.java.additional.5=-XX:MaxDirectMemorySize=256m
#wrapper.java.additional.10=-Xmx4G
wrapper.java.additional.10=-Xmx512m
#wrapper.java.additional.11=-Xms1G
wrapper.java.additional.11=-Xms128m
[root@h102 conf]#
以上配置是常用的对JVM内存的控制
server.xml
XML的格式就是各类标签
注释
这个标签用来框定注释范围
<!--
...
...
-->
mycat:server
这个标签用来框定服务配置范围
<mycat:server xmlns:mycat="http://org.opencloudb/">
</mycat:server>
system
这个标签用来框定系统配置范围,用来保存几乎所有mycat需要的系统配置信息(其在代码内直接的映射类为SystemConfig )
<system>
</system>
property
用来设定服务的具体参数
<property name="defaultSqlParser">druidparser</property>
<property name="processors">2</property>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
<property name="bindIp">0.0.0.0</property>
user
用来设定一个租户,与相关权限
这里设定了一个 cc 的租户,密码为 cc , 可以访问 cctest 的数据库(schema)
<user name="cc">
<property name="password">cc</property>
<property name="schemas">cctest</property>
</user>
schema.xml
mycat:schema
这个标签用来框定shema的配置范围
<mycat:schema xmlns:mycat="http://org.opencloudb/">
</mycat:schema>
schema
用来配置一个逻辑库(schema)
这里配置了一个名叫 cctest 的逻辑库,不检查SQL,默认limit为100(sql中不添加limit的情况下,mycat会隐式添加,以避免返回太多结果),其中包含两个逻辑表,catworld 和 catworld4 ,catworld 有三个分片,使用 mod-long 的规则,catworld4 有四个分片,使用 mod4-long 的分片规则
<schema name="cctest" checkSQLschema="false" sqlMaxLimit="100">
<table name="catworld" dataNode="sd1,sd2,sd3" rule="mod-long" />
<table name="catworld4" dataNode="sd1,sd2,sd3,sd4" rule="mod4-long" />
</schema>
| Attribute | Comment |
|---|---|
| checkSQLschema | 隐式删除schema前缀 |
| sqlMaxLimit | 隐式添加limit语句 |
table
| Attribute | Comment |
|---|---|
| dataNode | 指定所属数据节点 |
| rule | 指定分片规则 |
dataNode
这个标签用来定义数据节点(数据分片存放的地方)
<dataNode name="sd1" dataHost="h101" database="my1" />
<dataNode name="sd2" dataHost="h101" database="my2" />
<dataNode name="sd3" dataHost="h101" database="my3" />
<dataNode name="sd4" dataHost="h202" database="my4" />
| Attribute | Comment |
|---|---|
| dataHost | 指定所属数据库实例 |
| database | 指定数据库实例上的实际数据库名(一定要和真实库一样的名字,这个不是被标签定义的,是要提前在实例中手动创建的) |
dataHost
节点主机的相关配置
<dataHost name="h101" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="h101M1" url="192.168.100.101:3306" user="root" password="mysql">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
<dataHost name="h202" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="h202M1" url="192.168.100.202:3306" user="root" password="mysql">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
| Attribute | Comment |
|---|---|
| maxCon | 一个读写实例链接池的最大连接数 |
| minCon | 一个读写实例链接池的最小连接数,初始化连接池的大小 |
| balance | 负载均衡类型:0 代表不开启读写分离机制,只使用writeHost; 1 代表readHost与writeHost分担读请求; 2 代表随机分配读请求和1类似; 3 代表只由readHost来承担读请求 |
| writeType | 负载均衡类型:0 代表发到第一个writeHost,挂了后切到还生存的第二个writeHost,重新启动后以切换后的为准,也就是不漂回;1 代表写操作随机发送到writeHost,这样不安全; |
| dbType | 后端数据库类型 |
| dbDriver | mysql系可以使用native,其它系列得使用JDBC |
| switchType | 切换类型:-1 代表不切换,1 代表自动切换, 2 代表基于主从同步状态决定是否切换 |
| slaveThreshold | slave读的安全边界,如果Seconds_Behind_Master 大于这个值,这台slave会被临时剔除,以免被读 |
heartbeat
里面包含一个语句,用语句执行成功与否来判定数据库的可用性
writeHost/readHost
| Attribute | Comment |
|---|---|
| host | 一个主机标识,便于区分,不必和真实主机名一致 |
| url | 后端实例连接地址 |
| user | 连接账户 |
| password | 连接密码 |
Tip: 用户名和密码要提前在各实例中赋予相应连接和操作权限
rule.xml
此配置用来定义分片规则
mycat:rule
框定rule的配置范围
<mycat:rule xmlns:mycat="http://org.opencloudb/">
</mycat:rule>
tableRule
定义一个分片规则
定义了一个 mod-long 的分片规则,对 id 列进行分片,使用 mod-long 算法;定义了一个 mod4-long 的分片规则,对 id 列进行分片,使用 mod4-long 算法
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<tableRule name="mod4-long">
<rule>
<columns>id</columns>
<algorithm>mod4-long</algorithm>
</rule>
</tableRule>
function
<function name="mod-long" class="org.opencloudb.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
<function name="mod4-long" class="org.opencloudb.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">4</property>
</function>
| Attribute | Comment |
|---|---|
| class | 使用的类 |
| property | 通过 count=3/4 来指定分片数(指定模数) |
注意
XML中定义的标签有顺序,如果不按照顺序进行配置,会报错
比如 schema.xml 中的顺序为
- 1.定义 schema
- 2.定义 dataNode
- 3.定义 dataHost
如果不按顺序,会无法启动mycat,并且 mycat.log 中会报错
这里只对一套简单基础的配置进行了分析,只涵盖了一小部分,还未涵盖到的,可以参考 官方文档
命令汇总
ll conf/schema.xmlll conf/rule.xmlll conf/server.xmlll conf/wrapper.confcat wrapper.conf | egrep "(Xm|MaxDirectMemorySize)"
转自
Mycat 配置 - conanwang - 博客园 https://www.cnblogs.com/conanwang/p/5961019.html
Mycat的配置---雄关漫道真如铁,而今迈步从头越 - CSDN博客 http://blog.csdn.net/wangshuang1631/article/details/62888109
Mycat性能调优指南 - CSDN博客 http://blog.csdn.net/john_chang11/article/details/52044019
Mycat 配置及优化【转】的更多相关文章
- Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解
一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...
- 实战Nginx与PHP(FastCGI)的安装、配置与优化
一.什么是 FastCGIFastCGI是一个可伸缩地.高速地在HTTP server和动态脚本语言间通信的接口.多数流行的HTTP server都支持FastCGI,包括Apache.Nginx和l ...
- nginx反向代理配置及优化
nginx反向代理配置及优化前言: 由于服务器apache抗不住目前的并发.加上前端squid配置后,问题依然无法解决.而页面程序大部分是动态.无法使用fastcgi来处理.因此想使用nginx做为反 ...
- 【转】实战Nginx与PHP(FastCGI)的安装、配置与优化
原文连接:http://ixdba.blog.51cto.com/2895551/806622 原文作者:南非蚂蚁 转载注明以上信息 一.什么是 FastCGIFastCGI是一个可伸缩地.高速地在H ...
- Nginx与Tomcat安装、配置与优化
Nginx与Tomcat安装.配置与优化 Nginx与Tomcat安装.配置与优化 Nginx的安装与使用 Nginx是一款优秀的反向代理服务器 安装: rpm(或者是pkg安装),是预编译好的程序包 ...
- Nginx配置性能优化与压力测试webbench【转】
这一篇我们来说Nginx配置性能优化与压力测试webbench. 基本的 (优化过的)配置 我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.你应该能够在服务器的/et ...
- 大型网站的 HTTPS 实践(三)——基于协议和配置的优化
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt389 1 前言 上文讲到 HTTPS 对用户访问速度的影响. 本文就为大家介 ...
- MyCat 入门:漫谈 MyCat 配置系统
文章首发于[博客园-陈树义],点击跳转到原文<MyCat 入门:漫谈 MyCat 配置系统> 上篇文章<MyCat 启蒙:分布式系统的数据库架构演变>中,我们通过一个项目从零到 ...
- 项目重构之数据源配置与优化:log4j 配置数据库连接池Druid,并实现日志存储到数据库
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...
随机推荐
- ThinkPHP框架知识(比较全的知识)
php框架 一.真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格 ...
- [Cyan之旅]使用NPOI实现Excel的导入导出,踩坑若干.
Cyan是博主[Soar360]自2014年以来开始编写整理的工具组件,用于解决现实工作中常用且与业务逻辑无关的问题. 什么是NPOI? NPOI 是 POI 项目的 .NET 版本.POI是一个开源 ...
- Activiti源码:StandaloneInMemProcessEngineConfiguration与SpringProcessEngineConfiguration
activiti-engine-5.22.0-sources.jar package org.activiti.engine.impl.cfg; StandaloneInMemProcessEngin ...
- FuelPHP 系列(一) ------ Oil 命令
之前用过 Laravel,框架自带的 artisan 命令,用得爽到爆.现在工作需要,要学习 FuelPHP,首先看到框架目录结构,有 coposer.json 框架可以用 composer 管理,一 ...
- Degree Set CodeForces - 976D(双指针)
题意: 构造一个无向图,使得无向图里的所有点的度数 所组成的集合 即为给出的几个数 解析: 题中的数是以上升的顺序给出的, 我们对于dn+1个数进行处理,对于当前数i,有两个操作 1.向后边的所有点连 ...
- MT【98】三元对称不等式
评:这是一道浙江省省赛题,这里利用对称性,设$x\le y\le z$从而解决了问题.值得注意的是此处三元轮换对称正好也是完全对称,但如果变成一般的$n\ge4$元对称问题时,就不能设大小关系.事实上 ...
- BZOJ 2668 [cqoi2012]交换棋子 | 最小费用最大流
传送门 BZOJ 2668 题解 同时分别限制流入和流出次数,所以把一个点拆成三个:入点in(x).中间点mi(x).出点ou(x). 如果一个格子x在初始状态是黑点,则连(S, mi(x), 1, ...
- GDKOI2018发烧记
偏远小渔村NOIP螺旋升天选手又一次来到了广州参加GDKOI...金实的初三爷们也来啦?要被碾啦T T Day 0 跟HR Lao爷拼(biao)车到了高铁站,上了高铁居然没有颓颓颓吃吃吃(雾),安心 ...
- bzoj 1824: [JSOI2010]下棋问题
考虑每次新放一个棋子会产生多少新的矩形,以及减掉多少旧的矩形. 用第$i$个点的坐标把坐标轴分成4个象限. 显然第一问的答案用四个单调栈就能解决. 而且第二问每个矩形的两个端点一定在1,3或2,4象限 ...
- 【洛谷P2114】起床困难综合征 位运算+贪心
题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...