最近由于公司有高可用数据库的需求,念想了很久MYSQL集群,抽空整理、归纳了一下自己对MYSQL集群的理解和安装配置文档,一方面当作留给自己的学习笔记,另一方面也希望能给正在看本文档的您提供一些参考。
一、 MYSQL CLUSTER介绍
MYSQL集群适用于分布式计算高可用环境,基于NDBCLUSTER 存储引擎,可以利用一堆廉价服务器实现一整套高冗余数据库架构。不同于ORACLE RAC,MYSQL CLUSTER不需要共享存储,利用每台服务器的内存与磁盘实现数据存储,所以不用担心单点故障。
MYSQL CLUSTER还是存在一定局限性的,并非所有环境都能适用它,在需要复杂联合(Join)操作的环境中,MYSQL CLUSTER的性能可能会大打折扣。另外,网络环境也可能会是MYSQL CLUSTER的一大瓶颈,手册里也有相关介绍。目前7.2版本还不支持外键,要到7.3版本才能实现外键功能。即便如此,这项技术还是具有自己的优势,值得大家花点时间去钻研一番。
具体架构请参考下图(官方):
二、MYSQL CLUSTER的集群概念
一个NDB数据库由管理节点(Management Node)、数据节点(Data Node)、SQL节点(mysql instance)组成。管理节点用于获取集中式配置、监控、控制所有集群节点。一台计算机可以运行一个节点进程,也可以同时运行多个节点进程,通常数据节点可以同SQL节点运行在同一台计算机上,具体要看实际需求。
以下是官方文档对3种节点的详细介绍:
三类集群节点,在最低的MySQL集群配置中,至少有三个节点,这三类节点分别是:
管理(MGM)节点:这类节点的作用是管理MySQL集群内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令ndb_mgmd启动的。
数据节点:这类节点用于保存集群的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。数据节点是用命令ndbd启动的。
SQL节点:这是用来访问集群数据的节点。对于MySQL簇,客户端节点是使用NDB集群存储引擎的传统MySQL服务器。典型情况下,SQL节点是使用命令mysqld –ndbcluster启动的,或将ndbcluster添加到my.cnf后使用mysqld启动。
三、安装集群
1.操作系统版本:CentOS release 5.4 (Final)
2.我的MYSQL CLUSTER版本7.2.8,基于mysql5.5
3. 测试环境架构
192.168.56.10 管理节点
192.168.56.11 SQL节点
192.168.56.12 SQL 节点,数据节点
192.168.56.13 SQL 节点,数据节点
3.安装数据节点与SQL节点(本文档数据节点上同时安装了SQL节点,我的安装脚本方法会略语不同)
tar zxvf mysql-cluster-gpl-7.2.8-linux2.6-x86_64.tar.gz
cp mysql-cluster-gpl-7.2.8-linux2.6-x86_64 /usr/local/mysql
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start
4. 安装管理节点
tar zxvf mysql-cluster-gpl-7.2.8-linux2.6-x86_64.tar.gz
cp mysql-cluster-gpl-7.2.8-linux2.6-x86_64 /usr/local/mysql
cd /usr/local/mysql
cp bin/ndb_mgm* /usr/local/mysql/
mkdir /var/lib/mysql-cluster
mkdir /usr/local/mysql/mysql-cluster
四、配置集群
1. 配置、启动管理节点
vi /var/lib/mysql-cluster/config.ini
[NDBD DEFAULT]
NoOfReplicas: 2 #副本数量,建议使用默认的2
DataMemory: 100M
IndexMemory: 20M
BackupMemory: 20M
[MGM DEFAULT]
PortNumber: 1186 #管理节点通信端口
[NDB_MGMD] #管理节点配置项
Nodeid= 1
HostName = 192.168.56.10 #管理节点IP
DataDir = /var/lib/mysql-cluster #管理节点日志、配置目录
ArbitrationRank: 1 #该节点的优先级别等级
[NDBD] #数据节点配置项
Nodeid = 2 #第一个数据节点
HostName = 192.168.56.12 #数据节点IP
DataDir = /usr/local/mysql/data #数据节点存放数据的目录
[NDBD]
Nodeid=3 #第二个数据节点
HostName = 192.168.56.13
DataDir = /usr/local/mysql/data
#
[MYSQLD] #SQL节点配置项
Nodeid = 4 #第一个SQL节点
HostName = 192.168.56.11
[MYSQLD]
Nodeid = 5 #第二个SQL节点,与第一数据节点在同一计算机上
HostName = 192.168.56.12
[MYSQLD]
Nodeid = 6 #第三个SQL节点,与第二数据节点在同一计算机上
HostName = 192.168.56.13
[MYSQLD] #建议保留一个SQL节点配置口
从MYSQL5.0.3开始,数据节点的默认端口不需要配,Cluster能够根据空闲的端口自动地为数据节点分配端口
启动管理节点
ndb_mgmd -f /var/lib/mysql-cluster/config.ini注意,必须用“-f”或“--config-file”选项,告诉ndb_mgmd到哪里找到配置文件
关闭管理节点
ndb_mgm –e shutdown
2. 启动数据节点
在每台数据节点主机上,对于首次启动,运行下述命令启动NDBD进程:
ndbd --initial注意,仅应在首次启动ndbd时,或在备份/恢复或配置变化后重启ndbd时使用“--initial”参数,这很重要。原因在于,该参数会使节点删除由早期ndbd实例创建的、用于恢复的任何文件,包括恢复用日志文件。
3. 配置、启动SQL节点
vi /etc/my.cnf
[mysqld]
ndbcluster
ndb-connectstring=192.168.56.10:1186
[mysql_cluster]
ndb-connectstring=192.168.56.10:1186
启动SQL节点
Service mysqld start
完成配置后,启动集群并不很困难。必须在数据节点所在的主机上分别启动每个集群节点进程。尽管能够按任何顺序启动节点,但我们建议,应首先启动管理节点,然后启动存储节点,最后启动SQL节点
五、查看状态
[root@TEST-A ~]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.56.12 (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0)
id=3 @192.168.56.13 (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0, Master)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.56.10 (mysql-5.5.27 ndb-7.2.8)
[mysqld(API)] 3 node(s)
id=4 @192.168.56.11 (mysql-5.5.27 ndb-7.2.8)
id=5 @192.168.56.12 (mysql-5.5.27 ndb-7.2.8)
id=6 @192.168.56.13 (mysql-5.5.27 ndb-7.2.8)
六、创建NDB CLUSTER表测试
登陆192.168.56.11
create database ndb_test
create table test(id mediumint unsigned not null auto_increment primary key, name varchar(30) not null default '') engine = ndbcluster default charset utf8;
use ndb_test
insert into test(name) values('test1');
insert into test(name) values('test1');
insert into test(name) values('test1');
mysql> select * from test;
+----+-------+
| id | name |
+----+-------+
| 3 | test3 |
| 1 | test1 |
| 2 | test2 |
+----+-------+
登陆192.168.56.12
mysql> select * from test;
+----+-------+
| id | name |
+----+-------+
| 3 | test3 |
| 1 | test1 |
| 2 | test2 |
+----+-------+
七、自动安装脚本
[root@TEST-A ~]# cat mysql_cluster_install_7.2.8.sh
#!/bin/sh
install_path='/root'
install_file='mysql-cluster-gpl-7.2.8-linux2.6-x86_64'
path='/usr/local/mysql'
help="使用方法:\n\n\t./mysql_cluster_install_7.2.8.sh -t type [mgm|others]\n\n\tmgm 安装初始化管理节点\n\tother 安装初始化数据节点或SQL节点\n\n"
while getopts ht: opt
do
case "$opt" in
t) type=$OPTARG
;;
h)
echo -e $help
exit
;;
esac
done
#安装ndbd管理节点
mgmd_install(){
#cd $install_path
tar zxvf ./$install_file.tar.gz
mv ./$install_file $path
#添加用户
groupadd mysql && useradd -g mysql mysql
#创建目录
if [ ! -e "$path/data" ]
then
mkdir $path/data
fi
if [ ! -e "$path/run" ]
then
mkdir $path/run
fi
if [ ! -e "$path/log" ]
then
mkdir $path/log
fi
if [ ! -e "$path/var" ]
then
mkdir $path/var
fi
if [ ! -e "$path/mysql-cluster" ]
then
mkdir $path/mysql-cluster
fi
#增加打开文件数量
ulimit -n 4096
srh_limit=`egrep "soft nofile|hard nofile" /etc/security/limits.conf`
if [ "$srh_limit" = "" ]
then
echo $srh_limit
echo "* soft nofile 4096" >> /etc/security/limits.conf
echo "* hard nofile 4096" >> /etc/security/limits.conf
else
echo "ulimit配置已存在"
fi
#添加PATH
srh_path=`grep $path/bin /etc/profile`
if [ "$srh_path" = "" ]
then
echo $srh_path
echo "PATH=\"$path/bin:\$PATH\"" >> /etc/profile
export PATH="$path/bin:$PATH"
else
echo "path配置已存在"
fi
#添加LIB PATH
srh_lib=`grep $path/lib/mysql /etc/ld.so.conf`
if [ "$srh_lib" = "" ]
then
echo $srh_lib
echo "$path/lib/mysql" >> /etc/ld.so.conf && ldconfig
else
echo "lib配置已存在"
fi
#复制管理节点的执行文件与配置文件
cp $path/bin/ndb_mgm* /usr/local/bin && chmod 755 /usr/local/bin/ndb_mgm*
if [ ! -f "/var/lib/mysql-cluster" ]
then
mkdir /var/lib/mysql-cluster
cp $path/support-files/config.small.ini /var/lib/mysql-cluster/config.ini
fi
#MYSQL安装目录赋权
chown -R mysql:mysql $path
}
#安装数据节点或SQL节点
other_install(){
#cd $install_path
tar zxvf ./$install_file.tar.gz
mv ./$install_file $path
#添加用户
groupadd mysql && useradd -g mysql mysql
#创建目录
if [ ! -e "$path/data" ]
then
mkdir $path/data
fi
if [ ! -e "$path/run" ]
then
mkdir $path/run
fi
if [ ! -e "$path/log" ]
then
mkdir $path/log
fi
if [ ! -e "$path/var" ]
then
mkdir $path/var
fi
if [ ! -e "$path/mysql-cluster" ]
then
mkdir $path/mysql-cluster
fi
if [ ! -f /etc/my.cnf ]
then
echo -ne "\r正在需要复制$path/support-files/my-small.cnf到/etc/my.cnf"
sleep 1
cp $path/support-files/my-small.cnf /etc/my.cnf
echo -ne "...复制完成"
else
echo "/etc/my.cnf已存在"
fi
#增加打开文件数量
ulimit -n 4096
srh_limit=`egrep "soft nofile|hard nofile" /etc/security/limits.conf`
if [ "$srh_limit" = "" ]
then
echo $srh_limit
echo "* soft nofile 4096" >> /etc/security/limits.conf
echo "* hard nofile 4096" >> /etc/security/limits.conf
else
echo "ulimit配置已存在"
fi
#添加PATH
srh_path=`grep $path/bin /etc/profile`
if [ "$srh_path" = "" ]
then
echo $srh_path
echo "PATH=\"$path/bin:\$PATH\"" >> /etc/profile
export PATH="$path/bin:$PATH"
source /etc/profile
else
echo "path配置已存在"
fi
#添加LIB PATH
srh_lib=`grep $path/lib/mysql /etc/ld.so.conf`
if [ "$srh_lib" = "" ]
then
echo $srh_lib
echo "$path/lib/mysql" >> /etc/ld.so.conf && ldconfig
else
echo "lib配置已存在"
fi
#初始化数据库
cd $path && scripts/mysql_install_db --user=mysql
#运行MYSQL进程
#cd $path && bin/mysqld_safe --user=mysql &
#创建service服务
cd $path && cp support-files/mysql.server /etc/init.d/mysqld && chmod 755 /etc/init.d/mysqld
#MYSQL安装目录赋权
chown -R mysql:mysql $path
}
#MAIN
if [ "$type" = "mgm" ]
then
mgmd_install
elif [ "$type" = "others" ]
then
other_install
else
echo -e $help
fi
总结:以上就是本文档的全部内容并且都是在测试环境中完成,MYSQL CLUSTER的搭建与配置感觉没有想象中复杂,比较容易上手。但是,这些都只是迈出了第一步,后面需要继续研究优化配置与性能测试,据朋友介绍,在300并发时会有各种问题出现,具体可能和测试环境、应用本身有关,有时间我会继续完成后续文档,希望能用到生产环境中去。
Dominic