| 订阅 | 在线投稿
分享
 
 
当前位置: 王朝网络 >> mysql >> 配置高可用性的MySQL服务器负载均衡群集
 

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

2008-06-01 03:13:59 编辑來源:互联网 繁體版 评论
 
 
  这篇论坛文章(赛迪网技术社区)主要介绍了配置一个高可用性的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群集。
 
 
 
上一篇《教你在MySQL中快速复制表格作为测试数据》
下一篇《MySQL将开源进行到底 数据库下载中国第一》
 
 
 
 
 
 
日版宠物情人插曲《Winding Road》歌词

日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。 最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。 歌手:Def...

兄弟共妻,我成了他们夜里的美食

老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...

如何磨出破洞牛仔裤?牛仔裤怎么剪破洞?

把牛仔裤磨出有线的破洞 1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...

我就是扫描下图得到了敬业福和爱国福

先来看下敬业福和爱国福 今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。 今天该活动正式启动,和去年一样,需要收集“五福”...

冰箱异味产生的原因和臭味去除的方法

有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。 1、很多人有这种习...

 
 
 
这篇论坛文章(赛迪网技术社区)主要介绍了配置一个高可用性的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群集。
󰈣󰈤
 
 
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
清凉一夏_清纯美丽
纯白色小礼服
靓丽可人儿_嘉嘉
我的女神_靓丽女生
主题摄影
贵州,让我欢喜,让我神伤。
莫干山
天平秋色
 
>>返回首页<<
 
 
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 热帖排行
 
 
 
 
©2005- 王朝网络 版权所有