性能和扩展
响应时间和吞吐量
一个完整的事务响应时间由下面几部分组成:
- 数据库连接获取时间。
- 通过线路发送sql语句花费的时间。
- 所有sql执行的时间。
- 将执行结果发送回客户端的时间。
- 事务因为应用更高级别的计算占用,而在释放连接前空闲的时间。
其总时间计算公式如下:
T = t(acq) + t(req) + t(exec) + t(res) + t(idle)
吞吐量是一段时间内处理事务的数量。通常来说增大连接数,系统的吞吐量也会呈现曲线增长。
数据库升级和扩展
分布式系统相对于中心化系统更加复杂,所以水平扩展往往比垂直扩展更具挑战。
facebook就是使用水平扩展mysql以适应巨大的访问流量。
主从复制
对于读写比高的系统,主从模式很适合增强系统性能。
所有的写操作都是通过master进行的。master的所有更改都会在slave上重复发生。由于主从复制有时间延迟,从节点的同步可能要慢于主节点,在主节点挂掉时,
集群的投票机制会选出一个新的master。同步复制也被称为热备份。
在主从复制策略中,从节点可以只接收只读事务,较少主节点的读取流量。在主从复制中,主节点无法满足日益增长的读写流量时,多主节点复制时一个更好地选择。
多主节点复制
在多主节点模式中,所有的节点是平等的,既可以接收读请求,也可以接收写请求。然而分布式系统都是寻求平衡,由于多主模式有多个数据源,确保数据一致性是
一个巨大挑战。相同的数据可能同时在多个节点被更改,可能引起修改冲突。可以通过使用自动冲突解决算法避免冲突。
为了避免冲突,可以使用两阶段提交协议,这种协议要求所有节点在一个时间段内同步,这会增加事务的响应时间。
分片
当数据大到超过复制多节点技术的限制时,分割数据是不可避免的。分片意味着分布式数据跨越多个节点, 每个节点维护所有数据的一个子集。
传统数据库在数据库内提供了水平分区来跨表分布数据。相对于水平分区,分片需要一个分布式系统技术让数据分布在多台机器上。分片直接的连接由于使用分布式锁的
成本和网络开销会导致事务响应时间变得很长,通常会被禁止。典型的分片系统如下:
在上面的图标中,country表在两个数据中心之间做镜像复制,分区只发生在user表中。为了减少分片间的数据传输,每个user只会被保存在一个数据中心中。
在增加系统容量的过程中,分片通常是用尽其他所有可能后,最后的策略。
Mysql Cluster提供了mysql自动分片的功能(使用主键hash算法),每个节点都是可读写的。如下图:
由于是集群负责分发数据,所以应用层不必提供数据分片路由器。SQL也可能跨分片实现连接查询。Mysql Cluster7.3使用NDB存储引擎,所以它缺少了InnoDB
提供的事务隔离性和MVCC(Multi-Version Concurrency Control)。