供測試或開發 RADOS 用的 Ceph 叢集簡易部署
1. 先決條件
擁有基本的 Ceph 詞匯知識(例如:Monitor、OSD、RADOS、RADOS 閘道、RBD、MDS 及 CephFS)。
建議閱讀,至少速讀,Ceph Hammer 或 master 分支 的架構文件。
最少 7 台相同的 CentOS 7.2 x86_64 系統。此指南假設 KVM 虛擬電腦(磁碟裝置是 vdb、vdc 等)但改用實體硬件應該問題不大。
- 安裝 = Minimal,及一個可用的時間長註程式(即是可靠的 NTP 來源)
- 5GB 系統磁碟、swap = 512MiB,及主目錄 = 3GiB
- 2GiB 記憶體及每台系統一個虛擬處理器
- 每台系統一個固定的 IP
所有系統必須能用簡稱(hostname -s)互相 ping。要是沒有 DNS 服務,可採用一致的 /etc/hosts 檔,內有所有簡稱(而不是叢集的 FQDN)。
2. 描述
我們將會部署:
- 一個管理節點、
- 一個監視器、
- 兩個 OSD(儲存節點)、
- 一個 RADOS 閘道(它為 Ceph 提供 S3 似的存取模式)、
- 一個供 CephFS 用的 MDS、
- 及一個 Ceph 客端系統。
監視器在一個 PAXOS 叢集中運作,因此生產用時必須有三個(或五個),但我們可用一個監視器作測試之用。
一個生產用的 Ceph 叢集需要最少三個 OSD,因為每樣物件預設都會被儲存三次,但我們將會用兩個 OSD,並編輯設定檔來反映這個事實。
3. 警告
被建立出來的測試叢集並不適用於生產用。請勿按此指引建立生產系統,因為:
- 我們只部署了一個監視器,而不是一個 PAXOS 叢集,
- 我們只部署了兩個 OSD,因此物件只擁有兩個(而不是三個)複製本
我們沒有採用正式、獨立的量產型和可管理的乙太網介面,
未設置CRUSH(Controlled Replication Under Scalable Hashing)架構,
- 未將系統加固,
我們選用了 ceph-deploy 用戶,但實際部署最起碼會混淆該用戶名稱,
- 未測量性能。
4. RADOS 叢集安裝
4.1. 系統名稱
- c7-ceph-admin
- c7-ceph-mon0
- c7-ceph-osd0
- c7-ceph-osd1
4.2. 防火牆設定
監視器預設在 tcp:6789 上聆聽,在此在 c7-ceph-mon0 上執行:
# firewall-cmd --zone=public --add-port=6789/tcp --permanent # firewall-cmd --reload
OSD 在一組連接埠上聆聽,預設為 tcp:6800-7300,因此在 c7-ceph-osd{0,1} 上執行:
# firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent # firewall-cmd --reload
4.3. Yum 軟件庫設定
StorageSIG Ceph 軟件庫仍未公開,因此以下步驟行不通。請手動從 cbs.centos.org 提取 storage7-ceph-hammer-testing 建設標籤。
在所有主機上,安裝來自 centos-extras 的 centos-release-ceph 套件:
# yum -y install --enablerepo=extras centos-release-ceph
4.4. ceph-deploy 用戶
在所有主機上,建立一個 ceph-deploy 用戶,連同 sudo/NOPASSWD 功能:
# adduser ceph-deploy # echo myPassword | passwd ceph-deploy --stdin # cat << EOF >/etc/sudoers.d/ceph-deploy ceph-deploy ALL = (root) NOPASSWD:ALL Defaults:ceph-deploy !requiretty EOF # chmod 440 /etc/sudoers.d/ceph-deploy
註:請勿採用 ceph 用戶。Ceph 長註程式在 Hammer 以 root 身份運行,但 Infernalis 及其後版本改用 ceph 用戶。
在 ceph-admin 以 ceph-deploy 身份建立一個擁有密碼的 ssh 金鑰:
$ ssh-keygen -b 4096 (do not use an empty passphrase) $ ssh-agent bash $ ssh-add $ for node in c7-ceph-admin c7-ceph-mon0 c7-ceph-osd0 c7-ceph-osd1 ; do ssh-copy-id $node ; done
4.5. 停用 SELinux
採用 Ceph Hammer 必須停用 SELinux。Ceph Infernalis 及其後版本已含有正式的 SELinux 政策。
$ for node in c7-ceph-admin c7-ceph-mon0 c7-ceph-osd0 c7-ceph-osd1 ; do ssh $node sudo sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config ; done $ for node in c7-ceph-mon0 c7-ceph-osd0 c7-ceph-osd1 ; do ssh $node sudo reboot ; done $ sudo reboot
在 ceph-admin 上再次登入成為 ceph-deploy:
$ ssh-agent bash $ ssh-add
4.6. 套件安裝
在 ceph-admin 上以 ceph-deploy 身份安裝監視器和 OSD 的 Ceph 套件。
$ sudo yum -y install ceph-deploy $ ceph-deploy install --mon c7-ceph-mon0 $ ceph-deploy install --osd c7-ceph-osd0 c7-ceph-osd1
注意:上游的 ceph-deploy 預設使用 ceph.com 的 yum 軟件庫。StorageSIG 版的 ceph-deploy 不會這樣做,因為 StorageSIG Ceph 的軟件庫預計快會被啟用。
4.7. 叢集安裝
在 ceph-admin 上以 ceph-deploy 身份建立叢集設定檔:
$ ceph-deploy new c7-ceph-mon0
加入設定:10GiB 日誌、每樣物件採用(一般及最少)2 個複製本、等。
$ cat << EOF >> ceph.conf osd_journal_size = 10000 osd_pool_default_size = 2 osd_pool_default_min_size = 2 osd_crush_chooseleaf_type = 1 osd_crush_update_on_start = true max_open_files = 131072 osd pool default pg num = 128 osd pool default pgp num = 128 mon_pg_warn_max_per_osd = 0 EOF
在 ceph-admin 上以 ceph-deploy 身份建立監視器:
$ ceph-deploy mon create-initial
在 ceph-admin 上以 ceph-deploy 身份安裝及設置叢集的指令行介面:
$ ceph-deploy install --cli c7-ceph-admin $ ceph-deploy admin c7-ceph-admin
由於我們不會進行升級,優化 CRUSH 的設定:
$ sudo ceph osd crush tunables optimal
現在將兩個 12GiB 硬碟連到每台 OSD 並重新開機。這些硬碟會成為 vdb 及 vdc。
在 ceph-admin 上以 ceph-deploy 身份刪除 c7-ceph-osd0 和 c7-ceph-osd1 上的 vdb 及 vdc:
$ ceph-deploy disk zap c7-ceph-osd0:vdb c7-ceph-osd1:vdb c7-ceph-osd0:vdc c7-ceph-osd1:vdc
c7-ceph-osd0 和 c7-ceph-osd1 的 vdc 上建立一個分割區,填滿全個硬碟。 待做
Add parted command here
在 ceph-admin 上以 ceph-deploy 身份安裝及設定 OSD,利用 vdb 作為資料庫(一般採用大型的 RAID0 轉盤),然後以 vdc1 作為它的日誌(一般採用 SSD 上的分割區):
$ ceph-deploy osd prepare c7-ceph-osd0:vdb:vdc1 c7-ceph-osd1:vdb:vdc1
在 ceph-admin 上以 ceph-deploy 身份啟動 OSD。請留意先前的步驟分割了 vdb,因此我們啟動 OSD 時指定以 vdb1 存放資料:
$ ceph-deploy osd activate c7-ceph-osd0:vdb1:vdc1 c7-ceph-osd1:vdb1:vdc1
要是你夠快,以下指令會先輸出 HEALTH_WARN,再過一會便輸出 HEALTH_OK:
$ sudo ceph -s
4.8. RADOS 叢集監控
叢集健康狀態:
$ sudo ceph health HEALTH_OK
業集現況:
$ sudo ceph status cluster 02b3e99f-b8a6-4fa0-a2ea-f70c46340ee6 health HEALTH_OK monmap e1: 1 mons at {c7-ceph-mon0=192.168.2.181:6789/0} election epoch 2, quorum 0 c7-ceph-mon0 osdmap e12: 2 osds: 2 up, 2 in pgmap v202: 65 pgs, 2 pools, 179 kB data, 1 objects 68740 kB used, 24486 MB / 24553 MB avail 65 active+clean
監視狀況:
$ sudo ceph mon_status {"name":"c7-ceph-mon0","rank":0,"state":"leader","election_epoch":2,"quorum":[0],"outside_quorum":[],"extra_probe_peers":[],"sync_provider":[],"monmap":{"epoch":1,"fsid":"02b3e99f-b8a6-4fa0-a2ea-f70c46340ee6","modified":"0.000000","created":"0.000000","mons":[{"rank":0,"name":"c7-ceph-mon0","addr":"192.168.2.181:6789\/0"}]}}
列舉 OSD:
$ sudo ceph osd tree ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY -1 0.01999 root default -2 0.00999 host c7-ceph-osd0 0 0.00999 osd.0 up 1.00000 1.00000 -3 0.00999 host c7-ceph-osd1 1 0.00999 osd.1 up 1.00000 1.00000
顯示空間:
$ sudo ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 24553M 24486M 68868k 0.27 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS rbd 0 0 0 12243M 0
5. RADOS 使用方法
5.1. 建立集用池
若要建立集用池:
$ sudo ceph osd pool create mypool 1 pool 'mypool' created $ sudo ceph osd lspools 0 rbd,4 mypool, $ sudo ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 24553M 24486M 68912k 0.27 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS rbd 0 0 0 12243M 0 mypool 4 0 0 12243M 0
5.2. 物件調處
若要建立一件物件及上載檔案至該物件:
$ echo "test data" > testfile $ sudo rados put -p mypool testfile testfile $ sudo rados -p mypool ls testfile
若要設定該物件的關鍵碼/值:
$ sudo rados -p mypool setomapval testfile mykey myvalue $ sudo rados -p mypool getomapval testfile mykey (length 7) : 0000 : 6d 79 76 61 6c 75 65 : myvalue
若要下載檔案:
$ sudo rados get -p mypool testfile testfile2 $ md5sum testfile testfile2 39a870a194a787550b6b5d1f49629236 testfile 39a870a194a787550b6b5d1f49629236 testfile2
6. Ceph 客戶端
6.1. 系統名稱
- c7-ceph-client
6.2. Yum 軟件庫設定
StorageSIG Ceph 軟件庫仍未公開,因此以下步驟行不通。請手動從 cbs.centos.org 提取 storage7-ceph-hammer-testing 建設標籤。
安裝來自 centos-extras 的 centos-release-ceph 套件:
# yum -y install --enablerepo=extras centos-release-ceph
6.3. Ceph 套件
你需要以下套件才能利用 C/C++、Python 及像 S3 般存取 Ceph 叢集:
# yum -y install librados2-devel python-rados python-boto
6.4. 設定 Ceph 存取
即將出現。
7. RADOS C++ 程式介面
即將出現。
8. RADOS 閘道安裝及設定
8.1. 安裝
系統名稱:
- c7-ceph-radosgw
停用 SELinux:
$ sudo sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config $ sudo reboot
安裝 Apache 網頁伺服器及 mod_ssl:
$ sudo yum -y install httpd mod_ssl openssl $ sudo firewall-cmd --zone=public --add-port=80/tcp --add-port=443/tcp --permanent $ sudo firewall-cmd --reload success
要是你的測試環境沒有 PKI,請建立一張自行簽署的憑證:
$ openssl genrsa -out ca.key 2048 $ openssl req -new -key ca.key -out ca.csr \ -subj "/C=KI/ST=Phoenix Islands/L=Nikumaroro/O=NR16020/OU=Ren Tree/CN=$(hostname -f)" $ openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt $ sudo cp ca.crt /etc/pki/tls/certs $ sudo cp ca.key /etc/pki/tls/private/ca.key $ sudo cp ca.csr /etc/pki/tls/private/ca.csr
當中:
/C=: 2 個字母的 [ISO 3166 https://en.wikipedia.org/wiki/ISO_3166] 國家碼(KI=Kiribati)
- /ST=: 區域或省份(Phoenix Islands)
- /L=: 地區(Nikumaroro)
- /O=: 機構名稱(NR16020)
- /OU=: 機構單位名稱(Ren Tree)
- /CN=: 通用名稱。採用 FQDN。
設置 Apache 網頁伺服器:
$ sudo sed -i -e 's,^SSLCertificateFile.*,SSLCertificateFile\ /etc/pki/tls/certs/ca.crt,g' \ /etc/httpd/conf.d/ssl.conf $ sudo sed -i -e 's,SSLCertificateKeyFile.*,SSLCertificateKeyFile\ /etc/pki/tls/private/ca.key,g' \ /etc/httpd/conf.d/ssl.conf
啟動及啟用 Apache:
$ sudo service httpd configtest Syntax OK $ sudo systemctl start httpd $ sudo systemctl enable httpd
由於我們的叢集是一個測試/示範叢集,我們將會安裝所謂的 簡易 RADOS 閘道。如何為求容錯而安裝 聯合閘道(採用分佈不同地域的 Ceph 儲存服務)已超越本文章涵蓋的範圍。
8.2. 簡易 RADOS 閘道設定
在 c7-ceph-admin 上以 ceph-deploy 身份執行:
$ ceph-deploy install --rgw c7-ceph-radosgw $ ceph-deploy rgw create c7-ceph-radosgw (...) [ceph_deploy.rgw][INFO ] The Ceph Object Gateway (RGW) is now running on host c7-ceph-radosgw and default port 7480
在 c7-ceph-radosgw 上以 ceph-deploy 身份執行:
$ sudo vi /etc/httpd/conf.d/rgw.conf
然後加插以下內容:
<VirtualHost *:80> ServerName localhost DocumentRoot /var/www/html ErrorLog /var/log/httpd/rgw_error.log CustomLog /var/log/httpd/rgw_access.log combined # LogLevel debug RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] SetEnv proxy-nokeepalive 1 ProxyPass / unix:///var/run/ceph/ceph.radosgw.gateway.fastcgi.sock|fcgi://localhost:9000/ </VirtualHost>
編輯 SSL VirtualHost 的設定:
$ sudo vi /etc/httpd/conf.d/ssl.conf
然後在檔案底部,於 </VirtualHost> 標籤前插入:
ErrorLog /var/log/httpd/rgw_error.log CustomLog /var/log/httpd/rgw_access.log combined # LogLevel debug RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] SetEnv proxy-nokeepalive 1 ProxyPass / unix:///var/run/ceph/ceph.radosgw.gateway.fastcgi.sock|fcgi://localhost:9000/
重新啟動 httpd:
sudo systemctl restart httpd
建立一名用戶:
$ sudo radosgw-admin user create --uid="testuser" --display-name="First User"
過了一會(在採用 SSD 為後台的 Ceph 叢集約需十秒),便會輸出:
{ "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "auid": 0, "subusers": [], "keys": [ { "user": "testuser", "access_key": "ACCESS_KEY", "secret_key": "SECRET_KEY" } ], "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": [] }
請保留 ACCESS_KEY 和 SECRET_KEY 的值。
8.3. 利用 S3 程式介面測試閘道
在 c7-ceph-client 上建立一個含有以下內容的 s3test.py 檔:
import boto import boto.s3.connection access_key = 'ACCESS_KEY' secret_key = 'SECRET_KEY' conn = boto.connect_s3( aws_access_key_id = access_key, aws_secret_access_key = secret_key, host = 'c7-ceph-radosgw', is_secure=True, calling_format = boto.s3.connection.OrdinaryCallingFormat(), ) bucket = conn.create_bucket('my-new-bucket') for bucket in conn.get_all_buckets(): print "{name}\t{created}".format( name = bucket.name, created = bucket.creation_date, ) bucket = conn.delete_bucket('my-new-bucket')
執行它:
$ python s3test.py my-new-bucket 2016-01-30T22:05:30.000Z
截至此處,你便擁有一個可用的 S3 閘道。你可在 官方教程 找到更多關於 python-boto 的資訊。
9. MDS 及 CephFS 的安裝
即將出現。
10. 總結
此頁的靈感源自 Ceph 社群 的快速入門指南。
請參考 Ceph 社群的文檔 主頁 取得更詳盡的資料。
Translation of revision 32