MySQL-Cluster

MySQL集群是一种在无共享架构(SNA,Share Nothing Architecture)系统里应用内存数据库集群的技术。这种无共享的架构可以使得系统使用低廉的硬件获取高的可扩展性。 MySQL集群是一种分布式设计,目标是要达到没有任何单点故障点。因此,任何组成部分都应该拥有自己的内存和磁盘。任何共享存储方案如网络共享,网络文件系统和SAN设备是不推荐或不支持的。通过这种冗余设计,MySQL声称数据的可用度可以达到99.999%。
 

实际上,MySQL集群是把一个叫做NDB的内存集群存储引擎集成与标准的MySQL服务器集成。它包含一组计算机,每个都跑一个或者多个进程,这可能包括一个MySQL服务器,一个数据节点,一个管理服务器和一个专有的一个数据访问程序。它们之间的关系如下图所示:

 

存储引擎

 

MySQL Cluster 使用了一个专用的基于内存的存储引擎,这样做的好处是速度快, 没有磁盘I/O的瓶颈,但是由于是基于内存的,所以数据库的规模受系统总内存的限制, 如果运行NDB的MySQL服务器一定要内存够大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多台服务器上来实现数据的可靠性和扩展性,理论上 通过配置2台NDB的存储节点就能实现整个数据库集群的冗余性和解决单点故障问题。

该存储引擎有下列弊端:

  • 基于内存,数据库的规模受集群总内存的大小限制
  • 基于内存,断电后数据可能会有数据丢失,这点还需要通过测试验证。
  • 多个节点通过网络实现通讯和数据同步、查询等操作,因此整体性受网络速度影响,
  • 因此速度也比较慢

当然也有它的优点:

  • 多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。
  • 扩展性很好,增加节点即可实现数据库集群的扩展。
  • 冗余性很好,多个节点上都有完整的数据库数据,因此任何一个节点宕机都不会造成服务中断。
  • 实现高可用性的成本比较低,不象传统的高可用方案一样需要共享的存储设备和专用的软件才能实现,NDB 只要有足够的内存就能实现。

体系结构
 

MySQL Cluster 由3个不同功能的服务构成,每个服务由一个专用的守护进程提供,一项 服务也叫做一个节点,下面来介绍每个节点的功能。

The management (MGM) node

管理节点,用来实现整个集群的管理,理论上一般只启动一个,而且宕机也不影响 cluster 的服务,这个进程只在cluster 启动以及节点加入集群时起作用, 所以这个节点不是很需要冗余,理论上通过一台服务器提供服务就可以了。

通过 ndb_mgmd 命令启动,使用 config.ini 配置文件

The storage or database (DB) node:

数据库节点,用来存储数据,可以和管理节点(MGM) , 用户端节点(API) 可以处在 不同的机器上,也可以在同一个机器上面,集群中至少要有一个DB节点,2个以上 时就能实现集群的高可用保证,DB节点增加时,集群的处理速度会变慢。

通过 ndbd 命令启动,第一次创建好cluster DB 节点时,需要使用 –init参数初始化。

例如: bin/ndbd –ndb-connectstring=ndb_mgmd.mysqlcluster.net –initial

The client (API) node:

客户端节点,通过他实现 cluster DB 的访问,这个节点也就是普通的 mysqld 进程, 需要在配置文件中配置ndbcluster 指令打开 NDB Cluster storage engine 存储引擎,增加 API 节点会提高整个集群的并发访问速度和整体的吞吐量,该节点 可以部署在Web应用服务器上,也可以部署在专用的服务器上,也开以和DB部署在 同一台服务器上。

通过 mysqld_safe 命令启动,

这3类节点可以分布在不同的主机上,比如 DB 可以是多台专用的服务器,也可以 每个DB都有一个API,当然也可以把API分布在Web前端的服务器上去,通常来说, API越多cluster的性能会越好。

==========================以上理论摘抄自搜索技术博客-淘宝 ==========================

MySQL-Cluster具体配置

----------------------------------------

MGM IP:192.168.100.1
SQL1 IP:192.168.100.2
SQL2 IP:192.168.100.3
NDBD1 IP:192.168.100.4
NDBD2 IP:192.168.100.5
----------------------------------------

MGM配置
########################################################################
MySQL集群版安装
mysql-cluster-gpl-7.2.5.tar.gz
---------------------------------------------------------
# tar xf mysql-cluster-gpl-7.2.5.tar.gz -C /usr/src
# cd /usr/src/mysql-cluster-gpl-7.2.5
# cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/mysql -DMYSQL_DATADIR:PATH=/database -DMEMCACHED_HOME:PATH=/usr/local -DWITH_CLASSPATH:STRING=/usr/java -DWITH_EXTRA_CHARSETS:STRING=all -DWITH_INNOBASE_STORAGE_ENGINE:BOOL=ON -DWITH_NDBCLUSTER_STORAGE_ENGINE:BOOL=ON -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON -DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON
# make && make install
--------------------------------------------------------
具体的MySQL配置文件定义等这里不作进一步描述

# vim /usr/local/mysql/etc/config.ini //配置管理文件
# cat /usr/local/mysql/etc/config.ini
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M

[NDB_MGMD]
hostname=192.168.100.1
datadir=/data
nodeid=1

[NDBD]
hostname=192.168.100.4
datadir=/data
nodeid=2

[NDBD]
hostname=192.168.100.5
datadir=/data
nodeid=3

[MYSQLD]
hostname=192.168.100.2
nodeid=4

[MYSQLD]
hostname=192.168.100.3
nodeid=5
 

# /usr/local/mysql/bin/ndb_mgmd --config-file=/usr/local/mysql/etc/config.ini

 

 
  
  1. [sql] view plaincopyprint?  
  2. # /usr/local/mysql/bin/ndb_mgm    
  3. -- NDB Cluster -- Management Client --     
  4. ndb_mgm> show    
  5. Connected to Management Server at: localhost:1186    
  6. Cluster Configuration    
  7. ---------------------     
  8. [ndbd(NDB)]     2 node(s)    
  9. id=2 (not connected, accepting connect from 192.168.100.4)    
  10. id=3 (not connected, accepting connect from 192.168.100.5)    
  11.     
  12. [ndb_mgmd(MGM)] 1 node(s)    
  13. id=1    @192.168.100.1  (mysql-5.5.20 ndb-7.2.5)    
  14.     
  15. [mysqld(API)]   2 node(s)    
  16. id=4 (not connected, accepting connect from 192.168.100.2)    
  17. id=5 (not connected, accepting connect from 192.168.100.3)  

########################################################################

 


NBDB配置
########################################################################
MySQL无需再次编译,把MGM上的MySQL目录打包分发到各个NBDB节点上即可
# cat /usr/local/mysql/etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/database
socket=/var/run/mysqld/mysql5.socket
pid-file=/var/run/mysqld/mysql5.pid
general-log
general-log-file=/var/log/mysqld/mysql5-access.log
log-error=/var/log/mysqld/mysql5-error.log
port=3306
innodb=On

ndbcluster
ndb-connectstring=192.168.100.1

[mysql_cluster]
ndb-connectstring=192.168.100.1
# /usr/local/mysql/bin/ndbd --ndb-connectstring=192.168.100.1
########################################################################

SQL节点配置
########################################################################
MySQL无需再次编译,把MGM上的MySQL目录打包分发到各个SQL节点上即可
# cat /usr/local/mysql/etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/database
socket=/var/run/mysqld/mysql5.socket
pid-file=/var/run/mysqld/mysql5.pid
general-log
general-log-file=/var/log/mysqld/mysql5-access.log
log-error=/var/log/mysqld/mysql5-error.log
port=3306
innodb=On

ndbcluster
ndb-connectstring=192.168.100.1

[mysql_cluster]
ndb-connectstring=192.168.100.1


# /etc/init.d/mysqld5 restart
########################################################################

MGM连接查看当前状态:

 

  1. # /usr/local/mysql/bin/ndb_mgm
  2. -- NDB Cluster -- Management Client --
  3. ndb_mgm> show
  4. Connected to Management Server at: localhost:1186
  5. Cluster Configuration
  6. ---------------------
  7. [ndbd(NDB)] 2 node(s)
  8. id=2 @192.168.100.4 (mysql-5.5.20 ndb-7.2.5, Nodegroup: 0, Master)
  9. id=3 @192.168.100.5 (mysql-5.5.20 ndb-7.2.5, Nodegroup: 0)
  10.  
  11. [ndb_mgmd(MGM)] 1 node(s)
  12. id=1 @192.168.100.1 (mysql-5.5.20 ndb-7.2.5)
  13.  
  14. [mysqld(API)] 2 node(s)
  15. id=4 @192.168.100.2 (mysql-5.5.20 ndb-7.2.5)
  16. id=5 @192.168.100.3 (mysql-5.5.20 ndb-7.2.5)
  17.  
  18. ndb_mgm>
  1. # /usr/local/mysql/bin/ndb_mgm
  2. -- NDB Cluster -- Management Client --
  3. ndb_mgm> show
  4. Connected to Management Server at: localhost:1186
  5. Cluster Configuration
  6. ---------------------
  7. [ndbd(NDB)] 2 node(s)
  8. id=2 @192.168.100.4 (mysql-5.5.20 ndb-7.2.5, Nodegroup: 0, Master)
  9. id=3 @192.168.100.5 (mysql-5.5.20 ndb-7.2.5, Nodegroup: 0)
  10. [ndb_mgmd(MGM)] 1 node(s)
  11. id=1 @192.168.100.1 (mysql-5.5.20 ndb-7.2.5)
  12. [mysqld(API)] 2 node(s)
  13. id=4 @192.168.100.2 (mysql-5.5.20 ndb-7.2.5)
  14. id=5 @192.168.100.3 (mysql-5.5.20 ndb-7.2.5)
  15. ndb_mgm>

SQL节点测试
SQL1

 
  
  1. [sql] view plaincopyprint?  
  2. mysql> create database mysql_cluster;    
  3. Query OK, 1 row affected (0.20 sec)    
  4.     
  5. mysql> use mysql_cluster    
  6. Database changed    
  7. mysql> create table tt1 (id int, name varchar(10)) engine ndbcluster;    
  8. //注意这里建表只能使用ndbcluster引擎,否则只能同步库,不能同步表中内容    
  9. Query OK, 0 rows affected (0.45 sec)    
  10.     
  11. mysql> insert into tt1 select 1,'wu';    
  12. Query OK, 1 row affected (0.02 sec)    
  13. Records: 1  Duplicates: 0  Warnings: 0    
  14.     
  15. mysql> insert into tt1 select 2,'ku';    
  16. Query OK, 1 row affected (0.01 sec)    
  17. Records: 1  Duplicates: 0  Warnings: 0    
  18.     
  19. mysql>  

SQL2

 
  
  1. [sql] view plaincopyprint?  
  2. mysql> show databases;    
  3. +--------------------+     
  4. | Database           |    
  5. +--------------------+     
  6. | information_schema |    
  7. | mysql              |    
  8. | mysql_cluster      |    
  9. | ndbinfo            |    
  10. | performance_schema |    
  11. | test               |    
  12. +--------------------+     
  13. 8 rows in set (0.01 sec)    
  14.     
  15. mysql> use mysql_cluster    
  16. Reading table information for completion of table and column names    
  17. You can turn off this feature to get a quicker startup with -A    
  18.     
  19. Database changed    
  20. mysql> show tables;    
  21. +-------------------------+     
  22. | Tables_in_mysql_cluster |    
  23. +-------------------------+     
  24. | tt1                     |    
  25. +-------------------------+     
  26. 1 row in set (0.00 sec)    
  27.     
  28. mysql> select * from tt1;    
  29. +------+------+     
  30. | id   | name |    
  31. +------+------+     
  32. |    1 | wu   |    
  33. |    2 | ku   |    
  34. +------+------+     
  35. 2 rows in set (0.01 sec)    
  36.     
  37. mysql>     
  38. //查看SQL2节点可以看出两边数据是同步的