1 概述
MySQL Cluster 是MySQL 适合于分布式计算环境的高实用、可拓展、高性能、高冗余版本,其研发设计的初衷就是要满足许多行业里的最严酷应用要求,这些应用中经常要求数据库运行的可靠性要达到99.999%。MySQL Cluster允许在无共享的系统中部署“内存中”数据库集群,通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。
实际上,MySQL集群是把一个叫做NDB的内存集群存储引擎集成与标准的MySQL服务器集成。它包含一组计算机,每个都跑一个或者多个进程,这可能包括一个MySQL服务器,一个数据节点,一个管理服务器和一个专有的一个数据访问程序。
MySQL Cluster能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但在Cluster 级别上的存储引擎上做这个最简单。以下为MySQL集群结构关系图,
MySQL从结构看,由3类节点(计算机或进程)组成,分别是:
管理节点:用于给整个集群其他节点提供配置、管理、仲裁等功能。理论上通过一台服务器提供服务就可以了。
数据节点:MySQL Cluster的核心,存储数据、日志,提供数据的各种管理服务。2个以上 时就能实现集群的高可用保证,DB节点增加时,集群的处理速度会变慢。
SQL节点(API):用于访问MySQL Cluster数据,提供对外应用服务。增加 API 节点会提高整个集群的并发访问速度和整体的吞吐量,该节点 可以部署在Web应用服务器上,也可以部署在专用的服务器上,也开以和DB部署在 同一台服务器上。
2 NDB引擎
MySQL Cluster 使用了一个专用的基于内存的存储引擎——NDB引擎,这样做的好处是速度快, 没有磁盘I/O的瓶颈,但是由于是基于内存的,所以数据库的规模受系统总内存的限制, 如果运行NDB的MySQL服务器一定要内存够大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多台服务器上来实现数据的可靠性和扩展性,理论上 通过配置2台NDB的存储节点就能实现整个数据库集群的冗余性和解决单点故障问题。
2.1 缺陷
基于内存,数据库的规模受集群总内存的大小限制
基于内存,断电后数据可能会有数据丢失,这点还需要通过测试验证。
多个节点通过网络实现通讯和数据同步、查询等操作,因此整体性受网络速度影响,
因此速度也比较慢
2.2 优点
多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。
扩展性很好,增加节点即可实现数据库集群的扩展。
冗余性很好,多个节点上都有完整的数据库数据,因此任何一个节点宕机都不会造成服务中断。
实现高可用性的成本比较低,不象传统的高可用方案一样需要共享的存储设备和专用的软件才能实现,NDB 只要有足够的内存就能实现。
3 集群搭建及测试
3.1 配置规划
管理(MGM)节点1:192.168.56.1 rango.sysu
MySQL服务器(SQL)节点4:192.168.56.104 vm4.sysu
数据(NDBD)节点2:192.168.56.102 vm2.sysu
数据(NDBD)节点3: 192.168.56.103 vm3.sysu
3.2 安装
MySQL集群安装有三种方式:一是直接下载二进制使用,二是使用rpm安装,三是源码编译。此处选择二进制安装方式。从官网下载二进制版本mysql-cluster-gpl-7.3.2-linux-glibc2.5-i686.tar.gz
节点1:
管理节点没有必要安装MySQL服务器二进制版本,但应安装MGM服务器端口监督程序和客户端二进制版本(分别是ndb_mgmd和ndb_mgm):从解压出来的文件中获取ndb_mgmd和ndb_mgm,移动到/usr/local/bin下面,并chmod +x ndb_mgm*
数据节点和SQL节点:
解压二进制包到/usr/local/mysql
useradd -g mysql mysql
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
chown -R root /usr/local/mysql
chown -R mysql/usr/local/mysql/data
chgrp -R mysql /usr/local/mysql
cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
将MySQL启动脚本拷贝到恰当的目录下,使之成为可执行的脚本,并设置它以便在启动操作系统时启动:
cp support-files/mysql.server /etc/rc.d/init.d/
chmod +x /etc/rc.d/init.d/mysql.server
chkconfig --add mysql.server
ps:安装数据库时可能会提示:error while loading shared libraries: libaio.so.1,解决方法:yum install libaio*
3.3 配置
数据节点和SQL节点:/etc/my.cnf:该文件提供了两类信息:connectstring(连接字符串),用于通知节点到哪里找到MGM节点;以及一行用于通知该主机(容纳数据节点的机器)上的MySQL服务器运行在NDB模式下。vim /etc/my.cnf:
[MYSQLD]
ndbcluster
ndb-connectstring=192.168.56.1
[MYSQL_CLUSTER]
ndb-connectstring=192.168.56.1
管理节点:/var/lib/mysql-cluster/config.ini:该文件通知节点有多少需要维护的副本,需要在每个数据节点上为数据和索引分配多少内存,数据节点的位置,在每个数据节点上保存数据的磁盘位置,以及SQL节点的位置。config.ini:
# Options affecting ndbd processes on all data nodes:
[NDBD DEFAULT]
NoOfReplicas=2 # Number of replicas
DataMemory=80M # How much memory to allocate for data storage
IndexMemory=18M # How much memory to allocate for index storage
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough for
# this example Cluster setup.
# TCP/IP options:
[TCP DEFAULT]
portnumber=2202 # This the default; however, you can use any
# port that is free for all the hosts in cluster
# Note: It is recommended beginning with MySQL 5.0 that
# you do not specify the portnumber at all and simply allow
# the default value to be used instead
# Management process options:
[NDB_MGMD]
hostname=192.168.56.1 # Hostname or IP address of MGM node
datadir=/var/lib/mysql-cluster # Directory for MGM node logfiles
# Options for data node "A":
[NDBD]
# (one [NDBD] section per data node)
hostname=192.168.56.102 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node‘s datafiles
# Options for data node "B":
[NDBD]
hostname=192.168.56.103 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node‘s datafiles
# SQL node options:
[MYSQLD]
hostname=192.168.56.104 # Hostname or IP address
# (additional mysqld connections can be
# specified for this node for various
# purposes such as running ndb_restore)
[MYSQLD]
3.4 启动
首次启动需先启动管理节点,然后存储节点,最后启动SQL节点。注意防火墙的设置,在内网的话,建议直接关闭iptables和SELinux。
3.4.1 启动管理节点
ndb_mgmd --configdir=/var/lib/mysql-cluster -f /var/lib/mysql-cluster/config.ini
ps:修改了config.ini,比如加入新的数据或SQL节点时,启动管理节点要加上--reload
3.4.2 启动数据节点
/usr/local/mysql/bin/ndbd --initial
ps:首次启动需加上--initial选项
3.4.3 启动SQL节点
/usr/local/mysql/bin/mysqld_safe &
3.4.4 检查状态
在管理节点上检查集群启动状态:
ndb_mgm -e show:
[root@rango ~]# ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.56.102 (mysql-5.6.11 ndb-7.3.2, Nodegroup: 0, Master)
id=3 @192.168.56.103 (mysql-5.6.11 ndb-7.3.2, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.56.1 (mysql-5.6.11 ndb-7.3.2)
[mysqld(API)] 2 node(s)
id=4 @192.168.56.104 (mysql-5.6.11 ndb-7.3.2)
id=5 (not connected, accepting connect from any host)
3.5 测试服务是否正常
在SQL节点上执行如下数据库操作:
/usr/local/mysql/bin/mysql -u root -p
mysql> create database clusterdb;use clusterdb;
mysql> create table simples (id int not null primary key) engine=ndb;
mysql> insert into simples values (1),(2),(3),(4);
mysql> select * from simples;
切换到2台数据节点服务器,到/usr/local/mysql/data/ndb_2_fs/和/usr/local/mysql/data/ndb_3_fs/目录下查看,或者直接登录到数据库查看,数据已经同步。
3.6 关闭集群服务
在管理节点执行:ndb_mgm -e shutdown
该命令将恰当地中止ndb_mgm、ndb_mgmd以及任何ndbd进程。
关闭SQL节点的mysqld服务:killall mysqld
ps:
当config.ini文件有改动时,需要执行下面的操作:
rm /var/lib/mysql-cluster/ndb_1_config.bin.1 否则下次重启时无法完成。
重启:
与首次启动类似,但数据节点为:ndbd,SQL主机为:mysqld &
3.7 问题集成
1 如果发现关闭一台机器的ndbd进程,另一台机器的ndbd的进程也关闭,则需要修改参数NoOfReplicas。
2 ndbd --initial 不能同时在所有数据节点机器上执行,如执行,会删除所有数据
3 可以像操作非集群类型的数据库那样,操作mysqld节点
4 每次修改config.ini文件,重启ndb_mgmd时,需要删除mysql-cluster文件下的ndb_1_config.bin.1文件,因为他默认调用此文件
5 NDB 集群不支持自动发现数据库的功能,这点很重要,一旦在一个数据节点上创建了世界(world)数据库和它的表,在簇中的每个SQL节点上还需要发出命令 CREATE DATABASE world,后跟FLUSH TABLES。这样,节点就能识别数据库并读取其表定义
6 如果在相关节点服务器启动时,注意查看~/mysql/mysql-cluster目录内的相关日志文件以获取错误信息
4 总结
本文简单介绍了MySQL集群的设计理念、结构以及如何搭建一个阳春的MySQL集群,具体的测试和性能比较未能放出,有待投入到生产环境中作出评价
——Rango Chen
本文出自 “游响云停” 博客,请务必保留此出处http://rangochen.blog.51cto.com/2445286/1378259