高可用hdfs部署
当你使用hadop进入一段时间后,你可能会碰到更高的要求。系统稳定吗?uptime时间能达到100%?为了能够安抚这类担忧情绪你需要做更多的工作.在集群里hadoop的NameNode是SPOF模式,加上backup namenode保证namenode数据在硬盘正确完整的存储,但一旦进程或者服务器挂掉,以及不得不进行的硬件更换升级导致停机,集群一样会处于不可用状态,这也是运行中的hadoop生态系统最麻烦的事情。这时候你就只能重启,或者在另外一个服务器上启动一个namenode.
为保证高可用性,我们必须有1台StandbyNamenode角色的服务器,它能够随时保持与namenode服务器的状态同步,随时能够接替namenode的工作。最简单的办法是StandbyNamenode与namenode都使用NFS远程挂载一个一模一样的地址来做存储。这样当namenode的edits更改时StandbyNamenode能够随时知道。nfs的方案可能不够健壮,但是足够说服其它人安心了。
准备一台服务器作为nfs服务端。硬盘网卡需要最好质量的。预算足够的话建议购买专业的存储主机。
下面是配置过程:
为保证始终只有一个namenode是处于激活状态的。也就是始终只有一个namenode可以写edits,必须有一个方法用来阻止非激活状态的namenode去写这个文件。称为fencing方法,在配置
dfs.ha.fencing.methods里边指定。
为保证主备namenode的快速切换,所有DataNode都会同时配置这2个namenode的地址,同时向这2个namenode发送信息和心跳。 这2个namenode谁先启动谁就处于初始激活状态。
客户端的datanode
hdfs-site.xml 配置如下:
<property>
<name>fs.defaultFS</name>
<value>hdfs://clusternamenode</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>clusternamenode</value>
</property>
<property>
<name>dfs.ha.namenodes.clusternamenode</name>
<value>namenode1,namenode2</value>
</property>
namenode1,namenode2是你准备用于作为主备namenode的服务器。最多就2台!!
因为有2个namenode所以很多配置都要分别设置
<property>
<name>dfs.namenode.rpc-address.clusternamenode.namenode1</name>
<value>namenode1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.clusternamenode.namenode2</name>
<value>namenode2:8020</value>
</property>
指定每个NameNode监听的rpc通信端口
the fully-qualified RPC address for each NameNode to listen on
这些配置也要作相应修改只是不同端口
dfs.namenode.servicerpc-address.clusternamenode.namenode1
dfs.namenode.servicerpc-address.clusternamenode.namenode2
dfs.namenode.http-address.clusternamenode.namenode1
dfs.namenode.http-address.clusternamenode.namenode2
dfs.namenode.shared.edits.dir file:///mnt//namenode-shared 指定nfs挂载的路径
HDFS客户端检查目前激活的namenode是哪个的驱动
<property>
<name>dfs.client.failover.proxy.provider.clusternamenode</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
fencing方法
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/${yourname}/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
sshfence使用ssh连接的方式来拦截杀死服务进程,以防止它修改edits文件
dfs.ha.fencing.ssh.private-key-files 是ssh的登录验证文件路径。你必须在2台namenode上互相设置免密码登录。
如果没有这个文件 /home/${yourname}/.ssh/id_rsa 。你可以用命令ssh-keygen重新生成。
dfs.ha.fencing.ssh.connect-timeout 是sshfence的超时失效时间,到这个时间就认为失败了。
上面的设置我们已经实现了 向2台namenode发送信息跟保持心跳,同时防止2台namenode同是处于激活状态。但是激活的namenodey一旦挂掉,
还是需要手动运行命令 bin/hdfs haadmin -failover来切换,zookeeper能帮我们自动运行这个命令.
需要一个zookeeper的监控团。在生常环境中至少需要3个节点的zookeeper来组成这个监控团。zookeeper的节点只能是单数。
同时hdfs内置了一个zookeeper的客户端ZKFailoverController,这个组件的作用是管理跟监控namenode的状态,同时向zookeeper争取一个称为znode锁。
这个锁处于激活状态,该namenode处于激活状态
zookeeper与ZKFailoverController的配置如下:(注意在生产环境中我们至少需要3台zookeeper)
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.2.20</value>
</property>
重启集群后在namenode上运行:
bin/hdfs zkfc -formatZK //启动zookeeper的监控客户端。
到此高可用性的hdfs就上线了,接下来配置一套高可用hbase。
高可用hbase部署
先停止hbase集群
配置conf/hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>hdfs://clusternamenode/hbase</value>
</property>
//clusternamenode 就是上面配置的hadoop namenode.
你可能需要删除zookeeper上面的 /hbase目录/splitlogs 这个文件。
hbase.zookeeper.property.quorum 192.168.2.20,192.168.2.21,192.168.2.22 zookeeper监管列表
运行是环境变量配置conf/hbase-env.sh :
HBASE_MANAGES_ZK false 不使用内置的zookeeper服务
启动hbase
bin/start-hbase.sh