1、Java课程系列Java课程系列之Mycat尚硅谷Java版本:V1.6第一章入门概述1.1是什么Mycat是数据库中间件。1、数据库中间件中间件:是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的。例子:Tomcat,web中间件。数据库中间件:连接java应用程序和数据库2、为什么要用Mycat?Java与数据库紧耦合。高量高并发对数据库的。读写请求数据不一致3、数据库中间件对比Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列Cobar属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000+个MySQL数据库的
2、schema,集群日处理SQL请求50亿次以上。由于Cobar发起人的离职,Cobar停止维护。Mycat是开源社区在阿里cobar基础上进行二次开发,解决了cobar的功能在其中。青出于蓝而胜于蓝。的问题,并且加入了许多新OneProxy基于MySQL的proxy思想利用c进行开发的,OneProxy是一款商业的中间件。舍弃了一些功能,专注在性能和稳定性上。kingshard由小团队用go语言开发,还需要发展,需要不断完善。Vitess是生产在使用,架构很复杂。不支持MySQL原生协议,使用需要大量改造成本。Atlas是360团队基于mysqlproxy改写,功能还需完善,高并发下不稳定。
3、MaxScale是mariadb(MySQL原作者维护的一个版本)研发的中间件MySQLRoute是MySQLOracle公司发布的中间件Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列3、Mycat的官网1.2干什么1、读写分离2、数据分片垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列3、多数据源整合1.3原理Mycat的原理中最重要的一个动词是“”,它了用户过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析
7、的高可用性。搭建:一主一从、双从两种读写分离模式。3.1搭建一主一从一个主机用于处理所有写请求,一台从机负责所有读请求,架构图如下1、搭建MySQL数据库主从MySQL主从原理Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列主机配置(host79)binlog日志三种格式从机配置(host80)主机、从机重启MySQL服务主机从机都关闭在主机上建立帐户并slaveJava大数据前端python人工智能资料,可:尚硅谷官网Java课程系列在从机上配置需要的主机Java大数据前端python人工智能资料,可:尚硅谷官网Ja
8、va课程系列主机新建库、新建表、insert,从机Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列如何停止从服务功能如何重新配置主从2、修改Mycat的配置文件schema.xml之前的配置已分配了读写主机,是否已实现读写分离?修改的balance属性,通过此属性配置读写分离的类型为了能看到读写分离的效果,把balance设置成2,会在两个主机间切换Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列3、启动Mycat4、验证读写分离Java大数据前端python人工智能资料,可:尚硅谷官网Java
9、课程系列3.2搭建双从一个主机m1用于处理所有写请求,它的从机s1和另一台主机m2还有它的从机s2负责所有读请求。当m1主机宕机后,m2主机负责写请求,m1、m2互为备机。架构图如下Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列1、搭建MySQL数据库主从(双从)机配置Master1配置Master2配置Java大数据前端python人工智能资料,可:尚硅谷官网编号IP地址名1Master128host79.atguigu2Slave127host80.atgui
10、gu3Master226host81.atguigu4Slave225host82.atguiguJava课程系列配置Slave1配置Slave2配置重启mysql服务机、主机从机都关闭在两台主机上建立帐户并slaveJava大数据前端python人工智能资料,可:尚硅谷官网Java课程系列在从机上配置需要的主机Slava1Master1,Slava2Master2Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列两个主机互相Java大数据前端python人工智能资料,可:尚硅谷官网J
11、ava课程系列Master2Master1,Master1Master2Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列Master1主机新建库、新建表、insert,Master2和从机如何停止从服务功能如何重新配置主从2、修改Mycat的配置文件schema.xml修改的balance属性,通过此属性配置读写分离的类型Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列为了双从读写分离balance设置为1Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列3、启动Mycat4
12、、验证读写分离Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列5、抗风险能力Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列Master1、Master2互做备机,负责写的主机宕机,备机切换负责写操作,保证数据库读写分离高可用性。第四章垂直拆分分库一个数据库由很多表的,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说分担到不同的库上面,如下图:Java大数据前端python
13、人工智能资料,可:尚硅谷官网Java课程系列系统被切分成了,用户,订单,支付几个模块。4.1如何划分表一个问题:在两台主机上的两个数据库中的表,能否关联?:不可以关联。分库的原则:有紧密关联关系的表应该在一个,相互没有关联关系的表可以分到不同的。Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列以上四个表如何分库?客户表分在一个数据库,另外三张都需要关联,分在另外一个数据库。4.2实现分库1、修改schema配置文件Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列2、新增两个空白库分库操作不是在原来的老数据库上
14、进行操作,需要准备两台分别安装新的数据库3、启动MycatJava大数据前端python人工智能资料,可:尚硅谷官网Java课程系列4、Mycat进行分库第五章水平拆分分表相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图:Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列5.1实现分表1、选择要拆分的表MySQL单表数据条数是有瓶颈的,
16、customer_id(客户id)根据客户id去分,两个节点平均,一个客户的所有订单都在同一个节点Java课程系列5、在数据节点dn2上建orders表6、重启Mycat,让配置生效7、Mycat实现分片5.2Mycat的分片“join”Orders订单表已经进行分表操作了,和它关联的orders_detail订单详情表如何进行join。Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列我们要对orders_detail也要进行分片操作。Join的原理如下图:1、ER表Mycat借鉴了NewSQL领域的新秀
17、FoundationDB的设计思路,FoundationDB创新性的提出了TableGroup的概念,其将子表的位置依赖于主表,并且物理上紧邻存放,因此彻底解决了JION的效率和性能问题,根据这一思路,提出了基于E-R关系的数据分片策略,子表的与所关联的存放在同一个数据分片上。Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列2、全局表在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性:变动不频繁数据量总体变化不大数据规模不大,很少有超过数十万条鉴于此,M
18、ycat定义了一种特殊的表,称之为“全局表”,全局表具有以下特性:全局表的、更新操作会实时在所有节点上执行,保持各个分片的数据一致性全局表的操作,只从一个节点获取全局表可以跟任何一个表进行JOIN操作将字典表或者符合字典表特性的一些表定义为全局表,则从另外一个方面,很好的解决了数据JOIN的难题。通过全局表+基于E-R关系的分片策略,Mycat可以满足80%以上的企业应用开发Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列5.3常用分片规则1、取模此规则为
19、对分片字段求摸运算。也是水平分表最常用规则。5.1配置分表中,orders表采用了此规则。2、分片枚举通过在配置文件中配置可能的枚举id,配置分片,本规则适用于特定的场景,比些业务需要按照省份或区县来做保存,而省份区县固定的,这类业务使用本条规则。Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列3、范围约定此分片适用于,提前好分片字段某个范围属于哪个分片。Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列4、按日期(天)分片此规则为
21、e当前的值。优点:本地加载,速度较快Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列缺点:抗风险能力差,Mycat所在主机宕机后,无法本地文件。2、数据库方式利用数据库一个表来进行计数累加。但是并不是每次生成序列都读写数据库,这样效率太低。Mycat会预加载一部分号段到Mycat的内存中,这样大部分读写序列都是在内存中完成的。如果内存中的号段用完了Mycat会再向数据库要一次。问:那如果Mycat了,那内存中的序列岂不是都没了?是的。如果是这样,那么Mycat启动后会向数据库申请新的号段,原有号段会弃用。也就是说如果Mycat重启
23、java项目里生成全局序列,如下:根据业务逻辑组合可以利用redis的单线程原子性incr来生成序列但,生成需要单独在工程中用java代码实现,还是推荐使用Mycat自带全局序列。第六章基于HA机制的Mycat高可用在实际项目中,Mycat服务也需要考虑高可用性,如果Mycat所在服务器出现宕机,或Mycat服务故障,需要有备机提供服务,需要考虑Mycat集群。Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列6.1高可用方案我们可以使用HAProxy+Keepalived配合两台Mycat搭起Myca
24、t集群,实现高可用性。HAProxy实现了MyCat多节点的集群高可用和负载均衡,而HAProxy自身的高可用则可以通过Keepalived来实现。Java大数据前端python人工智能资料,可:尚硅谷官网编号IP地址名1Mycat128host79.atguigu2Mycat227host80.atguigu3HAProxy(master)26host81.atguigu4Keepalived(master)26host81.atguigu5HAProxy(backup)192
25、.168.140.125host82.atguigu6Keepalived(backup)25host82.atguiguJava课程系列6.2安装配置HAProxy1、安装HAProxyJava大数据前端python人工智能资料,可:尚硅谷官网Java课程系列2、启动验证Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列6.3配置Keepalived1、安装KeepalivedJava大数据前端python人工智能资料,可:尚硅谷官网Java课程系列#修改内容如下!ConfigurationFi
26、leforkeepalivedglobal_defsnotification_xlcocoonnotification_fromkeepalivedsmtp_serversmtp_connect_timeout30router_idLVS_DEVELvrrp_skip_check_adv_addrvrrp_garp_interval0vrrp_gna_interval0vrrp_instanceVI_1#主机配MASTER,备机配BACKUPstateMASTER#所在网卡interfaceens33virtual_router_id51
27、#数值越大优先级越高priority100advert_int1authenticationauth_typePASSauth_pass1111virtual_ipaddress#虚拟IP00virtual_server0048066delay_loop6lb_algorrlb_kindNATpersistence_timeout50protocolTCPJava大数据前端python人工智能资料,可:尚硅谷官网Java课程系列2、启动验证6.4测试高可用1、测试步骤Java大数据前端p
28、ython人工智能资料,可:尚硅谷官网Java课程系列第七章Mycat安全设置7.1权限配置1、user权限目前Mycat对于中间件的连接并没有做太复杂的,目前只做了中间件逻辑库级别的读写权限。是通过server.xml的user进行配置。配置说明Java大数据前端python人工智能资料,可:尚硅谷官网属性说明name应用连接中间件逻辑库的用户名password该用户对应的TESTDB应用当前连接的逻辑库中所对应的逻辑表。schemas中可以配置一个或多个readOnly应用连接中间件逻辑库所具有的权限。true为只读,false为读写都有,默认为fals
29、eJava课程系列测试案例Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列2、privileges权限在user下的privileges可以对逻辑库(schema)、表(table)进行精细化的DML权限控制。privileges下的check属性,如为true开启权限检查,为false不开启,默认为false。由于Mycat一个用户的schemas属性可配置多个逻辑库(schema),所以privileges的下级节点schema节点同样可配置多个,对多库多表进行细粒度的DML权限。Java大数据前端pyth
30、on人工智能资料,可:尚硅谷官网Java课程系列配置说明测试案例Java大数据前端python人工智能资料,可:尚硅谷官网DML权限增加(insert)更新(update)(select)删除(select)00000010可以1110可以1111可以可以可以可以Java课程系列Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列7.2SQLfirewall;firewall下whitehost用来定义IP白,blacklist用来定义用来定义SQL。1、白可以通过设置白,实现某主机某用户可以Mycat,而其他主机用户。Java大数据前端python人工智能资料,可:尚硅谷官网Java课程系列2