MYCAT的主要作用:
1. MYCAT是实现了MySQL通信协议的一个分布式数据库系统中间层。
数据库中间层的作用:数据库读写分离
、读负载均衡
、数据库连接池
(控制数据库的连接数量)、屏蔽后端数据库的变更(水平拆分和垂直拆分)
,对关系型数据库
、非关系型数据库
进行操作。
2. 实现数据库的读写分离,MYCAT支持读负载均衡,多出现在一主多从
的架构上,读操作可以在多个从服务器上进行均衡。MYCAT还支持后端MySQL主从复制集群
高可用。
这里的高可用:指的是可以在配置的时候,除了主节点之外,在指定一台从节点也可以支持写的功能,当主节点宕机之后,MYCAT会把写的SQL路由到我们在配置文件中指定的从节点上,并且并不支持把其他的从节点设置为新的主节点进行主从同步的功能。
3.实现数据库的垂直拆分:专库专用
一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图
优点:
1. 拆分后业务清晰,拆分规则明确。
2. 系统之间整合或扩展容易。
3. 数据维护简单。
缺点:
1. 部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。
2. 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。
3. 事务处理复杂。
4.实现数据库的水平拆分: 垂直拆分后遇到单机瓶颈,可以使用水平拆分。
相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。
优点:
1. 不存在单库大数据,高并发的性能瓶颈。
2. 对应用透明,应用端改造较少。
3. 按照合理拆分规则拆分,join操作基本避免跨库。
4. 提高了系统的稳定性跟负载能力。
缺点:
1. 拆分规则难以抽象。
2. 分片事务一致性难以解决。
3. 数据多次扩展难度跟维护量极大。
4. 跨库join性能较差。
5.两种方式共同缺点
1. 引入分布式事务的问题。
2. 跨节点Join 的问题。
3. 跨节点合并排序分页问题。
针对数据源管理,目前主要有两种思路:
A. 客户端模式,在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,直接访问各个 数据库,在模块内完成数据的整合。
优点:相对简单,无性能损耗。
缺点:不够通用,数据库连接的处理复杂,对业务不够透明,处理复杂。
B. 通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明;
优点:通用,对应用透明,改造少。
缺点:实现难度大,有二次转发性能损失。
拆分原则
1. 尽量不拆分,架构是进化而来,不是一蹴而就。(SOA)
2. 最大可能的找到最合适的切分维度。
3. 由于数据库中间件对数据Join 实现的优劣难以把握,而且实现高性能难度极大,业务读取 尽量少使用多表Join -尽量通过数据冗余,分组避免数据垮库多表join。
4. 尽量避免分布式事务。
5. 单表拆分到数据1000万以内。
切分方案
范围、枚举、时间、取模、哈希、指定等
案例分析
场景:
建立一个商城订单系统,保存用户订单信息。
分析:
电商系统
一号店或京东类?淘宝或天猫?
实时性要求高
存在瞬时压力
基本不存在大规模分析
数据规模?
机器资源有多少?
维度?商品?用户?商户?
方案1:按照用户取模,
带来的问题:后续扩容困难
方案2:按用户ID范围分片(1-1000万=分片1,xxx)
带来的问题:用户活跃度无法掌握,可能存在热点问题
方案3:按省份地区或者商户取模
数据分配不一定均匀
原文链接:https://blog.csdn.net/jerome_s/article/details/52492616
MYCAT的基本概念:
1. MYCAT中的数据库——逻辑库,逻辑表
位于中间层,它屏蔽了分库、分表后,数据库操作的复杂性。前端应用可以像使用一个未分库、分表的数据库一样来使用分库、分表的数据库(数据库路由等都是由中间件实现)
user_db
是逻辑数据库
db01
、db02
、db03
是物理数据库
注意: mycat中只保存逻辑库的定义,不保存数据,具体的数据存储在物理数据库中
2.MYCAY的关键特性:
- 支持sql92标准:sql92标准是大多数关系型数据库都支持的一个SQL标准,这个标准中定义了SQL语句的一些功能和标准的一些事务的特性,比如说隔离级别等。
- 支持MYSQL集群:一主多从,一主一从,多主多从等。
- 支持JDBC连接数据库:可以通过JDBC来连接除了MySQL之外的其他关系型数据库,比如Oracle,MSSQL,SqlServer,PgSQL等
使用MYCAT
1.安装MYCATlinux
安装java环境(已安装 忽略
)
安装mycat
wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
adduser mycat
tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
mv mycat /usr/local/
cd /usr/local/
chown mycat:mycat -R mycat
ls -lh
vi /etc/profile
export MYCAT_HOME=/usr/local/mycat
source /etc/profile
2.启动MYCAT
su mycat
cd /usr/local/mycat/bin
sh startup_nowrap.sh
可能会因为内存不足而报错,修改启动文件参数
JAVA_OPTS="-server -Xms1G -Xmx2G -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G"
3.Mycat的相关配置
schema.xml
rule.xml
server.xml
4.实现读写分离
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="DEVDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="node1" database="dev" />
<dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="49.235.110.134" url="49.235.110.134:3306" user="root" password="root">
<readHost host="203.195.224.113" url="203.195.224.113:3306" user="root" password="root" />
</writeHost>
<writeHost host="203.195.224.113" url="203.195.224.113:3306" user="root" password="root" />
</dataHost>
</mycat:schema>
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property>
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property>
<property name="processorBufferPoolType">0</property>
<!--
自定义 开始
-->
<property name="serverPort">3300</property>
<property name="managerPort">9066</property>
<!--
自定义 结束
-->
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">64k</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">false</property>
</system>
<user name="root" defaultAccount="true">
<property name="password">root</property>
<property name="schemas">DEVDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">DEVDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
测试
mysql -uroot -p -P3300 -h127.0.0.1
mysql> use DEVDB
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from stu;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 5 | lili | 18 |
+----+------+-----+
1 row in set (0.00 sec)