| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> 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、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
這篇論壇文章(賽迪網技術社區)主要介紹了配置一個高可用性的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群集。
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
寶貝清純百變豬豬
美女喜太狼裙裝時代
美麗幹練的OL
平面模特楊棋涵
石系列印象
海洲錦屏磷礦
再憶桂林
觀:重金屬所攝影:元陽梯田所想
 
>>返回首頁<<
 
 
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有