主机列表:
IP | 主机名 | 角色 |
---|---|---|
172.25.254.1 | server1 | NameNode 、DFSZKFailoverController 、ResourceManager |
172.25.254.5 | server2 | NameNode 、DFSZKFailoverController 、ResourceManager |
172.25.254.2 | server2 | JournalNode 、QuorumPeerMain 、DataNode 、NodeManager |
172.25.254.3 | server3 | JournalNode 、QuorumPeerMain 、DataNode 、NodeManager |
172.25.254.4 | server4 | JournalNode 、QuorumPeerMain 、DataNode 、NodeManager |
在典型的 HA 集群中,通常有两台不同的机器充当 NN。在任何时间,只有一台机器处于
Active 状态;另一台机器是处于 Standby 状态。Active NN 负责集群中所有客户端的操作;
而 Standby NN 主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢
复。
为了让 Standby NN 的状态和 Active NN 保持同步,即元数据保持一致,它们都将会和
JournalNodes 守护进程通信。当 Active NN 执行任何有关命名空间的修改,它需要持久化到
一半以上的 JournalNodes 上(通过 edits log 持久化存储),而 Standby NN 负责观察 edits log
的变化,它能够读取从 JNs 中读取 edits 信息,并更新其内部的命名空间。一旦 Active NN
出现故障,Standby NN 将会保证从 JNs 中读出了全部的 Edits,然后切换成 Active 状态。
Standby NN 读取全部的 edits 可确保发生故障转移之前,是和 Active NN 拥有完全同步的命
名空间状态。
为了提供快速的故障恢复,Standby NN 也需要保存集群中各个文件块的存储位置。为
了实现这个,集群中所有的 Database 将配置好 Active NN 和 Standby NN 的位置,并向它们
发送块文件所在的位置及心跳,如下图所示:
在任何时候,集群中只有一个 NN 处于 Active 状态是极其重要的。否则,在两个 Active NN
的状态下 NameSpace 状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为
了保证这种情况不会发生,在任何时间,JNs 只允许一个 NN 充当 writer。在故障恢复期
间,将要变成 Active 状态的 NN 将取得 writer 的角色,并阻止另外一个 NN 继续处于 Active
状态。
为了部署 HA 集群,你需要准备以下事项:
(1)、NameNode machines:运行 Active NN 和 Standby NN 的机器需要相同的硬件配
置;
(2)、JournalNode machines:也就是运行 JN 的机器。JN 守护进程相对来说比较轻
量,所以这些守护进程可以可其他守护线程(比如 NN,YARN ResourceManager)运行在
同一台机器上。在一个集群中,最少要运行 3 个 JN 守护进程,这将使得系统有一定的容错
能力。当然,你也可以运行 3 个以上的 JN,但是为了增加系统的容错能力,你应该运行奇
数个 JN(3、5、7 等),当运行 N 个 JN,系统将最多容忍(N-1)/2 个 JN 崩溃。
1. 先部署三个 zk
Zookeeper 集群至少三台,总节点数为奇数个。
[cay@server1 sbin]$ ./stop-yarn.sh
Stopping nodemanagers
Stopping resourcemanager
[cay@server1 sbin]$ ./stop-dfs.sh
Stopping namenodes on [server1] /先停掉开启的组件
Stopping datanodes
Stopping secondary namenodes [server1]
[cay@server1 sbin]$ rm -fr /tmp/*
[cay@server2 sbin]$ rm -fr /tmp/* /清理缓存
[cay@server3 sbin]$ rm -fr /tmp/*
[cay@server4 sbin]$ rm -fr /tmp/*
server5 为新加入的NN结点,先进行配置:
[root@server5 ~]# yum install nfs-utils -y
[root@server5 ~]# useradd cay
[root@server5 ~]# id cay
uid=1000(cay) gid=1000(cay) groups=1000(cay)
[root@server5 ~]# systemctl start rpcbind
[root@server5 ~]# mount 172.25.254.1:/home/cay /home/cay/
[root@server5 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 17811456 1166916 16644540 7% /
devtmpfs 735036 0 735036 0% /dev
tmpfs 747128 0 747128 0% /dev/shm
tmpfs 747128 16868 730260 3% /run
tmpfs 747128 0 747128 0% /sys/fs/cgroup
/dev/sda1 1038336 135224 903112 14% /boot
tmpfs 149428 0 149428 0% /run/user/0
172.25.254.1:/home/cay 17811456 3209216 14602240 19% /home/cay
[root@server5 ~]# su - cay
[cay@server5 ~]$ ls
bigfile hadoop hadoop-3.2.1 hadoop-3.2.1.tar.gz jdk jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
[cay@server1 ~]$ tar zxf zookeeper-3.4.9.tar.gz
[cay@server1 ~]$ cd zookeeper-3.4.9/
[cay@server1 zookeeper-3.4.9]$ cd conf/
[cay@server1 conf]$ ls
configuration.xsl log4j.properties zoo_sample.cfg
[cay@server1 conf]$ cp zoo_sample.cfg zoo.cfg
[cay@server1 conf]$ vim zoo.cfg
cp zoo_sample.cfg zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper /数据目录,需要预先创建
clientPort=2181
server.1=172.25.0.2:2888:3888
server.2=172.25.0.3:2888:3888 表示单个zookeeper结点,对应server234
server.3=172.25.0.4:2888:3888 /3888用于选举ZK的leader,2888用于leader和follow的通信,数据同步
.1 .2 .3是标示符号
各节点配置文件相同,并且需要在/tmp/zookeeper 目录中创建 myid 文件,写入一个唯一的数字,取值范围在 1-255。比如:172.25.254.2 节点的 myid 文件写入数字“1”,此数字与配置文件中的定义保持一致,(server.1=172.25.254.2:2888:3888)其它节点依次类推。
[cay@server2 ~]$ mkdir /tmp/zookeeper
[cay@server2 ~]$ echo 1 > /tmp/zookeeper/myid
[cay@server3 ~]$ mkdir /tmp/zookeeper
[cay@server3 ~]$ echo 2 > /tmp/zookeeper/myid
[cay@server4 ~]$ mkdir /tmp/zookeeper
[cay@server4 ~]$ echo 3 > /tmp/zookeeper/myid
[cay@server4 ~]$ cat /tmp/zookeeper/myid
3
启动zk
[cay@server2 ~]$ cd zookeeper-3.4.9/bin/
[cay@server2 bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/cay/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[cay@server2 bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/cay/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower
[cay@server3 ~]$ cd zookeeper-3.4.9/bin/
[cay@server3 bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/cay/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[cay@server3 bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/cay/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: leader /server3是他们决出来的领导者
[cay@server4 ~]$ cd zookeeper-3.4.9/bin/
[cay@server4 bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/cay/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[cay@server4 bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/cay/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower
[cay@server3 bin]$ ./zkCli.sh /可以通过这个命令进入它的命令行
[hadoop@server3 ~]$ jps
1222 QuorumPeerMain /zk已经启动
1594 Jps
HDFS 高可用
1. Hadoop 配置
定义zk的集群地址:
[cay@server1 hadoop]$ cd etc/hadoop/
[cay@server1 hadoop]$ cat workers
172.25.254.2
172.25.254.3
172.25.254.4
[cay@server1 hadoop]$ vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://masters</value> /改为masters,因为高可用有几个master结点
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>172.25.254.2:2181,172.25.254.3:2181,172.25.254.4:2181</value>
</property> /定义zk的集群地址
</configuration>
[cay@server1 hadoop]$ vim hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
/指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一致
<property>
<name>dfs.nameservices</name>
<value>masters</value>
</property>
/masters 下面有两个 namenode 节点,分别是 h1 和 h2 (名称可自定义)
<property>
<name>dfs.ha.namenodes.masters</name>
<value>h1,h2</value>
</property>
/指定 h1 节点的 rpc 通信地址和http通信地址
<property>
<name>dfs.namenode.rpc-address.masters.h1</name>
<value>172.25.254.1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.masters.h1</name>
<value>172.25.254.1:9870</value>
</property>
/指定 h2 节点的 rpc 通信地址和http通信地址
<property>
<name>dfs.namenode.rpc-address.masters.h2</name>
<value>172.25.254.5:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.masters.h2</name>
<value>172.25.254.5:9870</value>
</property>
/指定 NameNode 元数据在 JournalNode 上的存放位置
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://172.25.254.2:8485;172.25.254.3:8485;172.25.254.4:8485/masters</value>
</property>
/指定 JournalNode 在本地磁盘存放数据的位置,自动创建目录
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/tmp/journaldata</value></property>
/开启 NameNode 失败自动切换
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
/配置失败自动切换实现方式
<property>
<name>dfs.client.failover.proxy.provider.masters</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
/配置隔离机制方法,每个机制占用一行
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
/使用 sshfence 隔离机制时需要 ssh 免密码
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
/sshfence 隔离机制超时时间
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
2. 启动 hdfs 集群(按顺序启动
集群的启动是有顺序的要求的,先启动三个ZK 结点,
然后第一个启动的NN 结点就是ZK 的active
结点
1)在三个 DN 上依次启动 zookeeper 集群
我们刚才已经启动了
2)在三个 DN 上依次启动 journalnode(第一次启动 hdfs 必须先启动 journalnode)
[cay@server2 bin]$ hdfs --daemon start journalnode
[cay@server3 bin]$ hdfs --daemon start journalnode
[cay@server4 bin]$ hdfs --daemon start journalnode
[cay@server4 bin]$ cd /tmp
[cay@server4 tmp]$ ls
hadoop-cay hadoop-cay-journalnode.pid hsperfdata_cay journaldata zookeeper /生成了日志目录
3)格式化 HDFS 集群
[cay@server1 hadoop]$ hdfs namenode -format
Namenode 数据默认存放在/tmp,需要把数据拷贝到 h2
[cay@server1 hadoop]$ scp -r /tmp/hadoop-cay 172.25.254.5:/tmp/
VERSION 100% 217 114.7KB/s 00:00
seen_txid 100% 2 1.7KB/s 00:00
fsimage_0000000000000000000.md5 100% 62 74.3KB/s 00:00
fsimage_0000000000000000000
4)格式化 zookeeper (只需在 h1 上执行即可)
[cay@server1 sbin]$ hdfs zkfc -formatZK
5)启动 hdfs 集群(只需在 h1 上执行即可
[cay@server1 sbin]$ ./start-dfs.sh
Starting namenodes on [server1 server5]
Starting datanodes
Starting journal nodes [server4 server3 server2]
server3: Warning: Permanently added 'server3' (ECDSA) to the list of known hosts.
server4: journalnode is running as process 4421. Stop it first.
server2: journalnode is running as process 4450. Stop it first.
server3: journalnode is running as process 4437. Stop it first.
Starting ZK Failover Controllers on NN hosts [server1 server5]
- 查看各节点状态
[cay@server1 sbin]$ jps
6688 NameNode
7036 DFSZKFailoverController
7086 Jps
[cay@server5 tmp]$ jps
3872 Jps
3714 NameNode
3779 DFSZKFailoverController
[cay@server2 hadoop]$ jps
4672 Jps
4450 JournalNode
4312 QuorumPeerMain
4553 DataNode
[cay@server3 bin]$ jps
4258 QuorumPeerMain
4437 JournalNode
4662 Jps
4541 DataNode
[cay@server4 tmp]$ jps
4421 JournalNode
4647 Jps
4526 DataNode
4287 QuorumPeerMain
web 界面查看:
当前h1 是active的.server5是 standby
也可以进入到 cli 重查看:
[cay@server3 bin]$ ./zkCli.sh
[zk: localhost:2181(CONNECTED) 4] get /hadoop-ha/masters/ActiveBreadCrumb
mastersh1server1 �F(�>
- 测试故障自动切换
[cay@server1 sbin]$ hdfs dfs -mkdir /user
[cay@server1 sbin]$ hdfs dfs -mkdir /user/cay
[cay@server1 sbin]$ cd
[cay@server1 ~]$ dd if=/dev/zero of=bigfile bs=1M count=200
[cay@server1 ~]$ hdfs dfs -put bigfile
[cay@server1 ~]$ jps
6688 NameNode
7036 DFSZKFailoverController
7309 Jps
[cay@server1 ~]$ hdfs dfs -ls
Found 1 items
-rw-r--r-- 3 cay supergroup 209715200 2020-07-15 13:27 bigfile
[cay@server1 ~]$ kill -9 6688 /杀掉 server1 的NN进程
[cay@server1 ~]$ hdfs dfs -ls
Found 1 items
-rw-r--r-- 3 cay supergroup 209715200 2020-07-15 13:27 bigfile /仍然能获取到,这是因为server5变为了active
在启动server 1 的 NN:
[cay@server1 ~]$ hdfs --daemon start namenode
[cay@server1 ~]$ jps
7542 Jps
7036 DFSZKFailoverController
7468 NameNode
就成standby了
yarn 的高可用
- 编辑 mapred-site.xml 文件
[cay@server1 hadoop]$ vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name> 指定 yarn 为 MapReduce 的框架
<value>yarn</value>
</property>
</configuration>
2)编辑 yarn-site.xml 文件
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property> /配置可以在 nodemanager 上运行 mapreduce 程序
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
/激活 RM 高可用
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
/指定 RM 的集群 id
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>RM_CLUSTER</value>
</property>
/定义 RM 的节点
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
/指定 RM1 RM2的地址
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>172.25.254.1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>172.25.254.5</value>
</property>
/激活 RM 自动恢复
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
/配置 RM 状态信息存储方式,有 MemStore 和 ZKStore
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
/配置为 zookeeper 存储时,指定 zookeeper 集群的地址
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>172.25.254.2:2181,172.25.254.3:2181,172.25.254.4:2181</value>
</property>
3)启动 yarn 服务
[cay@server1 sbin]$ ./start-yarn.sh
Starting resourcemanagers on [ 172.25.254.1 172.25.254.5]
Starting nodemanagers
[cay@server1 tmp]$ jps
4560 Jps
3714 NameNode
3779 DFSZKFailoverController server1 5上出现了 RM进程
4326 ResourceManager
[cay@server2 hadoop]$ jps
4450 JournalNode
4312 QuorumPeerMain
4553 DataNode
4925 NodeManager /server234 出现了NM 进程
5021 Jps
可以通过8088的端口访问。当前server1是active。
- 测试 yarn 故障切换
[cay@server1 sbin]$ kill -9 4038 /杀掉server1的RM进程
server5就成了active的状态了。
[cay@server1 sbin]$ yarn --daemon start resourcemanager /再次启动
jps[cay@server1 sbin]$ jps
8677 Jps
8646 ResourceManager
7036 DFSZKFailoverController
7468 NameNode
就u成stangby状态了。
Hbase 分布式数据库高可用
HBASE是基于HADOOP的分布式海量数据库
[cay@server1 ~]$ tar zxf hbase-1.2.4-bin.tar.gz
[cay@server1 ~]$ cd hbase-1.2.4/
[cay@server1 hbase-1.2.4]$ ls
bin CHANGES.txt conf docs hbase-webapps LEGAL lib LICENSE.txt NOTICE.txt README.txt
[cay@server1 hbase-1.2.4]$ vim conf/hbase-env.sh
export JAVA_HOME=/home/cay/jdk /指定 jdk
export HADOOP_HOME=/home/cay/hadoop /默认值时 true,hbase 在启动时自动开启 zookeeper,如需自己维护 zookeeper 集群需设置为 false
export HBASE_MANAGES_ZK=false /指定 hadoop 目录,否则 hbase无法识别 hdfs 集群配置。
[cay@server1 hbase-1.2.4]$ vim conf/hbase-site.xml
<configuration>
/指定 region server 的共享目录,用来持久化 HBase。这里指定的 HDFS 地址是要跟 core-site.xml 里面的 fs.defaultFS 的 HDFS 的 IP 地址或者域名、端口必须一致
<property>
<name>hbase.rootdir</name>
<value>hdfs://masters/hbase</value>
</property>
/启用 hbase 分布式模式
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
/Zookeeper 集群的地址列表,用逗号分割。默认是 localhost,是给伪分布式用的。要修改才能在完全分布式的情况下使用。
<property>
<name>hbase.zookeeper.quorum</name>
<value>172.25.254.2,172.25.254.3,172.25.254.4</value>
</property>
/指定 hbase 的 master
<property><name>hbase.master</name>
<value>h1</value>
</property>
</configuration>
[cay@server1 conf]$ cat regionservers
172.25.254.2
172.25.254.3 /告诉他分布式存储的区域
172.25.254.4
[cay@server1 bin]$ ./start-hbase.sh /直接运行
starting master, logging to /home/cay/hbase-1.2.4/bin/../logs/hbase-cay-master-server1.out
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
172.25.254.4: starting regionserver, logging to /home/cay/hbase-1.2.4/bin/../logs/hbase-cay-regionserver-server4.out
172.25.254.3: starting regionserver, logging to /home/cay/hbase-1.2.4/bin/../logs/hbase-cay-regionserver-server3.out
172.25.254.2: starting regionserver, logging to /home/cay/hbase-1.2.4/bin/../logs/hbase-cay-regionserver-server2.out
[cay@server1 bin]$ jps
9793 Jps
8646 ResourceManager
9562 HMaster /master结点的进程
7036 DFSZKFailoverController
7468 NameNode
[cay@server2 hadoop]$ jps
5296 HRegionServer DN结点生成的进程
4450 JournalNode
4312 QuorumPeerMain
4553 DataNode
5547 Jps
4925 NodeManager
在备机上手动启动hbase:
[cay@server5 bin]$ ./hbase-daemon.sh start master
starting master, logging to /home/cay/hbase-1.2.4/bin/../logs/hbase-cay-master-server5.out
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
[cay@server5 bin]$ jps
3714 NameNode
3779 DFSZKFailoverController
4326 ResourceManager
5071 HMaster
5183 Jps
HBase Master 默认端口时 16000,还有个 web 界面默认在 Master 的 16010 端口
上,HBase RegionServers 会默认绑定 16020 端口,在端口 16030 上有一个展示
信息的界面。
插入一些数据:
[cay@server5 bin]$ ./hbase shell
hbase(main):001:0> create 'test','cf'
0 row(s) in 5.0730 seconds
=> Hbase::Table - test
hbase(main):002:0> list 'test'
TABLE
test
1 row(s) in 0.0190 seconds
=> ["test"]
hbase(main):004:0> put 'test','row1','cf:a','value1'
0 row(s) in 0.0500 seconds
hbase(main):005:0> put 'test','row2','cf:b','value2'
0 row(s) in 0.0370 seconds
hbase(main):006:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1594798895202, value=value1
row2 column=cf:b, timestamp=1594798907459, value=value2
2 row(s) in 0.0330 seconds
就可以在web界面看到了;
在zk重查看:
[zk: localhost:2181(CONNECTED) 8] get /hbase/master
�master:16000�
)�ϵ�PBUF
server1�}�����.�} /当前master是server1
[cay@server1 bin]$ jps
10081 Jps
8646 ResourceManager
9562 HMaster
7036 DFSZKFailoverController
7468 NameNode
[cay@server1 bin]$ kill -9 9562 /关闭server1的master进程
[zk: localhost:2181(CONNECTED) 9] get /hbase/master
�master:16000fq;�'� �PBUF
server5�}�����.�} 切换到了server5
[cay@server5 bin]$ ./hbase shell
hbase(main):001:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1594798895202, value=value1
row2 column=cf:b, timestamp=1594798907459, value=value2
2 row(s) in 0.4000 seconds
依然可以得到数据
[cay@server1 bin]$ ./hbase-daemon.sh start master server1上再次开启,就成了standby 了
starting master, logging to /home/cay/hbase-1.2.4/bin/../logs/hbase-cay-master-server1.out
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
[cay@server1 bin]$ jps
8646 ResourceManager
10263 HMaster
10376 Jps
7036 DFSZKFailoverController
7468 NameNode