基於Zookeeper的HDFS高可用配置
前言
在 Hadoop 1.X版本中,NameNode是整個HDFS叢集的單點故障(single point of failure,SPOF):每一個HDFS叢集只能有一個NameNode節點,一旦NameNode所在伺服器宕機或者出現故障將導致整個叢集都不可用,除非重啟或者開啟一個新的Namenode叢集才能夠恢復可用。
NameNode單點故障對HDFS叢集的可用性產生影響主要表現在以下兩種情況:
當NameNode所在伺服器發生未知的異常(例如:伺服器宕機)時,在NameNode被重新啟動之前整個叢集都將不可用。 當NameNode所在伺服器執行某些日常維護任務(例如:軟體或硬體升級)後重啟伺服器時,同樣會導致HDFS叢集在一段時間內不可用。
HDFS高可用簡介
在Hadoop 2.X 版本中,HDFS引入了雙NameNode架構,HA(High Available)通過將兩個NameNode分別配置為Active/Passive狀態來解決上述問題。處於Active狀態的NameNode叫作Active Namenode,處於Passive狀態的NameNode叫作Standby Namenode。 Standby Namenode作為Active Namenode的熱備份,能夠在NameNode發生故障或者由於日常伺服器維護需要重啟的時候以一種優雅的方式自動切換為Active Namenode。
Active Namenode處理客戶端所有的操作請求(讀寫),Standby Namenode只是作為Active Namenode的Slave儘可能地與Active Namenode保持狀態同步,使得在Active Namenode故障時能夠快速完成切換。為了使Standby Namenode與Active Namenode資料保持同步,兩個Namenode都需要與一組Journal Node進行通訊。當Active Namenode執行的任務對namespace有所更改時,會確保將修改日誌持久到Journal Node節點中的大部分。Standby Namenode持續監控這些Journal Node,當監測發現這些修改日誌有變化時,就會將這些修改應用到自己的namespace,進而保持與Active Namenode中namespace元資料保持一致。當進行故障轉移時,Standby Namenode在成為Active Namenode之前,會確保自己已經讀取了Journal Node中的所有修改日誌,從而保持資料狀態與故障發生前一致。
為了確保故障轉移能夠快速完成,Standby Namenode需要維護最新的Block位置資訊,即每個Block副本存放在叢集中的哪些節點上。為了達到這一點,Datanode同時配置主備兩個Namenode,並同時傳送Block報告和心跳到兩臺Namenode。
任何時候只有一個Namenode處於活動狀態對HA叢集來說至關重要,否則可能出現數據丟失或者資料損壞。當兩臺Namenode都認為自己的Active Namenode時,會同時嘗試寫入資料(不會再去檢測和同步資料)導致所謂的“裂腦現象”出現。為了達到這個目的並避免出現“裂腦現象”,管理員必須為共享儲存配置至少一個(fencing)方法。在宕機期間,如果確定了之前的Active Namenode已經放棄活動狀態,fencing程序將負責中斷之前的Active Namenode對共享儲存的訪問和編輯,從而防止它繼續對名稱空間做出任何進一步的修改,使新的活動節點能夠安全地進行故障轉移。
更多關於Hadoop HA 機制的詳細介紹請移步:
接下來我們重點講解如何基於QJM使用Zookeeper來配置HDFS-HA。
搭建Hadoop叢集
本文重點講解如何對HDFS進行HA高可用配置,Hadoop叢集的搭建過程請參考:
搭建好的Hadoop叢集的節點資訊如下:
Host Name | IP Address | Node Type | User Name |
hadoop34 | 172.16.250.234 | DataNode / NodeManager / NameNode | hadoop / root |
hadoop39 | 172.16.250.239 | DataNode / NodeManager / SecondaryNameNode | hadoop / root |
hadoop40 | 172.16.250.240 | DataNode / NodeManager / ResourceManager | hadoop / root |
新增HA詳細配置
在上述Hadoop叢集搭建完成之後,若要啟用HA還需要對hdfs-site.xml和core-site.xml兩個檔案進行一點額外的配置。
在 HDFS-HA 叢集中,使用 [nameservice ID] 來唯一識別一個 HDFS 例項,一個 HDFS-HA 叢集可以含有多個(目前最多隻支援兩個)NameNode,叢集同時又使用了 [name node ID] 來識別每一個NameNode。因此,在HDFS-HA 叢集中,NameNode 的配置引數都以[nameservice ID].[name node ID]為字尾的。由於dfs.nameservices和dfs.ha.namenodes.[nameservice ID]兩個配置項的值將決定後面一些配置項的名稱,所以建議先配置這兩個選項的值。
在本文中,[nameservice ID]=mycluster,兩個[name node ID]分別為nn1和nn2,名稱可以隨意取,只需要保持前後一致即可。
hdfs-site.xml
保持 hdfs-site.xml 原有的配置不變,再增加如下HA相關配置:
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
<description>指定nameservice ID的名稱</description>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
<description>指定各個NameNode在nameservice中的唯一識別符號</description>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop34:8020</value>
<description>指定nn1 NameNode所監聽的全限定RPC地址</description>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop39:8020</value>
<description>指定nn2 NameNode所監聽的全限定RPC地址</description>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop34:50070</value>
<description>指定nn1 NameNode所監聽的全限定HTTP地址</description>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop39:50070</value>
<description>指定nn2 NameNode所監聽的全限定HTTP地址</description>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop34:8485;hadoop39:8485;hadoop40:8485/mycluster</value>
<description>指定讓NameNodes用來讀寫edits的Journal Nodes的RUI</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>指定HDFS客戶端聯絡Active NameNode所使用的Java類</description>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<description>故障轉移時使用SSH登入Active NameNode並將其程序殺掉</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
<description>故障轉移時SSH登入Active NameNode所使用的私鑰檔案路徑</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
<description>故障轉移時SSH登入的超時毫秒數</description>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/journaldata</value>
<description>指定edits在JournalNode 上儲存的絕對路徑</description>
</property>
core-site.xml
保持 core-site.xml 其他的配置不變,僅將其中的 fs.defaultFS 配置:
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop34:9000</value>
</property>
修改為:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
同步NameNodes
在完成了上述的配置之後,你需要按照以下流程操作來實現NameNodes之間的資料同步:
==>啟動 JournalNodes
==>初始化同步NameNodes
==>啟動兩個NameNode
具體的操作過程如下:
首先在 JournalNodes 所在的機器上分別執行如下命令來啟動JournalNode 程序:
[[email protected] hadoop]$ hadoop-daemon.sh start journalnode
starting journalnode, logging to /usr/local/hadoop-2.9.1/logs/hadoop-hadoop-journalnode-hadoop34.out
[[email protected] hadoop]$ jps
3025 Jps
2969 JournalNode
待所有的 JournalNodes 都啟動完成之後,接下來初始化同步兩個NameNodes中的元資料,分三種情況:
(1)如果你是在對一個全新的HDFS 叢集進行HA配置,你可以先在任意一臺NameNode上執行 hdfs namenode -format 格式化命令;
(2)如果你已經格式化過NameNode或者是將一個非HA 叢集切換成HA叢集,你需要在已格式化的NameNode上執行hadoop-daemon.sh start namenode命令將NameNode啟動,然後在那些未格式化NameNode的機器上執行hdfs namenode -bootstrapStandby命令將NameNode元資料目錄下的所有內容拷貝過來;
(3)如果你是在將一個非HA NameNode轉換成HA NameNode,你可以執行 hdfs namenode -initializeSharedEdits 命令來使用本地NameNode的edits資料來初始化JournalNodes 。
如果此時還有NameNode未啟動的,在其機器上執行下面的命令將其啟動:
hadoop-daemon.sh start namenode #啟動NameNode
所有的NameNode都啟動了之後,輸入如下地址訪問它們的HTTP後臺管理介面檢視各個NameNode是Active還是Standby:http://172.16.250.239:50070
如圖所示,按照上述配置啟動的HA NameNode 都是Standby狀態,需要使用 hdfs haadmin 管理命令將其中的一個切換為Active狀態。
注:在HA叢集環境裡,備用的namenode還起到了檢測名稱空間狀態的作用,因此就沒有必要在叢集中再執行Secondary NameNode、CheckpointNode和BackupNode了。
HA NameNode管理命令
HA NameNodes配置並啟動完成之後,在叢集中會額外新增了幾個管理HA NameNodes的命令,啟動叢集然後輸入 hdfs haadmin 來檢視這些命令的用法:
[[email protected] hadoop]$ hdfs haadmin
Usage: haadmin [-ns <nameserviceId>]
[-transitionToActive [--forceactive] <serviceId>]
[-transitionToStandby <serviceId>]
[-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
[-getServiceState <serviceId>]
[-getAllServiceState]
[-checkHealth <serviceId>]
[-help <command>]
Generic options supported are:
-conf <configuration file> specify an application configuration file
-D <property=value> define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port> specify a ResourceManager
-files <file1,...> specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...> specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...> specify a comma-separated list of archives to be unarchived on the compute machines
The general command line syntax is:
command [genericOptions] [commandOptions]
命令 | 作用 |
transitionToActive transitionToStandby |
轉換指定NameNode 的狀態,Acitve或者Standby。 |
failover | 在兩個NameNode 之間啟動一次故障轉移。 |
getServiceState | 檢視指定NameNode 的狀態,Acitve或者Standby。 |
getAllServiceState | 檢視所有NameNode 的狀態,Acitve或者Standby。 |
checkHealth | 檢查指定NameNode 的健康狀態 |
使用 hdfs haadmin 管理命令將兩個Standby狀態的NameNode中的nn1切換為Active狀態:
[[email protected] hadoop]$ hdfs haadmin -transitionToActive nn1
再次登入到nn1的HTTP後臺管理介面檢視它的狀態,已經切換為Active了。
配置自動故障轉移
上述的HA NameNodes即使Active NameNode掛掉了也不會自動觸發故障轉移,需要我們手動進行故障轉移。
接下來就來講講如何使用Zookeeper讓上述HA NameNodes實現自動故障轉移。
首先,需要搭建好Zookeeper叢集,關於Zookeeper叢集的安裝方法,可以參考:
Host Name | IP Address | Zookeeper Port |
hadoop34 | 172.16.250.234 | 2181 |
hadoop39 | 172.16.250.239 | 2181 |
hadoop40 | 172.16.250.240 | 2181 |
Zookeeper叢集搭建完成之後,在3臺Zookeeper節點上分別執行以下命令啟動Zookeeper服務:
[[email protected] conf]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
然後,停止整個HDFS-HA叢集,然後在hdfs-site.xml和core-site.xml中增加如下配置:
hdfs-site.xml增加:
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>開啟NameNode失敗自動故障轉移</description>
</property>
core-site.xml增加:
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop34:2181,hadoop39:2181,hadoop40:2181</value>
<description>ZKFailoverController 自動故障轉移所使用的ZK伺服器列表</description>
</property>
接下來,在ZooKeeper上建立一個用來儲存自動故障轉移資料的znode,在任意NameNode 上執行如下命令完成znode建立:
# $HADOOP_PREFIX/bin/hdfs zkfc -formatZK
[[email protected] hadoop]$ hdfs zkfc -formatZK
至此,自動故障轉移就算是配置完成了。
配置了自動故障轉移後,執行start-dfs.sh指令碼將會在那些執行NameNode的機器上自動啟動一個ZKFC守護程序,在ZKFC啟動的過程中,它們會自動地選擇一個NameNode作為Acitve NameNode。
如果你希望手動地啟動單個ZKFC守護程序,可以使用下面的命令:
# $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start|stop zkfc
[[email protected] hadoop]$ hadoop-daemon.sh --script hdfs start zkfc
starting zkfc, logging to /usr/local/hadoop-2.9.1/logs/hadoop-hadoop-zkfc-hadoop34.out
[[email protected] hadoop]$ hadoop-daemon.sh --script hdfs stop zkfc
stopping zkfc
相關推薦
基於Zookeeper的HDFS高可用配置
前言 在 Hadoop 1.X版本中,NameNode是整個HDFS叢集的單點故障(single point of failure,SPOF):每一個HDFS叢集只能有一個NameNode節點,一旦NameNode所在伺服器宕機或者出現故障將導致整個叢集都不可用,除非重啟或
Kubernetes master節點的高可用配置
names iclient family each [0 refresh srv echo let 了解Kubernetes架構都知道Master節點在整個集群中的位置,為了保證整個架構的高可用,Kubernetes提供了HA的架構,處於興趣和對架構的進一步了解,我在自
RabbitMQ 集群與高可用配置
rabbitmq 集群與高可用配置RabbitMQ 集群與高可用配置集群概述通過 Erlang 的分布式特性(通過 magic cookie 認證節點)進行 RabbitMQ 集群,各 RabbitMQ 服務為對等節點,即每個節點都提供服務給客戶端連接,進行消息發送與接收。 這些節點通過 RabbitMQ
Linux的企業-Hadoop的高可用配置
hadoop的高可用一.配置環境redhat6.5server1 172.25.29(50).1 hadoop master nfsserver2 172.25.29(50).2 zookeeper nfsserver3 172.25.29(50).3 zookeeper nfsserver4 172.
mysql主從復制讀寫分離與高可用配置
mysql主從復制 mysql讀寫分離 一、說明 前面我們說了mysql的安裝配置(並提供一鍵安裝腳本),mysql語句使用以及備份恢復mysql數據;本次要介紹的是mysql的主從復制,讀寫分離;及高可用MHA;環境如下:master:CentOS7_x64 mysql5.721 172.16.
keepalived介紹、高可用配置;linux集群介紹;
keepalived 高可用配置 keepalived 冗余 Linux集群 VRRP Linux集群 分類(按功能) 1. 高可用:通常為兩臺服務器,一臺工作,另一臺做冗余;當主機宕機,冗余接替提供服務;實現軟件有:heartbeat、keepalived;2. 負載均衡:一臺做分發器
MySQL高可用配置(主從復制)
整數 mas pos 當前 sla ids 測試 cer cte 主從復制包含兩個步驟: 在 master 主服務器(組)上的設置,以及在 slave 從屬服務器(組)上的設置。 環境: MASTER: 192.168.155.101SLAVE: 192.168.155.1
SpringCloud學習成長之路七 高可用配置中心
true src ram localhost ots In with 實例 scrip 上一篇文章講述了一個服務如何從配置中心讀取文件,配置中心如何從遠程git讀取配置文件,當服務實例很多時,都從配置中心讀取文件,這時可以考慮將配置中心做成一個微服務,將其集群化,從而達到高
第五篇 高可用配置中心config-server(SVN版)
try cat 註意 address con mat user 環境 文件 一 新建module引入config-server依賴 <dependencies> <dependency> <gr
PGSQL主從+keepalived高可用配置
bash virtual scrip send 模擬 sta rac nopreempt timeout 環境說明:主機與IP:192.168.11.177 主庫192.168.11.180 備庫 192.168.11.210 VIP 系統:centos7.2PGSQL9
微服務架構eureka集群高可用配置
設置 pass figure ide style def eas gis 配置文件 工具:idea 環境:java8、maven3 版本:spring boot 1.5.15.RELEASE 1.搭建spring boot eureka項目 2. pom.xml
linux中keepalived實現nginx高可用配置
linux中keepalived實現nginx高可用配置 安裝keepalived 執行如下命令即可 tar -zxvf keepalived-2.0.8.tar.gz -C /usr/src cd /usr/src/keepalived-2.0.8 sudo apt-get install
Spring-cloud 微服務架構搭建 01 - Eureka服務搭建及高可用配置
文章目錄 1. Eureka簡介 2. Eureka 服務特點 3. Eureka-Server 服務端搭建 4. Eureka-Client端進行服務註冊 5. 高可用配置
走進Spring Cloud之九 高可用配置中心(Greenwich版本)
走進Spring Cloud之九 高可用配置中心(Greenwich版本) Config假如Eureka服務治理 註冊config-server pom.xml application.yml ConfigServerApplica
走進Spring Cloud之十 高可用配置中心動態重新整理(Greenwich版本)
走進Spring Cloud之十 高可用配置中心動態重新整理(Greenwich版本) 動態重新整理 refresh pom.xml application.yml 開啟更新機制 啟動測試 Webhooks
Hadoop高可用配置檔案hdfs-site.xml之dfs.ha.fencing.methods說明
dfs.ha.fencing.methods配置有sshfence和shell兩種方法: sshfence:防止namenode腦裂,當腦裂時,會自動通過ssh到old-active將其殺掉,將standby切換為active。 &nb
nginx+keepalived高可用配置
一.環境 應研發需求用兩臺虛擬機器搭建一套nginx+keepalived叢集,本篇只做基本配置不進行效能優化。 nginx-1.14.1 keepalived-1.3.5-6 兩臺centos7虛擬機器,192.168.171.8為keepalived主,192.168.171.1
Ceph RGW負載均衡和高可用配置
配置主要參考 (配置負載均衡有多種方法,這裡是使用keepalived 用於高可用,haproxy 用於負載均衡) 注意:負載均衡節點不能與任何RGW節點重合。 架構示意圖如下: 我的三個RGW分別為 R3S25:172.16.50.25 R3S4
Spring Cloud系列(二十九)高可用配置中心—Finchley版本
傳統作法 通常在生產環境,Config Server與服務註冊中心一樣,我們也需要將其擴充套件為高可用的叢集。在之前實現的config-server基礎上來實現高可用非常簡單,不需要我們為這些服務端做任何額外的配置,只需要遵守一個配置規則:將所有的Config Serv
springcloud-eureka高可用配置
一、1個eureka-server 注意點:1、新建專案選擇Eureka Server 2、啟動類加註解 3、application.yml配置檔案 eureka: client: service-url: defaultZone: