MyCat+Mysql集群整理

Lison <cundream@163.com>, v1.0.0, 2019.07.10

MyCat+Mysql集群整理

主从复制概述

在实际生产中,数据的重要性不言而喻,提供安全可靠的数据保障是技术与运维部门的职责所在;如果我们的数据库只有一台服务器,那么很容易产生单点故障的问题,比如这台服务器访问压力过大而没有响应或者奔溃,那么服务就不可用了,再比如这台服务器的硬盘坏了,那么整个数据库的数据就全部丢失了,这是重大的安全事故;为了避免服务的不可用以及保障数据的安全可靠性,我们至少需要部署两台或两台以上服务器来存储数据库数据,也就是我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障了,其他服务器依然可以继续提供服务;主从复制是指服务器分为主服务器和从服务器,主服务器负责读和写,从服务器只负责读,主从复制也叫 master/slave,master是主,slave是从;

复制架构

这是一主多从架构

[外链图片转存失败(img-f2wSRZl0-1563170832355)(..\typora-user-images\1562730355537.png)]
这是双主双从架构

[外链图片转存失败(img-dfF8x7sy-1563170832356)(..\typora-user-images\1562730540289.png)]
说明

一般情况下,具体架构还得看数据量大小来定,数据量规模较小的情况下,使用一主一从的架构的较多.一主一从的弊端就是容易出现单点故障,一旦主库故障便不能进行写入操作,所以,数据量较大时就需要使用处理高并发的思想来解决问题了,比如:一方面可以做分压处理(Nginx集群,MySql集群等等),一方面可以做异步处理,用时间换空间(ActiveMQ消息队列).MySql高并发的处理方案就是多主多从,可以极大地提高数据库的容灾能力.

主从复制原理

  1. 当 master 主服务器上的数据发生改变时,则将其改变写入二进制日志文件中;
  2. salve 从服务器会在一定时间间隔内对 master 主服务器上的二进制日志进行探测,探测其是否发生过改变;
  3. 如果探测到 master 主服务器的二进制日志发生了改变,则开始一个 I/O Thread 请求 master 二进制事件;
  4. 同时 master 主服务器为每个 I/O Thread 启动一个dump Thread,用于向其发送二进制事件;
  5. slave 从服务器将接收到的二进制事件保存至自己本地的中继日志文件中;
  6. salve 从服务器将启动 SQL Thread 从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致;
  7. 最后 I/O Thread 和 SQL Thread 将进入睡眠状态,等待下一次被唤醒;

MySQL主从复制原理图

[外链图片转存失败(img-OIDjB6mZ-1563170832357)(..\typora-user-images\1562730668874.png)]MySQL主从
说明:简单点讲就是:mysql要做到主从复制,就是A服务把自己所做的增删改的操作全都记录在日志中,B数据库就根据这份日志上面的操作在自己身上再操作一遍,这样就实现了主从复制;

如果在不使用中间件mycat的情况下,需要使用spring框架提供的AbstractRoutingDataSource类,通过重写它的方法,可以实现数据源的切换.

MyCat中间件管理Mysql集群原理

Mycat背景

Mycat的前身是阿里巴巴大名鼎鼎的Cobar,Cobar在开源了一段时间后,就没有再维护了,阿里巴巴放弃了该项目,再加上Cobar在使用过程中也发现存在一些比较严重的问题;2013年有人对Cobar这个项目进行了改进,并命名为Mycat,这就是MyCat的诞生。后来,越来越多的开源爱好者加入到MyCat的开发中,它是完全开源的,不属于任何商业公司。Mycat发展成为一个由众多软件公司的实力派架构师和资深开发人员维护的社区型开源软件, 2014年Mycat首次在上海的《中华架构师》大会上对外宣讲,更多的人参与进来,随后越来越多的项目采用了Mycat;截至2015年11月,超过300个项目采用Mycat,涵盖银行、电信、电子商务、物流、移动应用、O2O的众多领域和公司;MyCat开源组织致力于开发高性能数据库中间件而努力,永不收费,永不闭源,持续推动开源社区的发展;

Mycat简介

Mycat是一个开源数据库中间件;是一个实现了MySQL协议的的数据库中间件服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生(Native)协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信;Mycat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在Mycat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

简单理解就是: Mycat就是一个近似于MySQL的数据库服务器,你可以用连接MySQL的方式去连接Mycat(除了端口不同,默认的Mycat端口是8066而非MySQL的3306),大多数情况下,可以用你熟悉的对象映射框架比如MyBatis操作Mycat。

Mycat主要作用

数据库的读写分离

也就是通过Mycat可以自动实现写数据时操作主数据库,读数据时操作从数据库;从而实现读写分离,当主出现故障后,mycat自动切换到另一个主上,进而提供高可用的数据库服务,当然我需要部署多主多从的模式.

数据库分库分表

分库分表是一个词,不能拆分去理解,它指的是对数据的拆分;分库分表分为两种:水平拆分和垂直拆分.
这里仅凭口述我觉得很难叙述清楚,做了张简单的示意图来说明一下:
[外链图片转存失败(img-HhbryHNa-1563170832377)(D:\alc\work\个人文档\document\typora-user-images\1562734341865.png)]

说明

Mycat的水平拆分是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库服务器上面,这种切分称之为数据的水平切分,也可以称为横向切分.示意图中我按照mycat自动生成的主键id进行了拆分,将其id按照奇数偶数进行拆分了.mycat自身还定义了其他几种水平拆分策略,例如按时间戳拆分等等.

水平拆分的好处就是分压,假设原有数据1000w条操作,只在一张表上进行的话,效率会受到极大地影响,而将原数据表按拆分策略拆分为几张表之后,就可以更快地完成操作(每张表可以分担500w条操作).一般的项目比较少的会使用这个,因为一张表就有数十千万的数据量不多见,像淘宝,京东这类使用这种拆分最适合的.水平拆分适合数据量巨大的单表.当然,水平拆分也要注意一些问题,如下.

使用水平拆分时应注意一下几点:
1.使用水平拆分时只能按照mycat所规定的拆分方式进行拆分,比如:如果你使用UUID或者其他自定义的主键则无法使其自动进行拆分了,会产生矛盾.
2.当然,如果只是进行读写分离操作则无影响,可以使用自定义的主键.

关于水平拆分这里再放个举例:水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图:
[外链图片转存失败(img-3HLgpb6M-1563170832387)(..\typora-user-images\1562734205931.png)]

[外链图片转存失败(img-qiqnCM1l-1563170832389)(..\typora-user-images\1562734769191.png)]
说明

Mycat的垂直拆分是按照不同的表来切分到不同的数据库服务器之上,这种切可以称之为数据的垂直切分,也可以称为纵向切分;大多数项目的分库分表都会使用这个方案,方便管理.一般是按照业务维度进行数据库表的切分;把相同类型的表放在一个数据库,另一些表放在另一个数据库;也就是在不同库建不同表,把表分散到各个数据库.

相信看到表之后,我不用过多解释,也能明白什么意思,假定每个类型的表都有N张,将他们按照所属类型分别存放到不同的数据库中,这样就是垂直拆分,最常使用的一种数据库分库分表方案.

Mycat工作原理

Mycat的原理并不复杂,复杂的是代码。Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分
片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户

[外链图片转存失败(img-9uwGBT6J-1563170832394)(..\typora-user-images\1563160938866.png)]

利用MyCAT实现MySQL的读写分离、主从切换、分库分表的操作记录

Mycat实现Mysql主从复制,其中写操作在master主节点上执行,包括insert,delete,update 语句操作;读操作在slave节点上执行,只有select语句操作,其他操作均由主master的二进制文件决定;MyCat支持双主多从,多主多从情况需要配置多个writeHost兄弟节点,多个readHost节点即可!

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

[外链图片转存失败(img-SAuWyZsc-1563170832398)(..\typora-user-images\1563161069400.png)]

MyCat安装

环境: CentOS7, JDK1.8

MyCat 使用 Java 开发,因此,运行 MyCat ,一定要具备 Java 环境,配置 Java 运行环境这个比较容易,网上资料也很多,我就不详细介绍了。

Java 环境安装好之后,首先下载 MyCat

http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz

下载完成后,对下载文件进行解压。

    tar -zxvf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz

解压成功后,会出现一个 mycat 目录,进入到 mycat/conf 目录,对 mycat 进行配置:

MyCat相关配置参数解释

server.xml文件简单说明

server.xml文件其实跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等,因此在这里简单说明

       <user name="bobo">
                <property name="password">bo@123</property>
                <property name="schemas">mycat/property>
 
                <!-- 表级 DML 权限设置 -->
                <!--
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>
                 -->
        </user>
 
        <!--                         #注意,由于这里只定义了一个标签,所以把多余的都注释了。如果这个打开,也需要将TESTDB库改为和上面一样的mycat库名。
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
        </user>
       -->
</mycat:server>


重点关注上面这段配置,其他默认即可。
=======================================
参数           说明
user          用户配置节点
name          登录的用户名,也就是连接Mycat的用户名。
password      登录的密码,也就是连接Mycat的密码
schemas       数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs
privileges    配置用户针对表的增删改查的权限
readOnly      mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false。
=======================================
我这里配置了一个账号boo,密码为bo@123,逻辑数据库为mycat,这些信息都可以自己随意定义,读写权限都有,没有针对表做任何特殊的权限。
注意:
- server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息。
- 逻辑库名(如上面的mycat,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
- 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!


schema.xml 说明

schema.xml是最主要的配置项,此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!

MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!

schemaxml文件中配置的参数解释

参数            说明
schema         数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应
dataNode       分片信息,也就是分库相关配置
dataHost       物理数据库,真正存储数据的数据库

配置说明

name属性唯一标识dataHost标签,供上层的标签使用。
maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的
writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。
minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小。

每个节点的属性逐一说明

schema:
属性             说明
name               逻辑数据库名,与server.xml中的schema对应
checkSQLschema     数据库前缀相关设置,建议看文档,这里暂时设为folse
sqlMaxLimit    select 时默认的limit,避免查询全表

table

属性             说明
name               表名,物理数据库中表名
dataNode       表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
primaryKey     主键字段名,自动生成主键时需要设置
autoIncrement      是否自增
rule               分片规则名,具体规则下文rule详细介绍

dataNode

属性             说明
name               节点名,与table中dataNode对应
datahost       物理数据库名,与datahost中name对应
database       物理数据库中数据库名

dataHost

属性             说明
name               物理数据库名,与dataNode中dataHost对应
balance            均衡负载的方式
writeType      写入方式
dbType             数据库类型
heartbeat      心跳检测语句,注意语句结尾的分号要加

schema.xml文件中有三点需要注意:balance=“1”,writeType=“0” ,switchType=“1”
schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种

balance="0":      不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上。
 
balance="1":      读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与
                   select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,
                   S2 都参与 select 语句的负载均衡
 
balance="2":      读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发。
 
balance="3":      读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,
                   writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性,负载均衡类型,目前的取值有 3 种

writeType=``"0"`   `所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType=``"1"`   `所有写操作都随机的发送到配置的 writeHost。
writeType=``"2"`   `没实现。

对于事务内的SQL默认走写节点

以 /*balance*/ 开头,可以指定SQL使用特定负载均衡方案。例如在大环境开启读写分离的情况下,特定强一致性的SQL查询需求;
slaveThreshold:近似的主从延迟时间(秒)Seconds_Behind_Master < slaveThreshold ,读请求才会分发到该Slave,确保读到的数据相对较新。
 
schema.xml中的writeType的取值决定了负载均衡对写操作的处理:
writeType="0":所有的写操作都发送到配置文件中的第一个write host。(第一个write host故障切换到第二个后,即使之后修复了仍然维持第二个为写库)。推荐取0值,不建议修改.

主从切换(双主failover):switchType 属性

如果细心观察schem.xml文件的话,会发现有一个参数:switchType,如下配置:
 <dataHost name="237_15" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"switchType="1"  slaveThreshold="100">
 
参数解读
switchType="-1":  不自动切换
switchType="1":   默认值,自动切换
switchType="2":   基于MySQL主从同步的状态来决定是否切换。需修改heartbeat语句(即心跳语句):show slave status
switchType="3":   基于Mysql Galera Cluster(集群多节点复制)的切换机制。需修改heartbeat语句(即心跳语句):show status like 'wsrep%'

dbType属性

指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。例如:mongodb、oracle、spark等。

配置案例
双主多从
[外链图片转存失败(img-t2ER2PZw-1563170832403)(..\typora-user-images\1563170100565.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值