负载增加时,有两个解决办法。一个是购买更加强大的服务器来应对增加的负载,称为“纵向扩展”(scale up);二是添加更多的服务器,称为“横向扩展”(scale out)。横向扩展更常用,更具有成本效益。
横向扩展和复制的常用用途有:
1、读操作的负载均衡。
2、写操作的负载均衡。按信息角色分发,很少更新的表放在一个服务器,频繁更新的表分割到多个服务器上面;按地理区域分割,流量直接定向到最近的服务器。
3、热备份进行灾难避免。配置专门的salve作为热备份。
4、远程复制进行灾难避免。
5、制作备份。在完全不影响master的前提下执行备份。
6、生成报表。创建数据报表会降低服务器性能,影响较大,后台作业可以专门salve执行。
横向扩展只能扩展读操作,不能扩展写操作。分片(sharding)的技术扩展写操作。
同步复制要求master必须等待所有slave的写操作完成。需要额外的同步机制来保证一致性,一般通过两阶段提交(two-phase commit)协议来实现。协议之所以慢,是因为需要4次消息传递,包括事务消息和准备请求的消息,master的提交会被阻塞直到所有slave确认事务。异步复制只需要一条事务消息即可。
异步复制其实是牺牲一致性为代价换取性能。有两个问题:1、master出现故障,事务就会消失;2、slave执行的查询可能返回旧数据。
简单拓扑和树形拓扑用于横向扩展,双主拓扑用于故障转移,环形拓扑和双主结构允许站点本地允许时还能将变更复制到其他站点。
级联复制,添加额外的slave作为中继salve,通过管理一群slave来减轻master上的复制负载。普通salve需要将变更应用到数据库,但不写入二进制日志。relay需要写入二进制日志,但不应用变更。realy使用blackhole引擎,relay会产生额外延迟。
过滤复制事件
1、master上过滤事件,master过滤器,控制哪些被写入二进制日志。无法使用PITR准确恢复数据库。binlog-do-db、binlog-ignore-db,多个数据库需要重复使用选项。
2、salve上过滤事件,slave过滤器,控制哪些在slave上执行。所有变更通过网络传送,浪费带宽。可以过滤数据库,还可以过滤单个表以及使用通配符过滤一组表。replicate-do-db、replicate-ignore-db、replicate-do-table=dbname.tablename、replicate-ignore-table=dbname.tablename、replicate-wild-do-table、replicate-wild-ignore-table。
担心网络流量,可以在master保存完整二进制日志,relay过滤,减少流量。
数据的一致性管理
mysql5.6引入了全局事务标识符(GTID),master上提交的事务做个标记,等slave获取到这个事务时才在slave上执行查询。
级联部署一致性,,第一是利用全局事务标识符来提升slave,并反复轮询slave有没有处理这个事务;第二是利用函数master-pos-wait函数将maeter到salve路径上的relay都连接起来,保证所有变化都能传递到salve。