伸缩性与高可用性
性能:应用满足某一目标的能力负载能力:应用能够处理的总负载
伸缩性:应用通过各种方式增大时,能够继续保持原来的性能
可用性:应用响应请求时间的百分比
容错性:应用和整个系统从容的处理错误故障的能力
伸缩性
1.规划伸缩性
伸缩性较差的表现:查询缓慢,工作量从CPU密集切换到IO密集,并发查询的竞争,延迟越来越大原因是查询复杂度增加,部分不被使用的数据或索引仍占据内存
规划事项:
1、应用架构是否具备完整的功能
2、负载峰值是多少3、如果系统中每一部分处理负载,如果其中一部分发生故障时怎么办
2.前期办法
性能优化购买服务器
3.向上扩展
通过升级来获取伸缩性不是很好的办法4.向外扩展
常见办法:
1、通过集群分散到各个服务器,使用从服务器来处理读取查询。(缺点重复缓存)
2、将工作量分布到各个节点上。一个节点就是MySQL架构中一个功能单元。没有做冗余和高可用性规划,一个节点可能是一台服务器
带有容错能力的冗余系统,节点会是:
1.主主双机结构,一台主动服务器和一台被动服务器
2.一主多从3.一台主动服务器,一个分布式数据块复制设备做备用
4.一个基于存储区域网络的集群
分布到各个节点上的方法:
功能拆分
各个节点完成不同的功能
数据分块
把数据分成一小块,存储在不同的MySQL节点上
要扩展应用的写操作的负载能力,必须切分数据
对最重要最常用的查询数据做尽量少的分块
通过选择分割键来实现数据块分割
需要解决跨分块查询,可以借助汇总表,遍历所有数据分块把遍历结果作为冗余数据存放在改分块上,也可以放在另外的数据存储上
也需要解决数据的一致性
可以让数据分块的大小比节点的容量小,一个节点可以放多个数据分块
在节点上布置数据分块:
1、每个数据分块使用一个独立数据库,每个数据库都同名
2、把表的几个数据分块放在一个数据库中,把数据分块的号码写在表的名称里3、每个数据分块都有一个独立的数据库,把所有应用的表都放在数据库里,把数据分块的号码写在数据名称里。
4、每个数据分块使用独立的数据库,把数据分块的号码写在数据库名和表的名称里
数据分块的方法:
1.固定分配
2.动态分配都需要一个分配函数,读入一行的分配键,然后返回这行数据该被放置的数据分块
固定分配:只依赖一个分配键。好处是简单,开销低。确定是难在分块间做平衡,无法确定每一份数据放在哪个分块上,更改数据分块比较困难。
动态分配:每个数据分块单独处理。好处对数据的存储可以做精细的控制,数据分块间不平衡
数据分块的重平衡:比较好的策略是把新数据随机分配到一个数据分块上,当一个数据分块满了,就设置一个标志,表示不能再接受新数据了,等数据分块的容量扩大后,在把标志移除。
当把现有系统转化为数据分块存储系统时,会在不同的机器上生成全局唯一ID,可以使用auto_increment_increment和auto_increment_offset来解决
回缩
设计归档和删除数据策略1.要在不影响事务处理的情况下,把数据从重负载的服务上移走。关键是要有效找到要移除的行,一次一小块的移除
2.当知道一些数据不会再被使用后,可以把它们删除或归档
3.归档时要确定从哪个表先开始,避免数据丢失和解归档的数据
4.保证归档数据的隔离。隔离活跃数据和不活跃数据方法:分表,分区,以时间为基础的数据分区
负载平衡
基本目标:可伸缩性,高效性,可用性,透明性,一致性在复制上分离读写:
1、以查询为基础的分离,把所有写操作和不接受旧数据的读操作放在主服务器,其他读操作放在从服务器
2、旧数据分离,额外工作检查从服务器的迟滞程度,然后决定这些数据对于读操作是否“陈旧”3、以session为基础的分离,用户对数据有过更新,就在session层设置一个标志,用户执行读查询时,就会到主服务器上读取数据
4、以版本为基础的分离,通过版本号和时间戳来跟踪对象,根据从服务器上读取对象的版本号或时间戳来判断数据是否新的。太旧了,就从主服务器上读取并更新
5、全局版本/会话分离,执行写操作时,在事务提交后运行SHOW MASTER STATUS,把主服务器的日志坐标作为更新后对象和会话版本号放在缓存里。连接到从服务器时,运行SHOW SLAVE STATUS,用从服务器上参数与先前保存的版本比较。如果从服务器上的版本至少有一个编号高于主服务器提交事务后得到的版本号,就说明从服务器上的数据可以读取。
都需要监控从服务器的滞后时间,来决定从哪个服务器上读取数据。
负载平衡在MySQL上的局限:
1.并不能真正的为分布式请求做到负载平衡,除非知道MySQL的真实负荷
2.不能把所有连接请求从一个HTTP会话“粘贴”到一台MySQL服务器上,导致了效率下降3.连接池和持久性连接会阻碍负载平衡器分发连接请求的能力
4.MySQL服务器在3306端口不会接受任何HTTP请求,负载平衡器无法进行健康和负载检查
负载算法:随机,轮询,最少连接优先,最快响应优先,hash,权重
高可用性
主要建立冗余机制,当系统某部分故障时,能进行在线替换最重要原则是要发现和消除系统里会导致全盘崩溃的最薄弱环节
增加冗余的方式:增加备用的能力和组件的复制
1.增加备用能力可以通过创建服务器集群或者服务器池,并增加一个负载平衡方案
2.备用服务器访问主服务器数据,1)共享存储架构(适合InnoDB或其他事务性存储引擎)2)复制磁盘架构(常用DRBD),只能在主动-被动模式下运行
故障转移和故障恢复
1.提升一个从服务器或者切换角色
2.虚拟IP地址或IP接管
3.MySQL主-主复制管理工具
4.中间件解决方案,使用代理,端口转发,NAT,硬件复制平衡器来处理故障转移和故障切换
5.在应用中处理故障转移