如何使用MySQL 5.1设置负载平衡的MySQL群集

版本1.1

作者:Peter Okupski

本教程基于Falko Timme的MySQL Cluster 5.0教程。 它显示了如何配置具有五个节点的MySQL 5.1集群:1个管理,2个x存储节点和2个x平衡器节点。 该集群由Ultra Monkey软件包负载平衡,该软件包提供心跳 (用于检查其他节点是否仍然存在)和ldirectord (将请求分解到MySQL集群的节点)。

在本文中,我对所有节点使用Debian Etch 4.0。 因此,其他分布的设置可能会有所不同。 两个数据节点都是x64,以使用所有的8GB RAM。 服务器是从源编译的,所以你应该可以在任何平台上运行。 我在此设置中使用的MySQL版本是5.1.73。 这是一个发布候选人,但是我想使用5.1来利用基于内存磁盘的表。

从MySQL 5.1.6开始,可以将磁盘上的非索引列NDB表存储在磁盘上,而不是像先前版本的MySQL Cluster那样存储在RAM中。[ 更多 ]

这个howto只是让它运行的一个难题,对于许多人我建议从MySQL页面读取一些文档,以准备好如何管理整个集群,并始终知道发生了什么。

本文档不附带任何形式的保证! 记住,在生产模式使用之前,您需要进行测试和准备数据库。

1我的服务器

我将使用所有在同一个网络中的以下Debian服务器(在本例中为10.0.1.x):mysql-mngt.example.com:10.0.1.30 [MySQL集群管理服务器]

lb1.example.com:10.0.1.31 [Load Balancer 1]
lb2.example.com:10.0.1.32 [Load Balancer 2]
mysql-data1.example.com:10.0.1.33 [MySQL集群节点1]
mysql-data2.example.com:10.0.1.34 [MySQL集群节点2]

除此之外,我们需要一个虚拟IP地址: 10.0.1.10 。 它将由负载平衡器分配给MySQL集群,以便应用程序具有访问集群的单个IP地址。

虽然我们希望在我们的MySQL集群中有两个MySQL集群节点,但是我们仍然需要一个第三个节点,即MySQL集群管理服务器,主要是一个原因:如果两个MySQL集群节点中的一个失败,并且管理服务器没有运行,那么两个集群节点上的数据将变得不一致(“ 分裂脑 ”)。 我们还需要它来配置MySQL集群。

2个MySQL数据节点+ 1个集群管理服务器+ 2个负载平衡器= 5

这是我的硬件配置:

MySQL数据: DELL R300 Intel(R)四核Xeon(R)CPU X3353 @ 2.66GHz,2x SAS 146GB驱动器(Raid 1),8GB RAM

MySQL LoadBalancer: DELL R200 Intel(R)Xeon(R)CPU 3065 @ 2.33GHz,2x SATA 250 GB驱动器(Raid 1),1GB RAM

MySQL管理: DELL R200 Intel(R)Celeron(R)CPU 430 @ 1.80GHz,1x SATA 160 GB驱动器(Raid 1),1GB RAM

由于MySQL集群管理服务器不使用许多资源,您可以在本机上安装额外的负载平衡器,也可以使用它来监视Nagios或Cacti的整个集群。

2设置MySQL群集管理服务器

首先,我们必须下载MySQL 5.1.73(源版本),并安装集群管理服务器( ndb_mgmd )和集群管理客户端( ndb_mgm - 它可以用来监视集群中发生的情况)。 以下步骤在mysql-mngt.example.com ( 10.0.1.30 )上执行:

mysql-mngt.example.com:
cd /usr/src
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz
tar xvzf mysql-5.1.73.tar.gz
#Lets add proper user and group
groupadd mysql
useradd -g mysql mysql
./configure --prefix=/usr/local/mysql --enable-community-features \
--with-mysqld-user=mysql --with-mysqlmanager --with-plugins=ndbcluster
make
make install

这样我们就浪费了大约124MB的空间,因为我们不需要所有的实际的MySQL文件,但相信我只需在一个目录/ usr / local / mysql中进行任何清理/升级,而不是搜索/ usr中的所有文件/ bin等等。 编译后,我们有两个目录,我们对/ usr / local / mysql / bin和/ usr / local / mysql / libexec感兴趣[最后一个包含ndb管理exec]。

为了让生活更轻松,我们将以下内容添加到PATH环境中,因此我们必须编辑文件/root/.bash_profile :

mysql-mngt.example.com:
echo "PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/libexec" >>/root/.bash_profile
echo "export PATH" >>/root/.bash_profile

接下来,我们必须创建集群配置文件/usr/local/mysql/var/mysql-cluster/config.ini: [ 在此提示 ]

mysql-mngt.example.com:
mkdir /usr/local/mysql/var/mysql-cluster
cd /usr/local/mysql/var/mysql-cluster
vi config.ini[NDBD DEFAULT]
NoOfReplicas=2
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.
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Section for the cluster management node
[NDB_MGMD]
# IP address of the management node (this system)
HostName=10.0.1.30
# Section for the storage nodes
[NDBD]
# IP address of the first storage node
HostName=10.0.1.33
DataDir=/usr/local/mysql/var/mysql-cluster
BackupDataDir=/usr/local/mysql/var/mysql-cluster/backup
DataMemory=2048M
[NDBD]
# IP address of the second storage node
HostName=10.0.1.34
DataDir=/usr/local/mysql/var/mysql-cluster
BackupDataDir=/usr/local/mysql/var/mysql-cluster/backup
DataMemory=2048M
# one [MYSQLD] per storage node
[MYSQLD]
[MYSQLD]

请将文件中的IP地址替换为您的设置。

然后我们继续到DataSQL节点进行必要的目录和文件的设置。

mysql-mngt.example.com:
/usr/local/mysql/libexec/ndb_mgmd -f /usr/local/mysql/var/mysql-cluster/config.ini

在系统引导时自动启动管理服务器是有意义的,因此我们创建了一个非常简单的初始化脚本和相应的启动链接:

mysql-mngt.example.com:
echo '/usr/local/mysql/libexec/ndb_mgmd -f /usr/local/mysql/var/mysql-cluster/config.ini' > /etc/init.d/ndb_mgmd
chmod 755 /etc/init.d/ndb_mgmd
update-rc.d ndb_mgmd defaults

3设置MySQL群集节点(存储节点)

现在我们在mysql-data1.example.com和mysql- data2.example.com上安装mysql- 5.1.73 :

mysql-data1.example.com / mysql-data2.example.com:
cd /usr/src
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz
tar xvzf mysql-5.1.73.tar.gz
groupadd mysql
useradd -g mysql mysql
cd /usr/src/mysql-5.1.73
./configure --prefix=/usr/local/mysql --enable-community-features --with-mysqld-user=mysql --with-plugins=ndbcluster
make
make install
/usr/src/mysql-5.1.73/scripts/mysql_install_db --user=mysql
cd /usr/local/mysql
chown -R root:mysql .
chown -R mysql.mysql /usr/local/mysql/var
cd /usr/src/mysql-5.1.73
cp support-files/mysql.server /etc/init.d/
chmod 755 /etc/init.d/mysql.server
cd /etc/init.d
update-rc.d mysql.server defaults

然后我们在两个节点上创建MySQL配置文件/etc/my.cnf :

mysql-data1.example.com / mysql-data2.example.com:
vi /etc/my.cnf[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
ndbcluster
# IP address of the cluster management node
ndb-connectstring=10.0.1.30
default-storage-engine=NDBCLUSTER
#Those are for future tuning
#max_connections=341
#query_cache_size=16M
#thread_concurrency = 4
[mysql_cluster]
# IP address of the cluster management node
ndb-connectstring=10.0.1.30

确保填写MySQL集群管理服务器的正确IP地址。

让我们添加PATH env。 到数据节点:

mysql-data1.example.com / mysql-data2.example.com:
echo "PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/libexec" >>/root/.bash_profile
echo "export PATH" >>/root/.bash_profile

接下来,我们创建数据和备份目录,并在两个集群节点上启动MySQL服务器:

mysql-data1.example.com / mysql-data2.example.com:
mkdir /usr/local/mysql/var/mysql-cluster
mkdir /usr/local/mysql/var/mysql-cluster/backup
cd /var/lib/mysql-cluster
/usr/local/mysql/libexec/ndbd --initial
/etc/init.d/mysql.server start

(请注意:只有当我们第一次启动MySQL,并且mysql-mngt.example.com上的/usr/local/mysql/mysql-cluster/config.ini更改时,才需要运行ndbd --initial )。

现在是为MySQL root用户设置密码的好时机

mysql-data1.example.com / mysql-data2.example.com:
mysqladmin -u root password yourrootsqlpassword

我们要在引导时启动集群节点,所以我们创建一个ndbd init脚本和相应的系统启动链接:

mysql-data1.example.com / mysql-data2.example.com:
echo '/usr/local/mysql/libexec/ndbd' > /etc/init.d/ndbd
chmod 755 /etc/init.d/ndbd
update-rc.d ndbd defaults