HBase学习笔记(三)

配置多功能高可用性master
hadoop和hbase被设计的可以自动在slave节点间进行故障转移。由于在大型集群中有很多节点,一个slave节点的服务器的硬件故障被认为是正常的。
对于主节点,hbase本身没有单点故障(SPOF)。它使用zookeeper来提供中央协调服务。zookeeper通常有3个或者更多个服务器,只要集群中超过半数的服务器在线,zookeeper就正常的提供服务。
hbase将当前活动的主节点,root region的地址和其他一些主要的运行数据保存在zookeeper。因此,我们可以启动两个或更多个hmaster守护进程在独立的服务器上并且其中第一个被启动的将会作为hbase集群的活动主服务器。然而,hdfs的namenode在集群中存在单点故障的问题。namenode在本地内存中保存整个个hdfs文件系统的镜像。如果namenode宕掉,hdfs将不能再发挥作用。正如你所注意到的,有一个 secondary namenode。然而secondary namenode不是namenode的备用,它只提供了一个对namenode的检查功能。因此,高可用性集群的挑战是使得namenode具有高可用性。
接下来,我们将描述两个高可用的主节点设置,他们使用heartbeat 来相互监控。heartbeat 是一种在linux集群成员之间通信的广泛使用的高可用性解决方案。heartbeat 需要与集群资源管理器(Cluster Resource Manager,CRM)一起使用。集群资源管理器用来为集群提供启动或者停止服务。pacemaker是集群资源管理器用于heartbeat 的首选。我们将设置一个虚拟ip地址用于heartbeat 和pacemaker ,然后将其与活动主节点相关联。

准备
首先应该安装好hdfs和hbase。我们将设置一个主节点的备用节点master2.确保所有的配置都正确,将master1的配置同步到mater2中。
1.在master1和master2上安装heartbeat和pacemaker:
root# apt-get install heartbeat cluster-glue cluster-agents pacemaker 
2. 配置heartbeat,在master1和master2上进行如下修改:
root# vi /etc/ha.d/ha.cf
修改如下:
# enable pacemaker, without stonith
crm yes
# log where ?
logfacility local0
# warning of soon be dead
warntime 10
# declare a host (the other node) dead after:
deadtime 20
# dead time on boot (could take some time until net is up)
initdead 120
# time between heartbeats
keepalive 2
# the nodes
node master1
node master2
# heartbeats, over dedicated replication interface!
ucast eth0 master1 # ignored by master1 (owner of ip)
ucast eth0 master2 # ignored by master2 (owner of ip)
# ping the name server to assure we are online
ping ns
3.创建一个认证密钥(authkeys )文件。在master1和master2上切换到root用户执行如下脚本:
root# ( echo -ne "auth 1\n1 sha1 "; \
dd if=/dev/urandom bs=512 count=1 | openssl md5 ) \
> /etc/ha.d/authkeys
root# chmod 0600 /etc/ha.d/authkeys

创建并且安装一个NameNode资源代理
Pacemaker依赖于一个资源代理以便管理集群。一个资源代理是一个管理集群资源的可执行文件。在本例中,VIP地址和HDFS namenode服务是我们想要使用Pacemaker管理的集群资源。Pacemaker使用IPaddr资源代理来管理VIP,所以我们只需要创建自己的namenode资源代理即可  : 
1.切换到root用户,在master1和master2上添加环境变量到 .bashrc文件,不要忘记使这些改变生效:
root# vi /root/.bashrc
export JAVA_HOME=/usr/local/jdk1.6
export HADOOP_HOME=/usr/local/hadoop/current
export OCF_ROOT=/usr/lib/ocf
执行如下命令使上面的改变生效:
root# source /root/.bashrc
2. 创建一个标准开发集群框架(Open Clustering Framework ,OCF)资源打理文件并命名为namenode。并添加如下内容到其中:
root# vi namenode
#!/bin/sh
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
. ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
usage() {
echo "Usage: $0 {start|stop|status|monitor|meta-data|validateall}"
}
3. 添加一个meta_data()函数到上面的namenode文件中。meta_data()函数功能转储资源代理的元数据为标准输出。每个资源代理必须有一组XML元数据描述自己的目的和
支持的参数。
root# vi namenode
meta_data() {cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="namenode">
<version>0.1</version>
<longdesc lang="en">
This is a resource agent for NameNode. It manages HDFS namenode
daemon.
</longdesc>
<shortdesc lang="en">Manage namenode daemon.</shortdesc>
<parameters></parameters>
<actions>
<action name="start" timeout="120" />
<action name="stop" timeout="120" />
<action name="status" depth="0" timeout="120" interval="120" />
<action name="monitor" depth="0" timeout="120" interval="120" />
<action name="meta-data" timeout="10" />
<action name="validate-all" timeout="5" />
</actions>
</resource-agent>
END
}
4.添加 namenode_start()函数。这个函数用于通过Pacemake来在服务器上开启namenode守护线程。在namenode_start()函数中,我们首先检查是否NameNode会在服务器上已经启动,如果它没有启动,我们调用的hadoop-daemon.sh从Hadoop的用户来启动它:
root# vi namenode
namenode_start() {
# if namenode is already started on this server, bail out early
namenode_status
if [ $? -eq 0 ]; then
ocf_log info "namenode is already running on this server,
skip"
return $OCF_SUCCESS
fi
# start namenode on this server
ocf_log info "Starting namenode daemon..."
su - hadoop -c "${HADOOP_HOME}/bin/hadoop-daemon.sh start name
node"
if [ $? -ne 0 ]; then
ocf_log err "Can not start namenode daemon."
return $OCF_ERR_GENERIC;
fi
sleep 1
return $OCF_SUCCESS
}
5.添加namenode_stop()函数。此功能用于通过Pacemaker在服务器上停止NameNode的守护进程。在namenode_stop()函数中,我们 首先检查的NameNode是否已经停止在服务器上,如果它正在运行,我们从Hadoop的用户调用的hadoop-daemon.sh停止它: 
root# vi namenode
namenode_stop () {
# if namenode is not started on this server, bail out early
namenode_status
if [ $? -ne 0 ]; then
ocf_log info "namenode is not running on this server, skip"
return $OCF_SUCCESS
fi
# stop namenode on this server
ocf_log info "Stopping namenode daemon..."
su - hadoop -c "${HADOOP_HOME}/bin/hadoop-daemon.sh stop name
node"
if [ $? -ne 0 ]; then
ocf_log err "Can not stop namenode daemon."
return $OCF_ERR_GENERIC;
fi
sleep 1
return $OCF_SUCCESS
}
6.添加namenode_status()函数。此功能用于通过Pacemaker 监测服务器上的NameNode的守护程序的状态。在namenode_status() 
函数中,我们使用jps命令来显示所拥有的所有hadoop用户正在运行的Java进程,以及查看NameNode的守护程序是否开启:
root# vi namenode
namenode_status () {
ocf_log info "monitor namenode"
su - hadoop -c "${JAVA_HOME}/bin/jps" | egrep -q "NameNode"
rc=$?
# grep will return true if namenode is running on this machine
if [ $rc -eq 0 ]; then
ocf_log info "Namenode is running"
return $OCF_SUCCESS else
ocf_log info "Namenode is not running" return $OCF_NOT_
RUNNING
fi
}
7.添加namenode_validateAll()函数用来确保在我们运行其他功能之前,我们设置的环境变量是否正确:
root# vi namenode
namenode_validateAll () {
if [ -z "$JAVA_HOME" ]; then
ocf_log err "JAVA_HOME not set."
exit $OCF_ERR_INSTALLED
fi
if [ -z "$HADOOP_HOME" ]; then
ocf_log err "HADOOP_HOME not set."
exit $OCF_ERR_INSTALLED
fi
# Any subject is OK
return $OCF_SUCCESS
}
8. 添加下面的主程序。在这里,我们将简单地调用以前的函数
实现所要求的标准OCF资源代理的行为:
root# vi namenode
# See how we were called.
if [ $# -ne 1 ]; then
usage
exit $OCF_ERR_GENERIC
fi
namenode_validateAll
case $1 in
meta-data) meta_data
exit $OCF_SUCCESS;;
usage) usage
exit $OCF_SUCCESS;;
*);;
esac
case $1 in
status|monitor) namenode_status;;
start) namenode_start;;
stop) namenode_stop;;
validate-all);;
*)usage
exit $OCF_ERR_UNIMPLEMENTED;;
esac
exit $?
9. 改变namenode文件的权限并在master1和master2上测试它:
root# chmod 0755 namenode
root# ocf-tester -v -n namenode-test /full/path/of/namenode
10. 确定所有的测试在执行下一步之前通过,否则高可用性集群将可能出现未知的问题。
11. 在master1和master2的hac提供者上安装namenode资源代理:
root# mkdir ${OCF_ROOT}/resource.d/hac
root# cp namenode ${OCF_ROOT}/resource.d/hac
root# chmod 0755 ${OCF_ROOT}/resource.d/hac/namenode


我们准备用Heartbeat和Pacemaker来配置高度可用的NameNode。我们将设立一个VIP地址并且在配置Hadoop和HBase时使用这个VIP地址作为他们的 主节点。NameNode会在VIP被分配的时候在活动主节点上启动。如果活动 主已经崩溃,Heartbeat和Pacemaker会检测到它,并分配VIP地址的 备用主节点,然后启动NameNode。

1. 在master1和master2尚开启Heartbeat : 
root# /etc/init.d/heartbeat start
2. 改变默认的crm配置。所有资源相关的命令仅仅在master1和master2上执行一次:
root# crm configure property stonith-enabled=false
root# crm configure property default-resource-stickiness=1
3. 使用我们的VIP地址增加一个VIP资源:
root# crm configure primitive VIP ocf:heartbeat:IPaddr params
ip="10.174.14.10" op monitor interval="10s"
4. 确定在你做出改变之后将下面的hadoop配置同步到所有的主节点、客户端和从节点上:
hadoop$ vi $HADOOP_HOME/conf/core-site.xml
<property>
<name>fs.default.name</name>
<value>hdfs://master:8020</value>
</property>
5. 确定在你做出改变之后将下面的HBase 配置同步到所有的主节点、客户端和从节点上:
hadoop$ vi $HBASE_HOME/conf/hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:8020/hbase</value>
</property>
6. 为了配置Hadoop以便写元数据到本地磁盘和NFS中,做出如下改变并将 配置同步到所有的主节点、客户端和从节点上:
hadoop$ vi $HADOOP_HOME/conf/hdfs-site.xml
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/var/dfs/name,/mnt/nfs/hadoop
/dfs/name</value>
</property>
7. 添加我们在第5步中为Pacemaker创建的namenode资源代理,我们将使用NAMENODE作为它的资源名:
root# crm configure primitive NAMENODE ocf:hac:namenode op monitor
interval="120s" timeout="120s" op start timeout="120s" op stop
timeout="120s" meta resource-stickiness="1"
8.配置VIP资源和NAMENODE资源作为一个资源组:
root# crm configure group VIP-AND-NAMENODE VIP NAMENODE
9.配置VIP资源和NAMENODE资源 的托管:
root# crm configure colocation VIP-WITH-NAMENODE inf: VIP NAMENODE
10. 配置VIP资源和NameNode的资源的资源顺序:
root# crm configure order IP-BEFORE-NAMENODE inf: VIP NAMENODE
11. 通过使用crm_mon命令验证以前的Heartbeat和资源配置的。如果一切配置正确,你应该会看到
类似下面的输出:
root@master1 hac$ crm_mon -1r
============
Last updated: Tue Nov 22 22:39:11 2011
Stack: Heartbeat
Current DC: master2 (7fd92a93-e071-4fcb-993f-9a84e6c7846f) -
partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 1 expected votes
1 Resources configured.
============
Online: [ master1 master2 ]
Full list of resources:
Resource Group: VIP-AND-NAMENODE
VIP (ocf::heartbeat:IPaddr): Started master1
NAMENODE (ocf::hac:namenode): Started master1
12.确保VIP和NameNode的资源在同一台服务器上开启。
13. 现在停止master1上的Heartbeat; master2上的VIP和NAMENODE应该在几秒钟后再开启。
14. 重启master1上的Heartbeat,保持master2上的VIP和NAMENODE处于开启状态,资源不应该故障恢复到master1。 

开启DataNode、HBase集群并且备份HBase master。我们已经证实,我们的HA(高可用性)配置正常工作,所以我们就可以开启HDFS和HBase。现在。请注意,NameNode会已经被Pacemaker开启,所以我们只需要开启DataNode:
1.如果一切都工作的很好,我们现在就可以开启DataNod:
hadoop@master$ for i in 1 2 3
do
ssh slave$i "$HADOOP_HOME/bin/hadoop-daemon.sh start datanode"
sleep 1
done
2. 开启你的HBase集群的master,就是那些与VIP地址相关联的活动主服务器:
hadoop@master$ $HBASE_HOME/bin/start-hbase.sh
3.开启master2上的从HMaster:
hadoop@master2$ $HBASE_HOME/bin/hbase-daemon.sh start master
转载请注明出处: http://blog.csdn.net/iAm333

你可能感兴趣的:(HBase学习笔记(三))