前言
- 本文主要是通过在慕课网进行学习,地址为点击打开链接。向跟着视频一起学习的话,可以点开链接。
- 该文章只是基础的MyCat文章,之后还需要进一步学习分片、规则配置和高可用等等。
- 本文也涉及到MySQL的安装,本人之前学习了一些,可以参考这个:点击打开链接。
- 另外本文还涉及到MySQL主从配置,本人之前也学习了一些,可以参考这个:点击打开链接。
一、学习目的
- 掌握在数据库负载增大时的处理方法;
- 理解MyCat的基础概念;
- 掌握MyCat的基础配置和监控方法;
二、MyCat介绍
2.1 前世今生
- 阿里的Amoeba(2008年,阿米巴):MySQL分布式中间层,负载均衡,读写分离,高可用,SQL过滤;
- 阿里的Cobar(2012年):开源后不再维护,每天支持着上亿的数据库访问量;
- MyCat(2013年,元年):改善Cobar;
- MyCat(2017年,1.6版本):数百项目的应用;
2.2 主要作用
- 分布式数据库系统中间层;
读写分离,负载均衡,统一控制数据库连接池,连接关系型数据库和菲关系型数据库。
- 实现数据库的读写分离(基于数据库的主从复制);
- 支持后端MySQL高可用;
通过MHA和IM的方式实现高可用:当一个主节点宕机后,从多个从节点中选取一个成为主节点,其他从节点会从新的主节点中同步数据。
MyCat的高可用实现方式:将另一个从节点指定为可写的节点,当主节点宕机后,将SQL路由至指定的从节点,并且不支持其他从节点对指定的从节点进行主从同步。
- 数据库的垂直拆分;
将数据库的表按照逻辑分别放置在不同的数据库,如下图所示,将原本一个数据库的表拆分为:用户库,订单库,支付库。
- 数据库的水平拆分;
即数据库的分库分表,按照一定的规则将一个用户库分为多个用户库,如下图所示,将原本一个用户数据库根据用户的ID对3进行取模分为三个数据库。前端应用可以根据切分逻辑找到相应的数据库。
2.3 应用场景
- 需要进行读写分离的场景(当在一台数据库服务器上进行同时读写操作时感到性能大幅下降,读负载明显高于写负载的时候,一主一从,一主多从,主主复制,MySQLPXC集群等等);
- 需要进行分库分表的场景(支持对超过一千万的表分片,最大支持超过一千亿的单表分片);
- 多租户的场景(一种软件架构,在多用户的环境下,共同使用数据库的组件,并且依然保证各个用户的数据的隔离性,常见于云服务中);
- 数据统计系统(并发对后端数据库的数据进行访问,最后再进行合并);
- HBASE的一种替代方案;
HBASE:一款基于Hadoop列从主分布式数据库,基本的关系型数据库都是“行”存储。
- 需要使用同样的方式查询多种数据库的场景(对于前端来说可隐藏数据库的种类,来使用多种数据库);
2.4 优势
- 基于阿里的Cobar系统开发;
- 开发社区十分活跃(对于遇到的Bug和存在的问题有更好的解决方案);
- 完全开源可以自定义开发;
- 支持多种关系型及非关系型(NOSQL)数据库;
- 基于JAVA开发,可以部署在多种系统上(最好是在Linux上);
- 具有在多种行业和项目中应用的成功案例;
三、MyCat基础
3.1 MyCat基本概念
屏蔽了后端对数据库进行分库分表后的负载型,可以像使用未分片的数据库一样来使用分片的数据库,所有的路由和分片逻辑是由中间件实现的。
- MyCat中的数据库----逻辑库;
- MyCat中的数据库----逻辑表;
User_db为逻辑库,db01,db02和db03为物理库。
user_inf为逻辑表,db01,db02和db03中的user_inf为物理库中存储的表。
逻辑库和逻辑表是不存储数据的,只存储数据库和表的“逻辑”。
3.2 MyCat关键特性
- 支持SQL92标准(大多数数据库都支持的一个SQL标准,规定了SQL语句的功能和标准的事务的特性(隔离级别等等));
- 支持MySQL集群;
- 支持JDBC连接数据库(可以通过JDBC连接其他的数据库);
- 支持NOSQL数据库;
- 支持自动故障切换,高可用(前面已经说过,不同于MHA和3M);
- 支持读写分离;
- 支持全局表(比较小的表:字典表,将这种数据自动存储到其他的分片节点上,提高表的关联效率);
- 支持独有的基于ER关系的分片策略(将子表关联的父表存放在同一个数据分片上,子表依赖于父表存储,提高表的关联效率);
- 支持一致性HASH分片(HASH算法,解决了分片扩容的问题。建议:先在一台服务器上建立足够多的分片,当这一台服务器的负载过大时,将一些数据库分片迁移到其他的数据库上【简单高效】);
- 多平台支持,部署简单方便(基于JVM的部署);
- 支持全局序列号(自增ID,防止ID重复);
3.3 安装MyCat
安装过程如下图所示:
- 先查看是否已经安装JAVA环境,如果没有,先安装,具体安装过程这里不再赘述;
- 通过wget方式下载MyCat;
wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
- 建立mycat用户
adduser mycat
- 解压mycat
tar zxf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
- 改变mycat所属mycat用户
chown mycat:mycat -R mycat
- 编辑环境变量
vim /etc/profile
在文档末尾(或和Java一起)添加mycat环境变量,MYCAT_HOME后面是mycat的安装目录
export MYCAT_HOME=/home/mycat/mycat
配置完成之后,内容如图所示:
最后 按下Esc,输入:wq,保存配置文件并退出。
3.4 运行MyCat
$MYCAT_HOME/bin/startup_nowrap.sh
上面是通过使用全局变量的方式运行startup_nowrap.sh,也可以直接进入该目录执行该程序。
JAVA_OPTS="-server -Xms2G -Xmx2G -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G"
上面是当MyCat运行内存不足或内存溢出时,通过调整Java的参数来增加Java的运行配置,进而解决MyCat的问题。
运行时使用mycat用户来运行。切换用户是下面的命令:
编辑startup_nowrap.sh可以看到,文件中会检查JAVA_HOME和MYCAT_HOME的环境变量,以及关于Java运行的设置。其中关于Java运行环境的设置如下图所示:su - mycat
在执行startup_nowrap.sh后,会输出执行的参数,以及日志写入的文件。
3.5 关键配置文件
- schema.xml 用于配置逻辑库表、数据节点和数据源;
- rule.xml 用于配置表的分片规则;
- server.xml 用于配置服务器权限;
其他的配置文件
wrapper.conf 用配置关于java参数;
log4j2.xml 用于配置日志;
3.5.1 schema.xml
- 定义逻辑库表
<schema><table></table></schema>
如果只是读写分离,而不需要分库分表,可以不用配置这个。只保留schema标签就可以了。
- 定义数据节点
用于定义分片节点,一个数据节点代表一个独立的数据分片,包括后端数据源的命名和实际的数据库名字。<dataNode></dataNode>
- 定义数据节点的物理数据源
定义了主机节点,一个真实物理数据库的实例,一组真实的MySQL集群。定义读写分离的配置,心跳语句的配置等等。<dataHost></dataHost>
3.5.2 rule.xml
- 定义表使用的分片规则
<tableRule name=""></tableRule>
可以对表使用不同的分片规则,或者相同的分片规则不同的参数。
- 定义分片算法
<function name=""></function>
为分片规则定义不同的分片算法。
3.5.3 server.xml
- 定义系统配置
<system><property name=""></property></system>
如定义连接MyCat的端口号(serverPort),定义管理MyCat端口号(managePort,下面会继续提到),系统使用的内存大小(systemReserveMemorySize),等等。
- 定义连接MyCat的用户
<user></user>
如定义用户的名字,密码等等。这里定义的用户和在后端数据库定义的实际用户是不一样的,可以相同也可以不同,只有在server.xml存在的用户才可以通过MyCat连接到数据库。也就是在没有使用MyCat的时候,连接数据库用户名和密码是数据库的,使用MyCat后用户名和密码是在server.xml中配置的。
3.6 停止、启动MyCat
停止:
bin/mycat stop
启动:
bin/mycat start
3.7 管理MyCat
3.7.1 连接方式
使用MySQL客户端管理MyCat,前面提到的server.xml中有一配置管理端口的地方。
<property name="managerPort">9066</property>
通过命令行管理,注意:下面的用户名和密码是在server.xml中设置的用户名和密码。
mysql -uroot -proot -h127.0.0.1 -P9066
如果无法进入,可能是MyCat启动失败,在 logs/wrapper.log,可以查看启动的日志,根据日志内容分析问题。
进入成功的话,如下图所示,红框中就是你的MyCat的版本信息。
3.7.2 管理命令
- 查看帮助
show @@help;
- 重新加载配置文件(只是重新加载部分配置文件,所以有时候不得不重启MyCat)
reload @@config;
- 查看数据节点配置
show @@datanode;
- 查看后端物理数据库服务器
show @@datasource;
- 查看后端数据库数据连接情况
show @@backend;
3.8 本地登录MyCat
3.8.1 连接方式
连接方式和3.7.1节基本相同,只是需要将连接的端口换为serverPort,我的是默认端口8066。
3.8.2 使用方式
可以按照正常的MySQL客户端一样,进行增删改查的操作,并且也需要选择数据库(这里自然是逻辑库)。
并且也可以使用 explain + SQL语句 来查看 SQL语句的路由情况,而且并不会真正的执行该SQL语句。
3.9 日志管理
MyCat使用Apache log4j项目管理日志
日志配置文件位于conf/log4j2.xml
3.9.1 配置日志格式
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
</PatternLayout>
时间:%d{yyyy-MM-dd HH:mm:ss.SSS}
级别:%5p
线程:[%t]
提示信息:%m
回车符:%n
3.8.2 配置日志级别
<asyncRoot level="info" includeLocation="true">
级别:level
所有级别为
All < Trace < Debug < Info < Warn < Error < Fatal < OFF
3.9.3 日志内容
- 系统的初始化信息
- 线程数、核数、nio线程数信息
- MyCat启动参数(charset:MyCat字符集和MySQL字符集保持相同;idleTimeout:当前段应用使用的连接空闲时间长度,时间到达后会断开线程,将线程放回到线程池中;maxPacketSize:最大的包尺寸,MySQL中也有,不能大于MySQL的设置)
- 连接初始化信息
后话
只是入门啊,还得继续学习!!!