1、Ceph是分布式存储系统,支持三种接口。

Object:有原生的API,而且也兼容Swift和S3的API

Block:支持精简配置、快照、克隆

File:Posix接口,支持快照

Ceph也是分布式存储系统,它的特点是:

高扩展性:使用普通x86服务器,支持10~1000台服务器,支持TB到PB级的扩展。

高可靠性:没有单点故障,多数据副本,自动管理,自动修复。

高性能:数据分布均衡,并行化度高。对于objects storage和block storage,不需要元数据服务器。

目前Inktank公司掌控Ceph的开发,但Ceph是开源的,遵循LGPL协议。Inktank还积极整合Ceph和其他云计算和大数据平台,目前Ceph支持OpenStack、CloudStack、OpenNebula、Hadoop等。



1.1、组件:

Ceph OSDs: Object Storage Device,提供存储资源。

Monitors:维护整个Ceph集群的全局状态。

MDSs: 用于保存CephFS的元数据。



1.2、映射

Ceph的命名空间是 (Pool, Object),每个Object都会映射到一组OSD中(由这组OSD保存这个Object):

(Pool, Object) → (Pool, PG) → OSD set → Disk

Ceph中Pools的属性有:

Object的副本数

Placement Groups的数量

所使用的CRUSH Ruleset

在Ceph中,Object先映射到PG(Placement Group),再由PG映射到OSD set。每个Pool有多个PG,每个Object通过计算hash值并取模得到它所对应的PG。PG再映射到一组OSD(OSD的个数由Pool 的副本数决定),

第一个OSD是Primary,剩下的都是Replicas。

数据映射(Data Placement)的方式决定了存储系统的性能和扩展性。(Pool, PG) → OSD set 的映射由四个因素决定:

CRUSH算法:一种伪随机算法。

OSD MAP:包含当前所有Pool的状态和所有OSD的状态。

CRUSH MAP:包含当前磁盘、服务器、机架的层级结构。

CRUSH Rules:数据映射的策略。这些策略可以灵活的设置object存放的区域

把Object分成组,这降低了需要追踪和处理metadata的数量(在全局的层面上,我们不需要追踪和处理每个object的metadata和placement,只需要管理PG的metadata就可以了。PG的数量级远远低于object的

数量级)。

增加PG的数量可以均衡每个OSD的负载,提高并行度。

分隔故障域,提高数据的可靠性。


1.3、强一致性

Ceph的读写操作采用Primary-Replica模型,Client只向Object所对应OSD set的Primary发起读写请求,这保证了数据的强一致性。

由于每个Object都只有一个Primary OSD,因此对Object的更新都是顺序的,不存在同步问题。

当Primary收到Object的写请求时,它负责把数据发送给其他Replicas,只要这个数据被保存在所有的OSD上时,Primary才应答Object的写请求,这保证了副本的一致性。



RBD的I/O路径很长,要经过网络、文件系统、磁盘:

Librbd -> networking -> OSD -> FileSystem -> Disk


2、案例说明:

节点:

osd节点,每个系统都添加500G硬盘

10.200.197.11 cs1.99bill.com

10.200.197.12 cs2.99bill.com

10.200.197.13 cs3.99bill.com

10.200.197.14 cs4.99bill.com

10.200.197.15 cs5.99bill.com

10.200.197.16 cs6.99bill.com

10.200.197.17 cs7.99bill.com

10.200.197.18 cs8.99bill.com

10.200.197.19 cs9.99bill.com

10.200.197.20 cs10.99bill.com

10.200.197.21 cs11.99bill.com

10.200.197.22 cs12.99bill.com

10.200.197.23 cs13.99bill.com

10.200.197.24 cs14.99bill.com

10.200.197.25 cs15.99bill.com

mon节点

10.200.197.200 nc1.99bill.com

10.200.197.201 nc2.99bill.com

10.200.197.202 nc3.99bill.com

客户端

10.200.197.100 vip

10.200.197.252 cn1.99bill.com

10.200.197.253 cn2.99bill.com



mount 10.200.197.100:/data /mnt/data

2.1、

关闭防火墙或者开放 6789/6800~6900 端口、关闭 SELINUX;

配置源

centos7.repo

[ceph]

name=CentOS-- 163.com

baseurl= http://mirrors.163.com/ceph/rpm/el7/x86_64/

gpgcheck=0

gpgkey= http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7



[root@nc1 yum.repos.d]# cat epel.repo

[epel]

name=Extra Packages for Enterprise Linux 7 - $basearch

#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch

mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch

failovermethod=priority

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7


[epel-debuginfo]

name=Extra Packages for Enterprise Linux 7 - $basearch - Debug

#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug

mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch

failovermethod=priority

enabled=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

gpgcheck=1


[epel-source]

name=Extra Packages for Enterprise Linux 7 - $basearch - Source

#baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS

mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch

failovermethod=priority

enabled=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

gpgcheck=1

2.2、每台yum  install ceph


安装部署主机(ceph-deploy)安装环境准备

cd /etc/ceph/

yum install ceph-deploy -y


创建 mon 节点 

cd /etc/ceph/

ceph-deploy new nc1 nc2 nc3

2.3:添加初始 monitor 节点和收集秘钥

ceph-deploy mon create-initial

2.4:验证集群 mon 节点安装成功

[root@nc1 ceph]# ceph -s

安装集群 osd 服务

每台osd服务器格式化盘

fdisk /dev/sdb

mkfs.xfs /dev/sdb1



执行 osd 初始化命令



ceph-deploy --overwrite-conf osd prepare cs1:sdb1 cs2:sdb1 cs3:sdb1 cs4:sdb1 cs5:sdb1 cs6:sdb1 cs7:sdb1

 激活 OSD

ceph-deploy osd activate cs1:sdb1 cs2:sdb1 cs3:sdb1 cs4:sdb1 cs5:sdb1 cs6:sdb1 cs7:sdb1

2.5:验证 osd 启动状态

 ceph osd tree

 

 

2.6:PGs per OSD (2 < min 30)报错解决:

修改前查看数量

[root@nc1 ~]# ceph osd dump|grep rbd

修改配置:

ceph osd pool set rbd pg_num 128

ceph osd pool set rbd pgp_num 128


2.8:添加元数据服务器 

a:添加元数据服务器

cd /etc/ceph

ceph-deploy --overwrite-conf mds create nc{1..3}

b:验证 mds 服务

[root@nc1 ceph]# ceph mds stat

e1: 0/0/0 up

c:状态查看。还没有创建时候的状态。

对于一个刚创建的 MDS 服务,虽然服务是运行的,但是它的状态直到创建 pools 以及文件系统的时候才会变为

Active.

[root@nc1 ~]# ceph mds dump

d:通过下面的操作创建 Filesystem

[root@nc1 ~]# ceph osd pool create cephfs_data 128

[root@nc1 ~]# ceph osd pool create cephfs_metadata 128

[root@nc1 ~]# ceph fs new leadorfs cephfs_metadata cephfs_data

e:成功创建后,mds stat 的状态如下

[root@nc1 ~]# ceph mds stat


2.9:同步集群配置文件

同步配置文件和 client.admin key

ceph-deploy --overwrite-conf admin nc{1..3} cs{1..9}

单独同步配置文件

ceph-deploy --overwrite-conf config push nc{1..3} cs{1..9}


2.10:修改 crushmap 信息


1:把 ceph 的 crush map 导出并转换为文本格式,

先把 crush map 以二进制的形式导入到 test 文本。

Ptmind Ceph Cluster 安装配置文档

ceph osd getcrushmap -o test

2:转换为可读格式:

用 crushtool 工具把 test 里的二进制数据转换成文本形式保存到 test1 文档里。

crushtool -d test -o test1

3:把重新写的 ceph crush 导入 ceph 集群

把 test1 转换成二进制形式

crushtool -c test1 -o test2

把 test2 导入集群、

ceph osd setcrushmap -i test2 



2.11:清理软件包

ceph-deploy purge nc{1..3} cs{1..9}

2:卸载之前挂载的 osd 磁盘

/usr/bin/umount -a

rm -rf /var/lib/ceph



2.12:集群配置参数优化

1:配置参数优化

#

fsid = 973482fb-acf2-4a39-a691-3f810120b013

mon_initial_members = nc1, nc2, nc3

mon_host = 172.16.6.151,172.16.6.152,172.16.6.153

auth_cluster_required = cephx

auth_service_required = cephx

auth_client_required = cephx

#数据副本数,手动设置等同于 ceph osd pool set {pool-name} size {size}。

osd pool default size = 3

#数据最小副本数,以向客户端确认写操作。如果未达到最小值, Ceph 就不会向客户端回复已写确认。

osd pool default min size = 1

#当 Ceph 存储集群开始时,Ceph 在 OS 等级(比如, 文件描述符最大的)设置 max open fds 。它帮助阻止 Ceph OSD 守

护进程在文件描述符之外运行。

max open files= 131072

#集群公共网络

public network = 192.168.0.0/16

#集群私有网络

cluster network = 192.168.0.0/16

###OSD filestore

#扩展属性(XATTRs),为 XATTRS 使用 object map,EXT4 文件系统时使用,XFS 或者 btrfs 也可以使用默认:false

#为 XATTR 使用对象图,使用 ext4 文件系统的时候要设置。

filestore xattr use omap = true

#在一个 CRUSH 规则内用于 chooseleaf 的桶类型。用序列号而不是名字

osd crush chooseleaf type = 1

[mon]

#时钟偏移

mon clock drift allowed = .50

# OSD 宕机后数据开始恢复时间

mon osd down out interval = 900

#MON-OSD 满比,在被 OSD 进程使用之前一个硬盘可用空间大于%20,认为状态良好。

mon osd full ratio = .80

#MON-OSD nearfull 率,在被 OSD 进程使用之前一个硬盘的剩余空间大于%30,认为状态良好,另集群总空间使用率

大于%70,系统会告警。

mon osd nearfull ratio = .70

[osd]

#osd 格式化磁盘的分区格式 xfs

osd mkfs type = xfs

#强制格式化

osd mkfs options xfs = -f

#每个存储池默认 pg 数

osd pool default pg num = 3000

#每个存储池默认 pgp 数

osd pool default pgp num = 3000

##同步间隔

#从日志到数据盘最大同步间隔间隔秒数,默认:5

filestore max sync interval = 15

#从日志到数据盘最小同步间隔秒数,默认 0.1

filestore min sync interval = 10


##队列

#数据盘最大接受的操作数,超过此设置的请求会被拒绝。默认:500

filestore queue max ops = 25000

#数据盘一次操作最大字节数(bytes)默认:100 << 20

filestore queue max bytes = 10485760

#数据盘能够 commit 的最大操作数默认:500

filestore queue committing max ops = 5000

#数据盘能够 commit 的最大字节数(bytes)100 << 20

filestore queue committing max bytes = 10485760000

#最大并行文件系统操作线程数,默认 2;

filestore op threads = 32

###osd journal

#注意,Ceph OSD 进程在往数据盘上刷数据的过程中,是停止写操作的。

#OSD 日志大小(MB)默认 5120,推荐 20000,使用 ssd 块存储日志,可以设置为 0,使用整个块。

osd journal size = 10000 #从 v0.54 起,如果日志文件是块设备,这个选项会被忽略,且使用整个块设备。

#一次性写入的最大字节数(bytes)默认:10 << 20

journal max write bytes = 1073714824

#journal 一次写入日志的最大数量,默认:100

journal max write entries = 10000

#journal 一次性最大在队列中的操作数,默认 500

journal queue max ops = 50000

#journal 一次性最大在队列中的字节数(bytes),默认:10 << 20

journal queue max bytes = 10485760000

###OSD 通讯

#注意:增加 osd op threads 和 disk threads 会带来额外的 CPU 开销

#OSD 一次可写入的最大值(MB),默认:90

osd max write size = 512

#客户端允许在内存中的最大数据(bytes),默认:500MB 默认 500 * 1024L * 1024L =524288000

osd client message size cap = 2147483648

#在 Deep Scrub 时候允许读取的字节数(bytes),默认:524288

osd deep scrub stride = 131072

#OSD 进程操作的线程数,设置为 0 来禁用它。增加的数量可能会增加请求的处理速率。默认:2

osd op threads = 8

#OSD 密集型操作例如恢复和 Scrubbing 时的线程,默认:1

osd disk threads = 5

###OSD 映射

#保留 OSD Map 的缓存(MB),默认:500

osd map cache size = 1024

#OSD 进程在内存中的 OSD Map 缓存(MB),默认:50

osd map cache bl size = 128

#Ceph OSD xfs Mount 选项默认:rw,noatime,inode64

osd mount options xfs = rw,noexec,nodev,noatime,nodiratime,nobarrier

###OSD recovery

#osd 异常数据恢复启动的恢复进程数量,默认:1

Ptmind Ceph Cluster 安装配置文档 --康建华

osd recovery threads = 2

#恢复操作优先级,它是相对 OSD 客户端 运算 优先级。取值 1-63,值越高占用资源越高,默认:10 。

osd recovery op priority = 4

#同一时间内活跃的恢复请求数,更多的请求将加速复苏,但请求放置一个增加的群集上的负载。默认:15

osd recovery max active = 10

#一个 OSD 允许的最大 backfills 数,默认:10

osd max backfills = 4

[client]

#启用缓存 RADOS 块设备,默认:false

rbd cache = true

#RBD 缓存大小(以字节为单位)默认:33554432

rbd cache size = 268435456

#缓存为 write-back 时允许的最大 dirty 字节数(bytes),如果为 0,使用 write-through ,默认:25165824

#Write-through:向高速 Cache 写入数据时同时也往后端慢速设备写一份,两者都写完才返回。

#Write-back:向高速 Cache 写完数据后立即返回,数据不保证立即写入后端设备。给调用者的感觉是速度快,但需

要额外的机制来防止掉电带来的数据不一致。

rbd cache max dirty = 134217728

#在被刷新到存储盘前 dirty 数据存在缓存的时间(seconds)默认:1

rbd cache max dirty age = 5

[mon.nc1]

host = nc1

mon data = /var/lib/ceph/mon/ceph-nc1/

mon addr = 172.16.6.151:6789

[mon.nc2]

host = nc2

 mon data = /var/lib/ceph/mon/ceph-nc2/

mon addr = 172.16.6.152:6789

[mon.nc3]

host = nc3

 mon data = /var/lib/ceph/mon/ceph-nc3/

mon addr = 172.16.6.153:6789



3使用 


3.1、cephfs


1、添加元数据服务器

cd /etc/ceph

ceph-deploy --overwrite-conf mds create nc{1..3}

2:验证 mds 服务

[root@nc1 ceph]# ceph mds stat

2:通过下面的操作创建 Filesystem

[root@nc1 ~]# ceph osd pool create cephfs_data 128

[root@nc1 ~]# ceph osd pool create cephfs_metadata 128

[root@nc1 ~]# ceph fs new leadorfs cephfs_metadata cephfs_data


3、创建密钥文件

Ceph 存储集群默认启用认证,你应该有个包含密钥的配置文件(但不是密钥环本身)。用下述方法获取某一用户的密钥:

在密钥环文件中找到与某用户对应的密钥,例如:

cat ceph.client.admin.keyring

找到用于挂载 Ceph 文件系统的用户,复制其密钥。大概看起来如下所示:

[client.admin]

   key = AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==

打开文本编辑器。


把密钥粘帖进去,大概像这样:

AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==

保存文件,并把其用户名 name 作为一个属性(如 admin.secret )。

4、ceph使用

[root@TMCT-15 ~]# mount -t ceph 192.168.9.104:6789:/ /mnt/mycephfs2 -o name=admin,secretfile=/data/admin.secret

FATAL: Module ceph not found.

failed to load ceph kernel module (1)

mount error: ceph filesystem not supported by the system


[root@TMCT-15 ~]# rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org

[root@TMCT-15 ~]# rpm -Uvh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm

[root@TMCT-15 ~]# yum --enablerepo=elrepo-kernel install kernel-ml

If you want that new kernel to boot by default, edit /etc/grub.conf, and change the Default=1 to Default=0, and reboot.

挂载

mount -t ceph 192.168.9.104:6789,192.168.9.105:6789,192.168.9.106:6789:/credit_platform /opt/netdata/Creditdata -o name=admin,secretfile=/etc/ceph/admin.secret



3.2、块设备

创建一个pool ‘ db-pool’

[root@test-1 ~]# ceph osd pool create  db-pool 128 128

创建镜像

rbd create db1 --size 102400 --pool db-pool

我们同时也可以改变p_w_picpath的容量大小

[root@nc3 ceph]# rbd resize --size 1024000   db1  --pool db-pool

查看pool中的镜像

rbd ls db-pool


映射

rbd map db1 --pool db-pool --id admin

查看映射

rbd showmapped

删除映射

rbd unmap /dev/rbd1

挂载

mount /dev/rbd0 /data/

 

实践

keepalived+nfs

nfs挂载块设备,并提供nfs服务。

[root@cn1 keepalived]# cat keepalived.conf

! Configuration File for keepalived


global_defs {

   notification_email {

     linjun.zhou@99bill.com

   }

   notification_email_from lvs@99bill.com

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_script chk_ceph {

    script "/etc/keepalived/chk_ceph.keepalived.sh"

    interval 1

    weight 2

}


vrrp_script chk_mantaince_down {

   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"

   interval 1

   weight 2

}

vrrp_instance VI_1 {

    state MASTER

    interface ens192

    virtual_router_id 51

    priority 101

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass sLAlDoDEWs

    }

  track_interface {

       ens192

    }

    virtual_ipaddress {

        10.200.197.100

    }

    track_script {

        chk_ceph

        chk_mantaince_down

    }



    notify_master "/etc/keepalived/notify.sh master"

    notify_backup "/etc/keepalived/notify.sh backup"

    notify_fault "/etc/keepalived/notify.sh fault"


}

[root@cn1 keepalived]# cat notify.sh

#!/bin/bash

# Author: zljeyou@163.com

# description: An example of notify script

#


vip=10.200.197.100

contact=linjun.zhou@99bill.com


notify() {

    mailsubject="`hostname` to be $1: $vip floating"

    mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"

    echo $mailbody | mail -s "$mailsubject" $contact

}


case "$1" in

    master)

        notify master

        ssh 10.200.197.253 """umount -l /data/"""

        ssh 10.200.197.253 """ rbd showmapped|grep /dev/rbd|awk '{print \"rbd unmap \"\$NF}'|bash;"""

        map=`ssh 10.200.197.253 """rbd map db1 --pool db-pool --id admin"""`

        ssh 10.200.197.253 """mount ${map} /data """

        umount -l /data/

        rbd showmapped|grep /dev/rbd|awk '{print "rbd unmap "$NF}'|bash;

        rbd map db1 --pool db-pool --id admin

        map=`rbd showmapped|grep /dev/rbd|awk '{print $NF}'|tail -n 1`

        mount $map /data/

        exit 0

    ;;

    backup)

        notify backup

        umount -l /data/

        rbd showmapped|grep /dev/rbd|awk '{print "rbd unmap "$NF}'|bash;

        rbd map db1 --pool db-pool --id admin

        map=`rbd showmapped|grep /dev/rbd|awk '{print $NF}'|tail -n 1`

        mount $map /data/

        ssh 10.200.197.253 """umount -l /data/"""

        ssh 10.200.197.253 """ rbd showmapped|grep /dev/rbd|awk '{print \"rbd unmap \"\$NF}'|bash;"""

        map=`ssh 10.200.197.253 """rbd map db1 --pool db-pool --id admin"""`

        ssh 10.200.197.253 """mount ${map} /data """

        exit 0

    ;;

    fault)

        notify fault

        exit 0

    ;;

    *)

        echo 'Usage: `basename $0` {master|backup|fault}'

        exit 1

    ;;

esac

[root@cn1 keepalived]# cat chk_ceph.keepalived.sh

#!/bin/bash

# description:

# 定时查看nfs是否存在,如果不存在则启动nfs

# 如果启动失败,则返回1

status=`ps aux --no-header|grep nfs|grep -v grep|wc -l`

if [ $status -eq 0 ];then

/bin/systemctl restart  nfs.service

sleep 3

status=`ps aux --no-header|grep nfs|grep -v grep|wc -l`

if [ ${status} -eq 0 ];then

exit 1

fi

fi




3.3、CEPH 对象存储快速入门


从 firefly(v0.80)起,Ceph 存储集群显著地简化了 Ceph 对象网关的安装和配置。网关守护进程内嵌了 Civetweb,无需额外安装 web 服务器或配置 FastCGI。此外,可以直接 使用 ceph-deploy 来安装网关软件包、生成密钥、配置数据目录以及创建一个网关实例。


Tip Civetweb 默认使用 7480 端口。要么直接打开 7480 端口,要么在你的 Ceph 配置文件中设置首选端口(例如 80 端口)。

要使用 Ceph 对象网关,请执行下列步骤:


安装 CEPH 对象网关


在 client-node 上执行预安装步骤。如果你打算使用 Civetweb 的默认端口 7480 ,必须通过 firewall-cmd 或 iptables 来打开它。详情见预检。


从管理节点的工作目录,在 client-node 上安装 Ceph 对象网关软件包。例如:


ceph-deploy install --rgw <client-node> [<client-node> ...]

新建 CEPH 对象网关实例

ceph-deploy install --rgw cn2

yum install ceph-radosgw

从管理节点的工作目录,在 client-node 上新建一个 Ceph 对象网关实例。例如:


ceph-deploy rgw create

一旦网关开始运行,你就可以通过 7480 端口来访问它(比如 http://client-node:7480 )。


配置 CEPH 对象网关实例


通过修改 Ceph 配置文件可以更改默认端口(比如改成 80 )。增加名为 [client.rgw.<client-node>] 的小节,把 <client-node> 替换成你自己 Ceph 客户端节点的短名称(即 hostname -s 的输出)。例如,你的节点名就是 client-node ,在 [global] 节后增加一个类似于下面的小节:


[client.rgw.client-node]

rgw_frontends = "civetweb port=80"

Note 确保在 rgw_frontends 键值对的 port=<port-number> 中没有空格。

Important 如果你打算使用 80 端口,确保 Apache 服务器没有在使用该端口,否则会和 Civetweb 冲突。出现这种情况时我们建议移除 Apache 服务。

为了使新端口的设置生效,需要重启 Ceph 对象网关。在 RHEL 7 和 Fedora 上 ,执行:


sudo systemctl restart ceph-radosgw.service

在 RHEL 6 和 Ubuntu 上,执行:


sudo service radosgw restart id=rgw.<short-hostname>

最后,检查节点的防火墙,确保你所选用的端口(例如 80 端口)处于开放状态。如果没有,把该端口加入放行规则并重载防火墙的配置。例如:


sudo firewall-cmd --list-all sudo firewall-cmd --zone=public --add-port

80/tcp --permanent

sudo firewall-cmd --reload

关于使用 firewall-cmd 或 iptables 配置防火墙的详细信息,请参阅预检。


你应该可以生成一个未授权的请求,并收到应答。例如,一个如下不带参数的请求:


http://<client-node>:80

应该收到这样的应答:


<?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>

更多管理和 API 细节请参阅 Ceph 对象网关的配置 指南。




http://michaelkang.blog.51cto.com/1553154/1732525





调试对象存储,推荐式s3cmd


1:安装和配置s3cmd

yum install s3cmd -y


2:配置s3cmd进行S3接口测试,初始化 s3cmd本地环境  将之前radosgw-admin创建的user的access_key和secret_key,根据本机实际进行赋值;


vim ~/.s3cfg


[default]

access_key = 6FIZEZBT3LUBTPC60Z33

bucket_location = US

cloudfront_host = ceph.ptengine.cn

cloudfront_resource = /2015-12-15/distribution

default_mime_type = binary/octet-stream

delete_removed = False

dry_run = False

encoding = UTF-8

encrypt = False

follow_symlinks = False

force = False

get_continue = False

gpg_command = /usr/bin/gpg

gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s

gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s

gpg_passphrase =

guess_mime_type = True

host_base = ceph-100-80

host_bucket = %(*)s.ceph-100-80

human_readable_sizes = False

list_md5 = False

log_target_prefix =

preserve_attrs = True

progress_meter = True

proxy_host =

proxy_port = 0

recursive = False

recv_chunk = 4096

reduced_redundancy = False

secret_key = DbiQnQGuC7HMadOuptFgVMOMJhnMKKG2UNtePbS5

send_chunk = 4096

simpledb_host = rgw.ptengine.cn

skip_existing = False

socket_timeout = 10

urlencoding_mode = normal

use_https = False

verbosity = WARNING


3:测试是否配置成功:


s3cmd --configure

将会问你一系列问题:

    AWS S3的访问密钥和安全密钥

    对AWS S3双向传输的加密密码和加密数据

    为加密数据设定GPG程序的路径(例如,/usr/bin/gpg)

    是否使用https协议

    如果使用http代理,设定名字和端口


配置将以保存普通文本格式保存在 ~/.s3cfg.

一路选确定,因为我们已经配置过了,直到最后一步Test选y:


########################本人测试环境配置,s3cmd自测ok#############################

[root@ceph-100-80 ceph]# more ~/.s3cfg 

[default]

access_key = 6FIZEZBT3LUBTPC60Z33

access_token = 

add_encoding_exts = 

add_headers = 

bucket_location = US

ca_certs_file = 

cache_file = 

check_ssl_certificate = True

check_ssl_hostname = True

cloudfront_host = rgw.ptengine.cn

default_mime_type = binary/octet-stream

delay_updates = False

delete_after = False

delete_after_fetch = False

delete_removed = False

dry_run = False

enable_multipart = True

encoding = UTF-8

encrypt = False

expiry_date = 

expiry_days = 

expiry_prefix = 

follow_symlinks = False

force = False

get_continue = False

gpg_command = /usr/bin/gpg

gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s

gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s

gpg_passphrase = 

guess_mime_type = True

host_base = rgw.ptengine.cn

host_bucket = %(*)s.rgw.ptengine.cn

human_readable_sizes = False

invalidate_default_index_on_cf = False

invalidate_default_index_root_on_cf = True

invalidate_on_cf = False

kms_key = 

limitrate = 0

list_md5 = False

log_target_prefix = 

long_listing = False

max_delete = -1

mime_type = 

multipart_chunk_size_mb = 15

preserve_attrs = True

progress_meter = True

proxy_host = 

proxy_port = 0

put_continue = False

recursive = False

recv_chunk = 4096

reduced_redundancy = False

requester_pays = False

restore_days = 1

secret_key = DbiQnQGuC7HMadOuptFgVMOMJhnMKKG2UNtePbS5

send_chunk = 4096

server_side_encryption = False

signature_v2 = False

simpledb_host = rgw.ptengine.cn

skip_existing = False

socket_timeout = 10

stop_on_error = False

storage_class = 

urlencoding_mode = normal

use_https = False

use_mime_magic = True

verbosity = WARNING

website_endpoint = http://rgw.ptengine.cn/

website_error = 

website_index = index.html


#####################################################


4:s3cmd命令参数介绍:


帮助命令:

s3cmd --help

使用方法


1:配置,主要是 Access Key ID 和 Secret Access Key

s3cmd --configure


2:列举所有 Buckets。(bucket 相当于根文件夹)

s3cmd ls


3:创建 bucket,且 bucket 名称是唯一的,不能重复。

s3cmd mb s3://my-bucket-name


4:删除空 bucket

s3cmd rb s3://my-bucket-name


5:列举 Bucket 中的内容

s3cmd ls s3://my-bucket-name


6:上传 file.txt 到某个 bucket,

s3cmd put file.txt s3://my-bucket-name/file.txt


7:上传并将权限设置为所有人可读

s3cmd put --acl-public file.txt s3://my-bucket-name/file.txt


8:批量上传文件

s3cmd put ./* s3://my-bucket-name/


9:下载文件

s3cmd get s3://my-bucket-name/file.txt file.txt


10:批量下载

s3cmd get s3://my-bucket-name/* ./


11:删除文件

s3cmd del s3://my-bucket-name/file.txt


12:来获得对应的bucket所占用的空间大小

s3cmd du -H s3://my-bucket-name



######目录处理规则########



以下命令都能将dir1 中的文件上传至my-bucket-name,但效果只截然不同的。


1:dir1 不带"/"斜杠,那么dir1会作为文件路径的一部分,相当于上传整个dir1目录,即类似 "cp -r dir1/"


~/demo$ s3cmd put -r dir1 s3://my-bucket-name/

dir1/file1-1.txt -> s3://my-bucket-name/dir1/file1-1.txt  [1 of 1]


2:带"/"斜杠的 dir1,相当于上传dir1目录下的所有文件,即类似 "cp ./* "


~/demo$ s3cmd put -r dir1/ s3://my-bucket-name/

dir1/file1-1.txt -> s3://my-bucket-name/file1-1.txt  [1 of 1]



########同步方法########


这是s3cmd 使用难点,但却是最实用的功能。官方使用说明见《s3cmd sync HowTo》http://s3tools.org/s3cmd-sync

首先明确,同步操作是要进行MD5校验的,只有当文件不同时,才会被传输。

常规同步操作


1:同步当前目录下所有文件

s3cmd sync  ./  s3://my-bucket-name/


s3cmd sync    s3://my-bucket-name/  ./


2:加 "--dry-run"参数后,仅列出需要同步的项目,不实际进行同步。

s3cmd sync  --dry-run ./  s3://my-bucket-name/


3:加 " --delete-removed"参数后,会删除本地不存在的文件。

s3cmd sync  --delete-removed ./  s3://my-bucket-name/


s3cmd sync --delete-removed --force ./  s3://test.bucket 



4:加 " --skip-existing"参数后,不进行MD5校验,直接跳过本地已存在的文件。

s3cmd sync  --skip-existing ./  s3://my-bucket-name/


4.2、高级同步操作


4.2.1、排除、包含规则(--exclude 、--include)


file1-1.txt被排除,file2-2.txt同样是txt格式却能被包含。

~/demo$ s3cmd sync --dry-run --exclude '*.txt' --include 'dir2/*' ./  s3://my-bucket-name/

exclude: dir1/file1-1.txt

upload: ./dir2/file2-2.txt -> s3://my-bucket-name/dir2/file2-2.txt


4.2.2、从文件中载入排除或包含规则。(--exclude-from、--include-from)

s3cmd sync  --exclude-from pictures.exclude ./  s3://my-bucket-name/


pictures.exclude 文件内容


# Hey, comments are allowed here ;-)

*.jpg

*.gif


4.2.3、排除或包含规则支持正则表达式

--rexclude 、--rinclude、--rexclude-from、--rinclude-from


移除osd


1. 移出集群(管理节点执行)

ceph osd out 7 (ceph osd tree中,REWEIGHT值变为0)

2. 停止服务(目标节点执行)

systemctl stop ceph-osd@7 (ceph osd tree中,状态变为DOWN)

3. 移出crush

ceph osd crush remove osd.7

4. 删除key

ceph auth del osd.7

5. 移除osd

ceph osd rm 7

6. 查找其所在主机是否还有osd,若有,进入第7步骤,否则

ceph osd crush remove `hostname`

7. 修改并同步ceph.conf文件

vi /etc/ceph/ceph.conf 

若存在,将该条信息删除[osd.7]

8. 删除目录文件

rm –rf * /var/lib/ceph/osd/ceph-7


4、监控

inkscope

它是通过ceph-rest-api收紧信息的

启动ceph-rest-api:

[root@CHN-ID-3-3W7 ~]# ceph-rest-api -n client.admin &

http://192.168.9.147:5000/api/v0.1

执行inkscopeProbe目录中的install.sh 脚本生成配置文件和执行文件

sysprobe:收集系统信息,必须被安装在所有ceph节点 yum install lshw sysstat pymongo python-devel  python-pip

pip install psutil

cephprobe:收集集群信息,只需要安装在某一个ceph节点