Hadoop NameNode QJM 高可用+HBase HMaster 主备
实现 NameNode 和 HMaster 的高可用
1、准备工作
1、节点分布
2、安装包
apache-zookeeper-3.5.9-bin.tar.gz
hadoop-3.1.4.tar.gz
hbase-2.3.4-bin.tar.gz
jdk-8u181-linux-x64.tar.gz
解压数据包、删除.txt.md.html.等无用的文本文件、删除.cmd的windows使用命令文件
复制代码
下载链接
https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz
https://archive.apache.org/dist/hadoop/common/hadoop-3.1.4/hadoop-3.1.4.tar.gz
https://archive.apache.org/dist/hbase/2.3.4/hbase-2.3.4-bin.tar.gz
https://mirrors.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz
复制代码
3、校准时间
4、配置环境
ln -s /home/jdk/ /usr/local/jdk/
vim /etc/profile
JAVA_HOME=/usr/local/jdk
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH
xport HADOOP_HOME=/home/hadoop
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
source /etc/profile
复制代码
5、域名解析(使用 DNS 域名解析或编辑/etc/hosts)
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.224.192.194 test-194
10.224.192.206 test-206
10.224.192.210 test-210
复制代码
在一台机器上生成密钥对,将公钥放在 authorized_keys 中
6、免密码登录
1、生成密钥:
ssh-keygen -t rsa
2、将公钥写入其他机器中
/home/coremail/.ssh/authorized_keys
scp -P56789 -i ~/.ssh/id_rsa id_rsa coremail@10.224.192.210:/home/coremail/.ssh/
scp -P56789 -i ~/.ssh/id_rsa id_rsa coremail@10.224.192.206:/home/coremail/.ssh/
测试登录:
[coremail@test-194 .ssh]$ ssh-agent bash
[coremail@test-194 .ssh]$ ssh-add ~/.ssh/id_rsa
Identity added: /home/coremail/.ssh/id_rsa (/home/coremail/.ssh/id_rsa)
[coremail@test-194 .ssh]$ ssh -A -p 56789 coremail@10.224.192.206
Last login: Thu Apr 15 15:15:10 2021 from 10.224.192.194
[coremail@test-206 ~]$
复制代码
2、zookeeper 部署
1、配置文件 zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/zookeeper/zkdatas
clientPort=2181
#保留多少个快照(默认3)
autopurge.snapRetainCount=3
#日志多久清理一次(默认1h)
autopurge.purgeInterval=1
#服务器集群地址
server.1=test-194:2888:3888
server.2=test-206:2888:3888
server.3=test-210:2888:3888
4lw.commands.whitelist=*
复制代码
2、添加 mid
[coremail@test-194 zookeeper]$ mkdir /home/zookeeper/zkdatas/
[coremail@test-194 zkdatas]$ echo 1 > /home/zookeeper/zkdatas/myid
复制代码
3、将 zookeeper 复制到其他机器上,更改 myid
scp -r -P56789 -i ~/.ssh/id_rsa zookeeper/ coremail@10.224.192.210:/tmp/
scp -r -P56789 -i ~/.ssh/id_rsa zookeeper/ coremail@10.224.192.206:/tmp/
[root@test-206 zkdatas]# cat > myid
2
[root@test-210 zkdatas]# cat > myid
3
复制代码
4、在每台机器上启动 zookeepeer
[coremail@test-206 ~]$ /home/zookeeper/bin/zkServer.sh start
/usr/local/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
复制代码
5、分别查看 zookeeper 服务器的状态
[coremail@test-206 zookeeper]$ ./bin/zkServer.sh status
/usr/local/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
复制代码
6、zookeeper 访问问题
[root@test-194 ~]# echo stat|nc 127.0.0.1 2181
stat is not executed because it is not in the whitelist.
复制代码
解决方法:
在zoo.cfg 文件里加入配置项让这些指令放行
#开启四字命令
4lw.commands.whitelist=*
复制代码
3、Hadoop HDFS 部署
1、core-site.xml 配置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-cluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/tmp/</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>test-194:2181,test-206:2181,test-210:2181</value>
</property>
</configuration>
复制代码
2、hdfs-site.xml 配置
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/hadoop/data/namenodedatas</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/hadoop/data/datanodedatas</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>hadoop-cluster</value>
</property>
<property>
<name>dfs.ha.namenodes.hadoop-cluster</name>
<value>test-194,test-206</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoop-cluster.test-194</name>
<value>test-194:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoop-cluster.test-206</name>
<value>test-206:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoop-cluster.test-194</name>
<value>test-194:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoop-cluster.test-206</name>
<value>test-206:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://test-194:8485;test-206:8485;test-210:8485/hadoop-cluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/coremail/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journalnodes</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
复制代码
3、workers
4、hadoop-env.sh
export JAVA_HOME=/usr/local/jdk
export HADOOP_SSH_OPTS="-p 56789"
export HADOOP_HOME=/home/hadoop
export HADOOP_PID_DIR=/home/hadoop/tmp/
复制代码
5、复制到其他机器
scp -r -P56789 -i ~/.ssh/id_rsa zookeeper/ coremail@10.224.192.206:/tmp/
scp -r -P56789 -i ~/.ssh/id_rsa zookeeper/ coremail@10.224.192.210:/tmp/
复制代码
6、启动服务
#启动所有的journame
hdfs --daemon start journalnode
#HDFS初始化
hdfs namenode -format
#初始化zk
hdfs zkfc -formatZK
#启动HDFS
start-dfs.sh
#备份namenode
[coremail@test-206 ~]$ hdfs namenode -bootstrapStandby
#启动namenode
start-dfs.sh
#修改namenode的active和standby
./hdfs haadmin -transitionToActive test-194
#查看namenode的状态
hdfs haadmin -getServiceState test-194
复制代码
启动顺序:
1、启动zookeeper
2、启动三台机器的journalnode
3、初始化test-194的namenode,启动namenode
4、初始化test-194的zkfc,启动
5、将namenode同步到test-206,启动namenode
6、格式化test-206的zkfc,启动
7、启动剩余的所有节点start-dfs.sh
复制代码
7、自动切换
[coremail@test-194 bin]$ hdfs haadmin -transitionToActive test-194
Automatic failover is enabled for NameNode at test-206/10.224.192.206:8020
Refusing to manually manage HA state, since it may cause
a split-brain scenario or other incorrect state.
If you are very sure you know what you are doing, please
specify the --forcemanual flag.
[coremail@test-194 bin]$ hdfs haadmin -transitionToActive --forcemanual test-194
You have specified the --forcemanual flag. This flag is dangerous, as it can induce a split-brain scenario that WILL CORRUPT your HDFS namespace, possibly irrecoverably.
It is recommended not to use this flag, but instead to shut down the cluster and disable automatic failover if you prefer to manually manage your HA state.
You may abort safely by answering 'n' or hitting ^C now.
Are you sure you want to continue? (Y or N) n
2021-04-18 21:27:23,806 ERROR ha.HAAdmin: Aborted
指定forcemanual标志,可能会引起脑裂,会破坏HDFS空间,如果需要管理,关闭namenode进行故障转移
#查看namenode状态
[coremail@test-194 bin]$ hdfs haadmin -getServiceState test-194
复制代码
4、HBase 部署
1、regionservers
2、hbase-env.sh
#jdk环境变量
export JAVA_HOME=/usr/local/jdk/
#不使用内置zookeeper
export HBASE_MANAGES_ZK=false
#ssh端口
export HBASE_SSH_OPTS="-p 56789"
复制代码
3、hbase-site.xml
<configuration>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/home/hbase/tmp</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop-cluster/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>test-194,test-206,test-210</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/zookeeper/zkDatas</value>
</property>
</configuration>
复制代码
4、backup-masters
5、复制 Hadoop 的软连接
ln -s /home/hadoop/etc/hadoop/core-site.xml /home/hbase/conf/core-site.xml
ln -s /home/hadoop/etc/hadoop/hdfs-site.xml /home/hbase/conf/hdfs-site.xml
复制代码
6、复制到其他机器上
scp -i ~/.ssh/id_rsa -P56789 -r hadoop/ coremail@10.224.192.206:/tmp/
scp -i ~/.ssh/id_rsa -P56789 -r hadoop/ coremail@10.224.192.210:/tmp/
复制代码
7、启动
[coremail@test-194 hbase]$ bin/start-hbase.sh
复制代码
5、Hadoop 配置文件详解
为这个服务选择一个逻辑名称,例如“hadoop-cluster”,并使用这个逻辑名称作为这个配置选项的值。名称是任意的。既可以用于配置,也可以作为集群中 HDFS 绝对路径。注意:如果你也在使用 HDFS Federation,这个配置设置还应该包括其他 nameservices,HA 或其他,以逗号分隔的列表。
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
复制代码
配置以逗号分隔的 NameNode id 列表。这将被 datanode 用来确定集群中的所有 namenode。例如,如果你以前使用“mycluster”作为 nameservice ID,可以使用“nn1”,“nn2”和“nn3”作为 namenode 的单独 ID,配置如下:
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2,nn3</value>
</property>
复制代码
对于前面配置的两个 NameNode id,需要设置 NameNode 进程的完整地址和 IPC 端口。注意,这会导致两个单独的配置选项。例如:
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>machine2.example.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>machine3.example.com:8020</value>
</property>
复制代码
设置 NameNode 的 HTTP 服务器要监听的地址
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>machine1.example.com:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>machine2.example.com:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>machine3.example.com:9870</value>
</property>
复制代码
配置 journalnode 的地址,journalnode 提供共享编辑存储,由主 NameNode 写入并由备 NameNode 读取,以保持与主 nameNode 所做的所有文件系统更改同步。尽管必须指定多个 JournalNode 地址,但应该只配置其中一个 uri。URI 应该是这样的形式:qjournal://host1:port1;host2:port2;host3:port3/journalId。journal ID 是这个命名服务的唯一标识符,它允许一组 journalnode 为多个命名系统提供存储。例如,如果此集群的 JournalNodes 在机器“node1.example.com”、“node2.example.com”和“node3.example.com”上运行,并且 nameservice ID 为“mycluster”,则可以使用以下值作为此设置的值(JournalNode 的默认端口为 8485):
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/hadoop-cluster</value>
</property>
复制代码
配置 Java 类的名称,DFS 客户机将使用该类来确定哪个 NameNode 是当前活动的,从而确定当前哪个 NameNode 正在为客户机请求提供服务。目前 Hadoop 附带的两个实现是 ConfiguredFailoverProxyProvider 和 requestthedgingproxyprovider(对于第一个调用,并发调用所有的 namenode 来确定活动的一个,在后续的请求中,调用活动的 namenode 直到一个故障转移发生),因此,除非使用自定义代理提供程序,否则请使用其中之一。例如:
<property>
<name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
复制代码
为了保证系统的正确性,在任何给定的时间内只有一个 NameNode 处于活动状态。重要的是,当使用 Quorum Journal Manager 时,将只允许一个 NameNode 向 journalnode 写入数据,因此不存在破坏裂脑场景中的文件系统元数据的可能性。但是,当故障转移发生时,前一个活动的 NameNode 仍然可能向客户端提供读请求,这些请求可能会过期,直到 NameNode 在试图写入 journalnode 时关闭。由于这个原因,即使在使用 Quorum Journal Manager 时,仍然需要配置一些 fencing 方法。但是,为了在防御机制失败时提高系统的可用性,建议配置一个防御方法,它可以保证返回成功,作为列表中的最后一个防御方法。请注意,如果选择不使用实际的 fencing 方法,仍然必须为该设置配置一些东西,例如“shell(/bin/true)”。
故障转移过程中使用的隔离方法被配置为一个回车分隔列表,将依次尝试,直到其中一个表明隔离已经成功。Hadoop 附带了两种方法:shell 和 sshfence。有关实现自己的自定义防御方法的信息,请参阅 org.apache.hadoop.ha.NodeFencer 类。
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/exampleuser/.ssh/id_rsa</value>
</property>
复制代码
也可以配置非标准的用户名或端口(可以不配置)来执行 SSH。还可以为 SSH 配置一个超时(以毫秒为单位),在此之后,这个 fencing 方法将被认为失败。它可以这样配置:
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence([[username][:port]])</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
复制代码
shell fencing 方法运行任意的 shell 命令。它可以这样配置:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property>
复制代码
这是 JournalNode 机器上的绝对路径,JNs 使用的编辑和其他本地状态将存储在这里。对于此配置,只能使用单个路径。通过运行多个独立的 journalnode,或在本地连接的 RAID 阵列上配置此目录,可以提供此数据的冗余。(部署的机器需要创建目录)例如:
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journal/node/local/data</value>
</property>
复制代码
自动故障转移的配置需要在配置中添加两个新参数。在你的 hdfs-site.xml 文件中添加:
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
复制代码
在 core-site.xml 中添加:
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
</property>
复制代码
评论