转自http://www.cnblogs.com/StanBlogs/archive/2011/06/14/2080986.html
前言:
这是我第一次接触Linux,CentOS, MySQL,用了5天的时间终于将基于CentOS5.0系统下MySQL-Cluster架构成功,下面将我这些经验分享给大家.
MySQL簇是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的簇。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。
MySQL簇将标准的MySQL服务器与名为NDB的“内存中”簇式存储引擎集成了起来。在我们的文档中,术语NDB指的是与存储引擎相关的设置部分,而术语“MySQL簇”指的是MySQL和NDB存储引擎的组合。
MySQL簇由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB簇的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于簇中这些组件的关系,请参见下图:
所有这些程序一起构成了MySQL簇。将数据保存到NDB簇存储引擎中时,表将保存在数据节点内。能够从簇中所有其他MySQL服务器直接访问这些表。因此,在将数据保存在簇内的工资表应用程序中,如果某一应用程序更新了1位雇员的工资,所有查询该数据的其他MySQL服务器能立刻发现这种变化。
对于MySQL簇,保存在数据节点内的数据可被映射,簇能够处理单独数据节点的故障,除了少数事务将因事务状态丢失而被放弃外,不会产生其他影响。由于事务性应用程序能够处理事务失败事宜,因而它不是问题源。
通过将MySQL簇引入开放源码世界,MySQL为所有需要它的人员提供了具有高可用性、高性能和可缩放性的簇数据管理。
NDB是一种“内存中”存储引擎,它具有可用性高和数据一致性好的特点。
能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但以簇层面上的存储引擎开始最简单。MySQL簇的NDB存储引擎包含完整的数据集,仅取决于簇本身内的其他数据。
下面,我们介绍了设置由NDB存储引擎和一些MySQL服务器构成的MySQL簇的设置方法。
目前,MySQL簇的簇部分可独立于MySQL服务器进行配置。在MySQL簇中,簇的每个部分被视为1个节点。
注释:在很多情况下,术语“节点”用于指计算机,但在讨论MySQL簇时,它表示的是进程。在单台计算机上可以有任意数目的节点,为此,我们采用术语簇主机。
有三类簇节点,在最低的MySQL簇配置中,至少有三个节点,这三类节点分别是:
· 管理(MGM)节点:这类节点的作用是管理MySQL簇内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令ndb_mgmd启动的。
· 数据节点:这类节点用于保存簇的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。没有必要有一个以上的副本。数据节点是用命令ndbd启动的。
· SQL节点:这是用来访问簇数据的节点。对于MySQL簇,客户端节点是使用NDB簇存储引擎的传统MySQL服务器。典型情况下,SQL节点是使用命令mysqld –ndbcluster启动的,或将ndbcluster添加到my.cnf后使用mysqld启动。
簇配置包括对簇中单独节点的配置,以及设置节点之间的单独通信链路。对于目前设计的MySQL簇,其意图在于,从处理器的能力、内存空间和带宽来讲,存储节点是同质的,此外,为了提供单一的配置点,作为整体,簇的所有配置数据均位于1个配置文件中。
管理服务器(MGM节点)负责管理簇配置文件和簇日志。簇中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现有趣的事件时,节点将关于这类事件的信息传输到管理服务器,然后,将这类信息写入簇日志。
此外,可以有任意数目的簇客户端进程或应用程序。它们分为两种类型:
· 标准MySQL客户端:对于MySQL簇,它们与标准的(非簇类)MySQL没有区别。换句话讲,能够从用PHP、Perl、C、C++、Java、Python、Ruby等编写的现有MySQL应用程序访问MySQL簇。
· 管理客户端:这类客户端与管理服务器相连,并提供了优雅地启动和停止节点、启动和停止消息跟踪(仅对调试版本)、显示节点版本和状态、启动和停止备份等的命令。
(PDF图文版请下载,地址:http://download.csdn.net/source/3365704)
配置之前,先补充一些Linux常用命令:
ls 浏览
ls -l 查看文件夹及文件权限
vi 文本编辑器(搜索、编辑)
i 状态为修改
退出:“Esc”键后,然后输入":",然后输入“wq”写入、退出
:q! 强制退出
vim -f [文件名] 强制恢复文件
cp 拷贝文件命令
rm 删除文件
mkdir 创建文件夹
ln 连接问价或目录
man [命令] 查看命令参数
ifconfig 网卡信息命令
dig (域信息搜索器)
df 查看系统文件
vmstat 系统状态
ps 查看进程(-e显示全部,-f全格式输出)
ps -ef|grep mysql 查看所有mysql进程
Tips:输入一个文件或文件名,按一下Tab键,会自动完成改文件名(前提是这个文件或文件夹必须存在);
例如:
输入
[root@localhost tmp]# tar –xzvf mysql-c
按一下Tab键自动完成:
[root@localhost tmp]# tar –xzvf mysql-cluster-gpl-7.1.13-linux-i686-glibc23.tar.gz
下面,我们一起来架构吧!
一、配置环境:
OS:Linux CentOS 5.0
MySQL: mysql-cluster-gpl-7.1.13-linux-i686-glibc23.tar.gz (注意:需用Cluster版本,可在官网上下载 http://dev.mysql.com/downloads/cluster/#downloads)
节点配置情况:
MGM:192.168.20.231
NDBD1:192.168.20.232
NDBD2:192.168.20.233
SQL1:192.168.20.234
SQL2:192.168.20.235
修改CentOS IP地址
(1)打开/etc/sysconfig/network-scripts/ifcfg-eth0文件,做如下修改
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
HWADDR=00:0c:29:be:b3:53
IPADDR=192.168.20.231
NETMASK=255.255.255.0
GATEWAY=192.168.20.1
(2)修改/etc/resolv.conf文件, 如下(修改DNS服务)
nameserver 202.101.172.35
search localdomain
(3)重启网络服务
[root@localhost ~]# service network restart
二、软件安装:
(一)管理节点MGM
配置管理节点
首先在合适的位置,创建一个管理节点的配置文件,步骤如下:
[root@localhost ~]# mkdir /var/lib/mysql-cluster
[root@localhost ~]# cd /var/lib/mysql-cluster
[root@localhost mysql-cluster]# vi config.ini
配置文件config.ini内容如下:
[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
[tcp default]
portnumber=2202
[ndb_mgmd]
id=1
hostname=192.168.20.231
datadir=/var/lib/mysql-cluster
[ndbd]
id=2
hostname=192.168.20.232
datadir=/usr/local/mysql/data
[ndbd]
id=3
hostname=192.168.20.233
datadir=/usr/local/mysql/data
[mysqld]
id=4
hostname=192.168.20.234
[mysqld]
id=5
hostname=192.168.20.235
安 装管理节点,不需要mysqld二进制文件,只需要MySQL Cluster服务端程序(ndb_mgmd)和监听客户端程序(ndb_mgm)。这两个文件都在下载的MySQL-cluster文件解压后的bin 文件夹中。执行如下步骤,在集群的管理节点上安装ndb_mgmd 和 ndb_mgm。
1、改变地址到/var/tmp目录下,解压MySQL-Cluster压缩文件,取出ndb_mgm和ndb_mgmd复制到/usr/local/bin 目录下。
[root@localhost ~]# cd /var/tmp
[root@localhost tmp]# tar –xzvf mysql-cluster-gpl-7.1.13-linux-i686-glibc23.tar.gz
[root@localhost tmp]# cd mysql-cluster-gpl-7.1.13-linux-i686-glibc23
[root@localhost tmp]# cp bin/ndb_mgm* /usr/local/bin
2、改变路径为拷贝到的目录下,并确保这两个文件可执行。
[root@localhost tmp]# cd /usr/local/bin
[root@localhost bin]# chmod +x ndb_mgm*
3、在/usr/local下创建mysql文件夹。
[root@localhost ~]# cd /usr/local
[root@localhost local]# mkdir mysql
(二)、数据节点NDBD和SQL节点
配置数据节点NDBD和SQL节点
在每一个SQL节点中的/etc目录下找到my.cnf文件,并做如下配置:
[client]
socket=/usr/local/mysql/sock/mysql.sock
[mysqld]
ndbcluster
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/sock/mysql.sock
ndb-connectstring=192.168.20.231
old_passwords=1
[mysql_cluster]
ndb-connectstring=192.168.20.231
在每一个数据节点NDBD和SQL节点的机器上,用root用户执行下面的步骤。
1、检查/etc/passwd 和 /etc/group 文件,是否存在mysql组和mysql用户,如果没有,用下面的命令创建一个mysql组,并在改组中添加mysql用户。
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd –g mysql mysql
2、改变文件夹位置到mysql压缩包的存放位置,解压文件,准备安装,步骤如下:
(下载文件可以从其他电脑映射, 在/home/下面创建一个download文件夹,如果是在本机Linux下下载的文件,则不需要此映射步骤。)
[root@localhost ~]# mount -t cifs -o username="name",password="password" //192.168.20.210/MySQL /home/download
[root@localhost ~] cp /home/download/ mysql-cluster-gpl-7.1.13-linux-i686-glibc23.tar.gz /var/tmp
[root@localhost ~]# cd /var/tmp
[root@localhost tmp]# tar –C /usr/local –xzvf mysql-cluster-gpl-7.1.13-linux-i686-glibc23.tar.gz
3、改变位置到local文件夹,改变mysql解压后的文件夹名称为mysql,然后执行提供的脚本,创建系统数据库。
[root@localhost tmp]# cd /usr/local
[root@localhost local]# mv mysql-cluster-gpl-7.1.13-linux-i686-glibc23/ mysql/
[root@localhost local]# cd mysql
[root@localhost mysql]# mkdir sock
[root@localhost mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
4、为MySQL服务及数据目录设置必要的服务。
[root@localhost mysql]# chown -R root .
[root@localhost mysql]# chown -R mysql.mysql /usr/local/mysql/data
[root@localhost mysql]# chown -R mysql.mysql /usr/local/mysql/sock
[root@localhost mysql]# chgrp -R mysql .
[root@localhost mysql]# ls -l
5、复制MySQL的启动脚本到如下的文件夹,确保可以执行。并设置为当系统启动时,同时启动MySQL。
[root@localhost mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysql
[root@localhost mysql]# chmod +x /etc/rc.d/init.d/mysql
[root@localhost mysql]# chkconfig --add mysql
三、Cluster环境启动
注意启动顺序:首先是管理节点,然后是NDBD节点,最后是SQL节点。
1、[MGM]
[root@localhost ~]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini
使用ndb_mgm来监听客户端,如下:
[root@localhost ~]# ndb_mgm
2、[NDBD]
首次启动,则需要添加--initial参数,以便进行NDB节点的初始化工作。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件。
[root@localhost ~]# /usr/local/mysql/bin/ndbd --initial
如果不是首次启动,则执行下面的命令。
[root@localhost ~]# /usr/local/mysql/bin/ndbd
3、[SQLD]
/usr/local/mysql/bin/mysqld_safe --user=mysql &
有可能出现上图问题,是系统数据库创建问题,只需再次创建系统数据库,方法如下:
[root@localhost mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql
再次启动
/usr/local/mysql/bin/mysqld_safe --user=mysql &
查看管理节点,启动成功:
四、测试
1、常规测试:
在节点4上面:
为了让表在cluster中正常复制,创建一个表必须使用ndbcluster引擎(engine=ndb Or engine=ndbcluster)方法如下:
mysql>use test
mysql>create table teacher(t_id int) engine=ndb;
如果是一个已经存在的表,用alter table修改表的引擎。
mysql>alter table student engine=ndb;
插入一条数据:
mysql>insert into teacher values(133);
然后在节点5上:
mysql>select * from teacher;
两个节点数据保持一致,恭喜你,测试成功!
2、模拟NDB节点Crash:
在节点2上终止掉NDB进程,然后再分别通过两个SQL节点去访问teacher表,查看是否可以正常访问,数据是否一致。如下:
查看进程
[root@localhost ~]# ps -ef
[root@localhost ~]# kill 3344
[root@localhost ~]# ps -ef
查看管理节点,显示节点2已关闭。
节点4上面:
在节点5上面:
再回到节点4上面:
测试成功,当有一个NDB节点Crash后,整个MySQL Cluster环境仍可以正常服务。
3、模拟SQL节点Crash:
Kill掉节点4的mysqld进程,然后通过节点5进行访问,如下:
可以看到节点4 Crash之后,节点5仍然可以继续正常服务,测试成功。
遇到的的一些问题:
1、启动管理节时
#ndb_mgmd -f /var/lib/mysql-cluster/config.ini
MySQL Cluster Management Server mysql-5.5.19 ndb-7.2.4
2012-06-21 15:54:08 [MgmtSrvr] WARNING -- at line 12: [tcp] portnumber is deprecated
2012-06-21 15:54:08 [MgmtSrvr] WARNING -- at line 17: [MGM] id is deprecated, use NoId instead
2012-06-21 15:54:08 [MgmtSrvr] WARNING -- at line 26: [DB] id is deprecated, use Nodd instead
2012-06-21 15:54:08 [MgmtSrvr] WARNING -- at line 35: [DB] id is deprecated, use Nodd instead
2012-06-21 15:54:08 [MgmtSrvr] WARNING -- at line 44: [API] id is deprecated, us Id instead
2012-06-21 15:54:08 [MgmtSrvr] WARNING -- at line 51: [API] id is deprecated, us Id instead
2012-06-21 15:54:08 [MgmtSrvr] ERROR -- The hostname this node should have acc to the configuration does not match a local interface. Attempt to bind '192.168. failed with error: 99 'Cannot assign requested address'
解决方法:
删除config.ini中得id= [] 之类的; #ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial 初始化一下。
2、两个节点数据不同步。
原来我随便导入了一个脚本,结果存储引擎不是NDB。