HDFS高可用配置及其高可用集群搭建
高可用
- 高可用背景
- 单点故障、高可用
- 实现高可用
- 主备集群
- Active、Standby
- 可用性评判标准- x个9
- HA系统设置核心问题
- 1、脑裂问题
- 2、数据同步问题
- HDFS NameNode单点故障问题
- HDFS HA解决方案 -QJM
- QJM—主备切换、脑裂问题解决
- ZKFC(ZK Failover Controller)
- 主备切换、脑裂问题的解决--Fencing(隔离)机制
- 主备数据状态同步问题
- HDFS HA集群搭建
- Step 1:集群基础环境准备
- Step 2:HA集群规划
- Step 3 : 解压Hadoop
- 环境变量搭建
- Step 4 : Hadoop 配置文件配置
- hadoop-env.sh
- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- mapred-site.xml
- workers
- Step 5 :分发到集群
- 其他: zookeeper配置
- zookeeper 下载与安装
- 启动zookeeper
- Step 6:HA集群初始化
- 启动zookeeper
- 手动启动JN集群
- 格式化namenode
- 启动namenode进程
- 在hadoop133中进行namenode元数据同步
- 格式化ZKFC
- Step 6 : 启动HA
- HDFS HA效果演示
- 查看UI
- 模拟宕机
- 其他
高可用背景
单点故障、高可用
单点故障:
(single point of failure 缩写spof
)是指的是系统中某一点一旦失效,就会让整个系统无法运作,换句话说单点故障会造成整体故障
高可用:
(high availablelity 缩写 HA
),指系统无中断的执行其功能的能力,代表系统的可用性程度。是进行系统设计时的准则之一。高可用性系统意味着系统服务可以更长时间运行,通常通过提高系统的容错率来实现。
高可用性或者高可靠度的系统不会希望有单点故障造成整体故障的情形。一般可以通过冗余的方式增加多个相同机能的的不见,只要这些部件没有同时失效,系统(或至少部分系统)仍可运作,这会让可靠度提高。
实现高可用
主备集群
解决单点故障,实现系统服务高可用的核心并不是让故障永不发生,而是让故障的发生对业务的影响降到最小。因为软硬件故障是难以避免的问题。
当下企业中成熟的做法就是给单点故障的位置设置备份,形成主备架构。通俗描述就是当主挂掉,备份顶上,短暂的中断之后继续提供服务。
常见的是一主一备架构,当然也可以一主多备。备份越多,容错能力越强,与此同时,冗余也越大,浪费资源。
Active、Standby
Active:主角色。活跃的角色,代表正在对外提供服务的角色服务。任意时间有且只有一个active对外提供服务。
Standby:备份角色。需要和主角色保持数据、状态同步,并且时刻准备切换成主角色(当主角色挂掉或者出现故障时),对外提供服务,保持服务的可用性。
可用性评判标准- x个9
在系统的高可用性里有个衡量其可靠性的标准——X个9,这个X是代表数字3-5。X个9表示在系统1年时间的使用过程中,系统可以正常使用时间与总时间(1年)之比。
3个9:(1-99.9%)36524=8.76小时,表示该系统在连续运行1年时间里最多可能的业务中断时间是8.76小时。
4个9:(1-99.99%)36524=0.876小时=52.6分钟,表示该系统在连续运行1年时间里最多可能的业务中断时间是52.6分钟。
5个9:(1-99.999%)36524*60=5.26分钟,表示该系统在连续运行1年时间里最多可能的业务中断时间是5.26分钟。
9越多系统的可靠性越强,能容忍的业务中断时间越少,但是要付出成本更高
HA系统设置核心问题
1、脑裂问题
脑裂(split-brain)是指“大脑分裂”,本是医学名词。在HA集群中,脑裂指的是当联系主备节点的"心跳线"断开时(即两个节点断开联系时),本来为一个整体、动作协调的HA系统,就分裂成为两个独立的节点。由于相互失去了联系,主备节点之间像"裂脑人"一样,使得整个集群处于混乱状态。脑裂的严重后果:
1)集群无主:都认为对方是状态好的,自己是备份角色,后果是无服务;
2)集群多主:都认为对方是故障的,自己是主角色。相互争抢共享资源,结果会导致系统混乱,数据损坏。此外客户端也无法确定到底找谁去提供服务
避免脑裂问题的核心是:保持任意时刻系统有且只有一个主角色提供服务。
2、数据同步问题
主备切换保证服务持续可用性的前提是主备节点之间的状态、数据是一致的,或者说准一致的。如果说备用的节点和主节点之间的数据差距过大,即使完成了主备切换的动作,那也是没有意义的。
数据同步常见做法是:通过日志重演操作记录。主角色正常提供服务,发生的事务性操作通过日志记录,备用角色读取日志重演操作。9
HDFS NameNode单点故障问题
在Hadoop 2.0.0之前,NameNode是HDFS集群中的单点故障(SPOF)。每个群集只有一个NameNode,如果该计算机或进程不可用,则整个群集在整个NameNode重新启动或在另一台计算机上启动之前将不可用。
NameNode的单点故障从两个方面影响了HDFS群集的总可用性:
如果发生意外事件(例如机器崩溃),则在重新启动NameNode之前,群集将不可用。
计划内的维护事件,例如NameNode计算机上的软件或硬件升级,将导致群集停机时间的延长。
HDFS高可用性解决方案:在同一群集中运行两个(从3.0.0起,超过两个)冗余NameNode。这样可以在机器崩溃的情况下快速故障转移到新的NameNode,或者出于计划维护的目的由管理员发起的正常故障转移。
HDFS HA解决方案 -QJM
QJM 全称
Quorum Journal Manager(仲裁日志管理器)
,时Hadoop官方最推荐的HDFS HA解决方案使用zookeeper中的ZKFC来实现主备切换
使用Journal Node(JN)来实现edits log的共享以达到数据同步的目的
QJM—主备切换、脑裂问题解决
ZKFC(ZK Failover Controller)
ZKFC是一个Zookeeper客户端,主要职责有:
监视和管理NameNode健康状态
ZKFC通过命令监视的NameNode节点及机器的健康状态
维持和ZK集群联系
如果本地NameNode运行状态良好,并且ZKFC看到当前没有其他节点持有锁znode,他将自己尝试获取该锁,如果成功,则表明它‘赢得了选举’,并负责运行故障转移以使其本地NameNode处于Active状态,如果已经有其他节点持有锁,zkfc选举失败,则会对该节点注册监听,等待下次继续选举
主备切换、脑裂问题的解决–Fencing(隔离)机制
- 故障转移过程俗称主备角色切换过程,切换过程中最怕的就是脑裂的发生,因此需要Fencing机制来避免,将先前的Active节点隔离,然后将Standby转换为Active状态
- Hadoop公库中对外提供两种Fencing实现,分别是sshfence和shellfence(缺省实现)
sshfence是指通过ssh登录到目标节点上,使用命令fuser将进程杀死(通过tcp端口号定位进程pid,该方法比ips命令更加准确)
shellfence是指执行一个用户事先定义好的shell命令(脚本)完成隔离。
主备数据状态同步问题
- Journal Node (JN)集群是轻量级的分布式系统,主要用于高速读写数据、存储数据
- 通常使用2N+1台Journal Node 存储共享Edits Log(编辑日志)。低等类似于ZK的分布式一致性算法
- 任何修改操作在Active NN上执行时,Journal Node进程同时也会记录edits log 到至少半数以上的JN中,这是Standby NN检测到JN里面的同步log发生变化了会读取JN里面的edits log,然后重演操作记录同步到自己的目录镜像树里面
HDFS HA集群搭建
Step 1:集群基础环境准备
1.修改Linux主机名 /etc/hostname
2.修改IP /etc/sysconfig/network-scripts/ifcfg-ens33
3.修改主机名和IP的映射关系 /etc/hosts
4.关闭防火墙
5.ssh免登陆
6.安装JDK,配置环境变量等 /etc/profile
7.集群时间同步
8.配置主备NN之间的互相免密登录
Step 2:HA集群规划
机器 | 运行角色 |
---|---|
hadoop132-father | Nameode、zkfc、DataNode、Zookeeper、journal node |
hadoop133 | NameNode、ZKFC、DataNode、journal node |
hadoop134 | DataNode、zookeeper、journal node |
Step 3 : 解压Hadoop
环境变量搭建
由于之前环境变量已经进行过操作了,这里采用懒人模式,将原来的hadoop更改名称,然后重新解压一个新的,省事
Step 4 : Hadoop 配置文件配置
hadoop-env.sh
直接在最后几行加上这个
export JAVA_HOME=/opt/module/jdk1.8.0_301
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
core-site.xml
<configuration><!-- HA集群名称,该值要和hdfs-site.xml中的配置保持一致 --><property><name>fs.defaultFS</name><value>hdfs://mycluster</value></property><!-- hadoop本地磁盘存放数据的公共目录 --><property><name>hadoop.tmp.dir</name><value>/opt/data/ha-hadoop</value></property><!-- ZooKeeper集群的地址和端口--><property><name>ha.zookeeper.quorum</name><value>hadoop132-father:2181,hadoop133:2181,hadoop134:2181</value></property>
</configuration>
hdfs-site.xml
<configuration><!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 --><property><name>dfs.nameservices</name><value>mycluster</value></property><!-- mycluster下面有两个NameNode,分别是nn1,nn2 --><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><!-- nn1的RPC通信地址 --><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop132-father:8020</value></property><!-- nn1的http通信地址 --><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop132-father:9870</value></property><!-- nn2的RPC通信地址 --><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop133:8020</value></property><!-- nn2的http通信地址 --><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop133:9870</value></property><!-- 指定NameNode的edits元数据在JournalNode上的存放位置 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop132-father:8485;hadoop133:8485;hadoop134:8485/mycluster</value></property><!-- 指定JournalNode在本地磁盘存放数据的位置 --><property><name>dfs.journalnode.edits.dir</name><value>/opt/data/journaldata</value></property><!-- 开启NameNode失败自动切换 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</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><!-- 使用sshfence隔离机制时需要ssh免登陆 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_rsa</value></property><!-- 配置sshfence隔离机制超时时间 --><property><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property>
</configuration>
yarn-site.xml
<configuration>
<!-- 开启RM高可用 --><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property>
<!-- 指定RM的cluster id --><property><name>yarn.resourcemanager.cluster-id</name><value>yrc</value></property>
<!-- 指定RM的名字 --><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property>
<!-- 分别指定RM的地址 --><property><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop132-father</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop133</value></property>
<!-- 指定zk集群地址 --><property><name>yarn.resourcemanager.zk-address</name><value>hadoop132-father:2181,hadoop133:2181,hadoop134:2181</value></property><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property>
</configuration>
mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 --><property><name>mapreduce.framework.name</name><value>yarn</value></property>
</configuration>
workers
此处是ip
hadoop132-father
hadoop133
hadoop134
Step 5 :分发到集群
这边直接采用老方法
rsync -av hadoop-3.3.1 root@hadoop133:/opt/modul/hadoop-3.3.1
执行之后以此类推,对hadoop134也进行相同的操作,即可完成
其他: zookeeper配置
高可用需要zookeeper来进行操作,所以需要安装zookeeper并搭建集群 zookeeper还没学,后续慢慢补上
zookeeper 下载与安装
zookeeper的安装地址 -点击直接下载,版本:3.7.1
下载后进行解压
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
解压后需要对配置文件进行修改
cd apache-zookeeper-3.7.1-bin/
mv apache-zookeeper-3.7.1-bin /opt/module/zookeeper # 移动到modul
cd /opt/module/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
对配置文件进行编写:
server.1=hadoop132-father:2888:3888
server.2=hadoop133:2888:3888
server.3=hadoop134:2888:3888
dataDir=/opt/data/zookeeper #此处进行一个修改
随后在进行一个分发,大致与hadoop分发相同,这里就不再进行操作
启动zookeeper
进入到bin目录下
./zkServer.sh start
对各个都进行启动,随后查看状态
查看状态命令:
./zkServer.sh status
查看各个状态
hadoop132-father的状态:
hadoop133状态
hadoop134状态
当前状态有2个follower和1个leader
集群搭建完毕
Step 6:HA集群初始化
启动zookeeper
这里在集群搭建过程中已经进行了启动这里不再演示
手动启动JN集群
指令:
hdfs -daemon start journalnode
通过jps查看是否启动成功:
显然已经启动成功,随后将其他的机器都启动
格式化namenode
在hadoop132-father上进行格式化
hdfs namenode -faomat
到此我们就格式化成功
启动namenode进程
hdfs --daemon namemode
在hadoop133中进行namenode元数据同步
hdfs namenode --bootstrapStandby
表示已经成功
格式化ZKFC
注意: 在哪台机器上执行,那台机器就将成为第一次的Active NN
hdfs zkfc -formatZK
Step 6 : 启动HA
直接启动HDFS集群即可
直接启动全部
start-all.sh
可能会存在报错,报错我忘了说什么了,大概是因为meyarn没有指定用户啥的,需要填上,可以参考之前文章配置HDFS那里
查看启动效果:
该启动的都启动了,下播
HDFS HA效果演示
查看UI
去hadoop132-father里面进行查看
去查看hadoop133节点:
去浏览文件系统
可以看到文件正常,虽然说没有任何文件 (
HDFS高可用配置及其高可用集群搭建相关推荐
- mongodb生成自签名证书以及配置SSL以及mongo集群搭建(亲测有效)版本-5.0.6
@[TOC](mongodb生成自签名证书以及配置SSL(亲测有效) 版本-5.0.6 一直以来都是向大神学习,今天也做回大神分享,哈哈!!几个小时的努力不算白费. 一.自签名证书生成 1.生成根证书 ...
- linux下storm集群配置,Twitter Storm 系统集群搭建
Storm是什么? Storm是Twitter开源的一个分布式的实时计算系统 使用场景: 数据的实时分析.持续计算.分布式RPC等等. Storm特点(Storm类似手扶电梯,不出故障就会一直运行,h ...
- 【ManggoDB】安装配置(伪分布式集群搭建)Replia Set
文章目录 ManggoDB 参考资料 安装配置 配置 MongoDB 复制集(Replica Set)搭建 搭建伪节点 集群测试 注意 配置Debezium的connect 连接器 创建数据库 配置文 ...
- Redis 集群搭建(三):Docker 部署 Redis + Sentinel 高可用集群
Redis 集群搭建(三):Docker 部署 Redis + Sentinel 高可用集群 前言 建议 官方译文 什么是 Sentinel? Sentinel 优点 Redis 配置文件 maste ...
- elasticsearch 集群搭建 + kibana配置
elasticsearch 集群搭建 + kibana配置 一.elasticsearch 集群搭建 1.下载并解压elasticsearch 2.ES集群搭建 2.1 打开防火墙9200,9300端 ...
- 基于ubuntu的hadoop完全分布式集群搭建
借鉴网址1 借鉴网址2 hadoop官方配置教程 搭建虚拟机,克隆(或者先配置JAVA和Hadoop环境再克隆,之后要改主机名和映射以及SSH免密) 可以利用xsync集群分发脚本一台机器配置其他机器 ...
- Hadoop3集群搭建之——hive添加自定义函数UDTF (一行输入,多行输出)
上篇: Hadoop3集群搭建之--虚拟机安装 Hadoop3集群搭建之--安装hadoop,配置环境 Hadoop3集群搭建之--配置ntp服务 Hadoop3集群搭建之--hive安装 Hadoo ...
- RabbitMQ高级指南:从配置、使用到高可用集群搭建
本文大纲: 1. RabbitMQ简介 2. RabbitMQ安装与配置 3. C# 如何使用RabbitMQ 4. 几种Exchange模式 5. RPC 远程过程调用 6. RabbitMQ高可用 ...
- RabbitMQ 高级指南:从配置、使用到高可用集群搭建
博主说:在项目中,通过 RabbitMQ,咱们可以将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 正文 1 Rab ...
最新文章
- 怎样玩儿转App手游自动化测试?
- 将DataTable中的数据导入到数据库中
- topics in innovation management
- ASP.NET MVC3 部署的前期工作
- Linux epoll的用法
- 1.计算机语言发展史
- 作业2.1.1 安装并使用CheckStyle
- 1227: [SDOI2009]虔诚的墓主人
- 简单的TCP客户端发包工具
- java语言简介总结
- 精美粉色护士护理PPT模板
- Mac 安装非信任开发者软件
- 【集合论】集合概念与关系 ( 集族 | 集族示例 | 多重集 )
- 微信公众号:服务号、企业订阅号、个人订阅号的差异对比
- 微型计算机的硬盘电源,17款SATA硬盘盒产品横向评测
- 九度OJ题目1035:找出直系亲属
- 计算机硬盘的性能指标,对于硬盘而言它有哪些性能指标
- MATLAB主窗口中 主菜单栏有,【图片】MATLAB软件~~【西雅吧】_百度贴吧
- 【第64期】豆瓣9.8分,周志明的《凤凰架构》
- Java、C++、Python、Ruby、PHP、C#和JavaScript的理解
热门文章
- SX126x-数字接口SPI和控制功能
- 【数据结构与算法】之深入解析“K站中转内最便宜的航班”的求解思路与算法示例
- 龙芯软件开发(10)--龙芯2E指令
- 监控dns流量有哪些方法?
- Hbase--Scan全局扫描中的过滤器
- 长亭科技崔勤:如何打造一个“安全巡检”神器 | 深度
- 几种抠象技术理论试验-1 (Luma-Key,Chroma-Key)
- CUDA浅尝辄止-----什么是CUDA
- LeetCode刷题笔记汇总
- 哈佛啥时候已经成功制造了60只人工蜜蜂?2013年么?《黑镜》第三季第六集,细思极恐