博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽
1.环境准备
1.1新增两台虚拟机
mycat01:192.168.247.81mycat02: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_202export JRE_HOME=$JAVA_HOME/jreexport CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/libexport PATH=$JAVA_HOME/bin:$PATH生效:[root@amoeba~]# source /etc/profile验证:[root@amoeba~]# java -versionjava 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
1.5设置时间同步
timedatectl set-timezone Asia/Shanghaidate
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,不会接触到后端的数据库。如下案例是做一个主从、读写分离,简单分库分表的示例。结构如下图:
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]# lsbin 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.xml[root@mycat01 conf]# vim schema.xml (mycat01是实库事先创建好,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 statusswitchType=":基于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]#
3.4测试验证
3.4.1查看数据源(9099):
[root@mycat01 logs]# mysql -uroot -p123456 -P9066 -h192.mysql> show @@datasource;
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上面的表)
3.4.3主从切换验证
关闭主库,写入数据,发现自动切换为备用主库,表示验证完成,本次实验均已验证成功
4.多库配置
[root@mycat01 conf]# vim server.xml
[root@mycat01 conf]# vim schema.xml
[root@mycat01 logs]# mysql -uroot -p123456 -h 192.168.247.81 -P 8066
[root@mycat01 logs]# mysql -uroot -p -P9066 -h192.168.247.81
mysql> show @@datasource;
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.xml
[root@mycat01 conf]# vim rule.xml
参数解读:
1:
2:
3:
[root@mycat01 conf]# vim schema.xml
参数解读:
1:
2:
3:
4:
5.3测试验证(247.81)
mysql -uroot -p -P9066 -h192.168.247.81
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 ColumnListmysql> insert into localtion (,'北京');mysql> insert into localtion (,'洛杉矶');mysql> insert into localtion (,'克利夫兰');
结论:经过观察发现,插入数据是由规律的分别按前后次序进入mycat01和tanskdb的localtion表,本次实验数据先进入mycat-dn1-mycat01,后进入mycat-dn2-tanskdb
6.思考
6.1思考1
以现在的架构,master宕机,一台slave将会自动切换为writeHost机器,保证生产持续运行。如果mycat宕机,又该如何?
6.2思考2
以现在的架构,数据库负责最底层的真实数据的存储与管理,而mycat负责管理数据库,应用程序将指令发送给mycat。这样一来,应用程序到达数据库和结果返回的过程中是否存在延迟?若存在,又该如何诊断原因与发生的位置,如何解决这个延迟?