Ceph部署文檔 centos 7

[TOC]node

此文檔最新版本python

簡介

Ceph 始於加州大學聖克魯茲分校的 Sage Weil 的博士學位課題。但從 2010 年 3 月下旬起,能夠在 Linux 主流內核中找到 Ceph (從 2.6.34 內核起)。 Ceph 不只僅是一個文件系統,仍是一個有企業級功能的對象存儲生態環境。向上提供C/C++ api、CephFS、EBS、S3/Swift等豐富的功能。 本文將介紹使用 ceph deploy 工具在 centos7 上進行部署的方法.linux

架構劃分

Ceph 生態系統架構能夠劃分爲四部分,以下圖所示。算法

image

Clients

客戶端(數據用戶)bootstrap

MDS-cluster

Metadata server cluster,元數據服務器(緩存和同步分佈式元數據)。
Ceph 元數據服務器( MDS )爲 Ceph 文件系統存儲元數據(也就是說,Ceph 塊設備和 Ceph 對象存儲不使用MDS )。元數據服務器使得 POSIX 文件系統的用戶們,能夠在不對 Ceph 存儲集羣形成負擔的前提下,執行諸如 ls、find 等基本命令。swift

OSD-cluster

Object storage cluster,對象存儲集羣(將數據和元數據做爲對象存儲,執行其餘關鍵職能)。 Ceph OSD 守護進程( Ceph OSD )的功能是存儲數據,處理數據的複製、恢復、回填、再均衡,並經過檢查其餘OSD 守護進程的心跳來向 Ceph Monitors 提供一些監控信息。當 Ceph 存儲集羣設定爲有2個副本時,至少須要2個 OSD 守護進程,集羣才能達到 active+clean 狀態( Ceph 默認有3個副本,但你能夠調整副本數)。vim

Monitor-Cluster

Cluster monitors,集羣監視器(執行監視功能)。 Ceph Monitor維護着展現集羣狀態的各類圖表,包括監視器圖、 OSD 圖、歸置組( PG )圖、和 CRUSH 圖。 Ceph 保存着發生在Monitors 、 OSD 和 PG上的每一次狀態變動的歷史信息(稱爲 epoch )。centos

Ceph 存儲集羣至少須要一個 Ceph Monitor 和兩個 OSD 守護進程。而運行 Ceph 文件系統客戶端時,則必需要有元數據服務器( Metadata Server )。api

image

Ceph 把客戶端數據保存爲存儲池內的對象。經過使用 CRUSH 算法, Ceph 能夠計算出哪一個歸置組(PG)應該持有指定的對象(Object),而後進一步計算出哪一個 OSD 守護進程持有該歸置組。 CRUSH 算法使得 Ceph 存儲集羣可以動態地伸縮、再均衡和修復。緩存

部署環境拓撲

操做系統: CentOS 7.2 Ceph版本: Jewel 四臺虛擬機,部署拓撲以下。

image

環境準備

安裝Ceph部署工具。

dfs1做爲ceph-deploy的部署管理節點,在dfs1上添加ceph yum源,安裝ceph-deploy。 若是 ceph-deploy 以某個普通用戶登陸,那麼這個用戶必須有無密碼使用 sudo 的權限。

紅帽包管理工具(RPM)

sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*

把軟件包源加入軟件倉庫。用文本編輯器建立一個 YUM (Yellowdog Updater, Modified) 庫文件,其路徑爲 /etc/yum.repos.d/ceph.repo 。

sudo vim /etc/yum.repos.d/ceph.repo

把以下內容粘帖進去,最後保存到 /etc/yum.repos.d/ceph.repo 文件中。

[ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-jewel/el7/noarch/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

更新軟件庫並安裝 ceph-deploy :

sudo yum update && sudo yum install ceph-deploy

NTP服務

在四臺機器上全都執行。 確保在各 Ceph 節點上啓動了 NTP 服務,而且要使用同一個 NTP 服務器。

yum install -y ntp ntpdate ntp-doc
systemctl start ntpd.service 
systemctl enable ntpd.service

創建work帳戶 && SSH相關

在四臺機器上全都執行。
work帳號必須可以經過 SSH 無密碼地訪問各 Ceph 節點
work帳號在全部節點擁有免密碼使用sudo的權限. 部署操做使用work帳號操做.

無密碼使用sudo權限

在 /etc/sudoers 中添加work那一行, 最終應該這樣:

...
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
work    ALL=(root) NOPASSWD:ALL
...

注意, 如出現設置完成之後, 仍沒法免密碼使用sudo的狀況, 那先運行 groups 命令, 確認本身只屬於 work 組裏面.

openssh-server 服務

yum install -y openssh-server
systemctl start sshd.service   # 啓動sshd service
systemctl enable sshd.service  # 設置sshd開機啓動

無密碼 SSH 登陸

本身百度.

其餘設置

禁用requiretty。

在 CentOS 和 RHEL 上執行 ceph-deploy 命令時可能會報錯。若是你的 Ceph 節點默認設置了 requiretty ,執行 sudo visudo 禁用它,並找到 Defaults requiretty 選項,把它改成 Defaults:ceph !requiretty 或者直接註釋掉,這樣 ceph-deploy 就能夠用以前建立的用戶(建立部署 Ceph 的用戶 )鏈接了。

關閉防火牆。

systemctl stop firewalld.service 
systemctl disable firewalld.service

SELINUX

在 CentOS 和 RHEL 上, SELinux 默認爲 Enforcing 開啓狀態。爲簡化安裝,咱們建議把 SELinux 設置爲 Permissive 或者徹底禁用,也就是在加固系統配置前先確保集羣的安裝、配置沒問題。用下列命令把 SELinux 設置爲 Permissive:

sudo setenforce 0

要使 SELinux 配置永久生效(若是它的確是問題根源),需修改其配置文件 /etc/selinux/config 。

優先級/首選項

確保你的包管理器安裝了優先級/首選項包且已啓用。在 CentOS 上須要安裝 EPEL。

sudo yum install yum-plugin-priorities

安裝

安裝錯誤清理

若是在某些地方碰到麻煩,想從頭再來,能夠用下列命令清除配置:

ceph-deploy purgedata {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys

用下列命令能夠連 Ceph 安裝包一塊兒清除:

ceph-deploy purge {ceph-node} [{ceph-node}]

例如:

ceph-deploy purge dfs1 dfs2 dfs3 dfs4

若是執行了 purge ,你必須從新安裝 Ceph 。

配置 mirror 加速安裝過程

因ceph國外源速度很慢, 同時不穩定, 會致使安裝失敗, 能夠配置國內源.

按照操做系統, 要裝的版本, 在全部機器上, 不使用repo默認 yum 配置, /etc/yum.repos.d/ceph.repo 配置文件更改以下:

[ceph]
name=Ceph packages for x86_64
baseurl=http://mirrors.ustc.edu.cn/ceph/rpm-jewel/el7/x86_64
enabled=1
priority=1
gpgcheck=1
type=rpm-md
gpgkey=http://mirrors.ustc.edu.cn/ceph/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.ustc.edu.cn/ceph/rpm-jewel/el7/noarch
enabled=1
priority=1
gpgcheck=1
type=rpm-md
gpgkey=http://mirrors.ustc.edu.cn/ceph/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.ustc.edu.cn/ceph/rpm-jewel/el7/SRPMS
enabled=0
priority=1
gpgcheck=1
type=rpm-md
gpgkey=http://mirrors.ustc.edu.cn/ceph/keys/release.asc

參考: http://docs.ceph.com/docs/master/install/get-packages/#rpm-packages
國內鏡像源: http://bbs.ceph.org.cn/?/page/image

注意, 若是中途安裝失敗, 使用 ceph-deploy purge xxx 命令清楚過數據, 則這個文件會被備份到 /etc/yum.repos.d/ceph.repo.rpmsave, 再次安裝前, 需先將這個文件恢復, 以加速安裝過程.

集羣部署

建立操做目錄

先在管理節點上建立一個目錄,用於保存 ceph-deploy 生成的配置文件和密鑰對。

mkdir ceph-cluster
cd ceph-cluster

修改 /etc/hosts 文件,添加以下內容:

192.168.1.102 dfs1
192.168.1.103 dfs2
192.168.1.104 dfs3
192.168.1.105 dfs4

以後的部署,都是以hostname來進行操做。

注意! hostname裏面的機器名字應該和機器的真實hostname相同. 此版本ceph生成文件按照機器hostname生成, 而查找此文件是按照hosts文件裏面查找, 最終出現文件找不到(示例: No such file or directory /var/run/ceph/ceph-mon.dfs2.asok).

建立集羣

建立集羣,在dfs二、dfs三、dfs4上部署monitor。

ceph-deploy new dfs2 dfs3 dfs4

在當前目錄下用 ls 和 cat 檢查 ceph-deploy 的輸出,應該有一個 Ceph 配置文件、一個 monitor 密鑰環和一個日誌文件。詳情見 ceph-deploy new -h 。

更改配置

以下示例把 ./ceph.conf 裏的默認副本數從 3 改爲 2, 把下面這行加入 [global] 段:

osd pool default size = 2

安裝Ceph

ceph-deploy install dfs1 dfs2 dfs3 dfs4

[注意]

安裝過程當中可能會報以下錯誤:

  1. [ceph_deploy][ERROR ] RuntimeError: NoSectionError: No section: 'ceph' 執行 sudo yum remove ceph-release 便可,從新安裝便可。
  2. 超時失敗,No data was received after 300 seconds 由於ceph源速度太慢,ceph-deploy端報超時的錯誤。 直接到各節點執行以下命令:
sudo rpm --import https://download.ceph.com/keys/release.asc && sudo rpm -Uvh --replacepkgs https://download.ceph.com/rpm-jewel/el7/noarch/ceph-release-1-0.el7.noarch.rpm && sudo yum -y install ceph ceph-radosgw

等待安裝完成,再從新執行ceph-deploy安裝便可。

配置初始 monitor(s)、並收集全部密鑰:

ceph-deploy mon create-initial

完成上述操做後,當前目錄裏應該會出現這些密鑰環:
{cluster-name}.client.admin.keyring
{cluster-name}.bootstrap-osd.keyring
{cluster-name}.bootstrap-mds.keyring
{cluster-name}.bootstrap-rgw.keyring

存儲相關服務部署

部署OSD節點

將dfs二、dfs三、dfs4做爲集羣的OSD節點,在這三臺機器上建立目錄。

ssh dfs2
sudo mkdir -p /opt/data/ceph/osd0
sudo chown -R ceph.ceph /opt/data/ceph
exit
ssh dfs3
sudo mkdir -p /opt/data/ceph/osd1
sudo chown -R ceph.ceph /opt/data/ceph
exit
ssh dfs4
sudo mkdir -p /opt/data/ceph/osd2
sudo chown -R ceph.ceph /opt/data/ceph
exit

注意, 文件目錄權限都應該是ceph這個用戶下的. 若是是work用戶, 會致使沒法訪問.

prepare and activate OSDs:

ceph-deploy osd prepare dfs2:/opt/data/ceph/osd0 dfs3:/opt/data/ceph/osd1 dfs4:/opt/data/ceph/osd2
ceph-deploy osd activate dfs2:/opt/data/ceph/osd0 dfs3:/opt/data/ceph/osd1 dfs4:/opt/data/ceph/osd2

新版本的Ceph支持的默認存儲FS爲XFS,若是使用ext4的話,須要從新掛載,加入user_xattr參數( ceph.conf 配置文件的 [osd] 段下加入: filestore xattr use omap = true)。
參考 http://docs.ceph.org.cn/rados/configuration/filesystem-recommendations/#index-1

配置文件和admin祕鑰部署

ceph-deploy admin dfs1 dfs2 dfs3 dfs4

確保對 ceph.client.admin.keyring 有正確的操做權限。(儘可能在每臺機器上都執行)

sudo chmod +r /etc/ceph/ceph.client.admin.keyring

檢查集羣的健康情況

ceph health

添加元數據服務

咱們將元數據服務放在dfs1上。

ceph-deploy mds create dfs1

當前生產環境下的 Ceph 只能運行一個元數據服務器。你能夠配置多個,但如今Ceph還沒有爲多個元數據服務器的集羣提供商業支持。

RGW對象網關組件部署

  • 安裝 CEPH 對象網關 在dfs1節點的的工做目錄執行以下命令,在 dfs1 上安裝 Ceph 對象網關軟件包。
ceph-deploy install --rgw dfs1
  • 新建 CEPH 對象網關實例 執行以下命令:
ceph-deploy rgw create dfs1

一旦網關開始運行,你就能夠經過 7480 端口來訪問它(好比 http://dfs1:7480 )。

RGW默認監聽7480端口,能夠更改dfs1節點上ceph.conf內與rgw相關的配置,詳細配置參照官網文檔。
注意, ceph默認不對索引數據寫入進行分片, 致使小文件大量寫入成爲瓶頸. 若是有大量小文件持續寫入的情景, 需先設置分片數(rgw_override_bucket_index_max_shards), 再建立bucket.

  • 簡單測試
curl http://dfs1:7480

應答以下:

<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Owner>
        <ID>anonymous</ID>
        <DisplayName></DisplayName>
    </Owner>
    <Buckets>
    </Buckets>
</ListAllMyBucketsResult>

動態擴容

Ceph支持動態增長OSD、monitor等組件,自動進行數據的均衡操做。詳細操做請參照官網文檔。

使用

塊設備簡單使用

在dfs1上掛載一個2G的塊設備。 建立塊設備的image,並將該image映射爲塊設備。

rbd create foo --size 2048 -m 192.168.1.103  --image-format 2 --image-feature  layering
sudo rbd map foo --name client.admin -m 192.168.1.103 -k /etc/ceph/ceph.client.admin.keyring

建立文件系統,掛載以後就可使用了。

sudo mkfs.ext4 /dev/rbd/rbd/foo
mkdir /opt/data/ceph/ebs_foo
sudo mount /dev/rbd/rbd/foo /opt/data/ceph/ebs_foo

用df -h查看,以下所示:

/dev/rbd0               2.0G  6.0M  1.8G    1% /opt/data/ceph/ebs_foo

CephFS 簡單使用

建立文件系統

雖然已建立了元數據服務器(存儲集羣快速入門),但若是沒有建立存儲池和文件系統,它是不會變爲活動狀態的。

ceph osd pool create fs_data 16
ceph osd pool create fs_meta 16
ceph fs new fs_kernel fs_meta fs_data

建立密鑰文件

Ceph 存儲集羣默認啓用認證,你應該有個包含密鑰的配置文件(但不是密鑰環自己)。用下述方法獲取某一用戶的密鑰:

  • 在密鑰環文件中找到與某用戶對應的密鑰,例如:
cat ceph.client.admin.keyring
  • 找到用於掛載 Ceph 文件系統的用戶,複製其密鑰。大概看起來以下所示:
[client.admin]
   key = AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==
  • 打開文本編輯器。把密鑰粘帖進去:
echo "AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==" > admin.secret

確保此文件對用戶有合適的權限,但對其餘用戶不可見。

內核文件系統

把 Ceph FS 掛載爲內核驅動。

mkdir /opt/data/ceph/fs_kernel
sudo mount -t ceph 192.168.1.103:6789:/ /opt/data/ceph/fs_kernel -o name=admin,secretfile=admin.secret

用戶空間文件系統(FUSE)

把 Ceph FS 掛載爲用戶空間文件系統( FUSE )。

sudo mkdir /opt/data/ceph/fs_fuse
sudo ceph-fuse -k ./ceph.client.admin.keyring -m 192.168.1.103:6789 /opt/data/ceph/fs_fuse

對象存儲使用

S3功能配置

  • 新建用戶和 KEYRING 爲每個實例生成一個 Ceph 對象網關用戶名和key. 舉一個典型實例, 咱們將使用 client.radosgw 後使用 gateway 做爲用戶名,在 dfs1 的 /home/work/ceph-cluster 目錄下執行:
sudo ceph auth get-or-create client.radosgw.gateway osd 'allow rwx' mon 'allow rwx' -o /etc/ceph/ceph.client.radosgw.keyring
  • 建立存儲池

最新版本不用手工建立, 會自動建立.

sudo ceph osd pool create .rgw 128 128  
sudo ceph osd pool create .rgw.root 128 128  
sudo ceph osd pool create .rgw.control 128 128  
sudo ceph osd pool create .rgw.gc 128 128  
sudo ceph osd pool create .rgw.buckets 128 128  
sudo ceph osd pool create .rgw.buckets.index 128 128  
sudo ceph osd pool create .rgw.buckets.extra 128 128  
sudo ceph osd pool create .log 128 128  
sudo ceph osd pool create .intent-log 128 128  
sudo ceph osd pool create .usage 128 128  
sudo ceph osd pool create .users 128 128  
sudo ceph osd pool create .users.email 128 128  
sudo ceph osd pool create .users.swift 128 128  
sudo ceph osd pool create .users.uid 128 128

完成上述步驟以後,執行下列的命令確認前述存儲池都已經建立了:

rados lspools
  • 使用網關 radosgw 用戶須要新建而且賦予訪問權限. 命令 man radosgw-admin 將展現提供更多額外的命令選項信息.爲了新建用戶, 在 gateway host 上執行下面的命令:
sudo radosgw-admin user create --uid="testuser" --display-name="First User"

上述命令的輸出結果相似下面這樣:

{
    "user_id": "testuser",
    "display_name": "First User",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [],
    "keys": [
        {
            "user": "testuser",
            "access_key": "90WUIXXUW8P25TS0QQX0",
            "secret_key": "ckFtAughCWmhDOi8jmBf0nchUkAyODvNetuOB45T"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "temp_url_keys": []
}
  • 訪問驗證
sudo yum install python-boto

新建一個python文件,好比 s3_test.py,添加以下內容:

#coding:utf-8

import boto
import boto.s3.connection

access_key = "90WUIXXUW8P25TS0QQX0"
secret_key = 'ckFtAughCWmhDOi8jmBf0nchUkAyODvNetuOB45T'

conn = boto.connect_s3(
        aws_access_key_id = access_key,
        aws_secret_access_key = secret_key,
        host = 'dfs1', port = 7480,
        is_secure=False,
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
    )

bucket = conn.create_bucket('my-new-bucket2')

for bucket in conn.get_all_buckets():
    print "%s\t%s" % (bucket.name, bucket.creation_date)

執行結果:

my-new-bucket2	2016-08-12T04:38:01.000Z

References

  1. Ceph——一個 PB 規模的 Linux 分佈式文件系統
  2. 官方文檔
相關文章
相關標籤/搜索