本篇文章开始实际的集群搭建操作。
最开始,是集群规划,对集群的大概样子要心中有数
然后,配置drbd和pacemaker
其次,hadoop的配置,主要是指跟集群有关的配置
最后才是集群资源的配置
 
一、规划:
我们的Namenode双机热备,需要哪些资源?
首先,一般双节点主备方案所通用的资源:
一个虚拟IP:
一个drbd:
一个文件系统:drbd主备节点切换时,卸载或加载相应的分区
一个主从集群资源:这个资源是从drbd延伸过来的,因为drbd是两个节点上同时运行,所以要区分主从,这个资源用ms命令创建,而不是primitive
然后是特定集群中的资源,对于hadoop的namenode集群而言,资源如下:
一个hdfs服务:启动namenode的hdfs的服务
一个jobtracker服务:启动namenode的jobtracker服务
这两个资源最好编组,比如,把这两个资源编组为hadoop,否则在写约束时比较繁杂。
 
关于组资源:在很多案例中,人们使用group命令把虚拟IP和其它运行于DRBD主节点之上的服务(如文件系统、apache或mysql等)进行编组,这样可以简化约束条件配置。
资源编组有一些特点:
1、一般是两个以上的资源进行编组(两个也可以),编组的资源有一个额外的属性,即允许组中资源并行地启用;
2、组中的所有资源默认在同一个物理节点上运行;
3、组中的资源以显示顺序启动,以相反顺序停止;
4、如果组中的某资源在某节点上无法运行,则该资源其后的其它资源也不允许运行
5、在配置约束时,组中的资源通常使用组ID进行统一配置
 
需要哪些约束?
1、组资源hadoop要和虚拟IP绑定在一起,colocation约束
2、文件系统要和drbd的主节点绑定在一起,同样是colocation约束
3、组资源hadoop要和文件系统绑定在一起,也是colocation约束
4、虚拟IP先于组资源hadoop启动,是order约束
5、drbd提升主节点以后,再启动文件系统,又一个order约束
6、文件系统挂载以后,再启动hadoop,还是order约束
7、最后,两个额外的属性:property no-quorum-policy=ignore和stonith-enabled=false,这两个属性在双节点主备集群中的必要性,官方文档有说明。
 
总结资源配置顺序如下:
VIP--hadoop--两个资源的约束
      --drbd--文件系统--两个资源的约束 (cib模式)
          --hadoop--文件系统--这两个资源的约束
注意:drbd及文件系统配置时,要使用cib模式,否则会报错,我也是折腾了很久也明白过来的!
   
二、pacemaker的配置:
pacemaker的安装与配置,参考本博客pacemaker相关的文章。
配置文件:略。
 
三、drbd的配置:
drbd的安装与配置,已经有相关的文章。这里直接贴配置文件:
resource配置文件:略。
global-common配置文件:  
 
    
  1. ......
  2. ......     
  3.     common {   
  4.             protocol C;  
  5.     
  6.             handlers {   
  7.  
  8.                     pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";  
  9.  
  10.                     pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";  
  11.  
  12.                     local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";  
  13.  
  14.                      fence-peer "/usr/lib/drbd/crm-fence-peer.sh";  
  15.  
  16.                      split-brain "/usr/lib/drbd/notify-split-brain.sh root";  
  17.  
  18.                      after-resync-target "/usr/lib/drbd/crm-unfence-peer.sh"; 
  19.  
  20.             }   
  21.     
  22.            startup {   
  23.  
  24.                     # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb 
  25.  
  26.             }   
  27.     
  28.             disk {   
  29.                     on-io-error detach;  
  30.                     fencing resource-only;  
  31.  
  32.             }   
  33. ......略
  34. ......   
  35.             syncer {   
  36.                     rate 10M;  
  37.                     al-extents 512;  
  38.                     csums-alg sha1;  
  39.  
  40.             }  
上述配置文件只贴出了handler、disk等部分配置段,有几点要说一下:
1、配置文件删除了startup部分的配置。在配置HA时遇到了错误,在解决错误的过程中删掉了该配置,后来问题解决,也没有补上;个人觉得,HA中drbd由pacemaker来控制,pacemaker中也有相关的启动参数,似乎不必配置drbd本身的启动参数了。纯属个人意见。
2、有两个地方还需要调优:一是handler部分的split-brain,目前把邮件发送到root@localhost,以后要搭建postfix,发邮件到我的工作邮箱;还有一个是syncer部分的rate,目前是10M,以后还要调优,这个需要测试xfs的读写速度(主要是写速度)以后才能定下来。
 
四、hadoop的配置:
有几个配置文件要修改:
1、$HADOOP_HOME/conf/core-site.xml,修改两个参数:fs.default.name和hadoop.tmp.dir,
把fs.default.name的地址修改为虚拟IP对应的虚拟主机名,把hadoop.tmp.dir的目录位置修改为drbd分区: 
 
    
  1.    <name>fs.default.namename> 
  2.    hdfs://DRBD:9000
  3.  
  4.    hadoop.tmp.dir
  5.    /data/temp
说明,DRBD是我的虚拟主机名。其实这时候还没配置虚拟IP及虚拟主机名,但已经规划好了,所以这里直接填了。
2、$HADOOP_HOME/conf/hdfs-site.xml,修改dfs.name.dir,把目录位置修改为drbd分区:
 
    
  1.    dfs.name.dir
  2.    /data/nn
说明,/data目录是我的drbd分区所挂载的目录。
3、$HADOOP_HOME/conf/mapred-site.xml,修改两个参数:mapred.job.tracker,以及mapred.job.tracker.http.address,把它们的地址修改为虚拟IP: 
 
    
  1.   mapred.job.tracker
  2.   DRBD:9001
  3.  

  4.   mapred.job.tracker.http.address
  5.   DRBD:50030
4、$HBASE_HOME/conf/hbase-site.xml文件,修改hbase.rootdir:
 
    
  1.   base.rootdir
  2.   hdfs://DRBD:9000/hbase

 
五、开始配置集群资源:
首先,查看一下当前的集群配置:
 
配置资源与约束之前的准备工作:
1、要注意主备节点之间的时钟同步!
2、关闭drbd自启动,而使用pacemaker管理资源:
 
    
  1. chkconfig --level 2345 drbd off
3、由于官方没有提供namenode的资源代理,所以我们首先要创建RA,而在创建RA之前,我们还要hdfs和jobtracker的启动/停止脚本。
a、创建hdfs脚本:
该脚本用于启动/停止namenode节点的hdfs服务。
最简单的办法,修改start-dfs.sh及stop-dfs.sh脚本,删除最后两行,重新命名为start-namenode.sh,和stop-namenode.sh。
b、创建jobtracker脚本:
该脚本用于启动/停止namenode节点的jobtracker服务。
最简单的办法,修改start-mapred.sh及stop-mapred.sh脚本,删除最后一行,重新命名为start-jobtracker.sh,和stop-jobtracker.sh。
 
创建hdfs的资源代理:
OCF标准我不太懂,所以写了一个LSB标准的。两种RA的写法,参考:http://www.linux-ha.org/wiki/OCF_Resource_Agent,和http://refspecs.linux-foundation.org/LSB_3.2.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
在/etc/init.d目录下,创建脚本dfs:
 
    
  1. #!/bin/bash 
  2. #This is a Resource Agent for managing hadoop namenode 
  3. #2011-08-30 by qinshan.li 
  4. HADOOP_HOME=/home/hdfs/hadoop-0.20.2-CDH3B4 
  5. DFS_USER=hdfs 
  6. DFS_START=$HADOOP_HOME/bin/start-namenode.sh 
  7. DFS_STOP=$HADOOP_HOME/bin/stop-namenode.sh 

  8. start() {  
  9. echo -n "Starting dfs: "  
  10. su - $DFS_USER -c $DFS_START 
  11. sleep 10  
  12. if netstat -an |grep 50070 >/dev/null 
  13. then  
  14. echo "dfs is running" 
  15. return 0 
  16. else 
  17. return 3 
  18. fi 
  19.   
  20. stop() { 
  21. if netstat -an |grep 50070 |grep LISTEN >/dev/null 
  22. then  
  23. echo "Shutting down dfs"  
  24. su - $DFS_USER -c $DFS_STOP 
  25. else  
  26. echo "dfs is not running" 
  27. return 3 
  28. fi    
  29. if netstat -an |grep 50070 |grep LISTEN >/dev/null 
  30. then 
  31. sleep 10  
  32. kill -9 $(cat $HADOOP_HOME/pids/hadoop-hdfs-namenode.pid) 
  33. fi 
  34.    
  35. restart() {  
  36. if netstat -an |grep 50070 |grep LISTEN >/dev/null 
  37. then 
  38. stop 
  39. sleep 10 
  40. start 
  41. else 
  42. start 
  43. return 0 
  44. fi 
  45. }   
  46.  
  47. status() {  
  48. if netstat -an |grep 50070 |grep LISTEN >/dev/null 
  49. then  
  50. echo "dfs is running" 
  51. return 0 
  52. else  
  53. echo "dfs is stopped" 
  54. return 3 
  55. fi 

  56. case "$1" in 
  57. start) 
  58. start 
  59. ;; 
  60. stop) 
  61. stop 
  62. ;; 
  63. restart|force-reload) 
  64. restart 
  65. ;; 
  66. status) 
  67. status 
  68. ;; 
  69. *) 
  70.  
  71. echo "Usage: /etc/init.d/dfs {start|stop|restart|status}" 
  72. exit 1 
  73. ;; 
  74. esac 
  75. exit 0   
仿照上述脚本,创建jobtracker的资源代理:
在/etc/init.d目录下,创建mapred脚本:
脚本略
 
开始配置资源与约束:
提示:创建资源前,最后先使用meta命令查看一下该资源代理的常用选项!特别地,当你从网上照搬某些配置时,有时候系统会提示没有某配置项,或时间设定太短,这时候更需要meta命令了!  
添加集群资源:
#配置no-quorum-policy和stonith-enabled
已配置,略过。命令如下: 
 
    
  1. crm(live)configure# property no-quorum-polic=ignore  
  2. crm(live)configure# property stonith-enabled=false   
#创建虚拟IP资源 
 
    
  1. crm(live)configure# primitive VIP ocf:heartbeat:IPaddr2 \   #斜杠前有空格 
  2. > params ip=10.10.0.200 cidr_netmask=32 \   #根据实际情况进行配置!  
  3. > op monitor interval=20s timeout=30s  
  4. crm(live)configure# commit   
#把虚拟IP添加到host表,整个hadoop集群的节点都要添加,而不仅仅是两个namenode节点:
 
    
  1. vim /etc/hosts,添加: 
  2. 10.10.0.200 DRBD
#创建hdfs资源 
 
    
  1. crm(live)configure# primitive namenode lsb:dfs \ 
  2. > op monitor interval=20 timeout=20 start-delay=20 
  3. crm(live)configure# commit 
#创建jobtracker资源
 
    
  1. crm(live)configure# primitive jobtracker lsb:mapred 
  2. crm(live)configure# commit 
#创建组资源hadoop,把namenode和jobtracker资源进行编组
 
    
  1. crm(live)configure# group HADOOP namenode jobtracker 
  2. crm(live)configure# commit 
#配置资源VIP和组资源hadoop的两个约束
 
    
  1. crm(live)configure# colocation HADOOP-with-VIP inf: HADOOP VIP 
  2. crm(live)configure# order HADOOP-after-VIP inf: VIP HADOOP
  3. crm(live)configure# commit
#设置集群内的资源粘性,防止资源在节点间频繁迁移
 
    
  1. crm(live)configure# rsc_defaults resource-stickiness=100 
  2. crm(live)configure# commit 
#修改集群默认的时间间隔,我觉得20s太短了,改为60s 
 
    
  1. crm(live)configure# property default-action-timeout=60 
  2. crm(live)configure# commit   
#创建drbd资源,及其状态克隆资源
#参考:http://www.clusterlabs.org/wiki/DRBD_HowTo_1.0。注意,官方推荐使用ocf:linbit:drbd来配置drbd!
#注意:drbd资源,及文件系统资源,使用cib模式进行配置
 
    
  1. crm(live)# cib new drbd 
  2. INFO: drbd shadow CIB created 
  3.  
  4. crm(drbd)# configure primitive drbd0 ocf:linbit:drbd \ 
  5. > params drbd_resource=namenode \ 
  6. > op start timeout=250 \ 
  7. > op stop timeout=110 \ 
  8. > op promote timeout=100 \ 
  9. > op demote timeout=100 \ 
  10. > op notify timeout=100 \ 
  11. > op monitor role=Master interval=20 timeout=30 \ 
  12. > op monitor role=Slave interval=30 timeout=30 
  13.   
  14. crm(drbd)# configure ms ms-drbd0 drbd0 \ 
  15. > meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true 
  16.   
  17. crm(drbd)# cib commit drbd 
  18. INFO: commited 'drbd' shadow CIB to the cluster   
#创建文件系统资源,并配置文件系统与drbd资源的两个约束
 
    
  1. crm(live)# cib new fs 
  2. INFO: fs shadow CIB created 
  3.  
  4. crm(fs)# configure primitive fs-drbd0 ocf:heartbeat:Filesystem \ 
  5. > params device=/dev/drbd0 directory=/data fstype=xfs  
  6. crm(fs)# configure colocation fs-on-drbd0 inf: fs-drbd0 ms-drbd0:Master 
  7. crm(fs)# configure order fs-after-drbd0 inf: ms-drbd0:promote fs-drbd0:start 
  8.   
  9. crm(fs)# cib commit fs 
  10. INFO: commited 'fs' shadow CIB to the cluster   
#配置组资源hadoop与文件系统的两个约束
 
    
  1. crm(live)configure# colocation HADOOP-on-fs inf: HADOOP fs-drbd0 
  2. crm(live)configure# order HADOOP-after-fs inf: fs-drbd0 HADOOP 
  3. crm(live)configure# commit 
查看集群配置:
crm configure show
图就不贴了!:-)
 
查看集群状态:
 
测试迁移:
在SER-126上,执行crm node standby,停止其运行的所有服务,观察Namenode能否自动切换到SER-125上:
迁移成功!
搭建工作到此就完成了,可以在namenode上跑一些任务测试一下。