发新话题
打印

用 heartbeat 与 Mysql Cluster 构建高可用数据库服务

本主题由 bottle 于 2007-12-10 22:05 移动

用 heartbeat 与 Mysql Cluster 构建高可用数据库服务

引用:
高可用的系统是指在部分硬件(如硬盘、服务器、子网络)和部分软件(如操作系统、服务进程)的失效情况下,系统可以继续提供服务,最终用户不会感知到整个服务的中断。高可用性的系统要求在部分硬件和软件会发生故障的情况下,整个系统的服务必须是每天24小时每星期7天可用的。 单服务器显然不能处理不断增长的负载。

  本实验配置目的是使用三台Linux服务器,在完善Mysql Cluster服务的基础上,构建高可用数据库系统,并保持24x7的可用性。 (以后加入负载均衡考虑)

硬件要求

本实验配置环境如下:

1台运行任意unix系统的IBM x346服务器
2 台  IBM x346 服务器,各装Red Hat Enterprise Linux 4 x86_64 操作系统,内核升级为2.6.9-42.0.8,内核保证 IP virtual server 支持选项。
一根串口直连线缆(serial null modem cable)
集群技术、High-Availability Linux 项目与 heartbeat 三言两语

集群技术主要分为三大类:


高可用性(High Available Cluster),例:Linux-HA
负载均衡(Load balancing Cluster),例:LVS、MOSIX
高性能计算(High Performance Computing),例:Beowulf
  其中的Linux-HA 项目得到了广泛的应用,是很多高可用性解决方案的重要组成部分。 heartbeat 是可以从 Linux-HA  站点公开获得的软件包之一。它提供了所有 HA 系统所需要的基本功能,比如启动和停止资源、监测群集中系统的可用性、在群集中的节点间转移共享 IP 地址的所有者等。它通过串行线、以太网接口或者同时使用二者来监测特定服务(或多个服务)的健康状况。

MySQL Cluster 三言两语

  Mysql群集在官方手册中称为"MysQl簇"

  MySQL簇是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的簇。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。
  MySQL簇将标准的MySQL服务器与名为NDB的“内存中”簇式存储引擎集成了起来。在我们的文档中,术语NDB指的是与存储引擎相关的设置部分,而术语“MySQL簇”指的是MySQL和NDB存储引擎的组合。
  MySQL簇由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB簇的数据节点,管理服务器,以及(可能)专门的数据访问程序。


本文旨在简明扼要的介绍具体实验过程。有关详细MySQL Cluster的资料请参考以下网址:

http://erst.cn/MysqlManual/ndbcluster.html

MySQL Cluster 的优缺点
结合MySQL Cluster组件的关系图,简单而直接得分析一下MySQL簇的优势和不足之处:

  从上图的分析,可得出MySQL Cluster最大的弱项在于缺少统一的负载调度,在SQL节点群之前应添加整个集群对外的前端机制,负责将客户的请求发送到一组服务器上执行,从而使客户端认为数据库服务是来自一个IP地址。这可以用IP负载均衡技术的负载调度器实现,也可以是基于内容请求分发的负载调度器,还可以是两者的结合。
  至于MySQL Cluster的优点也是很显而易见了,它不像mssql Cluster体系那样必须建立在SAN的架构上,需要有共享存储空间,简化了体系环境。而且MySQL Cluster通过在内存实现数据主主备份建立副本,保存在数据节点内的数据可被映射。简而言之你不用担心所有的鸡蛋打碎在一个篮子里了。

计划实现的结构  

  为使该实验保持简单有效,参考LVS中最简单的heartbeat应用,为MySQL Cluster添加virtual IP address,在群集节点间共享,并使所有应用通过此虚拟地址访问群集。这样即使在群集体系中出现某个节点故障,负载调度会将请求转向其它节点,确保应用程序的正常数据访问。

下图为将要实施的群集配置  

第一部分安装:MySQL Cluster

该步骤将在三台服务器上实现五个节点的MySQL Cluster体系,服务器角色如下:

服务器  节点 IP地址
No.1                     管理(MGM)节点 192.168.0.230
No.2 MySQL服务器(SQL)节点 "A"  192.168.0.228
  数据(NDBD)节点 "C"  192.168.0.228
No.3 MySQL服务器(SQL)节点 "B" 192.168.0.229
  数据(NDBD)节点 "D"  192.168.0.229

以下操作在服务器 No.1、No.2、No.3 上分别进行  

首先检查一下现有的系统中是否已安装mysql server,特别是Redhat AS 4版本是否安装部分mysql服务,如检查出则卸载:

# rpm -qa |grep mysql

下载mysql 5.2源代码包,并解包至/usr/local/mysql目录。

下载地址:http://dev.mysql.com/downloads/mysql/

# groupadd mysql
# useradd -g mysql mysql
# cd /usr/local
# tar -xzvf  mysql-5.2.0-falcon-alpha-linux-i686-glibc23.tar.gz
# ln -s /usr/local/mysql-5.2.0-falcon-alpha-linux-i686-glibc23   mysql

以下操作在服务器No.2 和No.3 上分别进行

# cd mysql
#  ./scripts/mysql_install_db --user=mysql
# chown -R mysql:mysql /usr/local/mysql
# cp support-files/mysql.server /etc/rc.d/init.d/
# chkconfig --add mysql.server


需注意数据目录是/usr/local/mysql/data,一定要设置好该目录的权限。

配置数据节点my.cf文件:

vi /etc/my.cnf

# Options for mysqld process:
[MYSQLD]                        
ndbcluster                                    # run NDB engine
ndb-connectstring=192.168.0.230  # location of MGM node
# Options for ndbd process:
[MYSQL_CLUSTER]                 
ndb-connectstring=192.168.0.230  # location of MGM node

以下操作在服务器No.1 上进行  

# cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin
# cd /usr/local/bin
# chmod +x ndb_mgm*
# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini

# Options affecting ndbd processes on all data nodes:
[NDBD DEFAULT]
NoOfReplicas=2           # Number of replicas
DataMemory=512M    # How much memory to allocate for data storage
IndexMemory=180M    # How much memory to allocate for index storage
MaxNoOfConcurrentOperations= 10000
TimeBetweenWatchDogCheck= 30000
DataDir= /var/lib/mysql-cluster
MaxNoOfOrderedIndexes= 512
#StringMemory=25

# TCP/IP options:
[TCP DEFAULT]
portnumber=2202   # This the default; however, you can use any
                            # port that is free for all the hosts in cluster
                            # Note: It is recommended beginning with MySQL 5.0 that
                            # you do not specify the portnumber at all and simply allow
                            # the default value to be used instead

# Management process options:
[NDB_MGMD]
Id=1
hostname=192.168.0.230       # Hostname or IP address of MGM node
datadir=/var/lib/mysql-cluster    # Directory for MGM node log files

# Options for SQL node "A":
[MYSQLD]
Id=2
hostname=192.168.0.228       # Hostname or IP address
                                           # (additional mysqld connections can be
                                           # specified for this node for various
                                           # purposes such as running ndb_restore)

# Options for SQL node "B":
[MYSQLD]
Id=3
hostname=192.168.0.229       # Hostname or IP address
                                           # (additional mysqld connections can be
                                           # specified for this node for various
                                           # purposes such as running ndb_restore)

# Options for data node "C":
[NDBD]
                                           # (one [NDBD] section per data node)
Id=4
hostname=192.168.0.228       # Hostname or IP address
datadir=/usr/local/mysql/data    # Directory for this data node's data files

# Options for data node "D":
[NDBD]
Id=5
hostname=192.168.0.229       # Hostname or IP address
datadir=/usr/local/mysql/data    # Directory for this data node's data files

# TCP/IP Connections
[TCP]
NodeId1=4
NodeId2=5  

启动测试:

在管理服务器No.1上启动管理进程:

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

制作启动脚本:

# echo 'ndb_mgmd -f /var/lib/mysql-cluster/config.ini' > /etc/init.d/ndb_mgmd
# chmod 755 /etc/init.d/ndb_mgmd
# chkconfig --add ndb_mgmd

在服务器 No.2 和 No.3 上分别启动数据节点进程:

注意:第一次启动时的初始化命令为:
# ndbd --initial

以后启动数据节点的命令为:

# ndbd

  如果你在建立ndb类型的数据库后再执行以上初始化命令会删除所有数据,所以一定要慎重。此外,如果遇到群集服务出现异常,无法启动等状况,可采用initial参数恢复服务。

在服务器 No.2 和 No.3 上分别启动SQL节点进程:

# /etc/init.d/mysql.server start

在服务器 No.2 和 No.3上分别设置root用户口令:

# /usr/local/mysql/bin/mysqladmin -u root password '******'

在服务器 No.1 管理节点上查看群集状态:

# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=4    @192.168.0.228  (Version: 5.2.0, Nodegroup: 0)
id=5    @192.168.0.229  (Version: 5.2.0, Nodegroup: 0, Master)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.0.230  (Version: 5.2.0)

[mysqld(API)]   2 node(s)
id=2    @192.168.0.228  (Version: 5.2.0)
id=3    @192.168.0.229  (Version: 5.2.0)

ndb_mgm>

NDB Master 与 NDB Slaver 内存使用情况比较:

关于内存设置的原文引用如下:

  DataMemory的默认值是80MB,最小为1MB。没有最大尺寸限制,但在实际使用过程中,最大限制应恰当,以便当达到最大限制时,进程不会启动交换功能。该限制由机器上可用的物理RAM量、以及操作系统能提交给任何进程的内存量决定。对于32位操作系统,该限制值为每进程2~4GB,对于64位操作系统,该限制值更大。对于大的数据库,出于该原因,最好使用64位操作系统。此外,在每台机器上也能运行一个以上的ndbd进程,在使用多CPU的机器上,该特性颇具优势。
  对于100万条记录,需要58MB的索引内存来处理用于主键和唯一性约束的哈希索引。还需要64 MB来处理基表和唯一索引表、以及两个有序索引表的记录。
对于IndexMemory和DataMemory,重要的是,总的数据库大小是各节点组的所有数据内存和所有索引内存之和。
  强烈建议为所有的节点设置相同的DataMemory值和IndexMemory值。
  IndexMemory的默认值是18MB。最小值为1MB。

可以在任意SQL节点上查看可使用的存储引擎状况:



可根据您自己的实际运用情况,在所有SQL节点上添加相同的用户及权限:  

mysql> CREATE USER 'UserNameHere'@ '%' IDENTIFIED BY '****';
mysql> GRANT USAGE ON * . * TO 'UserNameHere'@ '%' IDENTIFIED BY '****' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
mysql> GRANT ALL PRIVILEGES ON `DataBaseHere` . * TO 'UserNameHere'@'192.168.0.xxx' WITH GRANT OPTION ;
mysql> FLUSH PRIVILEGES ;   

数据库向群集迁移在Mysql的官方手册中已经说明得很详细了,这里只说一下重点,关键在于ENGINE字改为ndbcluster,以前大多是MyISAM。例:

mysql> CREATE DATABASE `miko` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> ALTER TABLE `miko_table_one` ENGINE = ndbcluster DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;  

  

第二部分安装:(Linux-HA) Heartbeat

  从以下链接下载Heartbeat软件rpm包,为保持简洁的配置环境,本实验下载Heartbeat为release 1版本。

http://www.linux-ha.org/DownloadSoftware

依次安装所需软件,如果遇到链接库版本兼容问题,请在安装时试加 --nodeps参数,不影响实际使用。

# rpm -i heartbeat-pils-1.2.5-1.x86_64.rpm
# rpm -i heartbeat-stonith-1.2.5-1.x86_64.rpm
# rpm -i heartbeat-1.2.5-1.x86_64.rpm

准备串行的物理连接

使用一根串口直连线缆将服务器No.2 和 No.3的串口连接起来。
测试串行连接:

在服务器 No.2 上等待接收,执行:

# cat < /dev/ttyS0

在服务器 No.3 上发送信息,执行:

# echo "Serial Connection test" > /dev/ttyS0

结果是应该在等待接收的服务器No.2上看到这些文字。单向测试成功的话,互换一下角色再试一次。

配置heartbeat  

  要使heartbeat正常运行的关键是配置三个文件:authkeys、ha.cf 和 haresources。 您可以从heartbeat的文档目录复制一份配置作为参考,要求心跳连接的两台机器此三个配置文件要保持相同,本实验为服务器No.2与No.3。

cp /usr/share/doc/heartbeat-1.2.5/ha.cf /etc/ha.d/ha.cf
cp /usr/share/doc/heartbeat-1.2.5/authkeys /etc/ha.d/authkeys
cp /usr/share/doc/heartbeat-1.2.5/haresources /etc/ha.d/haresources

ha.cf
定义了heartbeat运行的一些基本参数

/etc/ha.d/ha.cf的配置内容:


  

logfacility daemon
serial /dev/ttyS0
baud 19200
udpport 694
keepalive 1
deadtime 10
initdead 80
node www2.erst.cn # No.2的hostname,请用uname -n查对。
node www3.erst.cn   # No.3的机器名,请用uname -n查对。
auto_failback on         # 当主节点恢复后,是否自动切回
  

haresources
此文件定义群集运行的服务及缺省宿主,以及虚拟地址。

/etc/ha.d/haresources的配置内容:


www2.erst.cn     192.168.0.227  # 前项为主节点的服务器的hostname,后项为共享IP地址。
  

Authkeys
此文件设置群集所使用的认证密钥;两个节点上的密钥必须相同。有三种认证模式可以选择:crc、md5 或 sha1。如果您的 heartbeat 运行在一个安全的网络上,比如用交叉线缆连接,那么应该使用 crc。从资源的角度看,该方法的花费最低。如果您的网络不够安全,但您不是特别多疑,或者不是很关心最小化 CPU 资源的使用,那么应该使用 md5。最后,如果您想要得到最好的认证,而不考虑 CPU 资源的使用,那么请使用 sha1,因为它最难破解。

/etc/ha.d/authkeys 的配置内容:


auth 2
2 crc
对两个节点上的authkeys文件安全性设置:

# chmod 600 /etc/ha.d/authkeys  

开始运行并测试heartbeat

在服务器No.2上执行:  

# /etc/init.d/heartbeat start
Starting High-Availability services:
                                                           [  OK  ]

查看一下日志信息:  

www2 heartbeat[4521]: info: **************************
www2 heartbeat[4521]: info: Configuration validated. Starting heartbeat 1.2.5
www2 heartbeat[4522]: info: heartbeat: version 1.2.5
www2 heartbeat[4522]: info: Heartbeat generation: 12
www2 heartbeat[4522]: info: Starting serial heartbeat on tty /dev/ttyS0 (19200 baud)
www2 heartbeat[4522]: info: pid 4522 locked in memory.
www2 heartbeat[4522]: info: Local status now set to: 'up'
www2 heartbeat[4525]: info: pid 4525 locked in memory.
www2 heartbeat[4526]: info: pid 4526 locked in memory.
www2 heartbeat[4527]: info: pid 4527 locked in memory.
www2 heartbeat[4522]: WARN: node www3.erst.cn: is dead
www2 heartbeat[4522]: info: Local status now set to: 'active'
www2 heartbeat[4522]: info: Resources being acquired from www3.erst.cn.
www2 heartbeat: info: Running /etc/ha.d/rc.d/status status
www2 heartbeat: info: /usr/lib64/heartbeat/mach_down: nice_failback: foreign resources acquired
www2 heartbeat[4522]: info: mach_down takeover complete.
www2 heartbeat[4522]: info: Initial resource acquisition complete (mach_down)
www2 heartbeat: info: mach_down takeover complete for node www3.erst.cn.
www2 heartbeat[4530]: info: Local Resource acquisition completed.
www2 heartbeat: info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp
www2 heartbeat: received ip-request-resp 192.168.0.227 OK yes
www2 heartbeat: info: Acquiring resource group: www2.erst.cn 192.168.0.227
www2 heartbeat: info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.227 start
www2 heartbeat: info: /sbin/ifconfig eth0:0 192.168.0.227 netmask 255.255.255.0 broadcast 192.168.0.255
www2 heartbeat: info: Sending Gratuitous Arp for 192.168.0.227 on eth0:0 [eth0]
www2 heartbeat: /usr/lib64/heartbeat/send_arp -i 1010 -r 5 -p /var/lib/heartbeat/rsctmp/send_arp/send_arp-192.168.0.227 eth0 192.168.0.227 auto 192.168.0.227 ffffffffffff
www2 heartbeat[4522]: info: Local Resource acquisition completed. (none)
www2 heartbeat[4522]: info: local resource transition completed.

  以上信息大致表示单个节点运行,另一个节点状态为“死”,通过串口建立通讯。将共享地址绑定在eth0上。查看一下网卡信息:

# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:XX:XX:XX:XX:XX  
          inet addr:192.168.0.228  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::210:XXXX:XXXX:XXXXX/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:48818 errors:0 dropped:0 overruns:0 frame:0
          TX packets:59618 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:4658086 (4.4 MiB)  TX bytes:7923761 (7.5 MiB)
          Interrupt:209

eth0:0    Link encap:Ethernet  HWaddr 00:XX:XX:XX:XX:XX  
          inet addr:192.168.0.227  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:209

  

在服务器No.3上执行:  

# /etc/init.d/heartbeat start
Starting High-Availability services:
                                                           [  OK  ]

相关日志信息:

www2 heartbeat[4522]: info: Link www3.erst.cn:/dev/ttyS0 up.
www2 heartbeat[4522]: info: Status update for node www3.erst.cn: status up
www2 heartbeat: info: Running /etc/ha.d/rc.d/status status
www2 heartbeat[4522]: info: Status update for node www3.erst.cn: status active
www2 heartbeat: info: Running /etc/ha.d/rc.d/status status
www2 heartbeat[4522]: info: remote resource transition completed.
www2 heartbeat[4522]: info: www2.erst.cn wants to go standby [foreign]
www2 heartbeat[4522]: info: standby: www3.erst.cn can take our foreign resources
www2 heartbeat[4737]: info: give up foreign HA resources (standby).
www2 heartbeat[4737]: info: foreign HA resource release completed (standby).
www2 heartbeat[4522]: info: Local standby process completed [foreign].
www2 heartbeat[4522]: WARN: 1 lost packet(s) for [www3.erst.cn] [9:11]
www2 heartbeat[4522]: info: remote resource transition completed.
www2 heartbeat[4522]: info: No pkts missing from www3.erst.cn!
www2 heartbeat[4522]: info: Other node completed standby takeover of foreign resources.  

  以上信息大致表示串口通讯建立,节点状态更新起用,与另一节点协商资源的寄宿,并报告有一个包丢失(不知为何)。

转移共享 IP 地址的所有者 — 主备切换实验

用局域网上的任意机器试长ping虚拟地址192.168.0.227

> ping 192.168.0.227 -t  

在主节点上关闭heartbeat服务:

# /etc/init.d/heartbeat stop

可以在备节点处查看到接管信息,接管了共享地址,并报告主节点dead:  

www3 heartbeat[5604]: info: Received shutdown notice from 'www2.erst.cn'.
www3 heartbeat[5604]: info: Resources being acquired from www2.erst.cn.
www3 heartbeat[5622]: info: acquire local HA resources (standby).
www3 heartbeat[5623]: info: No local resources [/usr/lib64/heartbeat/ResourceManager listkeys www3.erst.cn] to acquire.
www3 heartbeat[5622]: info: local HA resource acquisition completed (standby).
www3 heartbeat[5604]: info: Standby resource acquisition done [foreign].
www3 heartbeat: info: Running /etc/ha.d/rc.d/status status
www3 heartbeat: info: Taking over resource group 192.168.0.227
www3 heartbeat: info: Acquiring resource group: www2.erst.cn 192.168.0.227
www3 heartbeat: info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.227 start
www3 heartbeat: info: /sbin/ifconfig eth0:0 192.168.0.227 netmask 255.255.255.0 broadcast 192.168.0.255
www3 heartbeat: info: Sending Gratuitous Arp for 192.168.0.227 on eth0:0 [eth0]
www3 heartbeat: /usr/lib64/heartbeat/send_arp -i 1010 -r 5 -p /var/lib/heartbeat/rsctmp/send_arp/send_arp-192.168.0.227 eth0 192.168.0.227 auto 192.168.0.227 ffffffffffff
www3 heartbeat: ERROR: Could not send gratuitous arps
www3 heartbeat: info: /usr/lib64/heartbeat/mach_down: nice_failback: foreign resources acquired
www3 heartbeat[5604]: info: mach_down takeover complete.
www3 heartbeat: info: mach_down takeover complete for node www2.erst.cn.
www3 heartbeat[5608]: WARN: TTY write timeout on [/dev/ttyS0] (no connection or bad cable? [see documentation])
www3 heartbeat[5604]: WARN: node www2.erst.cn: is dead
www3 heartbeat[5604]: info: Dead node www2.erst.cn gave up resources.
www3 heartbeat[5604]: info: Link www2.erst.cn:/dev/ttyS0 dead.

同时从ping包信息处,察觉大约一分钟左右的切换延迟。

64 bytes from 192.168.0.227: icmp_seq=259 ttl=64 time=0.074 ms
64 bytes from 192.168.0.227: icmp_seq=260 ttl=64 time=0.073 ms
64 bytes from 192.168.0.227: icmp_seq=261 ttl=64 time=0.071 ms
64 bytes from 192.168.0.227: icmp_seq=262 ttl=64 time=0.071 ms
64 bytes from 192.168.0.227: icmp_seq=263 ttl=64 time=0.089 ms
64 bytes from 192.168.0.227: icmp_seq=264 ttl=64 time=0.077 ms
64 bytes from 192.168.0.227: icmp_seq=309 ttl=64 time=1.16 ms
64 bytes from 192.168.0.227: icmp_seq=310 ttl=64 time=0.072 ms
64 bytes from 192.168.0.227: icmp_seq=311 ttl=64 time=0.072 ms
64 bytes from 192.168.0.227: icmp_seq=312 ttl=64 time=0.073 ms
64 bytes from 192.168.0.227: icmp_seq=313 ttl=64 time=0.073 ms


在主节点上打开heartbeat服务:

# /etc/init.d/heartbeat start

主节点将接管共享地址,同时ping包有大约一分钟左右的切换延迟。

Gratuitous ARP 广播与共享IP地址转移 — 记录一个我未能解决的问题

  最初在测试共享IP地址的转移时,用来长ping共享地址的计算机和服务器群不在一个网段。在heartbeat进行地址接管后,该计算机与共享地址失去联系,再也无法ping通共享地址。事实上共享地址还活着。
  查看日志,发现heartbeat没能成功进行无故arp广播:

heartbeat: ERROR: Could not send gratuitous arps

  我们讨论一下Heartbeat的工作原理:首先确定哪台计算机(即主服务器,primary server)拥有特定资源和共享IP地址,另一台计算机将自动成为备份服务器(backup server)。运行在备份服务器上的Heartbeat进程监听来自主服务器的“心跳”。如果备份服务器没有听到主服务器的心跳,就启动失败接管。
  查找共享IP地址时,首先被转换为物理网卡地址,即Media Access Control(MAC)地址。这时,路由器或客户机使用地址解析协议(ARP)发出询问:“Who owns this IP address?”。在接收到使用这个IP地址的计算机的响应后,路由器或本地计算机将IP地址和对应的MAC地址加到内存中所谓的ARP表中,这样就无须在每次用到这个IP地址时进行询问。一段时间后,大多数计算机都会让未用到的ARP表项过期,保证内存中没有保存未使用(或不精确)的地址。
  Heartbeat在进行IP地址接管时用到 Gratuitous ARP 广播。 在主服务器故障时, Heartbeat程序使用无故ARP(Gratuitous ARP,GARP)广播,来强制修改客户机的ARP表,替换成新的硬件(MAC)地址,从而使客户机能够和接管共享IP地址的备份服务器进行会话。
  了解以上的工作过程后,确定问题出在跨网段的 Gratuitous ARP 广播上,测试用的计算机没能被成功更新arp表。于是使用同一网段的其它服务器测试共享IP地址的接管,结果通过。
  那么是什么造成heartbeat不能发送无故arp广播,如何解决,等有时间仔细再研究。

MySQL Cluster 与 Heartbeat 服务的启动和关闭顺序

启动:  

一般主张先在两台SQL节点上启动ndbd进程,当然充当master角色的在前启动。
执行完ndbd先不忙打开mysql server服务,在管理节点上用管理器先看看节点状态,如果节点状态显示:(Version: x.x.x, starting, Nodegroup: 0),则表示还在进行启动配置,此时如果打开该节点的mysql server服务,会在管理器上看到如下提示:

ndb_mgm> Node 5: Forced node shutdown completed. Occured during startphase 5. Initiated by signal 8. Caused by error 6000: 'Error OS signal received(Internal error, programming error or missing error message, please report a bug). Temporary error, restart node'. - Unknown error code: Unknown result: Unknown error code

如果出现类似出错提示,请用shutdown命令关闭群集,再重新按顺序开启。
当ndbd启动完成后,分别在SQL节点上开启mysql server服务
最后,按主备关系打开heartbeat服务
关闭:

按备主顺序关闭heartbeat服务
在管理节点上进入管理器:

# ndb_mgm
ndb_mgm> shutdown
依次在SQL节点上关闭sql进程.
优化

通过本实验中的共享IP地址来访问MySQL Cluster资源:

$this->connect('192.168.0.227', ‘MyUserName', 'MyDBPassword', 'Mydatabase', 0);

也许会感觉连接比原来的MyISAM存储引擎方式慢很多,借助/etc/my.cnf调整内存分配是很必要的系统优化,根据你自己的系统情况来实验,才能将NDB Cluster存储引擎方式调整到最佳性能。
附件: 您所在的用户组无法下载或查看附件
空间出租:P4 3.0+1G+RIAD 1 160G+PHP+IIS+MYSQL+MDaemon

QQ:126682182
Email:hhyisw@163.com
Home:http://www.stksky.com

TOP

发新话题