0 ha简介:
high availibility: 高可靠,有两个namenode节点在运行,一个是active状态 一个是standby状态,此两个namenode要保持内部数据一致性
通过journalnode集群实现namenode内部数据一致性,active状态的namenode像journalnode集群写入数据,standby状态的namenode从journalnode集群读入数据
当active状态的namenode宕机下,可以自动或者手动方式将standby状态的namenode变成active状态
真实环境中如何确认不同机器担任何种角色?
答: namenode适合于大内存机器 datanode适合于大硬盘机器 journalnode对内存和硬盘要求不高无特殊需要
1 准备5个节点虚拟机,分配功能如下
namenode:h2master h2master2
datanode:h2sliver112 h2sliver113 h2sliver114
journalnode:h2master h2master2 h2sliver112
2 准备初始环境:
将5个节点机器的静态IP,机器别名,IP和别名映射关系(vi /etc/hosts 内写所有节点映射关系),防火墙关闭设置好
3 5台机器各自ssh互通
a) 在各自机器中生成各自机器ssh秘钥(ssh-keygen -t rsa),并cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys生成各自公钥
b) 分别在其余四台机器中通过命令ssh-copy-id -i h2master 将各自机器公钥拷贝到h2master中,
后在h2master中,通过scp /root/.ssh/authorized_keys 其余四个机器别名:/root/.ssh 拷贝回去
这样实现5台机器相互之间无密码下ssh连接
4 在h2master内安装jdk,配置环境变量,后拷贝到其余四个节点:
scp /etc/profile h2master2:/etc/profile
scp -r /usr/local/jdk1.7 h2master2:/usr/local/
或者写脚本执行:
# vi mysh.sh
#!/bin/sh
for i in 112 113
do
scp -rq /usr/local/hadoop2.5 h2sliver$i:/usr/local
done
5 h2master配置hadoop配置文件,后拷贝到其余四个节点
配置文件写法和解释如下:
1.1 配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves)
1.1.1 hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.7
1.1.2 core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop2.5/tmp</value>
</property>
1.1.3 hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>cluster1</value> ------ ha对应的namenode节点定义
</property>
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>h2master,h2master2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.h2master</name> ------ ha对应的namenode节点端口地址
<value>h2master:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.h2master</name> ------ ha对应的namenode节点端口地址
<value>h2master:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.h2master2</name> ------ ha对应的namenode节点端口地址
<value>h2master2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.h2master2</name> ------ ha对应的namenode节点端口地址
<value>h2master2:50070</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled.cluster1</name> ------ ha 上取消自动恢复
<value>false</value>
</property>
<property> -- 节点数最少是3个并且建议使用奇数个
<name>dfs.namenode.shared.edits.dir</name> ------ 定义journalnode集群 /cluster1表示对cluster1对应的namenode集群进行数据共享
<value>qjournal://h2master:8485;h2master2:8485;h2sliver112:8485/cluster1</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name> ------ 定义journalnode集群存储namenode集群的数据存放位置
<value>/usr/local/hadoop2.5/tmp/journal</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name> ------ 指定切换方式用ssh
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name> ------ 指定ssh私钥文件路径
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name> ------ 声明执行切换要使用的代理类
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
1.1.6 slaves
h2sliver112
h2sliver113
h2sliver114
拷贝代码写法如下,其余节点类推写法:
scp -r /usr/local/hadoop2.5 h2master2:/usr/local/
6 启动hadoop2 hdfs集群
a) 先启动journalnode集群:
h2master h2master2 h2sliver112 sbin下上分别执行: hadoop-daemon.sh start journalnode
通过jps可以发现:
[root@h2sliver112 sbin]# jps
5617 Jps
5571 JournalNode 启动成
b) 格式化namenode:
b.1)在h2master格式化后启动:
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
[root@h2master sbin]# jps
13436 NameNode
13298 JournalNode
13503 Jps
b.2) 在h2master2上格式化并启动:
bin/hdfs namenode -bootstrapStandby 表示从另一个namenode节点上把数据读取过来
sbin/hadoop-daemon.sh start namenode
格式化日志可见,确实是从h2master节点上拷贝文件过来:
15/01/10 23:44:36 INFO namenode.TransferFsImage: Opening connection to http://h2master:50070/imagetransfer?getimage=1&txid=0&storageInfo=-57:1431856901:0:CID-71ea9740-d125-461b-9663-f98bd1a5023d
15/01/10 23:44:36 INFO namenode.TransferFsImage: Image Transfer timeout configured to 60000 milliseconds
15/01/10 23:44:37 INFO namenode.TransferFsImage: Transfer took 0.00s at 0.00 KB/s
15/01/10 23:44:37 INFO namenode.TransferFsImage: Downloaded file fsimage.ckpt_0000000000000000000 size 351 bytes.
[root@h2master2 sbin]# jps
5843 Jps
5775 NameNode
5615 JournalNode
b.3)
此时访问 http://h2master:50070/dfshealth.html http://h2master2:50070/dfshealth.html 会发现这两个节点都是standby状态,
在h2master上执行hadoop2.5/bin/hdfs haadmin -failover --forceactive h2master2 h2master
haadmin -failover 命令是ha故障恢复命令,后面两个参数中,最后的参数表示让节点为active 第一个参数设置为standby
如果两个namenode节点都是standy状态 是不能执行hdfs操作的 执行也不会显示任何结果
d) 启动datanode
在datanode节点上分别执行 hadoop2.5/sbin/hadoop-daemons.sh start datanode
7 手动切换ha:
e.1) 上传数据到h2master中,
[root@h2master bin]# hdfs dfs -put /etc/hosts /
e.2) 手动杀死h2master
[root@h2master bin]# jps
13436 NameNode
14108 Jps
13298 JournalNode
[root@h2master bin]# kill -9 13436
[root@h2master bin]# jps
14120 Jps
13298 JournalNode
[root@h2master bin]# hdfs haadmin -failover --forceactive h2master h2master2
...
Failover from h2master to h2master2 successful
此时在访问
http://h2master2:50070/dfshealth.html 会发现状态已经为active
再去h2mater2中查看 以前在h2master中上传的数据,会存在 ha保证了数据一致性
[root@h2master2 bin]# hdfs dfs -ls /
-rw-r--r-- 3 root supergroup 323 2015-01-11 00:11 /hosts
8 关闭各节点写法:
关闭datanode:
[root@h2master sbin]# hadoop-daemons.sh stop datanode
h2sliver113: stopping datanode
h2sliver112: stopping datanode
h2sliver114: stopping datanode
两个节点关闭namenode:
[root@h2master sbin]# hadoop-daemon.sh stop namenode
stopping namenode
[root@h2master2 sbin]# hadoop-daemon.sh stop namenode
stopping namenode
注意: 关闭datanode 可以再任何节点关闭 并且使用命令hadoop-daemons.sh 是复数有s
关闭namenode 只能在namenode节点关闭 使用命令hadoop-daemons.sh 是单数没有s
关闭JournalNode:
直接 kill -9 进程号即可