HA高可用模式搭建
节点结构
HOST | NN | JNN | DN | ZKFC | ZK |
---|---|---|---|---|---|
tongyuzhe1 | * | * | * | ||
tongyuzhe2 | * | * | * | * | * |
tongyuzhe3 | * | * | * | ||
tongyuzhe4 | * | * |
配置zookeeper
-
将zookeeper解压到/opt/bigdata/目录下,进入zookeeper下的conf文件夹
-
复制一份zoo_sample.cfg重命名为zoo.cfg
cp zoo_sample.cfg zoo.cfg
-
修改zoo.cfg
dataDir=/var/bigdata/hadoop/zk #文件下面新开一行 #设置zk服务器,以及优先级,数字大为主节点 server.1=tongyuzhe2:2888:3888 server.2=tongyuzhe3:2888:3888 server.3=tongyuzhe4:2888:3888 #2888端口:主从状态 #3888端口:主节点挂掉重新选举状态
-
新建文件夹
mkdir /var/bigdata/hadoop/zk
-
创建文件myid
#里面写上数字,例如数字1 #指的是这台主机优先级为数字1 #数字越大优先级越高 #将2追加至myid echo 2 > myid
-
将zk目录添加到环境变量
#path上一行追加 export ZOOKEEPER_HOME=/opt/bigdata/zookeeper-3.4.6 #path后添加 $ZOOKEEPER_HOME/bin
-
分发至其他节点
scp -r zookeeper-3.4.6/ tongyuzhe3:/opt/bigdata/
-
启动zookeeper
#启动ZK zkServer.sh start #查看服务状态 zkServer.sh status #会提示:It is probably not running. #服务不在运行但是jps里进程还在,因为1台主机不过半无法形成势力范围 #再启动第2个ZK节点会发现: #节点1:Mode: follower #节点2:Mode: leader #再运行节点3,会发现节点3是,Mode: follower #因为有leader正在运行,没必要再选出新leader
配置hadoop的xml
1. 将两个配置文件用scp分发到每一台节点
core-site.xml
<!--
多NN节点情况下寻找mycluster名字配置文件
mycluster:集群映射目录,用于识别不同集群挂载不同目录,避免集群冲突
-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--zookeeper节点位置-->
<property>
<name>ha.zookeeper.quorum</name>
<value>tongyuzhe2:2181,tongyuzhe3:2181,tongyuzhe4:2181</value>
</property>
hdfs-site.xml
1. 跟Secondary相关的删除,因为用不到了。
2. 存储位置全都从full改为ha目录,换个新目录。
NN名称映射
<!--自定义逻辑名称mycluster-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--mycluster一对多映射别名-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!--mycluster名具体到主机-->
<!--rpc链接-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>tongyuzhe1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>tongyuzhe2:8020</value>
</property>
<!--外部web页-->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>tongyuzhe1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>tongyuzhe2:50070</value>
</property>
JN配置
<!--JN启动位置-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://tongyuzhe1:8485;tongyuzhe2:8485;tongyuzhe3:8485/mycluster</value>
</property>
<!--JN数据存储路径-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/bigdata/hadoop/ha/dfs/jn</value>
</property>
HA切换指定代理类
<!--HA角色切换时指定哪个代理类和实现方法,以及发送消息-->
<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>
<!--
配置密钥目录。
免密使用的两个场景:管理脚本,ZKFC。
-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
zkfc开机自启动
<!--
开启自动化:
启动HDFS时,自动启动zkfc(故障自动转移)。
-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
注意事项
1. 格式化或是启动集群,要先操作JN,否则直接操作NN的话,数据还是会被JN给恢复。
2. 格式化NN时,只需要格式化一个,然后第二台同步第一台,如果也格式化第二个会生成另外一个集群ID。
3. 启动start-dfs.sh脚本的机器需要将公钥分发给别的节点
4. HA依赖ZK集群
5. ZKFC会用免密的方式控制自己和其他NN节点的NN状态
初始化启动
-
启动JN
#每一台JN服务器都启动 #启动JN hadoop-daemon.sh start journalnode
-
查看JN日志(选做)
#进入日志目录 cd $HADOOP_HOME/logs #查看对应主机名日志 tail -f hadoop-root-journalnode-tongyuzhe1.log
-
选择一个NN格式化
#只有第一次搭建做,以后不用做 hdfs namenode -format
-
启动NN
启动这个格式化的NN,以备另外一台同步 hadoop-daemon.sh start namenode
-
同步NN
#在另外一台NN机器中同步 hdfs namenode -bootstrapStandby
-
格式化ZK
#选择一台主机格式化 #格式化zk #只有第一次搭建做,以后不用做 hdfs zkfc -formatZK #可以打开zk客户端控制界面,用于查看目录 zkCli.sh #格式化zk其实就是在创建节点目录
-
启动HDFS
start-dfs.sh
理论检验
#强制杀死进程
#-9:制杀死进程,不执行退出流程
kill -9 进程号
#查看谁是活跃节点(锁)
#进入zk客户端执行
get /hadoop-ha/myCluster/ActiveStandbyElectorLock
#单独启动NameNode节点
hadoop-daemon.sh start namenode
#断开网卡链接
ifconfig eth33 down
#恢复网卡链接
ifconfig eth33 up