搭建HA,规划如下:
| NN-1 | NN-2 | DN | ZK | ZKFC | JNN |
|---|
| node01 | * | | | | * | * |
| node02 | | * | * | * | * | * |
| node03 | | | * | * | | * |
| node04 | | | * | * | | |
以下在03,04的基础上搭建
一、将zookeeper上传至node02,然后解压,移动至自己创建的目录下
tar -zxf zookeeper.*.tar.gz
mv zookeeper* /opt/sxt
(zookeeper也是java开发的,也需要jdk)
二、配置环境变量,使zkCli.cmd和zkServer.sh在任意位置可以使用
1.环境变量
cd /opt/sxt/zookeeper-3
vi /etc/profile
(在export中,用O新开倒数第二行)
export ZOOKEEPER_HOME=/opt/sxt/zookeeper-3.4.6
在最后一行增加“ :ZOOKEEPER_HOME/bin ”
2.加载配置文件:
. /etc/profile
3.验证:
cd 随便去一个位置
zk 按Tab有提示即可
三、调整配置文件
1.进入目录:
cd /opt/sxt/zookeeper-3
cd conf
2.改名:
cp zoo_sample.cfg zoo.cfg
3.补充:
vi zoo.cfg
将dataDir的目录改为/var/sxt/hadoop/zk
在最后补充:
server.1=192.168.159.12:2888:3888
server.2=192.168.159.13:2888:3888
server.3=192.168.159.14:2888:3888
4.将自己放入那个目录
mkdir -p /var/sxt/hadoop/zk
echo 1 > /var/sxt/hadoop/zk/myid
5.分发给node03,node04
cd /opt/sxt
scp -r ./zookeeper*/ node03:`pwd`
scp -r ./zookeeper*/ node04:`pwd`
6.在node03,node04中改为自己的id
mkdir -p /var/sxt/hadoop/zk
echo 2 > /var/sxt/hadoop/zk/myid
在node04中为:echo 3 > /var/sxt/hadoop/zk/myid
7.为node03,node04配置文件
scp /etc/profile node03:/etc/profile
scp /etc/profile node04:/etc/profile
在3,4中分别启动
. /etc/profile
四、启动
0.当启动过半时,确定leader。(server大的为,小的为follower)
后来的就算server大于leader的,也要追随,除非leader驾崩,server最大的才能继位。
1.启动:
zKServer.sh start
2.状态:
zKServer.sh status
其中的Mode为模式。
五、免密钥
=node02对自己免密钥,对node01免密钥=
1.创建
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
2.对自己免密钥
cd ~/.ssh
cat id_dsa.pub >> authorized_keys
3.验证
ssh node02
exit
4.远程拷贝公钥
scp id_dsa.pub node01:`pwd`/node02.pub
5.对node01免密钥
去到在node01中:
cd ~/.ssh
cat node02.pub >> authorized_keys
6.验证
(由node02访问01)
ssh node01
exit
六、备份、多版本
回到node01:
cd /opt/sxt/hadoop-*/etc
ll # 有hadoop目录
cp -r hadoop hadoop-full
(hadoop-full里面的配置就为完全分布式的(hdfs功能),将hadoop改为HA的配置)
七、更改node01中hdfs-site文件
cd /opt/sxt/hadoop-*/etc/hadoop
vi hdfs-site.xml
①删除:
HA模式中没有secondaryNamenode
将原有的第二个property即secondaryNamenode删除,它没有意义啦
②补充:
逻辑到物理的映射
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
③补充:
Journalnode的配置
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/sxt/hadoop/ha/jn</value>
</property>
④补充:
故障切换的实现和代理
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
⑤补充:
自动故障转移
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
八、更改node01中core-site文件
cd /opt/sxt/hadoop-*/etc/hadoop
vi core-site.xml
①改:
第一个value
hdfs://:9000变为hdfs://mycluster
逻辑名称为入口
②改:
第二个value
/var/sxt/hadoop/full变为/var/sxt/hadoop/ha
full已经被使用过啦
③补充:
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
指定zookeeper列表
九、分发
scp hdfs-site.xml core-site.xml node02:`pwd`
scp hdfs-site.xml core-site.xml node03:`pwd`
scp hdfs-site.xml core-site.xml node04:`pwd`
十、部署
1.启动
node01:hadoop-daemon.sh start journalnode
node02:hadoop-daemon.sh start journalnode
node03:hadoop-daemon.sh start journalnode
2.验证后格式化
node01:
jps 有journalNode则成功
hdfs namenode -format 格式化,有successfully则成功
3.启动后同步
node01:
hadoop-daemon.sh start namenode 使用jps可以看到namenode则成功
node02:
hdfs namenode --help 最后一个单词不会写,以此来查询
hdfs namenode -bootstrapStandby
node01:
hdfs zkfc -formatZK 有successfully create ……
node04:
zkCli.sh 找zk的客户端
ls / 有hadoop-ha
ls /hadoop-ha 有mycluster,再下面就是空的啦
node01:
start-dfs.sh 启动
node04:
ls /hadoop-ha/mycluster 现在有东西啦
get /hadoop-ha/mycluster/Active……Lock
取东西,有点乱码没关系,第一行可以看到node01,所以其就是主
浏览器进入“node01:50070”是“active”;
浏览器进入“node02:50070”是“standby”。
十一、模拟验证ha模式的能力
1.在node01中杀死NameNode
jps
kill -9 "namenode的进程号"
2.验证
①浏览器:
node01:50070崩溃,node02:50070仍然正常
②node04:
get /hadoop-ha/mycluster/Active……Lock
第一行的变为node02
3.恢复namenode
hadoop-daemon.sh start namenode
后果:
node01:50070成为standby
node02:50070不受影响
4.在node02中杀死DFSZFailoverController
kill -9 "其进程号"
后果:
node01:50070变为active
node02:50070变为standby
5.被杀死节点就超时过期啦
node02:hadoop-daemon.sh start zkfc
node01:kill -9 "ZKFC其进程号"
浏览器中node01:50070和node02:50070(active和standby)就会切换