新进化论

道生一,一生二,二生三,三生万物。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Redhat Ha Cluster

LinuxUla   2009-06-25 23:50
一 集群概念
1 集群:集群是一组协同工作的服务实体,用来提供比单一服务实体更具扩展性以及可用性的服务平台。
2 集群的可扩展性:可以动态的加入新的服务节点来提高集群的综合性能,而不需要停掉集群提供的服务。
3 集群的高可用性:集群实体通过内部服务节点的冗余方式来避免客户端访问时出现out of service的状况。也就是说,集群中同一服务可以由多个服务节点提供,当部分节点失效后,其他服务可以接管服务。
4 集群的实体地址:是客户端访问集群实体获取服务的唯一入口。
5 负载均衡:指集群中的分发设备将用户的请求比较均衡的分发给集群实体中各个服务节点的计算、存储、以及网络资源。
6 负载均衡器:负责提供负载均衡的设备。其一般具备如下功能:
1)维护集群地址
2 )负责管理各个服务节点的加入和退出
3 )集群地址向内部服务节点地址的转换
7 错误恢复:指集群中的某个或者某些服务节点不能正常工作或者提供服务时,其他服务节点可以资源透明的完成原有任务。
8 HA集群:高可用性集群,通过特殊的软件将独立的node连接起来,组成一个能够提供故障切换的集群。它保证了在多种故障中,关键性服务的可用性、可靠性、以及数据的完整性。主要应用与文件服务,WEB服务,数据库服务等关键应用中。
9 LB集群:负载均衡集群,在LB服务器上使用专门的路由算法,将数据包分散到多个真实服务器上进行处理,从而达到网络服务的负载均衡的作用。主要运用于公共WEB服务,FTP服务,数据库服务等高负载的服务中。
10 集群技术的优势:低成本,高可用,高扩展,高资源利用率。

二 HA 高可用集群
1 HA集群的三种方式:对称,主从,多机。
1)对称方式:包括2台服务器以及至少1个服务,2台服务器都运行服务,哪台先起则在哪台上启动服务,当一台失效时,服务迁移至另外一台上,当失效机恢复正常时,服务不会迁回至该机。
2)主从方式:包括2台服务器以及至少1个服务,其中权重较高的服务器运行服务,另外一台作为备份服务器,并且监视Master 的状态,当Master发生故障时,服务会切换至Slave服务器;当Master恢复正常,服务迁回至Master。
3)多机方式:2台以上服务器以及至少1个服务的对称方式或者主从方式。
2 HA的基本组成
1)Service:是HA集群中提供的特定资源。
2)Node:HA集群中实际运行服务提供特定资源的服务器。
3)Failover Domain:HA集群中所有提供特定资源的成员服务器的集合。
4)Hearbeat:通过网络数据包来监视服务器状态的方法。
5)ShareStorage:共享存储来储存HA集群所需的数据。
6)单一故障点:HA集群中可能出现故障的单个设备。
7)仲裁:判断服务器及其服务是否运行正常
8)服务失效转移:当node出现硬件或者服务失效时,应相应的服务迁移至失效域中的其他节点
9)Watchdog:定时向各节点发送信息,来确定节点或者节点上的服务的运行状态
10)可编程的电源控制器:由外部控制的电源控制器,连接各节点,当某台节点死锁时,可以通过其他成员服务器或者设备强行关闭该节点的电源。

三 使用qdisk以及组播方式作仲裁的基于Web的RedHat Ha 高可用集群的配置
1 硬件环境
node1:192.168.0.1
node2:192.168.0.2
node3:192.168.0.3
fence:192.168.0.4
所有设备在uplooking.com内网中
所有主机都运行在RHEL5U3 OS 上,并开启ssh服务,关闭selinux,方便操作

step1
在fence上编辑/etc/hosts文件,声明所有节点以及fence
vi /etc/hosts  
192.168.0.1 node1.uplooking.com node1
192.168.0.2 node2.uplooking.com node2
192.168.0.4 fence.uplooking.com fence
这里先不将node3 加入进来,在配置完3台的集群后,再动态的将node3 加入,体现集群技术的高扩展性。

step2
将fence 上的hosts 文件,复制给node1和node2
for i in node1 node2;do scp /etc/hosts $i:/etc;done
(可以将fence的公钥复制给各个node,这样在scp时就不需要频繁输入密码了)

step3
设置各节点的主机名
for i in node1 node2 fence;do hostname $i;done
要想重启后仍旧使用该主机名,修改/etc/sysconfig/network 文件

step4
在各台机器上yum 安装Clustering 套件;使用本地yum源
for i in node1 node2 fence;do ssh $i yum groupinstall -y Clustering;done
在这里可以将node3 的集群套件也安装上,
ssh 192.168.0.3 yum groupinstall -y Clustering

step5
安装完成后,取消各节点开机启动RHCS
for i in node1 node2 fence;do chkconfig cman off;done
for i in node1 node2 fence;do chkconfig rgmanager off;done
for i in node1 node2; do chkconfig httpd off;done 我们将通过集群由rgmanager 运行httod 服务
也在192.168.0.3上进行该操作

step6
使用图形化工具system-config-cluster 来生成我们的cluster.conf xml配置文件
1)执行system-config-cluster 命令
2)选择create new configuration 选项来生成一个新的配置文件
3)为我们的集群起一个响亮的名字,在 Choose a name for the cluster 下的文本框内输入
4)选择 custom configure multicast ;输入一个组播地址;该值的区间为[225.0.0.1,234.255.255.255]
这里先使用组播方式来确定成员服务器的状态,qdisk 在node3 加入后再行配置
5) 选中左边的fence devices ,点击右下角的add a fence device ;在下拉菜单中选择global network block device ;在name 文本框中输入你想要的名字,例如fence_dev ;在servers 中输入你在/etc/hosts文件中声明的fence 主机的主机名或者ip 。这里选择gnbd 因为我们没有真正的fence 栅设备,只能用软件来模拟。
6)选中左边的cluster nodes ,点击右边的add a cluster node ;出现对话框后,输入我们在hosts文件中声明过的节点名,node1 ;quorum votes 为仲裁权重,不输入它,Muticast interface 为接收组播的接口,选择eth0 。重复该动作设置node2 和 fence。
7)在左边选择我们设置的节点名node1 ;点击右边的 manage fencing  for this node ;之后点击 add a new fence level ;选择点击后出现的fence-level-1 ;点击add a new fence to this level ;将fence_dev 配置给它。
8)选中左边的failover domains ;点击右边的create a failover ;为失效域取一个名字;例如failover_httpd ;然后在下拉菜中将node1 node2 加入失效域。右边的restrict failover to this domains members 意为在该失效域的node中轮替;另外个选项prioritized list 允许你使用adjust priority 箭头来设置nodes 的优先级。
9)选中左边的resources ;点击右边的create a resource ;在下拉菜单中选择ip adress 为我们的集群配置一个浮动ip ;该ip 是访问我们集群的唯一入口;设置一个没人用的内网ip吧;如192.168.0.11(假设没有人在使用它);ok 后继续在下拉菜单中选择script ;使用脚本方式来启动我们的httpd 服务;name 中输入你想要的名字;例如apache ;在file(with path) 中输入/etc/init.d/httpd 。
10)选中左边的services ;点击create a service ;输入我们的服务名字;例如apache_ha ;接下来点击左下角的add a shared resource to this service ;将我们刚才设置的ip 以及httpd 资源配置给它。并且在右上角选择我们刚才配置的失效域;在autostart this service 上打勾,并且选择relcate为我们的切换方式。
11)在左上角的file 中选择save ;保存我们的配置文件;默认在/etc/cluster/cluster.conf

step7
将fence 上的/etc/cluster/cluster.conf 分发给各个node ;
for i in node1 node2;do scp -r /etc/cluster $i:/etc;done

step8 
在各个node 上启动cluster 服务
fence 
service cman start
gnbd_serv(若没有安装gnbd ;使用yum install gnbd* 安装上它)
node1 
service cman start
service rgmanager start
node2 
/etc/init.d/cman start
/etc/init.d/rgmanager start

step9
若所有服务顺利启动成功;可以用如下方法测试:
clustat 查看当前状态,发现httpd 正运行在node2 上;
ssh node2 "echo b > /proc/sysrq-trigger" 使用该命令干掉他,或者可以拔网线,拔电源,砸机器都可以;
在使用clustat 查看状态,可以看到服务运行到了node1 ,并且node2 offline了

step10
将node3 动态的加入进我们现有的集群中:
1)将干掉的node2 重新加入到集群中
service cman start
service rgmanager start
2) 在hosts 文件中声明node3
vi /etc/hosts
192.168.0.3 node3.uplooking.com node3
3) 将hosts 文件分发给各个node
for i in node1 node2 node3 ;do scp /etc/hosts $:/etc;done
4) 设置node3 的hostname
ssh node3 hostname node3
5) 编辑/etc/cluster/cluster.conf
a 修改 version
b 复制node1 或者node 2 的配置语句
c 将复制的配置语句中node1 或者 node2 部分 修改为 node3
d 在failover domain 的配置部分加入node3 节点的配置
e 保存退出
6)ccs_tool update /etc/cluster/cluster.conf
改命令用于更新集群中各节点的配置文件,使其同步到相同的版本
7)将配置文件拷贝给node3 
scp -r /etc/cluster node3:/etc
8)在node3 上启动服务
service cman start
service rgmanager start
ip add list
不出意外使用clustat 可以发现node3 加入了集群
9)我们可以使用命令来迁移当前服务
clusvcadm -r apache_ha -m node3
将httpd 服务迁移到 node3
10)要将node3 T出集群,我们需要将配置文件中node3 的部分全部删除;并且ccs_tool update 配置文件;
node3 将被打上标记声明已被T出集群

step 11
设置qdisk 仲裁投票机制。
在拥有3个相同权重的节点以后,集群中的2个节点当机,另外一个节点活着的时候,使用组播方式投票,集群会信任死掉的2个节点的投票,因为1台存活节点的权重加1,无法大于所有权重之和的一半,就会把存活着的node 也干掉,从而导致了整个集群的瘫痪。
因 此我们需要使用qdisk 的方式投票,qidsk使用探针来证明节点是否有投票的权利,若节点已死,就根本没有资格来投票,从而保证了2台服务器死掉后,另外一台能正常运行的状 况。1台存活节点的权重与qdisk权重之和整除2加1,大于所有权重之和的一半,就可以使节点存活下来。
1)使用system-config-cluster 来生成qdisk 的配置文件段;
a 执行命令system-config-cluster
b 选择create new configuration 选项来生成一个新的配置文件
c 选中 use a quorum disk
d 如下配置
  interval  1  每隔1秒发起投票
  tko 3 击倒次数
  vote 2  qdisk 的权重 
  minimun 1 node 最小的权重
  device 不配置 qdisk 的设备名
  label qdisk1 qdisk 的label 名
  program ping -c2 -s2 192.168.0.254(网关)
  score 1  探测1次
  interval 2 每隔2秒探测1次
2)将配置文件另存为一个路径;例如/root
3)将配置文件中的qdisk 配置语句复制到/etc/cluster/cluster.conf
4)ccs_tool update /etc/cluster/cluster.conf
5)在fence 上划分一个分区作为qdisk 的设备
a fdisk /dev/sda ;分出20M的分区
b partprobe
c fdisk -l 查看分区名;假设为 /dev/sda7
6)在fence 上安装iscsi 导出工具
yum install scsi-target-utils
7)配置并到导出iscsi 为qdisk 设备
vi /etc/tgtd/target.conf
<target iqn.2009-06.com.uplooking.fence:qdisk>
back-store /dev/sda7 
<\target>
8)service tgtd start
9)在各个节点上安装启动端
for i in node1 node2 node3;do ssh $i  yum install -y iscsi-initiator;done 
安装完成后启动服务
for i in node1 node2 node3;do ssh $i  service iscsi start;done
10)在1个节点上发现并且挂接qdisk
ssh node1 iscsiadm -m discovery -t sendtargets -p 192.168.0.4:3260
ssh node1 iscsiadm -m node -T iqn.2009-06.com.uplooking.fence:qdisk
11)在任意一台节点上格式化qdisk
ssh node1 mkqdisk -c /dev/sdb -l qdisk1
/dev/sdb 为本地挂接qdisk 的设备,qdisk1 为我们先前配置的qdisk 的label 名
12)在另外两台节点上发现并且挂接qdisk
for i in node1 node2 node3 ; do ssh $i iscsiadm -m discovery -t sendtargets -p 192.168.0.4:3260;done
for i in node1 node2 node3 ; do ssh $i iscsiadm -m node -T iqn.2009-06.com.uplooking.fence:qdisk;done
13)在各个节点上启动qdisk 服务
for i in node1 node2 node3 ; do ssh $i service qdiskd start;done
如果顺利,使用clustat 命令可以查看到qdisk 加入了集群,并且处于online 状态。
14)测试挂掉2 台服务节点,可以看到我们的集群在挂掉2台节点以后,剩下的唯一节点仍然坚挺。

四 使用共享存储的mysql-HA 集群
使用共享存储可以使各个节点的数据同步,但是使用ext3文件系统,经常会在同读写同一个文件的时候,使数据文件发生损坏;因此我们使用gfs2全球文件系统,可以很好的解决因为同读写的问题。
根据以上qdisk以及组播方式作仲裁的基于Web的RedHat Ha 高可用集群为基础,我们将其修改为mysql的共享存储集群。

step1
将storage 加入到正在运行的集群中去
1) 修改/etc/hosts文件
在任意的一台节点上修改/etc/hosts 文件
vim /etc/hosts
192.168.0.5 storage.uplooking.com storage
scp /etc/hosts storage:/etc/
2)修改配置文件
在任意一台节点上修改/etc/cluster/cluster.conf
vi /etc/cluster/cluster.conf
a 修改 version
b 复制node1 的配置语句为storage的配置语句
c 将其中的node1修改为storage
d 修改资源与服务部分将httpd 修改为mysqld
因为sotarage 只是用来做存储用的,因此不用将它加入冲突域中。
修改完成后,ccs_tool update /etc/cluster/cluster.conf
3)在storage 上启动服务
service cman start
成功后应该可以看到storage 节点已经online 状态。

step2
在storage 上导出共享设备
1) 使用gnbd 方式来导出共享设备
a 首先在storage上分出3个1g 的分区
fdisk /dev/sda
3个分区分别为 /dev/sda8 /dev/sda9 /dev/sda10
b 启动gnbd_serv
gnbd_serv
若没有该命令,那么yum instll "Cluster Storage",安装上
c 使用gnbd_export 命令来导出共享设备
gnbd_export -d /dev/sda8 -e gnbd1
gnbd_export -d /dev/sda9 -e gnbd2
gnbd_export -d /dev/sda10 -e gnbd3
可以使用gnbd _export -L 来查看共享设备
2) 使用iscsi 方式来导出共享设备
a 下载 iscsi-target 源代码包
b 安装它,make && make install
c 修改配置文件
vi /etc/ietd.conf
Target iqn.2009-06.com.uplooking.storage:share_ha
Lun 0 Path=/dev/sda8,Type=blockio
Lun 1 Path=/dev/sda9,Type=blockio
Lun 2 Path=/dev/sda10,Type=blockio
d /etc/init.d/iscsi-target start

step3 在节点上导入共享设备
1) 导入gnbd共享存储
以node1 为例,其余相同
a 首先需要挂接gnbd 模块
modprobe gnbd
b 使用gnbd_import 来导入gnbd 设备
gnbd_import -i storage
导入好了以后 可以使用gnbd_import -l 来查看导入的设备

2)导入iscsi共享设备
以node1为例,其余相同
a 安装iscsi 的导出端
yum install iscsi-initiator
b 启动iscsi 的服务
service iscsi start
c 发现并导入设备
iscsiadm -m discovery -t sendtargets -p 192.168.0.5:3260
iscsiadm -m node -T iqn iqn.2009-06.com.uplooking.storage:share_ha

step 4
配置clvm 来满足gfs 文件系统的动态扩展
1)打开lvm2 对clvmd 的支持
for i in node1 node 2 node3 fence storage ;do lvmconf --enable-cluster;done
也可以通过配置文件的方式来修改
 vi /etc/lvm/lvm.conf
 locking_type=3
2)在所有节点设备上启用clvmd
for i in node1 node2 node3 fence storage;do service clvmd start
3) 在节点上创建pv vg lv
因为是共享存储,因此只需要在一个节点做此操作即可,我们在node1 上创建它
a 创建pv
pvcreate /dev/gnbd/gnbd1
pvcreate /dev/gnbd/gnbd2
pvcreate /dev/gnbd/gnbd3
b 创建vg
vgcreate cvg0 /dev/gnbd/gnbd1 /dev/gnbd/gnbd2 /dev/gnbd/gnbd3
c 创建lv
lvcreat -L 2G cvg0 -n clv0 
创建完毕后应该在其他节点上也可以看到创建的lv,如果没有,重启下clvmd;service clvmd restart
iscsi 步骤同gnbd 就是/dev/下的设备名不一样

step5 
创建gfs 集群文件系统
mkfs.gfs2 -b 4096 -p lock_dlm -t mysql_ha:gfs1 -j 3 /dev/cvg0/clv0
-b 指定块大小
-p 指定锁类型
-t 集群名:文件系统名
-j 可接入节点数,可以通过gfs_jadd 动态添加

step6
1)挂接gfs
for i in node1 node2 node3 ;do mount /dev/cvg0/clv0 /var/lib/mysql;done
2)测试同读写
node1
while true ;do echo node1 >> /var/lib/mysql/file;sleep1;done
node2
while true ;do echo node2 >> /var/lib/mysql/file;sleep1;done
node3
tail -f /var/lib/mysql/file
可以看到node1 node2 交替写入,并没有因为多节点同时写入而损耗。

注:
1 mysql 的启动脚本需要修改才能在ha中切换,修改如下
status mysqld > /dev/null >&1
           if [ $? -eq 3 ];then
                   return 0
           fi
将以上部分加在stop()函数的起始位置。
2 gfs 节点的添加
1)首先扩容clvm
lvextend -L +512M /dev/cvg0/clv0
2)gfs_jadd -j 2 /var/lib/mysql
3)gfs_grow /var/lib/mysql
固定顺序
posted on 2012-11-15 13:46  岌岌可危  阅读(1225)  评论(0编辑  收藏  举报