Ozone1.0部署

1、背景簡介

HDFS通過把文件系統元數據全部加載到Namenode內存中,給客戶端提供了低延遲的元數據訪問。由於元數據需要全部加載到內存,所以一個HDFS集羣能支持的最大文件數,受JAVA堆內存的限制,上限大概是4億左右個文件。所以HDFS適合大量大文件(幾百兆以上)的集羣,如果集羣中有非常多的小文件,HDFS的元數據訪問性能會受到影響。 Ozone 是一個分佈式、多副本的對象存儲系統,並針對大數據場景進行了專門的優化。Ozone 主要圍繞可擴展性進行設計,目標是十億數量級以上的對象存儲。

2、組件架構

2.1 Ozone Manager

2.1.1 基本功能

Ozone Manager(OM)管理 Ozone 的命名空間,提供所有的 Volume, Bucket 和 Key 的新建,更新和刪除操作。

Ozone Manager 只和 Ozone Client 和 Storage Container Manager 通信,並不直接和 Datanode 通信。

當向Ozone寫入數據時,你需要向OM請求一個塊,OM會返回一個塊並記錄下相關信息。當你想要讀取那個文件時,你也需要先通過OM獲取那個塊的地址。

OM 允許用戶在卷和桶下管理鍵,卷和桶都是命名空間的一部分,也由 OM 管理。

每個卷都是 OM 下的一個獨立命名空間的根,這一點和 HDFS 不同,HDFS 提供的是單個根目錄的文件系統。

與 HDFS 中單根的樹狀結構相比,Ozone 的命名空間是卷的集合,或者可以看作是個森林,因此可以非常容易地部署多個 OM 來進行擴展。

2.1.2. 元數據管理

OM 維護了卷、桶和鍵的列表。它爲每個用戶維護卷的列表,爲每個卷維護桶的列表,爲每個桶維護鍵的列表。

2.1.3. 單點及高可用

單點OM通過RocksDB來持久化元數據;

HA模式底層通過 Ratis(實現了Raft協議) 擴展元數據的副本數來實現元數據的HA。

2.1.4. Key寫

2.1.5. Key 讀

2.2. Storage Container Manager

SCM是Ozone的block空間管理的leader節點,主要職責是創建和管理container,container是Ozone的主要複製單元。

SCM爲Ozone提供多個關鍵功能,集羣管理、證書頒發、塊管理和副本管理:

2.2.1. 集羣管理

SCM負責創建Ozone集羣,當通過init初始化集羣時,SCM將創建證書授權所需的集羣標識和根證書。 SCM管理着集羣中數據節點datanode的生命週期。

2.2.2. 服務安全管理

SCM的證書授權爲集羣中每個服務頒發身份證書,這個基礎證書讓服務在網絡層更容易啓動mTLS(雙向認證),並且塊的基礎token也依賴於這個基礎證書。

2.2.3. 塊管理

SCM是塊管理器,它分配塊並將他們分配給數據節點,客戶端可以直接對這些塊進行讀寫操作。

2.2.4. 副本管理

SCM持續跟蹤所有的塊副本,如果數據節點或者磁盤損壞,SCM會檢測到並會指示數據節點複製丟失的數據塊以確保高可用性。

2.3 Containers

Block是數據塊對象,真實存儲用戶的數據,不由SCM管理。

Container是一個邏輯概念,是由一些相互之間沒有關係的 Block 組成的集合。

在Ozone中,數據是以Container的粒度進行副本複製的,默認大小爲5G (ozone.scm.container.size),由SCM服務管理。

Pipeline 來保證 Container 實現想要的副本數。SCM 中目前支持2種 Pipeline 方式實現多副本,單副本的 Standalone 模式和三副本的 Ratis 方式(ozone.replication)。

當Ozone Manager從SCM請求一個新的塊分配時,SCM將識別合適的容器並生成一個包含ContainerId+LocalId的塊id。客戶端將連接到存儲容器的Datanode,Datanode可以根據LocalId管理分離的塊。

Container 有2種狀態,OPEN 和 CLOSED:

當container創建時,它就開始了Open狀態,當它寫滿時(默認5G),它就會關閉並且變成CLOSED的狀態,之後便不可修改。 | OPEN | CLOSED | | :------------: | :------------: | | 可變 | 不可變 | |通過ratis複製 | 使用異步容器copy進行復制| | Raft leader節點用於數據讀寫| 所有節點都用於讀 |

2.4 Datanodes

存儲所有數據,客戶端按block寫入數據,數據節點將這些block聚合到存儲container中, container中包含用戶寫入的數據塊和這些塊的元數據。

Ozone container存儲容器是一個自包含的超級塊,容器中包含一系列的Block,以及存儲實際數據的磁盤文件,是默認的存儲容器格式。

當客戶端想從Ozone讀取數據,客戶端向OM發送數據文件的名字,OM會返回組成這個文件的塊列表,一個Ozone塊包含一個container ID 和一個local ID,container ID讓客戶端發現container的位置,container的相關信息由SCM提供,在大多數情況下,container位置由Ozone Manager緩存,並與Ozone塊一起返回。

當客戶端找到了container,也就是知道了哪些數據節點包含這些container,客戶端會連接到數據節點並且讀取由container ID:Local ID指定的數據流,換句話說,Local ID用作容器的索引,從container中讀取想要的數據流。

  • 容器的位置發現

SCM 如何獲得容器的位置?這一點和現有的 HDFS 十分相似。數據節點會定期發送類似於塊報告的容器報告,容器報告比塊報告的內容簡潔的多,比如,對於一個存儲容量爲 196 TB 的集羣,Ozone 大概會擁有四萬個容器,相比於 HDFS 的一百五十萬個塊,塊報告數量縮減爲四十分之一。

這種間接管理的方式大大地提高了 Ozone 的擴展性,因爲 SCM 需要處理的塊數據大大減少,且命名服務(OM)作爲一個獨特的服務主體對於擴展 Ozone 具有重要意義。

2.5. Recon

Ozone的監控頁面

2.6 S3G

Ozone的s3 compatible REST gateway

3. 基本介紹

3.1.組件架構

Ozone 的命名空間由volume組成,同時volume也用作存儲賬戶管理。

Ozone Manager(OM) 管理命名空間,Storage Container Manager(SCM) 管理底層的數據,而 Recon 是 Ozone 的管理接口。

3.2.邏輯架構

Ozone數據的邏輯存儲架構

  1. Volumes(卷): 類似於用戶賬號,只有管理員可以創建volumes,可以做配額管理,用於存儲buckets,一個volume下可以包含多個buckets。
  2. Buckets(桶): 類似於目錄,用戶可以在自己的卷下創建任意數量的桶,一個bucket可以包含無數個keys,buckets不能包含其他buckets,它們之間互不干擾。
  3. Keys(鍵): 類似於文件,位於bucket下,用於讀寫數據。

3.3. 端口說明

服務 端口 參數 備註
Datanode 9858 dfs.container.ratis.ipc Datanode節點
Datanode 9859 dfs.container.ipc Datanode節點
SCM 9860 ozone.scm.client.address
SCM 9861 ozone.scm.datanode.address scm和datanode通信端口
OM 9862 ozone.om.address
SCM 9863 ozone.scm.block.client.port
OM 9874 ozone.om.http-address OM web頁面
SCM 9876 ozone.scm.http-address SCM web頁面
S3G 9878 ozone.s3g.http-address S3Gateway
Datanode 9882 hdds.datanode.http-address Datanode節點
Recon 9888 ozone.recon.http-address Recon web頁面
Recon 9891 ozone.recon.address 默認無,Datanode節點必配參數,以便Recon可以監測到Datanode服務

4.安裝部署

OZONE和HDFS不要部署在同一個節點上,因爲OZONE的環境變量會和HADOOP共用,服務啓動會衝突,可以修改環境變量相關腳本進行更改。

4.1.基礎環境

4.1.1.配置/etc/hosts

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.40.21 ozom-1
172.16.40.22 ozom-2
172.16.40.23 ozom-3
172.16.40.11 ozdn-1
172.16.40.12 ozdn-2
172.16.40.13 ozdn-3

4.1.2.關閉防火牆

# systemctl stop firewalld && systemctl disable firewalld

4.1.3.關閉selinux

# setenforce 0 && sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

4.1.4.時間同步

ntpd

4.1.5.創建用戶

# useradd hadoop

4.1.6.配置互信

4.2.單點部署

Hostname Ip Service
ozom-1 172.16.40.21 OM、SCM、DataNode
ozom-2 172.16.40.22 DataNode
ozom-3 172.16.40.23 DataNode
ozdn-1 172.16.40.11 DataNode
ozdn-2 172.16.40.12 DataNode
ozdn-3 172.16.40.13 DataNode

4.2.1.創建目錄

創建Datanode的數據目錄 掛載到磁盤上

# mkdir -p /data/disk{1..2}
# chown -R hadoop:hadoop /data/disk{1..2}

創建ozone相關目錄

# mkdir -p /opt/dlw/{conf,soft,logs,metadata,tmp}
# chown -R hadoop:hadoop /opt/dlw

$ mkdir -p /opt/dlw/logs/ozone
$ mkdir -p /opt/dlw/tmp/run

$ mkdir -p /opt/dlw/metadata/ozone/{om,node,recon,ratis,scm}

4.2.2.環境變量

1、配置java

所有節點都需配置

配置ozone

export OZONE_HOME=/opt/dlw/soft/ozone
export PATH=$OZONE_HOME/sbin:$OZONE_HOME/bin:$PATH
export HADOOP_OPTS="-XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+CMSParallelRemarkEnabled"
export HADOOP_PID_DIR=/opt/dlw/tmp/run
export HADOOP_LOG_DIR=/opt/dlw/logs/hadoop

4.2.3.拷貝軟件

Ozone 下載的二進制包,直接解壓使用,拷貝至所有節點

$ tar -zxvf hadoop-ozone-1.0.0.tar.gz -C /opt/dlw/soft/
$ cd /opt/dlw/soft/
$ mv ozone-1.0.0 ozone

4.2.4.修改配置

生成配置

$ ozone genconf $OZONE_HOME/etc/hadoop

修改配置

$ vim $OZONE_HOME/etc/hadoop/ozone-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
    <property>
        <name>ozone.om.address</name>
        <value>ozom-1</value>
    </property>

    <property>
        <name>ozone.om.http-address</name>
        <value>ozom-1:9874</value>
    </property>

    <property>
       <name>ozone.om.db.dirs</name>
       <value>/opt/dlw/metadata/ozone/om</value>
    </property>

    <property>
        <name>ozone.metadata.dirs</name>
        <value>/opt/dlw/metadata/ozone</value>
    </property>

    <property>
        <name>ozone.om.ratis.enable</name>
        <value>false</value>
    </property>

    <property>
        <name>ozone.om.service.ids</name>
        <value>omdlw001</value>
    </property>

    <property>
       <name>ozone.om.nodes.omdlw001</name>
       <value>om1,om2,om3</value>
    </property>

    <property>
       <name>ozone.om.address.omdlw001.om1</name>
       <value>ozom-1</value>
    </property>

    <property>
       <name>ozone.om.address.omdlw001.om2</name>
       <value>ozom-2</value>
    </property>

    <property>
       <name>ozone.om.address.omdlw1.om3</name>
       <value>ozom-3</value>
    </property>

    <property>
        <name>ozone.scm.client.address</name>
        <value>ozom-1</value>
    </property>

    <property>
        <name>ozone.scm.names</name>
        <value>ozom-1</value>
    </property>

    <property>
        <name>ozone.scm.container.size</name>
        <value>5GB</value>
    </property>

    <property>
       <name>ozone.scm.db.dirs</name>
       <value>/opt/dlw/metadata/ozone/scm</value>
    </property>

    <property>
       <name>ozone.scm.pipeline.owner.container.count</name>
       <value>3</value>
    </property>

    <property>
        <name>ozone.scm.datanode.id.dir</name>
        <value>/opt/dlw/metadata/ozone/node</value>
    </property>

    <property>
       <name>ozone.scm.block.client.address</name>
       <value>ozom-1</value>
    </property>

    <property>
       <name>ozone.scm.datanode.address</name>
       <value>ozom-1</value>
    </property>

    <property>
       <name>hdds.datanode.dir</name>
       <value>/data/disk1,/data/disk2</value>
    </property>

    <property>
       <name>ozone.recon.db.dir</name>
       <value>/opt/dlw/metadata/ozone/recon</value>
    </property>

    <property>
       <name>ozone.recon.address</name>
       <value>ozom-1:9891</value>
    </property>

    <property>
       <name>recon.om.snapshot.task.interval.delay</name>
       <value>1m</value>
    </property>

    <property>
       <name>dfs.container.ratis.datanode.storage.dir</name>
       <value>/opt/dlw/metadata/ozone/ratis</value>
    </property>

</configuration>
$ vim $OZONE_HOME/etc/hadoop/workers
ozom-1
ozom-2
ozom-3
ozdn-1
ozdn-2
ozdn-3

4.2.5.啓動服務

  • scm
$ ozone scm --init
$ ozone --daemon start scm
  • om
$ ozone om --init
$ ozone --daemon start om
  • datanode –所有datanode節點
$ ozone --daemon start datanode
  • recon
$ ozone --daemon start recon
  • s3g
$ ozone --daemon start s3g

4.2.6.校檢驗證

$ jps
6721 ReconServer
7589 Gateway
4934 StorageContainerManagerStarter
5479 OzoneManagerStarter
5705 HddsDatanodeService
7662 Jps
  • scm

  • om

  • s3g

  • recon

4.3.高可用部署

Hostname Ip Service
ozom-1 172.16.40.21 OM、SCM、DataNode
ozom-2 172.16.40.22 OM
ozom-3 172.16.40.23 OM
ozdn-1 172.16.40.11 DataNode
ozdn-2 172.16.40.12 DataNode
ozdn-3 172.16.40.13 DataNode

高可用目前只有OM服務支持HA,SCM尚不支持: 單點OM通過RocksDB來持久化元數據; 高可用模式底層通過 Ratis(實現了Raft協議) 擴展元數據的副本數來實現元數據的HA。

修改配置,開啓OM的HA模式

    <property>
        <name>ozone.om.ratis.enable</name>
        <value>true</value>
    </property>

一個ozone-site.xml支持多個Ozone HA配置,爲了在可用的HA集羣之間進行選擇,每個集羣都需要一個邏輯名稱,該名稱可以解析爲OM的IP地址(或域名)。

   <property>
       <name>ozone.om.service.ids</name>
       <value>cluster1,cluster2</value>
   </property>

此處只有一個集羣,自定義一個集羣名稱omdlw001

    <property>
        <name>ozone.om.service.ids</name>
        <value>omdlw001</value>
    </property>

對於這個集羣可以定義他的所有om,並對每個om的節點進行配置

    <property>
       <name>ozone.om.nodes.omdlw001</name>
       <value>om1,om2,om3</value>
    </property>

    <property>
       <name>ozone.om.address.omdlw001.om1</name>
       <value>ozom-1</value>
    </property>

    <property>
       <name>ozone.om.address.omdlw001.om2</name>
       <value>ozom-2</value>
    </property>

    <property>
       <name>ozone.om.address.omdlw001.om3</name>
       <value>ozom-3</value>
    </property>

在三個om節點上都啓動om服務,但是必須得注意,高可用的om服務不能與datanode服務同處於同一個節點,因爲2者都使用ratis會衝突。

$ ozone om --init
$ ozone --daemon start om
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章