mycat(读写分离、负载均衡、主从切换)

时间:2023-03-09 15:36:38
mycat(读写分离、负载均衡、主从切换)

博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽


1.环境准备

1.1新增两台虚拟机

mycat01:192.168.247.81
mycat02:192.168.247.82

1.2下载地址(mycat)

官网:http://dl.mycat.io/http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

1.3配置jdk

[root@amoeba~]# mkdir /usr/local/java -p
[root@amoeba~]# tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/java/
设置环境变量:
[root@amoeba~]# vim /etc/profile
在最后输入:
export JAVA_HOME=/usr/local/java/jdk1..0_202
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
生效:
[root@amoeba~]# source /etc/profile
验证:
[root@amoeba~]# java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) -Bit Server VM (build 25.202-b08, mixed mode)
[root@amoeba~]# 

1.4关闭SELinux

mycat(读写分离、负载均衡、主从切换)

1.5设置时间同步

timedatectl set-timezone Asia/Shanghai
date

2.为什么要选择mycat(引用自其它博文,如有侵权,请联系删除)

参考文档1:通过mycat中间件,实现MySQL的读写分离.docx(黄志鹏)
参考博文1:https://blog.csdn.net/kobejayandy/article/details/60869530
参考博文2:https://www.cnblogs.com/kevingrace/p/9365840.html
.1mycat的由来
Amoeba是作为一个真正的独立中间件提供服务,即应用去连接Amoeba操作MySQL集群,就像操作单个MySQL一样。从架构中可以看来,Amoeba算中间件中的早期产品,后端还在使用JDBC Driver。

Cobar是在Amoeba基础上进化的版本,一个显著变化是把后端JDBC Driver改为原生的MySQL通信协议层。后端去掉JDBC Driver后,意味着不再支持JDBC规范,不能支持Oracle、PostgreSQL等数据。但使用原生通信协议代替JDBC Driver,后端的功能增加了很多想象力,比如主备切换、读写分离、异步操作等。

MyCat又是在Cobar基础上发展的版本,两个显著点是:
后端由BIO改为NIO,并发量有大幅提高;增加了对Order By、Group By、limit等聚合功能的支持(,虽然Cobar也可以支持Order By、Group By、limit语法,但是结果没有进行聚合,只是简单返回给前端,聚合功能还是需要业务系统自己完成)。

目前社区情况:
TDDL处于停滞状态
Amoeba处于停滞状态
Cobar处于停滞状态
MyCAT社区非常活跃
MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

.2Mycat简介
-  一个彻底开源的,面向企业应用开发的大数据库集群
-  支持事务、ACID、可以替代MySQL的加强版数据库
-  一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
-  一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
-  结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
-  一个新颖的数据库中间件产品

.3Mycat关键特性
-  支持SQL92标准
-  遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理
-  基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群
-  支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
-  基于Nio实现,有效管理线程,高并发问题
-  支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页
-  支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join
-  支持通过全局表,ER关系的分片策略,实现了高效的多表join查询
-  支持多租户方案
-  支持分布式事务(弱xa)
-  支持全局序列号,解决分布式下的主键生成问题
-  分片规则丰富,插件化开发,易于扩展
-  强大的web,命令行监控
-  支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉
-  支持密码加密
-  支持服务降级
-  支持IP白名单
-  支持SQL黑名单、sql注入攻击拦截
-  支持分表(1.6)
-  集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(.0开发版)

.4Mycat应用场景
Mycat发展到现在,适用的场景已经很丰富,而且不断有新用户给出新的创新性的方案,以下是几个典型的应用场景:
-   单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;
-   分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;
-   多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;
-   报表系统,借助于Mycat的分表能力,处理大规模报表的统计;
-   替代Hbase,分析大数据;
-   作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择;
.5Mycat不适合的应用场景
-  设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!
-  设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!
-  设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使用Mycat,可以考虑放弃!
-  设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用Mycat,可以考虑放弃!

.6注意事项:
在生产环境中, Mycat节点最好使用双节点, 即双机热备环境, 防止Mycat这一层出现单点故障. 可以使用的高可用集群方式有:  Keepalived+Mycat+Mysql, Keepalived+LVS+Mycat+Mysql, Keepalived+Haproxy+Mycat+Mysql

2.7架构

MyCat支持双主多从,多主多从情况需要配置多个writeHost兄弟节点,多个readHost节点即可!

Mycat的架构其实很好理解,Mycat是数据库代理中间件,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。如下案例是做一个主从、读写分离,简单分库分表的示例。结构如下图:

mycat(读写分离、负载均衡、主从切换)

1. 安装mycat(读写分离、负载均衡、主从切换)

3.1解压安装

[root@mycat01 mycat]# pwd
/opt/mycat
[root@mycat01 mycat]#
[root@mycat01 mycat]# tar -zvxf Mycat-server--linux.tar.gz
[root@mycat01 mycat]# mkdir -p /data
[root@mycat01 mycat]# mv mycat/ /data/
[root@mycat01 mycat]# cd /data/mycat/
[root@mycat01 mycat]# ls
bin  catlet  conf  lib  logs  version.txt
[root@mycat01 mycat]# 

3.2目录注解:

bin     mycat命令,启动、重启、停止等
catlet   catlet为Mycat的一个扩展功能
conf    Mycat 配置信息,重点关注
lib     Mycat引用的jar包,Mycat是java开发的
logs    日志文件,包括Mycat启动的日志和运行的日志。
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:
server.xml   Mycat的配置文件,设置账号、参数等
schema.xml   Mycat对应的物理数据库和数据库表的配置
rule.xml     Mycat分片(分库分表)规则

3.3设置配置文件

[root@mycat01 mycat]# cd conf/
[root@mycat01 conf]# cp -a server.xml server.xml.bak
[root@mycat01 conf]# cp -a schema.xml schema.xml.bak
[root@mycat01 conf]# vim server.xmlmycat(读写分离、负载均衡、主从切换)[root@mycat01 conf]# vim schema.xml  (mycat01是实库事先创建好,mycat是逻辑库)
mycat(读写分离、负载均衡、主从切换)
参数解读:
:映射设置
设置逻辑库mycat和对应的实库mycat01
:读写分离+负载均衡
balance=":不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上。
balance=":读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡
balance=":读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发。
balance= 只在 1.4 及其以后版本有,1.3 没有。
:主从切换设置
switchType="-1":不自动切换
switchType=":默认值,自动切换
switchType=":基于MySQL主从同步的状态来决定是否切换。需修改heartbeat语句(即心跳语句):show slave status
switchType=":基于Mysql Galera Cluster(集群多节点复制)的切换机制。需修改heartbeat语句(即心跳语句):show status like 'wsrep%'
:真实数据库
映射主机
:主从切换的备机
switchType="的时候设置备用机器,当master宕机的时候自动切换这台机器为master
其它参数解读:https://www.cnblogs.com/kevingrace/p/9365840.html

3.3启动

[root@mycat01 conf]# ../bin/mycat start
启动日志:
[root@mycat01 ~]# cd /data/mycat/logs/
[root@mycat01 logs]# ls
-  mycat.log  mycat.pid  wrapper.log
[root@mycat01 logs]# mycat(读写分离、负载均衡、主从切换)

3.4测试验证

3.4.1查看数据源(9099):

[root@mycat01 logs]# mysql -uroot -p123456  -P9066  -h192.
mysql> show @@datasource;

mycat(读写分离、负载均衡、主从切换)

3.4.2登录逻辑库

[root@mycat01 logs]# mysql -uroot -p123456 -h
关闭主库,则系统无法进行写操作,关闭从库,则系统无法进行读操作,表示读写分离验证完毕
第一次查询显示slave1库,第二次查询显示slave2库,表示轮询配置验证完成
轮询配置验证具体如下:
在mycat上建表test(247.81):
mysql> use test01;
mysql> create table test(id ));
在slave1上insert数据(247.54):
mysql> use test01;
mysql> insert into test values(); (在slave1上手动插入一条数据)

返回mycat上查询test:
mysql> select * from test;  (第一次查询得到数据,也就是slave1上面的数据)
+------+
| id   |
+------+
|  |
+------+
 row in set (0.00 sec)

mysql> select * from test;
Empty set (0.00 sec)  (查询不到数据,也就是查询的是slave2上面的表)

mycat(读写分离、负载均衡、主从切换)

3.4.3主从切换验证

关闭主库,写入数据,发现自动切换为备用主库,表示验证完成,本次实验均已验证成功

4.多库配置

[root@mycat01 conf]# vim server.xml

mycat(读写分离、负载均衡、主从切换)

[root@mycat01 conf]# vim schema.xml

mycat(读写分离、负载均衡、主从切换)

[root@mycat01 logs]# mysql -uroot -p123456 -h 192.168.247.81 -P 8066

mycat(读写分离、负载均衡、主从切换)

[root@mycat01 logs]# mysql -uroot -p  -P9066  -h192.168.247.81

mysql> show @@datasource;

mycat(读写分离、负载均衡、主从切换)

5.分库分表

5.1.环境准备

图示:

库-逻辑库

备注

规则

mycat01-mycat

localtion

南宁

mycat-rule

mod-long

tanskdb-tansk

localtion

广州

说明:为了更直接的比较各类功能,分库分表只在节点81上进行,82没有设置。

在主库上(247.53),创建表与基础数据:

mysql -uroot -p  -P9066  -h192.168.247.53

mysql> use mycat01;

mysql> create table localtion ( id int(10) not null auto_increment, city_name varchar(20), primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

mysql> insert into localtion values(1,'南宁');

mysql> select * from localtion;

+----+-----------+

| id | city_name |

+----+-----------+

|  1 | 南宁      |

+----+-----------+

mysql> use tanskdb;

mysql> create table localtion ( id int(10) not null auto_increment, city_name varchar(20), primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

mysql> insert into localtion values(1,'广州');

mysql> select * from localtion;

+----+-----------+

| id | city_name |

+----+-----------+

|  1 | 广州      |

+----+-----------+

5.2分库分表

设置配置文件

[root@mycat01 conf]# pwd
/data/mycat/conf
[root@mycat01 conf]# cp -a rule.xml rule.xml.bak
[root@mycat01 conf]# cp -a server.xml server.xml.bak02
[root@mycat01 conf]# cp -a schema.xml schema.xml.bak02
[root@mycat01 conf]# vim server.xmlmycat(读写分离、负载均衡、主从切换)

[root@mycat01 conf]# vim rule.xml

mycat(读写分离、负载均衡、主从切换)

参数解读:

1:

2:

3:

[root@mycat01 conf]# vim schema.xml

mycat(读写分离、负载均衡、主从切换)

参数解读:

1:

2:

3:

4:

5.3测试验证(247.81)

mysql -uroot -p  -P9066  -h192.168.247.81

mycat(读写分离、负载均衡、主从切换)
mysql> use tansk;
mysql> select * from localtion;
+----+-----------+
| id | city_name |
+----+-----------+
|   | 广州      |
+----+-----------+
mysql> use mycat;
mysql> select * from localtion;
+----+-----------+
| id | city_name |
+----+-----------+
|   | 广州      |
|   | 南宁      |
+----+-----------+

在使用mycat逻辑库查看localtion表的时候,结果是实库mycat01和tanskdb的数据的合集.一个表有广州,一个表有南宁,分别在不同的库里面,使用mycat(81)可以查到他们的合集:证明分库分表完成,与此同时,保留了逻辑库tansk的原有配置

在mycat里面插入数据:
注意:即使插入所有字段的数据,也一定要在表名后面写明插入数据的字段名称,否则插入数据会报错:ERROR  (HY000): partition table, insert must provide ColumnList

mysql>  insert into localtion (,'北京');
mysql>  insert into localtion (,'洛杉矶');
mysql>  insert into localtion (,'克利夫兰');

mycat(读写分离、负载均衡、主从切换)

结论:经过观察发现,插入数据是由规律的分别按前后次序进入mycat01和tanskdb的localtion表,本次实验数据先进入mycat-dn1-mycat01,后进入mycat-dn2-tanskdb

6.思考

6.1思考1

以现在的架构,master宕机,一台slave将会自动切换为writeHost机器,保证生产持续运行。如果mycat宕机,又该如何?

6.2思考2

以现在的架构,数据库负责最底层的真实数据的存储与管理,而mycat负责管理数据库,应用程序将指令发送给mycat。这样一来,应用程序到达数据库和结果返回的过程中是否存在延迟?若存在,又该如何诊断原因与发生的位置,如何解决这个延迟?



转载需注明出处