[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