MyCat学习

前言

  • 本文主要是通过在慕课网进行学习,地址为点击打开链接。向跟着视频一起学习的话,可以点开链接。
  • 该文章只是基础的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用户来运行。切换用户是下面的命令:

su - mycat
编辑startup_nowrap.sh可以看到,文件中会检查JAVA_HOME和MYCAT_HOME的环境变量,以及关于Java运行的设置。其中关于Java运行环境的设置如下图所示:


在执行startup_nowrap.sh后,会输出执行的参数,以及日志写入的文件。

3.5 关键配置文件

  1. schema.xml 用于配置逻辑库表、数据节点和数据源;
  2. rule.xml 用于配置表的分片规则;
  3. server.xml 用于配置服务器权限;

其他的配置文件

wrapper.conf 用配置关于java参数;

log4j2.xml 用于配置日志;

3.5.1 schema.xml

  • 定义逻辑库表
<schema><table></table></schema>

如果只是读写分离,而不需要分库分表,可以不用配置这个。只保留schema标签就可以了。

  • 定义数据节点
<dataNode></dataNode>
用于定义分片节点,一个数据节点代表一个独立的数据分片,包括后端数据源的命名和实际的数据库名字。
  • 定义数据节点的物理数据源
<dataHost></dataHost>
定义了主机节点,一个真实物理数据库的实例,一组真实的MySQL集群。定义读写分离的配置,心跳语句的配置等等。

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的设置)
  • 连接初始化信息

后话

只是入门啊,还得继续学习!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值