Mycat知识
一、什么是Mycat?能干什么?
属于是一种分库分表的数据库中间件,常用于解决高并发高访问量情况下对数据库的压力,解决java应用与数据库之间的紧耦合问题,解决读写请求不一致问题(一个mycat的逻辑数据库包含物理数据库)
用于
-
读写分离(由mycat控制数据库的读写)
-
数据分片(垂直拆分和水品拆分),也就是分库分表
- 垂直拆分
- 分库:将一个数据库拆分成多个库,一般按照业务拆分到专库,也就是专库专用
- 分表:将一张大表分拆成多个小表
- 水平拆分
- 分库:把同一张表的数据按照主键的一定规则拆分到不同的数据库中,每个数据库只有这张表的部分数据
- 分表:将一张表中的数据分拆到一个数据库中的多张表中,每张表存储一部分数据
- 垂直拆分
-
多数据源整合
二、Mycat和其他数据库中间件的对比
功能 | Sharding-jdbc | Mycat |
---|---|---|
基于客户端还是服务端 | 客户端 | 服务端 |
分库分表 | 有 | 有 |
MySQL交互协议 | JDBC Driver | 前后端均用NIO |
支持的数据库 | 任意 | 任意 |
三、Mycat原理
Mycat原理中最重要的一个动词就是“拦截”,它拦截用户发送过来的SQL语句,首先对SQL语句进行一些特定的分析,如分片分析、路由分析、读写分离分析、缓存分析等,然后将SQL发送给后端真实的数据库,并将返回的结果做适当处理,最终返回用户。如下:
四、Mycat的安装
Linux下的软件安装方式
1、rpm安装
- 需要.rpm安装包,如果存在多个.rpm安装包,需要按照顺序安装
2、yum安装
- 需要联网,通过下载网址
3、解压后即可使用
4、解压后编译安装
Mycat使用第三种方式
#将Mycat安装包上传到Linux系统中
#tar -zxvf 安装包.tar.gz
#将解压之后的文件copy到/usr/local目录中,cp -r 文件夹名称 /usr/local/
Mycat三个配置文件很重要
- schema.xml:定义逻辑库,表、分片节点等信息
- rule.xml:定义分片规则(比如表水平拆分规则等)
- server.xml:定义用户 以及系统相关变量,比如端口等信息
五、Mycat的启动
#控制台启动
去到Mycat/bin 目录下执行./mycat console 这种方式能看到输出日志,方便定位问题
#后台启动
去到Mycat/bin 目录下执行./mycat start
六、Mycat的登录
#登录后台管理窗口,此登录方式用于管理维护Mycat
mysql -u用户名 -p密码 -P 9066(这个端口是管理窗口) -h 地址
#登录数据窗口
mysql -u用户名 -p密码 -P 8066 -h 地址
七、搭建Mycat的读写分离
#通过Mycat和Mysql的主从复制配合搭建数据库的读写分离
#一主一从
#搭建MySQL的数据库主从复制
1、主机配置
#修改配置文件:vim /etc/my.cnf
#主服务器的ID
server-id=1
#启动二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要进行复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
2、从机配置
#同样修改配置文件:vim /etc/my.cnf
#从服务器的ID
server-id=2
#启用中继日志
relay-log=mysql-relay
3、主机从机重启服务
centOS7:systemctl restart mysqld
#查看当前mysql的状态
systemctl status mysqld
4、主机从机都关闭防火墙
#查看防火墙状态
systemctl status firewalld
5、在主机上建立账户并授权slave
#在主机MYSQL里执行授权命令
GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%' IDENTIFIED BY '密码'
#查询master状态
show master status;
#记录下File和Position的值
#执行完此步骤之后不要在操作主服务器MYSQL,防止主服务器状态值改变
6、在从机上配置需要复制的主机
#复制主机的命令
CHANGE MASTER TO MASTER_HOST='主机IP地址',
MASTER_USER='之前建立并且授权的用户',
MASTER_PASSWORD='密码',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS='具体值';
#如果之前设置过主机信息,需要重一下
stop slave
reset master
7、启动从服务器复制功能
start slave
8、查看从服务器状态
show slave status\G;
需要slave_IO_running:yes
slave_sql_running:yes
#实现mycat的读写分离
1、修改Mycat的配置文件:vim /usr/local/mycat/conf/schema.xml
<schema>配置逻辑库信息
<dataNode>配置数据源信息,database是数据源的物理数据库名称
<dataHost>数据源的主机信息
<writeHost>写主机信息
<readHost>读主机信息
为了方便验证是否实现了读写分离我们在在数据库插入主机名,这样由于主从复制的格式导致主从数据不一致
insert into mytable values(1,@@hostname)
#要使得读写分离需要修改<dataHost>节点的balance属性,通过此属性配置读写分离的属性
balance='0',不开启读写分离机制,所有读请求都发送到当前可用的writeHost上
balance='1',全部的readHost与stand by writeHost参与select语句的负载均衡,简单说 ,当双主双从(M1->S1,M2->S2,并且M1和M2互为主备),正常情况下,S1,M2,S2都参与select语句的负载均衡
balance='2',所有读操作都随机在writeHost、readHHost上分发
balance='3',所有读请求随机的分发到readHost执行,writeHost不负担读压力
2、在只存在2台机器时,一般使用3,但是双主双从时一般使用1
#双主双从
#搭建双主双从
#M1->S1,M2->S2,M1和M2互为主备(在主机宕机,主备之间可以切换)
1、将之前从机设置的从机配置重置并且删除从机中的表
stop slave
reset master
2、在之前的master1的基础上修改配置文件:vim /etc/my.cnf
#在作为从数据库的时候,写入操作也需要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认是1,取值范围是1....65535
auto-increment-increment=2
#表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1...65535
auto-increment-offset=1
3、修改另一台主机的配置:vim /etc/my.cnf
同第一台主机的配置差不多,只有两个地方不同
#server-id=3(这个每台需要唯一)
#auto-increment-offset=2(起始值需要为2,不能同第一台主机一致)
4、修改第一台从机的配置:vim /etc/my.cnf
#从服务器的ID
server-id=2
#启用中继日志
relay-log=mysql-relay
5、修改第二台从机配置:vim /etc/my.cnf
#同上,但是server-id需要不同,保持唯一
6、重启每台服务器,并且关闭防火墙
7、在两台主机上都建立账户并授权slave,之前M1已经建立就不需要了,只需要给M2建立即可
8、在每台从机上配置需要复制的主机(同一主一从的第6步)
9、配置两个主机相互复制
#同样配置需要复制的机器(同一主一从的第6步),但是注意IP要更改,以及对应的File和pos要正确
#mycat双主双从读写分离
1、修改Mycat的配置文件:vim /usr/local/mycat/conf/schema.xml
#将双主双从的服务器机器配置好,因为只有一个逻辑库,所以<schema>节点、<dataNode>节点、<dataHost>节点不用动只需要增加<writeHost>节点、<readHost>
#将balance属性值更改为1
#还有几个属性值需要注意
writeType='0':所有写操作发送到配置的第一个writeHost,第一个挂了切换到还生存的第二个
writeType='1':所有写操作都随机发送到配置的writeHost,1.5之后废弃不用
#writeHost挂了重新启动后以切换的为准,切换记录在配置文件中:dnindex.properties
switchType='1':默认值,自动切换
switchType='-1':不自动切换
switchType='2':基于mysql主从同步的状态决定是否切换
2、启动mycat验证
MySQL的binlog日志的三种格式
- statement:默认的格式,会将所有写操作sql写入到日志,但是如果写操作包含的时间字段是采用系统时间now()的话,会导致主从数据不一致
- row:不记录写操作sql,而是记录的是每一行的改变,但是当表中字段全部更新并且字段较多,会使得日志太长
- mixed:针对上述两种的智能选择,当sql中存在系统函数,就采用row,没有就使用默认格式,但是mixed不能识别系统变量@@hostname