heartbeat v1的架构是:heartbeat + haresource 来实现高可用的。heartbeat 作为message layer层,haresource作为CRM管理资源,RA可以有LSB,OSF,heartbeat legacy提供。 ######################################1、Heartbeat的控制信息: “心跳”信息: (也称为状态信息)仅150 bytes大小的广播、组播或多播数据包。可为以每个节点配 置其向其它节点通报“心跳”信息的频率,以及其它节点上的heartbeat进程为了确认主节点出节点出 现了运行等错误之前的等待时间。 集群变动事务(transition)信息:ip-request和ip-request-rest是相对较常见的两种集群变动信息 ,它们在节点间需要进行资源迁移时为不同节点上heartbeat进程间会话传递信息。比如,当修复了主 节点并且使其重新“上线”后,主节点会使用ip-request要求备用节点释放其此前从因主节点故障而 从主节点那里接管的资源。此时,备用节点则关闭服务并使用ip-request-resp通知主节点其已经不再 占用此前接管的资源。主接点收到ip-request-resp后就会重新启动服务。 重传请求:在某集群节点发现其从其它节点接收到的heartbeat控制信息“失序”(heartbeat进程使 用序列号来确保数据包在传输过程中没有被丢弃或 出现错误)时,会要求对方重新传送此控制信息。 Heartbeat一般每一秒发送一次重传请求,以避免洪泛。 上面三种控制信息均基于UDP协议进行传送,可以在/etc/ha.d/ha.cf中指定其使用的UDP端口或者多播 地址(使用以太网连接的情况下)。 此外,除了使用“序列号/确认”机制来确保控制信息的可靠传输外,Heartbeat还会使用MD5或SHA1为 每个数据包进行签名以确保传输中的控制信息的安全性。 ######################################2、Heartbeat的配置文件: /etc/ha.d/ha.cf 定义位于不同节点上的heartbeat进程间如何进行通信; /etc/ha.d/haresources 定义对某个资源来说哪个服务器是主节点, 以及哪个节点应该拥有客户端访问资源时的目标IP地址。 /etc/ha.d/authkeys 定义Heartbeat包在通信过程中如何进行加密。 当ha.cf或authkeys文件发生改变时,需要重新加载它们就可以使用之生效; 而如果haresource文件发生了改变,则只能重启heartbeat服务方可使之生效。 尽管Heartbeat并不要求主从节点间进行时钟同步,但它们彼此间的时间差距不能超过1分钟, 否则一些配置为高可用的服务可能会出异常。 Heartbeat当前也不监控其所控制的资源的状态,比如它们是否正在运行,是否运行良好以 及是否可供客户端访问等。要想监控这些资源,要使用额外的Mon软件包来实现。 ######################################3、ha.cf配置文件部分参数详解: autojoin none #集群中的节点不会自动加入 logfile /var/log/ha-log #指名heartbaet的日志存放位置 keepalive 2 #指定心跳使用间隔时间为2秒(即每两秒钟在eth1上发送一次广播) deadtime 30 #指定备用节点在30秒内没有收到主节点的心跳信号后,则立即接管主节点的服 务资源 warntime 10 #指定心跳延迟的时间为十秒。当10秒钟内备份节点不能接收到主节点的心跳 信号时,就会往日志中写入一个警告日志,但此时不会切换服务 initdead 120 #在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作, 该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。 udpport 694 #设置广播通信使用的端口,694为默认使用的端口号。 baud 19200 #设置串行通信的波特率 #bcast eth0 # Linux 指明心跳使用以太网广播方式,并且是在eth0接口上进行广播。 #mcast eth0 225.0.0.1 694 1 0 #采用网卡eth0的Udp多播来组织心跳,一般在备用节点不止一台 时使用。Bcast、ucast和mcast分别代表广播、单播和多播,是组织心跳的三种方式,任选其一即可。 #ucast eth0 192.168.1.2 #采用网卡eth0的udp单播来组织心跳,后面跟的IP地址应为双机对方的IP 地址 auto_failback on #用来定义当主节点恢复后,是否将服务自动切回,heartbeat的两台主机 分别为主节点和备份节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交 给备份节点并由备份节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取 资源并取代备份节点,如果该选项设置为off,那么当主节点恢复后,将变为备份节点,而原来的备 份节点成为主节点 #stonith baytech /etc/ha.d/conf/stonith.baytech # stonith的主要作用是使出现问题的节点从集 环境中脱离,进而释放集群资源,避免两个节点争用一个资源的情形发生。保证共享数据的安全性 和完整性。 #watchdog /dev/watchdog #该选项是可选配置,是通过Heartbeat来监控系统的运行状态。使用该特 性,需要在内核中载入"softdog"内核模块,用来生成实际的设备文件,如果系统中没有这个内核 模块,就需要指定此模块,重新编译内核。编译完成输入"insmod softdog"加载该模块。然后输入 "grep misc /proc/devices"(应为10),输入"cat /proc/misc |grep watchdog"(应为130)。最后 ,生成设备文件:"mknod /dev/watchdog c 10 130" 。即可使用此功能 node node2.example.com #主节点主机名,可以通过命令“uname �Cn”查看。 node node3.example.com #备用节点主机名 ping 172.16.0.1 #选择ping的节点,ping 节点选择的越好,HA集群就越强壮,可以选择固定的路由 器作为ping节点,但是最好不要选择集群中的成员作为ping节点,ping节点仅仅用来测试网络连接 #ping_group group1 192.168.12.120 192.168.12.23 #类似于ping ping一组ip地址 apiauth pingd gid=haclient uid=hacluster respawn hacluster /usr/local/ha/lib/heartbeat/pingd -m 100 -d 5s #该选项是可选配置,列出与heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插 件,这些进程遇到故障可以自动重新启动。最常用的进程是pingd,此进程用于检测和监控网卡 状态,需要配合ping语句指定的ping node来检测网络的连通性。其中hacluster表示启动pingd 进程的身份。 #下面的配置是关键,也就是激活crm管理,开始使用v2 style格式 # crm respawn #注意,还可以使用crm yes的写法,但这样写的话,如果后面的cib.xml配置有问题 #会导致heartbeat直接重启该服务器,所以,测试时建议使用respawn的写法 #下面是对传输的数据进行压缩,是可选项 compression bz2 compression_threshold 2 ####################################4、haresources配置文件介绍 主从节点上的/etc/ra.d/raresource文件必须完全相同。文件每行通常包含以下组成部分: 1、服务器名字:指正常情况下资源运行的那个节点(即主节点),后跟一个空格或tab; 这里指定的名字必须跟某个节点上的命令"uname -n"的返回值相同; 2、IP别名(即额外的IP地址,可选):在启动资源之前添加至系统的附加IP地址, 后跟空格或tab;IP地址后面通常会跟一个子网掩码和广播地址,彼此间用“/”隔开; 3、资源脚本:即用来启动或停止资源的脚本,位于/etc/init.d/或/etc/ha.d/resourcd.d目录中; 如果需要传递参数给资源脚本,脚本和参数之间需要用两个冒号分隔,多个参数时彼此间也需要用两个冒号分隔;如果有 多个资源脚本,彼此间也需要使用空格隔开; 格式如下: primary-server [IPaddress[/mask/interface/broadcast]] resource1[::arg1::arg2] \ resource2[::arg1::arg2] 例如: node2.example.com 172.16.10.20/16/eth0/172.16.255.255 \ Filesystem::172.16.10.9:/mysqldata::/var/lib/mysql::nfs mysqld ######################################5、authkeys配置文件介绍 auth 1 # 指明认证类型 1 md5 6c781b5034b1f6b9379b # 指明对应的认证类型和随机字符串 ######################################6、补充资料:组播IP地址 组播IP地址用于标识一个IP组播组。IANA(internet assigned number authority)把D类地址 空间分配给IP组播,其范围是从224.0.0.0到239.255.255.255。如下图所示(二进制表示), IP组播地址前四位均为1110八位组⑴ 八位组⑵ 八位组⑶ 八位组⑷1110 XXXX XXXXXXXX XXXXXXXX XXXXXXXX组播组可以是永久的也可以是临时的。组播组地址中, 有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成 员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有 保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址 供路由协议使用。 224.0.1.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效。 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。常用的预留组播地 址列表如下: 224.0.0.0 基准地址(保留) 224.0.0.1 所有主机的地址 224.0.0.2 所有组播路由器的地址 224.0.0.3 不分配 224.0.0.4dvmrp(Distance Vector Multicast Routing Protocol,距离矢量组播路由协议)路由器 224.0.0.5 ospf(Open Shortest Path First,开放最短路径优先)路由器 224.0.0.6 ospf dr(Designated Router,指定路由器) 224.0.0.7 st (Shared Tree,共享树)路由器 224.0.0.8 st主机 224.0.0.9 rip-2路由器 224.0.0.10 Eigrp(Enhanced Interior Gateway Routing Protocol,增强网关内部路由线路协议)路 由器 224.0.0.11 活动代理 224.0.0.12 dhcp服务器/中继代理 224.0.0.13 所有pim (Protocol Independent Multicast,协议无关组播)路由器 224.0.0.14 rsvp (Resource Reservation Protocol,资源预留协议)封装 224.0.0.15 所有cbt 路由器 224.0.0.16 指定sbm(Subnetwork Bandwidth Management,子网带宽管理) 224.0.0.17 所有sbms 224.0.0.18 vrrp(Virtual Router Redundancy Protocol,虚拟路由器冗余协议) 239.255.255.255 SSDP协议使用
#########################在172.16.10.9上: #################提供nfs服务 一、安装nfs管理工具 yum install nfs-utils -y 二、创建共享目录并共享 mkdir /mysqldata # vim /etc/exports 添加以下内容: /mysqldata/ 172.16.0.0/16(rw,no_root_squash) setfacl -m u:26:rwx /mysqldata (uid=26是使用rpm方式安装的mysql时的mysql用户的uid) # 注意:上面的 no_root_squash 选项是为了在安装 mysql 时方便,安装完成后,应去掉此选项。 三、启动nfs服务 /etc/init.d/nfs start ############################################配置主节点和备节点 第一步:设置主机名 #########################在172.16.10.22上: # vim /etc/sysconfig/netwoek中的HOSTNAME: HOSTNAME=node2.example.com #########################在172.16.10.33上: # vim /etc/sysconfig/netwoek中的HOSTNAME: HOSTNAME=node3.example.com 第二步:设置主机名解析 #########################在172.16.10.22上: # vim /etc/hosts文件,添加: 172.16.10.22 node2.example.com node2 172.16.10.33 node3.example.com node3 #########################在172.16.10.33上: # vim /etc/hosts文件,添加: 172.16.10.22 node2.example.com node2 172.16.10.33 node3.example.com node3 第三步:实现 node2 和 node3 之间基于ssh秘钥认证 #########################在172.16.10.22上: ssh-keygen -t rsa -P '' ssh-copy-id -i ~/.ssh/id_rsa.pub node3.example.com #########################在172.16.10.33上: ssh-keygen -t rsa -P '' ssh-copy-id -i ~/.ssh/id_rsa.pub node2.example.com 第四步:node2 和 node3 之间实现时间同步 1、可以使用相同的时间服务器来同步时间 2、可以手动设置是时间同步
验证以上配置结果:
上面的配置正确的话,可以继续进行如下配置:
第一步:安装 mysql 服务,并配置 #########################在172.16.10.22上: yum install mysql mysql-server mount -t nfs 172.16.10.9:/mysqldata /var/lib/mysql chown -R mysql.mysql /var/lib/mysql # 启动 mysql 并初始化 mysql,设置用户密码等 /etc/init.d/mysqld start #########################在172.16.10.33上: yum install mysql mysql-server mount -t nfs 172.16.10.9:/mysqldata /var/lib/mysql /etc/init.d/mysqld start
验证以上配置结果:
注意:以上结果在测试时,mysqld服务只能在一个节点上启动。当然,这里需要授权给远程用户172.16.10.20的权限。完成这些配置后,可以继续进行以下配置。
第一步:安装heartbeat之前的工作 #########################在172.16.10.22,172.16.10.33上: mysql>GRANT ALL ON *.* TO root@'172.16.10.20' IDENTIFIED BY 'guoting'; /etc/init.d/mysqld stop umount /var/lib/mysql chkconfig mysqld off 第二步:安装heartbeat v1版本软件 #########################在172.16.10.22,172.16.10.33上: yum install perl-TimeDate net-snmp-libs libnet PyXML # 注意:libnet是在epel仓库中的,需要实现配置好。也可以手动编译,下载地址:http://search.cpan.org/dist/libnet/ rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm # 这是由heartbeat 自己制作的rpm包 第三步:配置heartbeat #########################在172.16.10.22 cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,haresources,authkeys} /etc/ha.d/ # vim /etc/ha.d/ha.cf 修改以下内容: mcast eth0 226.10.10.10 694 1 0 auto_failback on node node2.example.com node node3.example.com ping 172.16.0.1 # vim /etc/ha.d/haresources 添加以下内容: node2.example.com 172.16.10.20/16/eth0/172.16.255.255 \ Filesystem::172.16.10.9:/mysqldata::/var/lib/mysql::nfs mysqld # vim /etc/ha.d/authkeys 添加以下内容: auth 1 1 md5 6c781b5034b1f6b9379b chmod 600 /etc/ha.d/authkeys #########################在172.16.10.33 scp -p node2.example.com:/etc/ha.d/{ha.cf,haresources,authkeys} /etc/ha.d 第四步:启动服务 #########################在172.16.10.22 /etc/init.d/heartbeat start;ssh node3 '/etc/init.d/heartbeat start'
验证以上结果:
此时模拟,主节点出现故障:
此时,从节点可以正常接管资源,用户可以正常访问。
此时,如果主节点重新上线,主节点会接管现有资源。(auto_failback on的缘由)
实验拓扑图和上面一致。
第一步:修改ha.cf配置文件 #########################在172.16.10.22上: crm on scp /etc/ha.d/ha.cf node3:/etc/ha.d/ 第二步:修改ha.cf配置文件 #########################在172.16.10.22、172.16.10.33上: rpm -ivh rpm -ivh heartbeat2/heartbeat-gui-2.1.4-12.el6.x86_64.rpm 第三步:启动heartbeat服务 #########################在172.16.10.22、172.16.10.33上: /etc/init.d/heartbeat start
配置完成后,可以验证结果:
以上结果正确后,可以继续以下实验:
第一步:在主节点上设置ha_gui图形化管理接口的密码 # 默认登陆账号是 hacluster 本地账号 passwd hacluster 第二步:启动图形化接口工具配置 hb_gui &
图形化管理接口界面:
添加组资源:
在组中添加vip,storage,mysqld资源:
客户端测试:
实现资源迁移:
当然,这里也可以使用资源约束来定义资源的粘性,启动顺序等。
至此,配置已全部完成。
以上内容是自己对知识的理解,如有偏差,欢迎指正。