一、什么是可扩展性
可扩展性表明了当需要增加资源以执行更多工作时系统 能够获得划算的等同提升的能力。
从较高层次上看是能够通过增加资源来提升容量的能力。
容量:可以认为是处理负载的能力。
二、扩展mysql
2.1规划可扩展性
难点:估算需要承担的负载到底有多少。
2.2为扩展赢得时间
优化性能,购买更强的硬件来争取一些扩展工作的时间
2.3向上扩展
意味着花钱升级硬件。
2.4向外扩展
分为三个部分:复制、拆分和数据分片。
1.按功能拆分
不同的服务器或节点配置不同的应用,每个节点包含这个应用需要的数据即可。
2.数据分片
将数据分成一小片或一块存储到不同的节点。
需要从初始就将单一数据存储结构转为分片结构。
3.选择分区键
尽量选择那些能够避免跨分片查询的,同时也能让分片足够小,以免过大的数据片导致问题。
4.多个分区键
5.跨分片查询
6.分配数据、分片和节点
分片尽可能的小于节点容量,则可以在单节点上部署多个分片。分片小易于管理,数据的备份和恢复都更容易
7.在节点上部署分片
每个分片使用单一数据库。
多个分片的表放到同一个数据库,每个表明包含分片号。
每个分片使用一个数据库,这个数据库包含所有应用需要的表。
每个分片使用一个数据库,并在数据库名和表名中包含分片号。
每个节点上使用多个mysql实例,每个实例上有一个或多个分片,使用上述提到的方式的任意组合安排分片。
8.固定分配
数据分配到分片的方式:固定分配和动态分配,种方法都需要使用一个分区函数,使用行的分区键值作为输入,返回存储该行的分片。
固定分配:仅仅依赖分区键的值。eg:hash函数和取模运算。
优点:简单,开销低,可以在应用中硬编码。
缺点:分片大,数量少,很难平衡不同分片的负载。
无法自定义数据放到哪个分片。修改分配策略较难,因为需要重新分配已有的数据
结论:更倾向于使用动态分配的方式。
动态分配:每个数据单元映射到一个分片,实际上就是维护一套分片的关系。
增加了资源的开销,但是可以更好的对数据存储位置做细粒度的控制。
9.混合固定分配和动态分配
10.显示分配
适用于新插入的数据,开发中极少使用。如果使用,需要将分片号码编码到ID中,防止 主-主 复制主键冲突。
11.重新均衡分片数据
如有必要,可以通过在分片中移动数据来达到负载均衡。但是也要尽量避免重新均衡分片数据,可能会影响用户使用,和增加新特性。
12.生成全局唯一ID
讲一个现有系统转为分片数据存储时,经常需要在多台机器上生成全局唯一ID。
如下几个方法可以生成:
使用auto_jncrement_jncrement和auto_jncrement_offset
全局节点中创建表
使用memcached或Redis
批量分配数字
使用复合值
使用GUID值
13.分片工具
在设计数据分片应用时,首先要做的是编写能够查询多个数据源的代码。需要设计一个抽象层。完成以下任务:
连接到正确的分片并查询
分布式一致性校验
跨分片结果集聚合
跨分片关联操作
锁和事务管理
创建新的数据分片
2.5通过多实例扩展
核心实际上是充分利用服务器的资源,以较低的成本做较高效的设计。
2.6通过集群扩展
1.MYSQL Cluster(NDB Cluster)
2.Clustrix
3.ScaleBase
4.BenieDB
5.Akiban
2.7向内扩展
仅仅作为争取时间的短期策略
设计归档和清理策略时要考虑下面几点:
对应用的影响
要归档的行
维护数据一致性
避免数据损失
解除归档
三、负载均衡
就是尽可能的平均负载量。
负载均衡的目的:
可扩展性
高效性
可用性
透明性
一致性
3.1直接连接
1.复制上的读写分离
常见的读写分离方法:
基于查询分离
基于脏数据分离
基于会话分离
基于版本分离
基于全局版本/会话分离
2.修改应用的配置
通过代码来实现负载均衡,代码要有健壮性和精确性。
3.修改DNS
比较粗糙不太可控
4.转移IP地址
在服务器之间转移虚拟地址。
3.2引入中间件
大部分的负载均衡都会引入中间件作为网络通信的代理。接受请求和派发请求到不同的服务器上。
1.负载均衡器
mysql都是正常的TCP/IP连接,所以可以在MYSQL上使用多用途负载均衡器。但由于缺少Mysql专有的特性,因此会有一些限制。
a.无法真正做到负载均衡,不同功能的服务器的硬件不同就会有差异
b.mysql连接是有状态的,负载均衡器不知道如何把所有从单个http会话发送的连接请求“固定”到一个mysql服务器上。
c.连接池和长连接可能会阻碍负载均衡器分发连接请求。
d.许多负载均衡器只会对http服务器做健康和负载检查。
2.负载均衡算法
常用的算法:
随机
轮询
最少连接数
最快响应
哈希
权重
3.在服务器池中增加/移除服务器
3.3一主多备间的负载均衡
这是最常见的复制拓扑结构。
功能区分
过滤和数据分区
将部分写操作转移到备库
保证备库跟上主库
同步写操作