Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167363
  • 博文数量: 39
  • 博客积分: 756
  • 博客等级: 上士
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-27 15:06
文章分类
文章存档

2012年(14)

2011年(24)

2010年(1)

分类:

2012-11-14 10:31:52

最近由于公司有高可用数据库的需求,念想了很久MYSQL集群,抽空整理、归纳了一下自己对MYSQL集群的理解和安装配置文档,一方面当作留给自己的学习笔记,另一方面也希望能给正在看本文档的您提供一些参考。

一、 MYSQL CLUSTER介绍

MYSQL集群适用于分布式计算高可用环境,基于NDBCLUSTER 存储引擎,可以利用一堆廉价服务器实现一整套高冗余数据库架构。不同于ORACLE RACMYSQL 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

阅读(2319) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~