数据库集群的特征就是 有多台机器,这多台机器上都有数据库, 这些数据库的数据是完全一样的,即相当于一套数据的多个副本。集群就是要保证这些副本的实时或准时实(可以延时一会)的同步,即如果一台机器上的数据更改时,集群系统要保证这个更改实时或准时实的应用到所有的机器上,实现数据同步。
 
集群主要解决两个问题:
1. 负载均衡:这个主要是解决访问量大的问题。一台机器的读写能力是有限的,当同时有大量用户访问的时候,仅一台机器可能就会因负载过大而垮掉。而使用集群后,集群系统会将访问量均衡到每台机器上,也即多台机器分担了访问量,这就达到了负载均衡的目的。
2. 当机:当只有一台机器时,如果这台机器因意外当机会需要停机维护,那么此时系统就不能访问,对于一些使用量大,使用频繁的系统而言,这样是肯定不行的。如果使用集群,只有集群中有一台机器还在运行,就能让系统继续运行下去,而且对于重新启动的机器,能很快的同步在停机时间用户所做的更改。我的当前公司很喜欢用顶这个词,当一台机器垮掉时,能立马有另一台机器顶上。
 
集群的方式和技术点:
由于俺对集群不了解,对于有几种方式更是不清楚,这里就以这个同事介绍的Mysql MMM集群记记。
这个集群用了5台机器,两个主(Master),两个从(Slave),一个用来监视。这里只介绍大概,具体的俺也不清楚。
5台机器都有一个IP,在集群时给两台主机器分配了同一个虚拟IP,这个虚拟IP主要用来进行写操作(事务性操作)。然后再为两个主和两个从每机分配一个虚拟IP,这些ip用于读操作。虚拟IP就是为了让集群系统来决定每一个访问所连接的机器(或数据库),从而达到负载平衡。给机器分为主和从,是为了让主作为作为写的主体,即所有写的操作都是在主上进行。主和从都可以作为读的主体,由于在平时访问中一般读取要远大于写操作,所以这里就机当于多出两台从机器用于读取负载。
 
当要进行写操作时,使用写的虚拟IP连接数据库,集群系统会跟据两个主的状态选择一台负载小的机器连接,然后就是进行写操作,由于写操作的是事务性的,这个事务会扩展到另一个主机上,也即如果在写操作时要锁定表,另一台主机器上的相同表也会被锁定。当事务提交时,被连接的主机器立马将相同的事务操作应用到另一台主机器上,从而实现两台机器的同步。从表面上看,写操作对两台机器都进行了操作,不旦没有节省时间和资源,还增大了开销,但从细节上来看还是有很多优点所在的。首先,只所以用多台主机器,是为了防止其中一台当机了,系统不能进行写操作,所以写的事务会同步到所有主机器上必须要做的。其次,在进行写操作时,对事务的缓冲只在真正连接的机器上,其它主机器只是同步事务,即锁定该锁定的,没有操作缓冲,只有在提交事务时,连接的机器才会把所做的更改发给其它主机器让其同步。所以这里来说,其它主机器没有太大的写操作开销。 这里也要注意,主机器之间的网络连通一定要好,否则会出现瓶颈。  以上写操作都未提到从机器。 我认为在写操作时,从机器也被扩展了事务(也可能没有),即该锁定的表也锁定了(也可能没有锁),在写事务提交时,并没有马上进行同步,这要根据当时的负载和网络连通情况,集群系统会挑一个“合适”的时机,让从机器跟主机器同步,所以这里会有一定的延时,也就是当你写完所,你通过连接读的虚拟IP获取的数据不一定就包括了你先前的更改,除非你就用进行写操作的连接进行读操作,因为这两个机器连的都是同一台机器,所以一致。