什么是MySQL集群

       MySQL集群是一个无共享的(shared-nothing)、分布式节点架构的存储方案,其目的是提供容错性和高性能。

      

       数据更新使用读已提交隔离级别(read-committedisolation)来保证全部节点数据的一致性,使用两阶段提交机制(two-phasedcommit)保证全部节点都有同样的数据(假设不论什么一个写操作失败。则更新失败)。

      

        无共享的对等节点使得某台server上的更新操作在其它server上马上可见。传播更新使用一种复杂的通信机制,这一机制专用来提供跨网络的高吞吐量。

  

       通过多个MySQLserver分配负载,从而最大程序地达到高性能,通过在不同位置存储数据保证高可用性和冗余。



架构图




怎样存储数据

   

    Mysqlcluster数据节点组内主从同步採用的是同步复制,来保证组内节点数据的一致性。

一般通过两阶段提交 协议来实现。一般工作步骤例如以下:


   a)Master运行提交语句时,事务被发送到slave,slave開始准备事务的提交。
   b)每一个slave都要准备事务,然后向master发送OK(或ABORT)消息。表明事务已经准备好(或者无法准备该事务)。
   c)Master等待全部Slave发送OK或ABORT消息
 
   d)假设Master收到全部 Slave的OK消息,它就会向全部Slave发送提交消息,告诉Slave提交该事务;
假设Master收到来自不论什么一个Slave的ABORT消息。它就向全部 Slave发送ABORT消息。告诉Slave去中止事务。


   e)每一个Slave等待来自Master的OK或ABORT消息。

         假设Slave收到提交请求,它们就会提交事务,并向Master发送事务已提交 的确认;

         假设Slave收到取消请求,它们就会撤销全部改变并释放所占有的资源,从而中止事务。然后向Masterv送事务已中止的确认。


    f)当Master收到来自全部Slave的确认后,就会报告该事务被提交(或中止),然后继续进行下一个事务处理。

由于同步复制一共须要4次消息传递,故mysql  cluster的数据更新速度比单机mysql要慢。所以mysql cluster要求运行在千兆以上的局域网内,节点能够採用双网卡。节点组之间採用直连方式。


    Mysql cluster将全部的索引列都保存在主存中,其它非索引列能够存储在内存中或者通过建立表空间存储到磁盘上。

假设数据发生改变(insert,update,delete等)。mysql 集群将发生改变的记录写入重做日志,然后通过检查点定期将数据定入磁盘。由于重做日志是异步提交的。所以故障期间可能有少量事务丢失。为了降低事务丢失。mysql集群实现延迟写入(默认延迟两秒,可配置)。这样就能够在故障发生时完毕检查点写入。而不会丢失最后一个检查点。一般单个数据节点故障不会导致不论什么数据丢失,由于集群内部採用同步数据复制。


MySQL集群的横向扩展


    1.加入数据节点组来扩展写操作,提高 cluster的存储能力。支持在线扩容,先将新的节点加入到clsuter里,启动后用


ALTER ONLINE TABLE table_name REORGANIZE PARTITION
命令进行数据迁移,把数据平均分配到数据节点上。


    2.加入Slave只扩展读,而不能做到写操作的横向扩展。


整个系统的平均负载能够描写叙述为:

AverageLoad=∑readload+ ∑writeload / ∑capacity

假设每一个server每秒有10000的事务量。而Master每秒的写负载为4000个事务,每秒的读负载为6000。结果就是:

AverageLoad=6000+4000/10000=100%


    如今。加入3个slave,每秒的事务量添加到40000。由于写操作也会被复制,每一个写操作运行4次。这样每一个slave的写负载就是每秒4000个事务。

那么如今的平均负载为:


AverageLoad=6000+4*4000/ 4*10000=55%



MySQL集群的优缺点

长处:

    99.999%的高可用性;高速的自己主动失效切换;灵活的分布式体系结构,没有单点故障;高吞吐量和低延迟;可扩展性强。支持在线扩容


缺点:


    存在非常多限制,比方:不支持外键;部署、管理、配置非常复杂;占用磁盘空间大,内存大;备份和恢复不方便;重新启动的时候。数据节点将数据load到内存须要非常长时间