mysql cluster mysql集群

 

MySQL Cluster 是一种技术,其主要功能是在无共享的相关系统中部署内存中数据库的 Cluster 。在通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDBCluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于 Cluster 中这些组件的关系,请参见下图:

 

所有的这些节点构成一个完成的MySQL集群体系。数据保存在“NDB存储服务器”的存储引擎中,表(结构)则保存在“MySQL服务器”中。应用程序通过“MySQL服务器”访问这些数据表,集群管理服务器通过管理工具(ndb_mgmd)来管理“NDB存储服务器”。通过将MySQL Cluster 引入开放源码世界,MySQL为所有需要它的人员提供了具有高可用性、高性能和可缩放性的 Cluster 数据管理。
MySQL Cluster 基本概念
“NDB” 是一种“内存中”的存储引擎,它具有可用性高和数据一致性好的特点。
MySQL Cluster 能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但在 Cluster 级别上的存储引擎上做这个最简单。MySQL Cluster的NDB存储引擎包含完整的数据集,仅取决于 Cluster本身内的其他数据。
目前,MySQL Cluster的 Cluster部分可独立于MySQL服务器进行配置。在MySQL Cluster中,Cluster的每个部分被视为1个节点。
管理(MGM)节点:这类节点的作用是管理MySQL Cluster内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令“ndb_mgmd”启动的。
数据节点:这类节点用于保存 Cluster的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。不过没有必要设置多个副本。数据节点是用命令“ndbd”启动的。
SQL节点:这是用来访问 Cluster数据的节点。对于MySQL Cluster,客户端节点是使用NDBCluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。注释:在很多情况下,术语“节点”用 于指计算机,但在讨论MySQL Cluster时,它表示的是进程。在单台计算机上可以有任意数目的节点,为此,我们采用术语“ Cluster主机”。
管理服务器(MGM节点)负责管理 Cluster配置文件和 Cluster日志。 Cluster中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现新的事件时,节点将关于这类事件的信息传输 到管理服务器,然后,将这类信息写入 Cluster日志。
此外,可以有任意数目的 Cluster客户端进程或应用程序。它们分为两种类型:
标准MySQL客户端:对于MySQL Cluster,它们与标准的(非 Cluster类)MySQL没有区别。换句话讲,能够从用PHP、Perl、C、C++、Java、Python、Ruby等编写的现有MySQL应用程序访问MySQL Cluster。
管理客户端:这类客户端与管理服务器相连,并提供了启动和停止节点、启动和停止消息跟踪(仅调试版本)、显示节点版本和状态、启动和停止备份等的命令。
详细请参考一下官方文档:
http://dev.mysql.com/doc/refman/5.1/zh/ndbcluster.html
从www.mysql.com上下载所需软件
  
  
  
  
  1. MySQL-Cluster-gpl-client-7.1.18-1.el6.x86_64.rpm 
  2. MySQL-Cluster-gpl-clusterj-7.1.18-1.el6.x86_64.rpm 
  3. MySQL-Cluster-gpl-management-7.1.18-1.el6.x86_64.rpm 
  4. MySQL-Cluster-gpl-server-7.1.18-1.el6.x86_64.rpm 
  5. MySQL-Cluster-gpl-storage-7.1.18-1.el6.x86_64.rpm 
  6. MySQL-Cluster-gpl-tools-7.1.18-1.el6.x86_64.rpm 

 

 系统:RHEL6  selinux and iptables disabled

管理节点:192.168.0.31
数据节点:192.168.0.56
sql节点:192.168.0.71
 
管理节点配置:
  
  
  
  
  1. rpm -ivh MySQL-Cluster-gpl-management-7.1.18-1.el6.x86_64.rpm  
  2. rpm -ivh MySQL-Cluster-gpl-tools-7.1.18-1.el6.x86_64.rpm  
  3. mkdir /usr/mysql-cluster 
  4. vim /usr/mysql-cluster/config.ini 
  5. [ndbd default] 
  6. noofreplicas=1  #该全局参数仅能在[NDBD DEFAULT]中设置,它定义了cluster中每个表保存的副本数。该参数还指定了节点组的大小。节点组指的是保存相同信息的节点集合 
  7. datamemory=30M  #该参数定义了数据节点用于保存数据库记录的空间大小,全部空间均是分配在内存中的,确保你的数据节点具有足够的物理内存来容纳该值,由于我这是使用虚拟机测试,所以设置的偏小,你可以依照实际环境来定义此值 
  8. indexmemory=10M #该参数用于控制cluster中哈希(混编)索引所使用的存储量 
  9. [ndb_mgmd] 
  10. nodeid=1 #cluster中的每个节点都有唯一的标识,由从1到63的整数表示 
  11. hostname=192.168.0.31  #定义管理节点ip 
  12. datadir=/usr/mysql-cluster #它用于设置保存管理服务器输出文件的位置。这些文件包括cluster日志文件、进程输出文件、以及端口监督程序的pid文件 
  13. [ndbd] 
  14. nodeid=2 
  15. hostname=192.168.0.56 #定义数据节点ip 
  16. datadir=/usr/mysql-cluster  #它用于设置保存管理服务器输出文件的位置。这些文件包括cluster日志文件、进程输出文件、以及端口监督程序的pid文件 
  17. [mysqld] 
  18. nodeid=3  
  19. hostname=192.168.0.71  #定义sql节点ip 
首先启动管理节点,然后启动存储节点,最后启动SQL节点
   
   
   
   
  1. :ndb_mgmd -f /usr/local/mysql-cluster/config.ini 
查看集群状态
  
  
  
  
  1. ndb_mgm 
  2. ndb_mgm> show #查看集群连接状态 
 
数据节点配置:
  
  
  
  
  1. rpm -ivh MySQL-Cluster-gpl-storage-7.1.18-1.el6.x86_64.rpm 
  2. mkdir /usr/mysql-cluster 
  3. vim /etc/my.cnf 
  4. [mysqld] 
  5. ndbcluster #运行ndb集群引擎 
  6. ndb-connectstring=192.168.0.31  #指定管理节点 
  7. [mysql_cluster] 
  8. ndb-connectstring=192.168.0.31  #指定管理节点 
 启动数据节点
 
  
  
  
  
  1. ndbd --initial 
  2. 注: 仅在首次启动ndbd时,或在备份/恢复或配置变化后重启ndbd时使用“--initial”参数。原因在于,该参数会使节点删除由早期ndbd实例创建的、用于恢复的任何文件,包括恢复用日志文件 
 
 sql节点配置:
  
  
  
  
  1. rpm -ivh MySQL-Cluster-gpl-client-7.1.18-1.el6.x86_64.rpm  
  2. rpm -ivh MySQL-Cluster-gpl-server-7.1.18-1.el6.x86_64.rpm 
注意,如果之前安装过mysql和mysql-server而且做过实验的话,安装会报错,提示版本冲突,需要做一下的事情
  
  
  
  
  1. yum remove mysql-server mysql mysql-libs 
  2. cd /var/lib/mysql/ 
  3. rm -fr * 
  4. mysql_install_db --user=mysql  初始化mysql,因为刚刚把它所有的数据都删除了,这样做完就可以安装集群了 

 
 
  
  
  
  
  1. cp /usr/share/mysql/my-medium.cnf /etc/my.cnf  #根据内存大小选取配置文件,我的是300M
  2. vim /etc/my.cnf
  3. [mysqld] .... (以下数据添加在[mysqld]区域的最下方)
  4. ndbcluster
  5. ndb-connectstring=192.168.0.31
  6. [mysql_cluster]
  7. ndb-connectstring=192.168.0.31
启动sql节点:
 
  
  
  
  
  1. /etc/init.d/mysql start 
这时候再在管理节点查看集群状态,所有连接成功:
  
  
  
  
  1. [root@desktop26 mnt]# 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)] 1 node(s) 
  8. id=2    @192.168.0.56  (mysql-5.1.56 ndb-7.1.18, Nodegroup: 0, Master) 
  9.  
  10. [ndb_mgmd(MGM)] 1 node(s) 
  11. id=1    @192.168.0.31  (mysql-5.1.56 ndb-7.1.18) 
  12.  
  13. [mysqld(API)]   1 node(s) 
  14. id=3    @192.168.0.71  (mysql-5.1.56 ndb-7.1.18) 
  15.  
  16. ndb_mgm>  

安全关闭和重启mysql cluster
在MGM节点所在的机器上,在Shell中简单地输入下述命令:
ndb_mgm -e shutdown
该命令将恰当地中止ndb_mgm、ndb_mgmd以及任何ndbd进程。使用mysqladmin shutdown或其他方法,可中止SQL节点
重启时,可简单地运行下述命令:
在管理节点上:
ndb_mgmd -f /var/lib/mysql-cluster/config.ini
在每台数据节点上:
ndbd
注:正常重启NDBD节点时,不要用“--initial”选项调用该命令。
在SQL节点上:
service mysql start
 
功能扩展:
新增节点:数据节点:192.168.0.52  sql节点:192.168.0.63
管理节点上配置:
  
  
  
  
  1. ndb_mgm -e shutdown  #中止ndb_mgm、ndb_mgmd以及任何ndbd进程 
  2. vim /usr/mysql-cluster/config.ini 
  3. [ndbd default] 
  4. noofreplicas=2 #定义两个节点为一个节点组,这里指的是id 2和3为一个数据组,同组存储的数据是相同,数据节点分布在不同的主机,避免了单点故障。 
  5. datamemory=30M 
  6. indexmemory=10M 
  7.  
  8. [ndb_mgmd] 
  9. nodeid=1 
  10. hostname=192.168.0.31 
  11. datadir=/usr/mysql-cluster 
  12.  
  13. [ndbd] 
  14. nodeid=2 
  15. hostname=192.168.0.56 
  16. datadir=/usr/mysql-cluster 
  17.  
  18. [ndbd]     #加入新增数据节点 
  19. nodeid=3 
  20. hostname=192.168.0.52 
  21. datadir=/usr/mysql-cluster 
  22.  
  23. [mysqld] 
  24. nodeid=4 
  25. hostname=192.168.0.71 
  26.  
  27. [mysqld]    #加入新增sql节点 
  28. nodeid=5 
  29. hostname=192.168.0.63 
  30.  
  31. [mysqld]    #加了个空闲连接,数据备份和恢复时所需要,需要时再加也可以 
再次启动管理节点
  
  
  
  
  1. ndb_mgmd -f /usr/mysql-cluster/config.ini --initial    
  2. #不加--initial的话新修改的配置不会生效 
按上面方法配置新的数据节点和sql节点,数据节点重新初始化,各sql节点重启mysql:
  
  
  
  
  1. ndbd --initial 
  2. /etc/init.d/mysql restart 
管理节点检测:
  
  
  
  
  1. ndb_mgm> show 
  2. Cluster Configuration 
  3. --------------------- 
  4. [ndbd(NDB)] 2 node(s) 
  5. id=2    @192.168.0.171  (mysql-5.1.56 ndb-7.1.18, Nodegroup: 0, Master) 
  6. id=3    @192.168.0.52  (mysql-5.1.56 ndb-7.1.18, Nodegroup: 0) 
  7.  
  8. [ndb_mgmd(MGM)] 1 node(s) 
  9. id=1    @192.168.0.31  (mysql-5.1.56 ndb-7.1.18) 
  10.  
  11. [mysqld(API)]   3 node(s) 
  12. id=4    @192.168.0.40  (mysql-5.1.56 ndb-7.1.18) 
  13. id=5    @192.168.0.63  (mysql-5.1.56 ndb-7.1.18) 
  14. id=6 (not connected, accepting connect from any host) 
  15.  
  16. ndb_mgm>  
从以上的显示信息可以看到节点2和3做为一个数据组,两个节点的数据是一样的,互为冗余;两个sql 节点可以操作,互为冗余。
建立集群数据:
在sql节点执行:
   
   
   
   
  1. mysqladmin create world 
  2. vi city.sql 
  3. CREATE TABLE City ( 
  4. ID int(11) NOT NULL auto_increment, 
  5. Name char(35) NOT NULL default '', 
  6. CountryCode char(3) NOT NULL default '', 
  7. District char(20) NOT NULL default '', 
  8. Population int(11) NOT NULL default '0', 
  9. PRIMARY KEY (ID) 
  10. ENGINE=NDBCLUSTER; #指定MySQL为该表使用了NDB存储引擎,数据存储于各数据节点,不 
  11. 然 mysql使用默认的MyISAM存储引擎,所有的数据将会存储于本机,和单机一样 
  12. INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); 
  13. INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); 
  14. INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); 
  15. mysql world < city.sql 
现在你可以在各sql节点查看数据
 
  
  
  
  
  1. mysql> select * from City; 
  2. +----+----------+-------------+----------+------------+ 
  3. | ID | Name     | CountryCode | District | Population | 
  4. +----+----------+-------------+----------+------------+ 
  5. |  3 | Herat    | AFG         | Herat    |     186800 | 
  6. |  1 | Kabul    | AFG         | Kabol    |    1780000 | 
  7. |  2 | Qandahar | AFG         | Qandahar |     237500 | 
  8. +----+----------+-------------+----------+------------+ 
  9. 3 rows in set (0.00 sec) 

 mysql cluster 备份恢复
在管理节点执行备份:
  
  
  
  
  1. ndb_mgm> start backup 
  2. Waiting for completed, this may take several minutes 
  3. Node 2: Backup 1 started from node 1 
  4. Node 2: Backup 1 started from node 1 completed 
  5.  StartGCP: 509 StopGCP: 512 
  6.  #Records: 2060 #LogRecords: 0 
  7.  Data: 51380 bytes Log: 0 bytes 
注:备份的数据在各数据节点的/usr/mysql-cluster/BACKUP目录下保存,每个数据节点保存一部分数据
删除City表中的所有数据
    
    
    
    
  1. mysql> delete from City; 
  2. Query OK, 3 rows affected (0.04 sec) 
  3.  
  4. mysql> select * from City; 
  5. Empty set (0.00 sec) 
由于数据分散在两个数据节点,因此在各数据节点执行恢复,由于使用rpm包方式安装,各数据节点没有ndb_restore(来自MySQL-Cluster-gpl-tools-7.1.18-1.el6.x86_64.rpm)命令,可以直接从管理节点scp:
   
   
   
   
  1. scp /usr/bin/ndb_restore 192.168.0.56:/usr/bin 
  2. scp /usr/bin/ndb_restore 192.168.0.52:/usr/bin 
 在每个数据节点上分别执行恢复动作,-n指nodeid,-b指恢复第几次的备份,-r指恢复,后面接的使保存备份的文件夹
  
  
  
  
  1. ndb_restore -n 2 -b 1 -r /usr/mysql-cluster/BACKUP/BACKUP-1/ 
  2. mysql> select * from City; #sql节点
  3. +----+-------+-------------+----------+------------+
  4. | ID | Name | CountryCode | District | Population |
  5. +----+-------+-------------+----------+------------+
  6. | 3 | Herat | AFG | Herat | 186800 |
  7. +----+-------+-------------+----------+------------+
  8. 1 row in set (0.14 sec)
  9. ndb_restore -n 3 -b 1 -r /usr/mysql-cluster/BACKUP/BACKUP-1/ 
  10. mysql> select * from City; #sql节点
  11. +----+----------+-------------+----------+------------+
  12. | ID | Name | CountryCode | District | Population |
  13. +----+----------+-------------+----------+------------+
  14. | 1 | Kabul | AFG | Kabol | 1780000 |
  15. | 2 | Qandahar | AFG | Qandahar | 237500 |
  16. | 3 | Herat | AFG | Herat | 186800 |
  17. +----+----------+-------------+----------+------------+
  18. 3 rows in set (0.01 sec) mysql>
 
 

你可能感兴趣的:(mysql,集群)