[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 生態系統架構能夠劃分爲四部分,以下圖所示。算法
客戶端(數據用戶)bootstrap
Metadata server cluster,元數據服務器(緩存和同步分佈式元數據)。
Ceph 元數據服務器( MDS )爲 Ceph 文件系統存儲元數據(也就是說,Ceph 塊設備和 Ceph 對象存儲不使用MDS )。元數據服務器使得 POSIX 文件系統的用戶們,能夠在不對 Ceph 存儲集羣形成負擔的前提下,執行諸如 ls、find 等基本命令。swift
Object storage cluster,對象存儲集羣(將數據和元數據做爲對象存儲,執行其餘關鍵職能)。 Ceph OSD 守護進程( Ceph OSD )的功能是存儲數據,處理數據的複製、恢復、回填、再均衡,並經過檢查其餘OSD 守護進程的心跳來向 Ceph Monitors 提供一些監控信息。當 Ceph 存儲集羣設定爲有2個副本時,至少須要2個 OSD 守護進程,集羣才能達到 active+clean 狀態( Ceph 默認有3個副本,但你能夠調整副本數)。vim
Cluster monitors,集羣監視器(執行監視功能)。 Ceph Monitor維護着展現集羣狀態的各類圖表,包括監視器圖、 OSD 圖、歸置組( PG )圖、和 CRUSH 圖。 Ceph 保存着發生在Monitors 、 OSD 和 PG上的每一次狀態變動的歷史信息(稱爲 epoch )。centos
Ceph 存儲集羣至少須要一個 Ceph Monitor 和兩個 OSD 守護進程。而運行 Ceph 文件系統客戶端時,則必需要有元數據服務器( Metadata Server )。api
Ceph 把客戶端數據保存爲存儲池內的對象。經過使用 CRUSH 算法, Ceph 能夠計算出哪一個歸置組(PG)應該持有指定的對象(Object),而後進一步計算出哪一個 OSD 守護進程持有該歸置組。 CRUSH 算法使得 Ceph 存儲集羣可以動態地伸縮、再均衡和修復。緩存
操做系統: CentOS 7.2 Ceph版本: Jewel 四臺虛擬機,部署拓撲以下。
dfs1做爲ceph-deploy的部署管理節點,在dfs1上添加ceph yum源,安裝ceph-deploy。 若是 ceph-deploy 以某個普通用戶登陸,那麼這個用戶必須有無密碼使用 sudo 的權限。
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
在四臺機器上全都執行。 確保在各 Ceph 節點上啓動了 NTP 服務,而且要使用同一個 NTP 服務器。
yum install -y ntp ntpdate ntp-doc systemctl start ntpd.service systemctl enable ntpd.service
在四臺機器上全都執行。
work帳號必須可以經過 SSH 無密碼地訪問各 Ceph 節點
work帳號在全部節點擁有免密碼使用sudo的權限. 部署操做使用work帳號操做.
在 /etc/sudoers 中添加work那一行, 最終應該這樣:
... ## Allow root to run any commands anywhere root ALL=(ALL) ALL work ALL=(root) NOPASSWD:ALL ...
注意, 如出現設置完成之後, 仍沒法免密碼使用sudo的狀況, 那先運行 groups 命令, 確認本身只屬於 work 組裏面.
yum install -y openssh-server systemctl start sshd.service # 啓動sshd service systemctl enable sshd.service # 設置sshd開機啓動
本身百度.
在 CentOS 和 RHEL 上執行 ceph-deploy 命令時可能會報錯。若是你的 Ceph 節點默認設置了 requiretty ,執行 sudo visudo 禁用它,並找到 Defaults requiretty 選項,把它改成 Defaults:ceph !requiretty 或者直接註釋掉,這樣 ceph-deploy 就能夠用以前建立的用戶(建立部署 Ceph 的用戶 )鏈接了。
systemctl stop firewalld.service systemctl disable firewalld.service
在 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 。
因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-deploy install dfs1 dfs2 dfs3 dfs4
[注意]
安裝過程當中可能會報以下錯誤:
- [ceph_deploy][ERROR ] RuntimeError: NoSectionError: No section: 'ceph' 執行 sudo yum remove ceph-release 便可,從新安裝便可。
- 超時失敗,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安裝便可。
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
將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
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還沒有爲多個元數據服務器的集羣提供商業支持。
ceph-deploy install --rgw dfs1
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
雖然已建立了元數據服務器(存儲集羣快速入門),但若是沒有建立存儲池和文件系統,它是不會變爲活動狀態的。
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
[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
把 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
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
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