之前也听过人人网曾使用过代替普通MC缓存的方案,然后自己看了下相关的文档,这里记录一下。
MysqlCluster主要分为三个核心部分:cluster manager 、 sql node 、 ndb node
cluster manager : 类似一个管理节点,负责管理sql node 和 ndb node , 同时也会保存元数据信息,这个对高可用要求不高,挂了不影响服务.
sql node : 其实就是一个装了NDB engine 的Mysql Server,负责提供服务,但是不做数据存储。
ndb node : 主要做数据存储用,默认全内存的,也可以指定为磁盘的文件,也叫做data node。
安全配置就不说了,网上很多,文档也有介绍。
HA , 高可用:
ndb node 有group 的概念,比如有两个ndb node : node1 , node2 。这两个做一个group , 那么这个group 会存两份数据,这样有一份坏掉,数据的完整性也能保证,如果有四个节点,可以做两个group , group 之间做数据分片,group 之内做数据冗余,目前一台机器只能启一个ndb node .一个Group之间的Node也有主和从的概念,只能有一个主,主挂了会从从节点中选主。
sql node 的高可用官方就是启动多个sql node ,但是我觉得这样没啥用,因为程序只能连一个sql node ,前端可以做LVS或者用keepalive,对多个SQLNode做高可用。
mysql cluster 最大的优点就是可以动态增加节点,因为数据是存内存的,所以加节点就类似于扩容,加节点需要一台一台的重启ndb manager 、 sql node 、ndb node,因为数据有多份,所以可以做到在线的变更,当节点加入集群,数据需要重新分布,这个也是在线的。
mysql cluster 也能做到备份和恢复,类似于在每个数据节点上做一个快照,每个数据节点目录下都会有一份备份文件,恢复也靠这个恢复。
mysql cluster 也是能支持事务的,也有自己的redo 和undo , redo统一存在磁盘,Undo则是看情况,内存表在内存,磁盘表在磁盘。
Mysql cluster 之间也能做复制,就是说两个集群之间也能做复制,有个前提:binlog 格式必须是ROW Based,写binlog是有一个injector thread来完成的,为什么不同MysqlServer来写Binlog呢?因为如果是MysqlServer写Binlog,如果程序直接通过NDB的API操作数据Binlog就会少很多,所以又新启了一个线程。
Mysql cluster 数据切分,Mysql cluster 默认的切分方法是根据主键做Hash,如果没主键则用唯一建,如果连唯一建都没有则采用Innodb的Rowid。
至于性能倒是没测试,数据全存内存应该不会差。mysql cluster算是目前Mysql主推的一个产品,但是貌似大家对这种全内存的方案不是太感冒,应用到生产环境还需要更多的尝试和测试。