[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 软件库设置

在所有主机上,安装来自 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:24