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
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,不会接触到后端的数据库。如下案例是做一个主从、读写分离,简单分库分表的示例。结构如下图:
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.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 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]#
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 ColumnList mysql> 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。这样一来,应用程序到达数据库和结果返回的过程中是否存在延迟?若存在,又该如何诊断原因与发生的位置,如何解决这个延迟?
转载需注明出处
mycat(读写分离、负载均衡、主从切换)的更多相关文章
- MyCat 读写分离,负载均衡
docker mysql 主从复制 配合Spring 事务 注意事项 配置好JRE,安装好MYCAT 在mysql主库创建表,会同步到从库 CREATE TABLE `user` ( `id` ) N ...
- 基于amoeba实现mysql数据库的读写分离/负载均衡
一.Amoeba的简述:[来自百度百科] Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请 ...
- mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)
mysql主从复制与lvs+keepalived实现负载高可用 文件夹 1.前言 4 2.原理 4 2.1.概要介绍 4 2.2.工作原理 4 2.3.实际作用 4 3方 ...
- Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived
文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...
- 2、MyCat读写分离
1.主从复制 搭建mycat的读写分离,首先我们现需要搭建mysql的主从复制 [1].Mysql主从复制原理 [2].MySQL主从复制配置 (1).主机配置 修改配置文件:vim /etc/my. ...
- Mycat读写分离、主从切换、分库分表的操作记录
系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...
- Mycat读写分离、主从切换学习(转)
http://blog.csdn.net/zhanglei_16/article/details/50707487 Mycat读写分离.主从切换学习问题一:分表.分库的优缺点,以及分表无法成为主流分表 ...
- mycat读写分离与主从切换【转】
什么是mycat,以及mycat的优点和特性本文不做赘述,本文继续本着实战的态度,来分享一些个人对mycat的基础功能实践.本文mycat的读写分离和主从切换的环境为mysql主从环境. 如何安装my ...
- Mycat在MySQL主从模式(1主1从)下读写分离和及自动切换模式的验证
实验环境 两台Centos7 MySQL5.7.12 IP地址为:192.168.10.36 192.168.10.37 一台Centos7 Mycat IP地址为:192.168.10.31 一 ...
- mysql主从同步+mycat读写分离+.NET程序连接mycat代理
背景 最近新项目需要用到mysql数据库,并且由于数据量大的原因,故打算采用1主1从(主数据库负责增.删.改操作:从数据库负责查操作)的数据库架构,在实现主从之后还要实现读写分离的代理,在网上搜寻了很 ...
随机推荐
- 把Android studio的日志导入目标文件中
最好是在Android studio的命令行工具中进行命令操作. adb logcat -v time > /Users/z/log.txt adb logcat -v time > /U ...
- C#——反射,自动生成添加的SQL语句
C#中的反射.是C#中特别重要也是特别神奇的特性,对后面学习框架,了解框架的原理.以及自己写框架,都是必不可少的.学习反射的过程中.总给我一种茅塞顿开的感觉,以前不懂的,现在懂了 反射的介绍:http ...
- 吴裕雄--天生自然 PYTHON3开发学习:基本数据类型
#!/usr/bin/python3 counter = 100 # 整型变量 miles = 1000.0 # 浮点型变量 name = "runoob" # 字符串 print ...
- PAT Basic 1023 组个最⼩数 (20) [贪⼼算法]
题目 给定数字0-9各若⼲个.你可以以任意顺序排列这些数字,但必须全部使⽤.⽬标是使得最后得到的数尽可能⼩(注意0不能做⾸位).例如:给定两个0,两个1,三个5,⼀个8,我们得到的最⼩的数就是1001 ...
- Python语言学习:homework2
三级菜单 # Author:Crystal data = { '北京':{ "昌平":{ "沙河":["oldbay","test ...
- LGOJ3747 六省联考2017 分手是祝愿
这两天遇到不少这种"人类智慧题"了,感觉都是很巧妙的 Description link 现在有 \(n\) 盏灯,设每一次操作控制第 \(i\) 占灯,而改变状态的灯就是 \(i\ ...
- Java 开发者必须了解的 16 个Java 顶级开源项目!
本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb/JavaGuide ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核 ...
- switch-case的用法
case 值1: 表达式的值和 值1匹配上了,需要执行的代码; break; case 值2: 表达式的值和 值2匹配上了,需要执行的代码; break; case 值3: 表达式的值和 值3匹配上了 ...
- MySQL--事务控制和锁定语句
MySQL 支持对 MyISAM 和 MEMORY 存储引擎的表进行表级锁定,对 BDB 存储引擎的表进行页级锁定,对 InnoDB 存储引擎的表进行行级锁定.默认情况下,表锁和行锁都是自动获得的,不 ...
- jQuery ajax中的dataType——JSON和JSONP
引用:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html [原创]说说JSON和JSONP,也许你会豁 ...