Mysql主从复制及读写分离

Mysql主从复制及读写分离

一、Mysql5.7的版本优势;
1.安全性:
MySQL数据库初始化完成以后,会产生一个 [email protected] 用户,从MySQL 5.7开始,root用户的密码不再是空,而是随机产生一个密码;
MySQL官方已经删除了test数据库,默认安装完后是没有test数据库的;
提供了更为简单SSL安全访问配置,并且默认连接就采用SSL的加密方式;
可以为用户设置密码过期策略,一定时间以后,强制用户修改密码;
ALTER USER ‘jeffrey’@‘localhost’ PASSWORD EXPIRE INTERVAL 90 DAY;
可以”锁”住用户,用以暂时禁用某个用户;
ALTER USER ‘jeffrey’@‘localhost’ ACCOUNT LOCK;
ALTER USER l ‘jeffrey’@‘localhost’ ACCOUNT UNLOCK;

2.灵活性:
JSON:随着非结构化数据存储需求的持续增长,各种非结构化数据存储的数据库应运而生(如MongoDB)。从最新的数据库使用 排行榜 来看,MongoDB已经超过了PostgreSQL,其火热程度可见一般。各大关系型数据库也不甘示弱,纷纷提供对JSON的支持,以应对非结构化数据库的挑战。MySQL数据库从5.7.8版本开始,也提供了对JSON的支持。其使用方式如下:
CREATE TABLE t1 (jdoc JSON);
INSERT INTO t1 VALUES(’{“key1”: “value1”, “key2”: “value2”}’);
MySQL支持JSON以后,总是避免不了拿来与MongoDB进行一些比较。但是,MySQL对JSON的支持,至少有两点能够完胜MongoDB:
1.可以混合存储结构化数据和非结构化数据,同时有关系型数据库和非关系型数据库的优点;
2.能够提供完整的事务支持:generated column是MySQL 5.7引入的新特性,所谓generated column,就是数据库中这一列由其他列计算而得;

3.易用性:
sys schema是MySQL 5.7.7中引入的一个系统库,包含了一系列视图、函数和存储过程, 该项目专注于MySQL的易用性;
例如,我们可以通过sys schema快速的知道,哪些语句使用了临时表,哪个用户请求了最多的io,哪个线程占用了最多的内存,哪些索引是无用索引等;

4.性能:
临时表的性能改进:
加速连接处理:在MySQL 5.7之前,变量的初始化操作(THD、VIO)都是在连接接收线程 里面完成的,现在将这些工作下发给工作线程,以减少连接接收线程的工作量,提高连 接的处理速度。这个优化对那些频繁建立短连接的应用,将会非常有用。
复制性能的改进:复制延迟是Mysql很大的问题之一,MySQL 5.7版本已经支持”真正”的 并行复制功能。MySQL 5.7并行复制的思想简单易懂,简而言之,就是”一个组提交的 事务都是可以并行回放的”,因为这些事务都已进入到事务的prepare阶段,则说明事 务之间没有任何冲突(否则就不可能提交)。这里需要注意的是,为了兼容MySQL 5.6 基于库的并行复制,Mysql提供了两个特定了变量;

二、数据库集群的概述;
数据库发展阶段:

Mysql数据库存在的瓶颈:
CPU瓶颈:Mysql在单个事务查询中只能使用一个CPU,而且他多CPU支持的不好,多加了也没用,所以我们要提高CPU速度,这里我们简单理解为提高CPU主频,当然64位架构会更佳(即64位OS配合64位的CPU)。
I/O瓶颈:I/O瓶颈发生在装入数据远大于内存容量的时候,磁盘的I/O读写性能有限,当读写速度远不及数据处理时,可以改变磁盘的存储性能(通过物理或逻辑方式RAID),使用类似DRBD等块复制的磁盘方式;

三、Mysql数据库的主从复制;
概述:单台mysql数据库服务器,需要承载客户端的读取和写入操作的请求,那么若客户端请求过多,服务器会不堪重负,那么可以选择Mysql数据库集群的方式来增加Mysql服务处理数据的效率,像web集群一样,但是不得不考虑的是多台Mysql数据库之间数据的一致性;Mysql主从复制及读写分离

Mysql主从复制及读写分离

主从复制过程原理:
1、在每一个事务更新之前,Master在二进制日志记录这些改变,写入二进制日志完成后,Master通知存储引擎提交事务;
2、Slave将Master的Binary log复制到其中继日志,首先Slave开始一个I/O线程,I/O线程在Master的Binary log中读取事件,如果已经跟上Master,他会睡眠并等待Master产生新的事件,I/O线程将这些事件写入到中继日志Relay log,中继日志通常存放在OS的缓存中,所以开销较小;
3、Slave中的Sql线程在中继日志Relay log中读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致;
注:复制过程中,Slave中的数据复制是串行化的,并行操作无法在Slave上实现(复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作);

复制类型:
1、基于语句的复制:在主服务器上执行的sql语句,在从服务器上同样也会执行,mysql默认选用基于语句的复制,效率比较高,MySQL 5.0及之前的版本仅支持基于语句的复制(也叫做逻辑复制,logical replication),这在数据库并不常见。master记录下改变数据的查询,然后,slave从中继日志中读取事件,并执行它,这些SQL语句与master执行的语句一样。;
2、基于行的复制:把改变的内容复制过去,而不是把命令重新执行一遍;
3、混合类型的复制:默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行;

主从复制方式:
基于二进制文件:二进制日志文件;
基于GTID方式:全局事务标示符,自5.6版本开启的新型复制方式,GTID的组成:前面是server_uuid:后面是一个***
例如:server_uuid:sequence number
7800a22c-95ae-11e4-983d-080027de205a:10
UUID:每个mysql实例的唯一ID,由于会传递到slave,所以也可以理解为源ID。
Sequence number:在每台MySQL服务器上都是从1开始自增长的序列,一个数值对应一个事务。
工作过程:
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的I/O 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
6、在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。
优势:
1、更简单的实现failover,不用以前那样在需要找二进制日志文件log_file和位置值log_pos。
2、更简单的搭建主从复制。
3、比传统的复制更加安全。
4、GTID是连续的没有空洞的,保证数据的一致性,零丢失。
5、slave无需知道master的pos值和日志文件值,只需要知道master的ip、用户名、密码即可;

四、Mysql数据库的读写分离;
读写分离架构:
Mysql主从复制及读写分离

实现方式:
1.基于程序代码内部实现:
在代码中根据select和insert进行路由分类,性能比较好,无需任何硬件代理条件,缺点是需要开发人员的编写,运维人员无从下手;
2.基于中间代理层实现:
在客户端与数据库间添加代理层,代理服务器接收到客户端的请求之后,判断请求后,转发给后端的数据库;
mysql-proxy:为mysql的开源项目,但是mysql官方不建议将其引用在生产环境中;
amoeba:变形虫,由陈思儒开发,Java语言编写而成,再生产环境中amoeba代理层软件是一个不错的选择;