[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

供測試或開發 RADOS 用的 Ceph 叢集簡易部署

1. 先決條件

擁有基本的 Ceph 詞匯知識(例如:MonitorOSDRADOSRADOS 閘道RBDMDSCephFS)。

建議閱讀,至少速讀,Ceph Hammermaster 分支 的架構文件。

最少 7 台相同的 CentOS 7.2 x86_64 系統。此指南假設 KVM 虛擬電腦(磁碟裝置是 vdb、vdc 等)但改用實體硬件應該問題不大。

2. 描述

我們將會部署:

監視器在一個 PAXOS 叢集中運作,因此生產用時必須有三個(或五個),但我們可用一個監視器作測試之用。

一個生產用的 Ceph 叢集需要最少三個 OSD,因為每樣物件預設都會被儲存三次,但我們將會用兩個 OSD,並編輯設定檔來反映這個事實。

3. 警告

被建立出來的測試叢集並不適用於生產用。請勿按此指引建立生產系統,因為:

4. RADOS 叢集安裝

4.1. 系統名稱

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. 系統名稱

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. 安裝

系統名稱:

停用 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

當中:

設置 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


2023-09-11 07:23