当前位置: 首页 > 图文教程 > 数据库 > MYSQL > 配置高可用性的MySQL服务器负载均衡群集

MYSQL
mysql "too many connections" 错误 之 mysql解决方法
MySQL: mysql is not running but lock exists 的解决方法
使用mysql中遇到的几个问题
MySQL一个索引最多有多少个列?真实的测试例子
MySQL里Create Index 能否创建主键 Primary Key
MySQL 创建索引(Create Index)的方法和语法结构及例子
MYSQL 优化常用方法
linux mysql 找回密码
mysql 动态执行存储过程语句
MySQL 查找价格最高的图书经销商的几种SQL语句
MySQL 客户端不输入用户名和密码直接连接数据库的2个方法
mysql 查询表中平均分最低的班级
mysql 左连接、右连接和内连接
Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理)
Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)
Mysql 插入中文及中文查询 (修改+调试)
mysql 数据表中查找重复记录
MySql .frm数据库文件导入的问题
解决hibernate+mysql写入数据库乱码
mySQL UNION运算符的默认规则研究

MYSQL 中的 配置高可用性的MySQL服务器负载均衡群集


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 242 ::
收藏到网摘: n/a

这篇论坛文章(赛迪网技术社区)主要介绍了配置一个高可用性的MySQL服务器负载均衡群集的具体过程,详细内容请参考下文:

本文将告诉你如何配置一个三个节点的MySQL 5数据库服务器群集:两个存储节点和一个

管理节点。这个群集是由用提供“heartbeat心跳”(用来检查另外一个节点是否活动)和

“ldirectord”(将请求分发到MySQL群集的节点)的Ultra Monkey安装包的两个节点组成的

一个高可用性负载均衡器。


本文我们的每个节点使用Debian Sarge Linux系统。其它Linux发行版本的安装可能一点点

区别。MySQL的版本我们使用5.0.19。如果你不想使用MySQL 5,你也可以使用MySQL 4.1,尽

管我还没有测试过。


本文是一篇实践应用指导;它没有涉及太多的理论。关于群集的理论你可以在网上找到很多。


一 服务器


我使用下面的Debian服务器,它们都在同一个网段(本例如:192.168.0.x):

sql1.test.com: 192.168.0.101 MySQL 群集节点 1

sql2.test.com: 192.168.0.102 MySQL 群集节点 2

loadb1.test.com: 192.168.0.103 负载均衡 1 / MySQL 群集管理服务器

loadb2.test.com: 192.168.0.104 负载均衡 2

另外我们需要一个虚拟IP地址:192.168.0.105。它会安排给这个MySQL群集的负载均衡,以便于

应用程序通过统一单独的IP地址来访问群集。


尽管我们想在MySQL群集中使用两个节点,但是我们仍然需要第三个节点,MySQL群集管理服务器

,主要的一个原因是:如果其中一个MySQL群集节点坏了,而MySQL群集管理服务器没有运行,那

么两个群集节点上的数据将会不一致(“split brain”)。我们需要它来配置MySQL群集.


因此我们的安装一般需要五台机器:


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


因为群集管理服务器没有使用多少资源,系统将会空着什么都不做,所以我们可以把我们的第一

个负载均衡和它一起放在同一台机器上,这样可以节约我们一台服务器,所以最好我们只需要四台

机器。


二 配置MySQL群集管理服务器


首先我们要下载MySQL 5.0.19,并安装群集管理服务器(ndb_mgmd)和群集管理客户端 (ndb_mgm - 它

可以用来监控群集的运行情况). 下面的步骤是在loadb1.test.com (192.168.0.103)上进行的:


loadb1.test.com:


mkdir /usr/src/mysql-mgm

cd /usr/src/mysql-mgm

wget http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-max-5.0.19-linux-i686-\

glibc23.tar.gz/from/http://www.mirrorservice.org/sites/ftp.mysql.com/

tar xvfz mysql-max-5.0.19-linux-i686-glibc23.tar.gz

cd mysql-max-5.0.19-linux-i686-glibc23

mv bin/ndb_mgm /usr/bin

mv bin/ndb_mgmd /usr/bin

chmod 755 /usr/bin/ndb_mg*

cd /usr/src

rm -rf /usr/src/mysql-mgm


下一步,我们必须创建群集的配置文件,/var/lib/mysql-cluster/config.ini:


loadb1.test.com:


mkdir /var/lib/mysql-cluster

cd /var/lib/mysql-cluster

vi config.ini


———-

[NDBD DEFAULT]

NoOfReplicas=2

[MYSQLD DEFAULT]

[NDB_MGMD DEFAULT]

[TCP DEFAULT]

# Section for the cluster management node

[NDB_MGMD]

# IP address of the management node (this system)

HostName=192.168.0.103

# Section for the storage nodes

[NDBD]

# IP address of the first storage node

HostName=192.168.0.101

DataDir= /var/lib/mysql-cluster

[NDBD]

# IP address of the second storage node

HostName=192.168.0.102

DataDir=/var/lib/mysql-cluster

# one [MYSQLD] per storage node

[MYSQLD]

[MYSQLD]

———-

实际应用中请将文件中的IP地址换成你相应的IP。

然后我们启动群集管理服务器:

loadb1.test.com:

ndb_mgmd -f /var/lib/mysql-cluster/config.ini

我们应该也需要在服务器启动时能够自动启动管理服务器,所以我们创建了一个非常简单的初始化

脚本和相应的启动连接:

loadb1.test.com:

echo ‘ndb_mgmd -f /var/lib/mysql-cluster/config.ini’ > /etc/init.d/ndb_mgmd

chmod 755 /etc/init.d/ndb_mgmd

update-rc.d ndb_mgmd defaults

三 配置MySQL群集节点(存储节点)

现在我们将分别在sql1.test.com和sql2.test.com上安装mysql-max-5.0.19:

sql1.example.com / sql2.example.com:

groupadd mysql

useradd -g mysql mysql

cd /usr/local/

wget http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-max-5.0.19-linux-i686-\

glibc23.tar.gz/from/http://www.mirrorservice.org/sites/ftp.mysql.com/

tar xvfz mysql-max-5.0.19-linux-i686-glibc23.tar.gz

ln -s mysql-max-5.0.19-linux-i686-glibc23 mysql

cd mysql

scripts/mysql_install_db –user=mysql

chown -R root:mysql .

chown -R mysql data

cp support-files/mysql.server /etc/init.d/

chmod 755 /etc/init.d/mysql.server

update-rc.d mysql.server defaults

cd /usr/local/mysql/bin

mv * /usr/bin

cd ../

rm -fr /usr/local/mysql/bin

ln -s /usr/bin /usr/local/mysql/bin


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

vi /etc/my.cnf

[mysqld]

ndbcluster

# IP address of the cluster management node

ndb-connectstring=192.168.0.103

[mysql_cluster]

# IP address of the cluster management node

ndb-connectstring=192.168.0.103

确认你在群集管理服务器中输入的是正确的IP地址。

下一步我们分别在每个群集节点上创建数据目录和启动MySQL服务器:

sql1.test.com / sql2.test.com:

mkdir /var/lib/mysql-cluster

cd /var/lib/mysql-cluster

ndbd –initial

/etc/init.d/mysql.server start

(请记住:我们只是在第一次启动MySQL时或loadb1.test.com上面的

/var/lib/mysql-cluster/config.ini发生改变时,才使用ndbd –initial)

现在,是时候给MySQL root帐号设置密码了:

sql1.test.com / sql2.test.com:

mysqladmin -u root password yourrootsqlpassword

我们需要在服务器启动时,启动群集节点,所以我们创建一个ndbd初始化脚本和相应的

系统启动连接:

sql1.test.com / sql2.test.com:

echo ‘ndbd’ > /etc/init.d/ndbd

chmod 755 /etc/init.d/ndbd

update-rc.d ndbd defaults

四 测试MySQL群集

我们的MySQL群集配置工作已经完成,现在是测试它的时间了。在群集管理服务器

(loadb1.test.com)上,运行群集管理客户端ndb_mgm来检查群集节点是否连接:

loadb1.test.com:

ndb_mgm

你将会看到这些:

– NDB Cluster — Management Client –

ndb_mgm>

在命令行输入 show;

show;

输出的信息应该是这样的:

ndb_mgm> show;

Connected to Management Server at: localhost:1186

Cluster Configuration

———————

[ndbd(NDB)] 2 node(s)

id=2 @192.168.0.101 (Version: 5.0.19, Nodegroup: 0, Master)

id=3 @192.168.0.102 (Version: 5.0.19, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)

id=1 @192.168.0.103 (Version: 5.0.19)

[mysqld(API)] 2 node(s)

id=4 @192.168.0.101 (Version: 5.0.19)

id=5 @192.168.0.102 (Version: 5.0.19)

ndb_mgm>

如果你看到你的节点都已经连接上了。那么一切都很顺利!

输入

quit;

退出 ndb_mgm 客户端控制台。

现在我们在sql1.test.com节点上创建一个测试数据库,并创建一个测试表,

填入一些测试数据:

mysql -u root -p

CREATE DATABASE mysqlclustertest;

USE mysqlclustertest;

CREATE TABLE testtable (i INT) ENGINE=NDBCLUSTER;

INSERT INTO testtable () VALUES (1);

SELECT * FROM testtable;

quit;

(看看上面这个CREATE语句:我们想群集起来的所有数据库的表,必须使用 ENGINE=NDBCLUSTER!

如果你使用其它的ENGINE,那么群集将不会工作!)

SELECT出的结果应该是:

mysql> SELECT * FROM testtable;

+——+

| i |

+——+

| 1 |

+——+

1 row in set (0.03 sec)


现在我们在sql2.test.com节点上创建相同的数据库(是,我们仍然要创建它,但是在testtable创建之后

数据将会被复制到sql2.test.com,因为testtable是使用ENGINE=NDBCLUSTER):

sql2.test.com:

mysql -u root -p

CREATE DATABASE mysqlclustertest;

USE mysqlclustertest;

SELECT * FROM testtable;

SELECT出的结果应该是和上面的sql1.test.com的结果相同:

mysql> SELECT * FROM testtable;

+——+

| i |

+——+

| 1 |

+——+

1 row in set (0.04 sec)


我们看到数据已经从sql1.test.com节点复制到sql2.example.com节点了。现在我们

向testtable中插入另外一行:

sql2.test.com:

INSERT INTO testtable () VALUES (2);

quit;

现在让我们回到sql1.example.com节点上,检查是否能够看见新插入的那一行:

sql1.example.com:

mysql -u root -p

USE mysqlclustertest;

SELECT * FROM testtable;

quit;

 


你应该看到像这样的输出:


mysql> SELECT * FROM testtable;

+——+

| i |

+——+

| 1 |

| 2 |

+——+

2 rows in set (0.05 sec)


所以每个群集节点都有着相同的数据!


现在让我们看看如果我们停止节点1(sql1.example.com):运行


sql1.example.com:


killall ndbd


并检查


ps aux | grep ndbd | grep -iv grep


看看所有的ndbd进程已经结束了。如果你仍然看见ndbd进程,再运行


killall ndbd


直到所有的ndbd进程都结束。


现在让在我们的管理服务器上,检查群集的状态(loadb1.example.com):


loadb1.example.com:


ndb_mgm


在ndb_mgm控制台上输入


show;


你应该看到这些:

ndb_mgm> show;

Connected to Management Server at: localhost:1186

Cluster Configuration

———————

[ndbd(NDB)] 2 node(s)

id=2 (not connected, accepting connect from 192.168.0.101)

id=3 @192.168.0.102 (Version: 5.0.19, Nodegroup: 0, Master)

[ndb_mgmd(MGM)] 1 node(s)

id=1 @192.168.0.103 (Version: 5.0.19)

[mysqld(API)] 2 node(s)

id=4 @192.168.0.101 (Version: 5.0.19)

id=5 @192.168.0.102 (Version: 5.0.19)

ndb_mgm>


你看见,sql1.example.com节点没有连接上了。


输入:


quit;


退出ndb_mgm控制台。


让我们检查sql2.example.com节点:


sql2.example.com:


mysql -u root -p

USE mysqlclustertest;

SELECT * FROM testtable;

quit;


SELECT查询出的结果应该依然是:


mysql> SELECT * FROM testtable;

+——+

| i |

+——+

| 1 |

| 2 |

+——+

2 rows in set (0.17 sec)


Ok,所有的测试都正常,现在让我们再次启动sql1.test.com节点:


sql1.example.com:


ndbd


五 如何重新启动群集


现在让我们设想你由于修改了loadb1.test.com节点上的/var/lib/mysql-cluster/config.ini

或者其它原因,需要重新启动MySQL群集。为了这样做,你要使用loadb1.example.com节点上的

ndb_mgm群集管理客户端:


loadb1.test.com:


ndb_mgm


在ndb_mgm控制台上,你输入


shutdown;


你将看到像这样的信息:


ndb_mgm> shutdown;

Node 3: Cluster shutdown initiated

Node 2: Node shutdown completed.

2 NDB Cluster node(s) have shutdown.

NDB Cluster management server shutdown.

ndb_mgm>


这意味着群集节点sql1.test.com和sql2.test.com,已经群集管理服务器都已经关闭。


运行


quit;


退出 ndb_mgm 控制台。


为启动群集管理服务器,在loadb1.test.com上这样做:


loadb1.test.com:


ndb_mgmd -f /var/lib/mysql-cluster/config.ini


并在sql1.test.com 和 sql2.test.com 上运行:


sql1.example.com / sql2.example.com:


ndbd


或者,你刚修改过loadb1.test.com上的/var/lib/mysql-cluster/config.ini文件:


ndbd –initial


在这之后,你可以在loadb1.test.com上检查看看群集是否已经重启:


loadb1.test.com:


ndb_mgm


在ndb_mgm控制台,输入


show;


来查看当前群集的状态。所有节点重启后可能需要一点点时间来报告已经连接上。


输入:


quit;


退出ndb_mgm控制台。


六 配置负载均衡


我们的MySQL群集已经现在完成了,你现在可以开始使用它了。然而,我们没有一个访问群集的

单独的IP地址,这意味着你必须配置应用程序一部分使用MySQL群集节点1(sql1.test.com),另

外的部分使用节点2(sql2.test.com).当然,所有的应用程序只是需要使用一个节点,但如果你

不想在群集节点之间分流负载,那你拥有一个群集的目的是什么?另外一个问题是,如果一个群集

节点坏掉了怎么办?那么使用这个群集节点的应用程序将根本不能够工作了。


这里的解决方案是在MySQL群集前端配置一个负载均衡器来在每个MySQL群集节点之间平衡负载。

负载均衡器在群集节点之间配置一个共享的虚拟IP地址,所有你的应用程序使用这个虚拟IP地址来

访问群集。如果其中一个节点坏掉,那么你的应用程序将仍然可以工作,因为负载均衡器将请求转移

到了工作正常的另外一个节点。


现在在这个例子中负载均衡器成为了瓶颈。如果这个负载均衡器坏掉了怎么办呢?因此我们将以(active/passive)

主动/被动安装方式来配置两个负载均衡器。这意味着我们有一个负载均衡器是主动的,另外一个是

热备的,当主动的那个坏掉了,它将会变为主动。每个负载均衡器都使用heartbeat(心跳)来检查

另外一个负载均衡器的活动情况,同时负载均衡器也使用ldirectord,它负责将流量分配到群集节点。

heartbeat和ldirectord都在我们将要安装的 Ultra Monkey 安装包中。


loadb1.test.com 和 loadb2.test.com 节点的系统内核支持IPVS(IP虚拟服务器) 非常重要。

IPVS是在Linux内核的传输层执行负载均衡的。


6.1 安装 Ultra Monkey


好,现在让我们开始: 首先我们启用loadb1.test.com 和 loadb2.test.com节点上IPVS:


loadb1.example.com / loadb2.example.com:


modprobe ip_vs_dh

modprobe ip_vs_ftp

modprobe ip_vs

modprobe ip_vs_lblc

modprobe ip_vs_lblcr

modprobe ip_vs_lc

modprobe ip_vs_nq

modprobe ip_vs_rr

modprobe ip_vs_sed

modprobe ip_vs_sh

modprobe ip_vs_wlc

modprobe ip_vs_wrr


为了在启动时IPVS模块,我们在/etc/modules列举了模块:


loadb1.test.com / loadb2.test.com:


vi /etc/modules


ip_vs_dh

ip_vs_ftp

ip_vs

ip_vs_lblc

ip_vs_lblcr

ip_vs_lc

ip_vs_nq

ip_vs_rr

ip_vs_sed

ip_vs_sh

ip_vs_wlc

ip_vs_wrr


现在我们编辑/etc/apt/sources.list,添加 Ultra Monkey 的下载点,然后我们安装Ultra Monkey:


loadb1.test.com / loadb2.test.com:


vi /etc/apt/sources.list


deb http://www.ultramonkey.org/download/3/ sarge main

deb-src http://www.ultramonkey.org/download/3 sarge main


apt-get update

apt-get install ultramonkey libdbi-perl libdbd-mysql-perl libmysqlclient14-dev


现在Ultra Monkey已经安装了,如果你看到下面这样的警告:


| libsensors3 not functional

|

| It appears that your kernel is not compiled with sensors support. As a

| result, libsensors3 will not be functional on your system.

|

| If you want to enable it, have a look at “I2C Hardware Sensors Chip

| support” in your kernel configuration.


你可以忽略它。


回答下面的问题:


Do you want to automatically load IPVS rules on boot?

<-- No


Select a daemon method.

<-- none


我刚安装的libdbd-mysql-perl安装包不能够在MySQL 5(我们在MySQL群集上使用MySQL 5),

因此我们安装最新的DBD::mysql Perl安装包:

 


loadb1.test.com / loadb2.test.com:


cd /tmp

wget http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-3.0002.tar.gz

tar xvfz DBD-mysql-3.0002.tar.gz

cd DBD-mysql-3.0002

perl Makefile.PL

make

make install


我们必须先启用packet forwarding:


loadb1.example.com / loadb2.example.com:


vi /etc/sysctl.conf


# Enables packet forwardingnet.ipv4.ip_forward = 1


6.2 配置heartbeat(心跳)


我们通过创建三个文件(loadb1.test.com 和 loadb2.test.com的文件必须完全一样)来配置heartbeat:


loadb1.test.com / loadb2.test.com:


vi /etc/ha.d/ha.cf


logfacility local0

bcast eth0

mcast eth0 225.0.0.1 694 1 0

auto_failback off

node loadb1

node loadb2

respawn hacluster /usr/lib/heartbeat/ipfail

apiauth ipfail gid=haclient uid=hacluster


请记住:你必须列出节点名称(本例中是loadb1 和 loadb2)


uname -n


除了这些,我们不需要对这个文件做任何修改。


vi /etc/ha.d/haresources


loadb1 \

ldirectord::ldirectord.cf \

LVSSyncDaemonSwap::master \

IPaddr2::192.168.0.105/24/eth0/192.168.0.255


你必须列举其中一个负载均衡节点名称(这里是:loadb1),并且列出

虚拟IP地址(192.168.0.105)和广播地址(192.168.0.255).


vi /etc/ha.d/authkeys


auth 3

3 md5 somerandomstring


somerandomstring是loadb1 和 loadb2 用来相互认证的两个heartbeat守护进程的密码。

这里设置成你自己的密码。你可以选择3种加密方式。我一般使用md5来加密。


/etc/ha.d/authkeys应该是root帐号只读,这里我们这样做:


loadb1.test.com / loadb2.test.com:


chmod 600 /etc/ha.d/authkeys


6.3 配置 ldirectord


现在我们为ldirectord创建配置文件, 负载均衡器:


loadb1.example.com / loadb2.example.com:


vi /etc/ha.d/ldirectord.cf


# Global Directives

checktimeout=10

checkinterval=2

autoreload=no

logfile="local0"

quiescent=yes

virtual = 192.168.0.105:3306

service = mysql

real = 192.168.0.101:3306 gate

real = 192.168.0.102:3306 gate

checktype = negotiate

login = "ldirector"

passwd = "ldirectorpassword"

database = "ldirectordb"

request = "SELECT * FROM connectioncheck"

scheduler = wrr


请填入正确的虚拟IP地址(192.168.0.105)和正确的MySQL群集节点的IP地址(192.168.0.101 和 192.168.0.102)。


3306是MySQL运行时默认的端口。我们也指定了一个MySQL用户(ldirector)和密码(ldirectorpassword),一个数据库(ldirectordb)和

一条SQL查询。ldirectord 使用这些信息来测试MySQL群集节点,以此来检查它们的是否一直可用。下一步我们将用ldirector用户来

创建ldirectordb数据库。


现在我们为heartbeat创建系统必需的启动连接,并移除ldirectord(因为ldirectord将由heartbeat来启动):


loadb1.test.com / loadb2.test.com:


update-rc.d -f heartbeat remove

update-rc.d heartbeat start 75 2 3 4 5 . stop 05 0 1 6 .

update-rc.d -f ldirectord remove


6.4 创建数据库ldirector


下面我们在MySQL群集节点sql1.test.com 和 sql2.test.com上创建ldirector数据库。这个数据库将会用于我们的负载均衡器来检查

MySQL群集节点的可用性。


sql1.test.com:


mysql -u root -p

GRANT ALL ON ldirectordb.* TO 'ldirector'@'%' IDENTIFIED BY 'ldirectorpassword';

FLUSH PRIVILEGES;

CREATE DATABASE ldirectordb;

USE ldirectordb;

CREATE TABLE connectioncheck (i INT) ENGINE=NDBCLUSTER;

INSERT INTO connectioncheck () VALUES (1);

quit;


sql2.test.com:


mysql -u root -p

GRANT ALL ON ldirectordb.* TO 'ldirector'@'%' IDENTIFIED BY 'ldirectorpassword';

FLUSH PRIVILEGES;

CREATE DATABASE ldirectordb;

quit;


6.4 为负载均衡准备MySQL群集节点


最后我们必须配置MySQL群集节点sql1.test.com 和 sql2.test.com来接受虚拟IP地址192.168.0.105。


sql1.test.com / sql2.test.com:


apt-get install iproute


在/etc/sysctl.conf里面添加下面的内容:


vi /etc/sysctl.conf


# Enable configuration of arp_ignore option

net.ipv4.conf.all.arp_ignore = 1

# When an arp request is received on eth0, only respond if that address is

# configured on eth0. In particular, do not respond if the address is

# configured on lo

net.ipv4.conf.eth0.arp_ignore = 1

# Ditto for eth1, add for all ARPing interfaces

#net.ipv4.conf.eth1.arp_ignore = 1

# Enable configuration of arp_announce option

net.ipv4.conf.all.arp_announce = 2

# When making an ARP request sent through eth0 Always use an address that

# is configured on eth0 as the source address of the ARP request. If this

# is not set, and packets are being sent out eth0 for an address that is on

# lo, and an arp request is required, then the address on lo will be used.

# As the source IP address of arp requests is entered into the ARP cache on

# the destination, it has the effect of announcing this address. This is

# not desirable in this case as adresses on lo on the real-servers should

# be announced only by the linux-director.

net.ipv4.conf.eth0.arp_announce = 2

# Ditto for eth1, add for all ARPing interfaces

#net.ipv4.conf.eth1.arp_announce = 2


sysctl -p


将下面这段加入到/etc/network/interfaces:


sql1.test.com / sql2.test.com:


vi /etc/network/interfaces


auto lo:0

iface lo:0 inet static

address 192.168.0.105

netmask 255.255.255.255

pre-up sysctl -p > /dev/null


ifup lo:0


七.启动负载均衡器并测试


现在我们启动两个负载均衡管理器:


loadb1.test.com / loadb2.test.com:


/etc/init.d/ldirectord stop

/etc/init.d/heartbeat start


如果你没有看见错误,你需要现在重启每个负载均衡器:


loadb1.test.com / loadb2.test.com:


shutdown -r now


重启之后我们可以检查是否两个负载均衡器象期望一样工作:


loadb1.test.com / loadb2.test.com:


ip addr sh eth0


主动的负载均衡器应该列出了虚拟IP地址(192.168.0.105):


2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 00:16:3e:45:fc:f8 brd ff:ff:ff:ff:ff:ff

inet 192.168.0.103/24 brd 192.168.0.255 scope global eth0

inet 192.168.0.105/24 brd 192.168.0.255 scope global secondary eth0


被动(热备)的负载均衡器应该显示如下:


2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 00:16:3e:16:c1:4e brd ff:ff:ff:ff:ff:ff

inet 192.168.0.104/24 brd 192.168.0.255 scope global eth0


loadb1.test.com / loadb2.test.com:


ldirectord ldirectord.cf status


主动负载均衡器上的输出:


ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 1603


被动负载均衡器上的输出:


ldirectord is stopped for /etc/ha.d/ldirectord.cf


loadb1.example.com / loadb2.example.com:


ipvsadm -L -n


主动负载均衡器上的输出:


IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.0.105:3306 wrr

-> 192.168.0.101:3306 Route 1 0 0

-> 192.168.0.102:3306 Route 1 0 0


被动负载均衡器上的输出:


IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn


loadb1.test.com / loadb2.test.com:


/etc/ha.d/resource.d/LVSSyncDaemonSwap master status


主动负载均衡器上的输出:


master running

(ipvs_syncmaster pid: 1766)


被动负载均衡器上的输出:


master stopped

(ipvs_syncbackup pid: 1440)


如果你的测试都是正常的,你现在可以从相同网络(192.168.0.x)中的其它服务器用虚拟IP地址192.168.0.105来访问MySQL数据库:


mysql -h 192.168.0.105 -u ldirector -p


(请记住:你的MySQL客户端必须至少是4.1版本的;旧的版本不能运行MySQL5。)


你现在可以关掉一个MySQL群集节点来测试;你应该仍然可以连接到MySQL数据库。


八 注解


运行一个MySQL群集时,这里有一些重要的东西需要记住:


–所有的数据都是存在内存! 因此你的群集节点上需要大容量的内存。这里有每个节点需要内存

容量的计算公式:


(数据库大小SizeofDatabase * 复制数量NumberOfReplicas * 1.1 ) / 数据节点数量NumberOfDataNodes


所以如果你有一个数据库的大小是1GB,你应该为每个节点配备1.1GB内存!


–群集管理节点在监听1186端口上的任意连接。所以这意味着不是很安全,所以你应当在一个独立的网络上运行MySQL群集。