Mysql集群原理整理

Mysql集群整理

申明一下:这个CSDN的新版编辑器还不大会玩,导致不少编辑效果不够理想,目录主次区分不够明显,还望各位查看时多多担待.ps:当时做毕业设计的论文要是敢这样主次不分,得被导师骂死不可(偷笑)….

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

二. 主从复制架构

这是一主多从架构
这里写图片描述
这是双主双从架构
这里写图片描述
说明:一般情况下,具体架构还得看数据量大小来定,数据量规模较小的情况下,使用一主一从的架构的较多.一主一从的弊端就是容易出现单点故障,一旦主库故障便不能进行写入操作,所以,数据量较大时就需要使用处理高并发的思想来解决问题了,比如:一方面可以做分压处理(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主从复制原理图
MySQL主从复制原理图
说明:简单点讲就是:mysql要做到主从复制,就是A服务把自己所做的增删改的操作全都记录在日志中,B数据库就根据这份日志上面的操作在自己身上再操作一遍,这样就实现了主从复制;

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

四.MyCat中间件管理Mysql集群原理

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

2.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。

3.Mycat主要作用

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

b.数据库分库分表
分库分表是一个词,不能拆分去理解,它指的是对数据的拆分;分库分表分为两种:水平拆分和垂直拆分.
这里仅凭口述我觉得很难叙述清楚,做了两张简单的示意图来说明一下:
这里写图片描述
说明: Mycat的水平拆分是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库服务器上面,这种切分称之为数据的水平切分,也可以称为横向切分.示意图中我按照mycat自动生成的主键id进行了拆分,将其id按照奇数偶数进行拆分了.mycat自身还定义了其他几种水平拆分策略,例如按时间戳拆分等等.

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

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

关于水平拆分这里再放个举例:水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图:
这里写图片描述

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值