灾难恢复和true CDP解决方案-EchoStream for AIX

查看完整版本: [技巧]如何配置一个高可用性的MySQL服务器负载均衡群集

杀死白雪公主 2008-4-14 12:29

[技巧]如何配置一个高可用性的MySQL服务器负载均衡群集

  本文将告诉你如何配置一个三个节点的MySQL 5[url=http://database.ctocio.com.cn/]数据库[/url]服务器群集:两个[url=http://storage.ctocio.com.cn/]存储[/url]节点和一个
  管理节点。这个群集是由用提供“heartbeat心跳”(用来检查另外一个节点是否活动)和
  “ldirectord”(将请求分发到MySQL群集的节点)的Ultra Monkey安装包的两个节点组成的
  一个高可用性负载均衡器。
  本文我们的每个节点使用[url=http://whatis.ctocio.com.cn/searchwhatis/163/5947663.shtml]Debian[/url] Sarge [url=http://whatis.ctocio.com.cn/searchwhatis/210/5948710.shtml]Linux[/url]系统。其它Linux发行版本的安装可能一点点
  区别。MySQL的版本我们使用5.0.19。如果你不想使用MySQL 5,你也可以使用MySQL 4.1,尽
  管我还没有测试过。
  本文是一篇实践应用指导;它没有涉及太多的理论。关于群集的理论你可以在网上找到很多。
  一 [url=http://server.ctocio.com.cn/]服务器[/url]
  我使用下面的Debian服务器,它们都在同一个网段(本例如:192.168.0.x):
  sql1.test.[url=http://whatis.ctocio.com.cn/searchwhatis/307/5947307.shtml]com[/url]: 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
  另外我们需要一个虚拟[url=http://whatis.ctocio.com.cn/searchwhatis/191/6025691.shtml]IP[/url]地址: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/[url=http://database.ctocio.com.cn/mysql/]mysql[/url]-mgm
  cd /usr/src/mysql-mgm
  wget [url]http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-max-5.0.19-linux-i686-[/url]\
  glibc23.[url=http://whatis.ctocio.com.cn/searchwhatis/85/6092585.shtml]tar[/url].gz/from/http://www.mirrorservice.[url=http://whatis.ctocio.com.cn/searchwhatis/20/6093020.shtml]org[/url]/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
  [url=http://whatis.ctocio.com.cn/searchwhatis/185/5947185.shtml]chmod[/url] 755 /usr/bin/ndb_mg*
  cd /usr/src
  rm -rf /usr/src/mysql-mgm
  下一步,我们必须创建群集的配置文件,/var/lib/mysql-[url=http://whatis.ctocio.com.cn/searchwhatis/247/5947247.shtml]cluster[/url]/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]
  [[url=http://whatis.ctocio.com.cn/searchwhatis/96/6092596.shtml]TCP[/url] DEFAULT]
  # Section for the cluster management [url=http://whatis.ctocio.com.cn/searchwhatis/443/6093443.shtml]node[/url]
  [NDB_MGMD]
  # [url=http://whatis.ctocio.com.cn/searchwhatis/192/6025692.shtml]IP address[/url] of the management node (this [url=http://whatis.ctocio.com.cn/searchwhatis/494/6026494.shtml]system[/url])
  HostName=192.168.0.103
  # Section for the storage nodes
  [NDBD]
  # IP [url=http://whatis.ctocio.com.cn/searchwhatis/255/6025255.shtml]address[/url] of the first storage node
  HostName=192.168.0.101
  DataDir= /var/lib/mysql-cluster
  [NDBD]
  # IP address of the [url=http://whatis.ctocio.com.cn/searchwhatis/451/5948951.shtml]second[/url] 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
  updat[url=http://whatis.ctocio.com.cn/searchwhatis/246/5947746.shtml]e-[/url]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 [url]http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-max-5.0.19-linux-i686-[/url]\
  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 [url=http://whatis.ctocio.com.cn/searchwhatis/99/5947599.shtml]data[/url]
  cp [url=http://whatis.ctocio.com.cn/searchwhatis/446/6026446.shtml]support[/url]-files/mysql.[url=http://whatis.ctocio.com.cn/searchwhatis/497/5948997.shtml]server[/url] /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 [url=http://whatis.ctocio.com.cn/searchwhatis/435/6025935.shtml]password[/url] 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 [url=http://whatis.ctocio.com.cn/searchwhatis/243/6093743.shtml]row[/url] in [url=http://whatis.ctocio.com.cn/searchwhatis/23/5949023.shtml]set[/url] (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 | [url=http://whatis.ctocio.com.cn/searchwhatis/243/6093243.shtml]grep[/url] ndbd | grep -iv grep
  看看所有的ndbd[url=http://whatis.ctocio.com.cn/searchwhatis/292/7333792.shtml]进程[/url]已经结束了。如果你仍然看见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地址来
  访问群集。如果其中一个节点坏掉,那么你的应用程序将仍然可以工作,因为负载均衡器将请求转移
  到了工作正常的另外一个节点。
  现在在这个例子中负载均衡器成为了[url=http://whatis.ctocio.com.cn/searchwhatis/146/7475146.shtml]瓶颈[/url]。如果这个负载均衡器坏掉了怎么办呢?因此我们将以(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 [url]http://www.ultramonkey.org/download/3/[/url] sarge main
  deb-src [url]http://www.ultramonkey.org/download/3[/url] 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 [url=http://whatis.ctocio.com.cn/searchwhatis/24/5948524.shtml]kernel[/url] is not [url=http://whatis.ctocio.com.cn/searchwhatis/340/5947340.shtml]compiled[/url] with sensors support. As a
  | result, libsensors3 will not be functional on your system.
  |
  | If you want to enable it, have a look at “[url=http://whatis.ctocio.com.cn/searchwhatis/187/5948187.shtml]I2C[/url] Hardware Sensors Chip
  | support” in your kernel [url=http://whatis.ctocio.com.cn/searchwhatis/388/5947388.shtml]configuration[/url].
  你可以忽略它。
  回答下面的问题:
  Do you want to automatically load IPVS rules on boot?
  <-- No
  Select a [url=http://whatis.ctocio.com.cn/searchwhatis/89/5947589.shtml]daemon[/url] method.
  <-- none
  我刚安装的libdbd-mysql-perl安装包不能够在MySQL 5(我们在MySQL群集上使用MySQL 5),
  因此我们安装最新的DBD::mysql [url=http://whatis.ctocio.com.cn/searchwhatis/6/6026006.shtml]Perl[/url]安装包:
  loadb1.test.com / loadb2.test.com:
  cd /tmp
  wget [url]http://search.cpan.org/CPAN/authors/id/C/[url=http://whatis.ctocio.com.cn/searchwhatis/175/7785675.shtml]CA[/url]/CAPTTOFU/DBD-mysql-3.0002.tar.gz[/url]
  tar xvfz DBD-mysql-3.0002.tar.gz
  cd DBD-mysql-3.0002
  perl Makefile.PL
  make
  make install
  我们必须先启用[url=http://whatis.ctocio.com.cn/searchwhatis/385/6025885.shtml]packet[/url] 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"
  [url=http://whatis.ctocio.com.cn/searchwhatis/132/5947632.shtml]database[/url] = "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.5 为负载均衡准备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
  [url=http://whatis.ctocio.com.cn/searchwhatis/325/6025825.shtml]net[/url].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 [url=http://whatis.ctocio.com.cn/searchwhatis/459/5946959.shtml]cache[/url] 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/[url=http://whatis.ctocio.com.cn/searchwhatis/367/6093367.shtml]network[/url]/interfaces:
  sql1.test.com / sql2.test.com:
  vi /etc/network/interfaces
  auto lo:0
  iface lo:0 inet static
  address 192.168.0.105
  [url=http://whatis.ctocio.com.cn/searchwhatis/359/6093359.shtml]netmask[/url] 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
  [url=http://whatis.ctocio.com.cn/searchwhatis/206/5948706.shtml]link[/url]/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)
  如果你的测试都是正常的,你现在可以从相同[url=http://networking.ctocio.com.cn/]网络[/url](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端口上的任意连接。所以这意味着不是很[url=http://security.ctocio.com.cn/]安全[/url],所以你应当在一个独立的网络上运行
  MySQL群集。
页: [1]
查看完整版本: [技巧]如何配置一个高可用性的MySQL服务器负载均衡群集