第一章 MySQL高可用架构
第一节 MySQL高可用描述
1. 高可用是什么
高可用(High Availability)
l 应用提供持续不间断(可用)的服务的能力
l 系统高可用性的评价通常用可用率表示
三个9是一般的网站的基本要求
2. 造成不可用的原因
l 硬件故障(各种)
l 预期中的系统软硬件维护
l 软件缺陷(应用代码,服务程序都可能存在bug…)
l 攻击,泄露,人为失误..等安全事件
l 对于系统来说,不可用时间是各关键组件不可用时间的总和…
3. 提高可用性的主要手段
l 冗余,Redundancy
l 关键软硬件通过备用冗余避免故障时长时间的不可用
l 数据软件,硬件,存储的数据,都需要通过冗余确保故障时可替换
第二节 MySQL高可用常见方案
1. 数据库冗余与可用性
l 数据库服务在冗余实现上有其特殊性
n 数据:服务“有状态”与数据冗余
l 实现方式多种多样,同一种数据也会有多种实现方案
n 数据可用性:主从复制,备份恢复
l 可用性目标循序渐进:
l 任何故障都不会造成数据丢失->可以较快速恢复服务(高可用)
2. 目前数据库高可用实施方案。
l MySQL -基于共享存储的单活方案(比较扯)——非常昂贵
技术目标上,非常稳健非常可靠
l MySQL -基于存储复制的数据冗余单活(不常用)
l MySQL -基于MySQL主从复制(常用,普适)
通过binlog的传递和恢复来做到主从服务器的一致
l 基于集群提交通信协议的多主复制(一定场景适用)
3. MySQL主从复制高可用方案需要改进的问题
l 主从服务器各自有IP地址,发生主从切换后应用需要修改重启
l 人工判断主库是否故障再发起切换需要花较多时间
l 主从复制存在客观延迟,切换后可能造成事务数据丢失
MySQL主从复制高可用方案改进
l 为了避免应用人工修改切换IP引入VIP漂移方案
用户不再直接去访问主库的IP,而是在网卡上绑定虚拟IP
l 为了避免应用人工修改切换IP引入VIP漂移方案
主库错误:在主库上把IP注销掉,在从库上把IP注册上;
主库失去访问了,直接在从库上把虚拟IP注册上
l 为了减少人工介入处理的时间开销引入自动探活处理机制
l 高可用中间层与RDS
u VIP解决应用切换问题
u 监控和管理服务器解决自动判断故障切换和VIP漂移
u VIP管理+探活+主从关系切换=高可用中间层
u 云环境+高可用中间层+底层数据库=一种PaaS =基本RDS
腾讯,阿里提高了一些RDS
l 高可用中间层
l MHA
u 自动选择复制延迟最小的从节 点并试图补全日志(但大部分主机故障情况下不通)
u 通常要求两从以上,会进行主从关系切换
u 不提供VIP管理方案
n MMM
u 提供 了基本的VIP管理功能
u 适合双主配置的一对主机不会主动切换主从关系
u 不支持主从数据延迟判断和补全
4. MySQL主从复制延迟
l 日志传输延迟上why?
日志传输烟草-what?
MySQL半同步:
5. 较完善的MySQL高可用方案
l 半同步复制+高可用中间层+ VIP管理方案
例如:
l 半同步复制+ MHA + Keepalive
l 半同步复制+ RDS
第三节 MySQL高可用框架MHA
1. MySQL高可用框架-MHA
l 用一个管理节点监控后端数据库主库可用性
l 提供VIP漂移接口,不提供具体方法
l 提供补全从库日志的脚本
2. MHA的安装步骤
1.规划
2.配置服务器间域名和ssh互信访问
3.在manager节点安装MHA node和manager组件及其依赖包
4.在数据库服务器安装MHA node组件及其依赖包
5.配置VIP管理脚本masterip_failover和master_ip_online_change
6.配置MHA配置文件mha_manager.cnf
7.数据库配置主从,添加mha连接用户…etc.
8.启动MHA开始监控数据库主从集群
第二章 MySQL读写分离
第一节 MySQL读写分离概述
1. 什么是读写分离
读写分离:
在高并发查询场景下,为了满足应用访问需求,通常都会部署多个从库提供查询服务以提升数据库查询的扩展性,将查询分发到从库,让从库分担主库查询负载的技术我们通常称为读写分离
2.什么时候需要读写分离
提升数据库查询扩展性
保护主库
提升资源利用
应用端:
服务器端:
3. 读写分离的主要问题:
l 数据可能丢失
l 部署,实现相对复杂
第二节 MySQL读写分离常见手段
1. MySQL读写分离方案介绍
常用的读写分离方案∶
l MySQL Proxy ——MySQL官方自己开发的一款
l Amoeba For MySQL
l MySQL Router ——MySQL官方
l 应用端实现
MySQL Proxy
l MySQL Proxy是MySQL官方开发的一款读写分离中间件,开发多年一直未GA,在功能上存在许多缺陷,目前官方已经放弃开发
使用C/C++开发服务模块
使用lua脚本语言分析sql语句进行读写分离
MySQL Proxy (Atlas)
Atlas是360公司开发改进的一款MySQL Proxy分支,基于MySQLProxy0.8.2,修正大量bug,并添加许多使用功能。已经大规模运行于360公司的各种业务中,经过线上大并发业务考研,也有许多其他公司在使用,开发者与使用者比较活跃
Amoeba for MySQL
Amoeba是类似MySQL Proxy的中间件,采用java语言编写,具有读写分离、数据切分和过滤等功能,是非常早的一款国MySQL分读写离软件
l 支持读写分离
l 支持数据拆分
l 对事务支持不好
l 数据拆分比较简单
MySQL Router
MySQL Router是MySQL官方开发的一款一个轻量级的用来实现高可用和扩展性的中间件,支持读写分离负载均衡,支持跟MySQL Fabric一起使用,刚GA,稳定性等还有待考验
l MySQL Router提供2个端口,读写个只读端口
读写端口: first available
只读端口: round robin
2. MYSQL Proxy (Atlas)部署
第三章 MySQL分布式架构
第一节 MySQL分布式架构
1. 常见的分布式数据库架构
分布式数据库
l 区别单机,不因单台服务器的性能瓶颈上限
l 一般由管理节点台机器、计算节点、数据节点组成
l 数据节点统一由分布式数据库管理节点控制
分布式数据的分类
Shared Nothing vs Shared Anyhing
Shared Nothing ——MySQL Cluster 是MySQL官方提供的分布式方案
Shared Anyhing
2. MySQL分布式架构
l 分布式事务处理与XA协议
l MySQL分布式事务处理
l MySQL分布式事务的局限与改进
分布式事务
l Distributed(XA) Transactions
l 2pc(Two Phase Commit)Transactions
2. 掌握MySQL分布式架构
MySQL的分布式事务
什么是分布式事务处理分布式事务一般包括3个部分∶
l APP
—般指事务的发起者
l Resource Manager,RM
资源管理器RM,主要是提供外部程序进行资源共享访问
l Transaction Manager/Coordinator(TM or TC)
TM或者TC是事务的协调者,对于分布式事务,在提交时,可能有部分节会提交失败,这个时候,需要TC来决定哪些事务需要重新提交,哪些事务需要回滚。
XAln MySQL
l Only a Resource Manager
l InnoDB Only: innodb_support_xa
MySQL XA事务的局限
l 客户端退出,prepare状态的XA事务被回滚
n 根据分布式事务的原理,所有prepare成功的事务都应该被提交,有下面一个客户端操作∶
xa start’111’;
insert into t values(1);
xa end ‘111’;
xa prepare’111’;
l Server Crash后重启,提交prepare的事务
l Server Crash后重启,提交prepare的事务,造成主从数据不一致
为什么一直没有人修复
看似简单,其实解决代价很大
MySQL的XA事务用的真不多,官方觉得没必要
第二节 MySQL开源分布式软件MyCat
1. Mycat项目介绍
l Mycat的由来
n Java语言编写
n JDK版本要求>1.7版本
n 基于阿里的cobar实现,完全兼容MySQL协议
n 有专业的维护团队,更新频繁,文档写的比较好
n 功能较为完善
n 分布式事务支持的不够好
n 支持各种数据库:MySQL、Oracle、MongoDB
n 目前不支持在线水平扩容
n 要做MySQL界的Tomcat
2. Mycat架构
3. Mycat功能特点
Mycat的功能特点
l 数据拆分,丰富的拆分策略,数据库水平扩容。
枚举算法
Range算法
Hash取模算法
l 读写分离,支持用户友好的读写分离策略
l 兼容MysQL协议,用户可以以最小的代价接入Mycat
Mycat里面的重要概念
全局ID
MySQL : auto increment
Mycat : global sequnce number
Mycat的全局ID
l 基于文件
基于文件实现
l 基于数据库
l 基于本地时间戳
l
4. Mycat的部署与安装
l MyCat的重要概念
n DataHost
n DataBase Node (DBN)
n 分区规则
n 分区键
启动mycat:
第四章 MySQL新发展
第一节 MySQL新版本特征