Ceph+cosbench简介及环境搭建
一.Ceph简述
1.Ceph简介
Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。ceph 的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展。在国内一些公司的云环境中,通常会采用 ceph 作为openstack 的唯一后端存储来提高数据转发效率。Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。
2.Ceph特点
2.1高性能
2.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
高可用性
副本数可以灵活控制。
支持故障域分隔,数据强一致性。
多种故障场景自动进行修复自愈。
没有单点故障,自动管理。
2.2高可扩展性
去中心化。
扩展灵活。
随着节点增加而线性增长。
2.3特性丰富
支持三种存储接口:块存储、文件存储、对象存储。
支持自定义接口,支持多种语言驱动。
3.Ceph结构介绍
3.1.Ceph架构图
Ceph系统可以大致划分为两大部分,客户端和服务端,客户端包含了四种接口,服务端包含了元数据服务器,对象存储集群和集群监视器
图:ceph物理部署架构图
客户端
面向用户的使用提供接口,目前有三种存储方式接口提供,对象存储 RGW(rados gateway)、块存储 RBD(rados
block device) 和文件存储 CephFS。
块存储和文件存储都是基于对象存储来进行封装实现的,块存储和文件存储的底层还是对象存储。
1.对象存储(RGW:RADOS gateway)
Ceph 对象存储服务提供了 REST 风格的 API ,它有与 Amazon S3 和 OpenStack
Swift 兼容的接口。也就是通常意义的键值存储,其接口就是简单的GET、PUT、DEL和其他扩展;
RADOSGW是一套基于当前流行的RESTFUL协议的网关,并且兼容S3和Swift。
2.块存储(RBD:RADOS block device)
RBD通过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设备。
RBD 是通过librbd库对应用提供块存储,主要面向云平台的虚拟机提供虚拟磁盘;RBD类似传统的SAN存储,提供数据块级别的访问;
目前 RBD 提供了两个接口,一种是直接在用户态实现,
通过 QEMU Driver 供 KVM 虚拟机使用。 另一种是在操作系统内核态实现了一个内核模块。通过该模块可以把块设备映射给物理主机,由物理主机直接访问。
3.文件存储 (CEPH FS)
CEPH FS通过Linux内核客户端和FUSE来提供一个兼容POSIX的文件系统。
Ceph 文件系统服务提供了兼容 POSIX 的文件系统,可以直接挂载为用户空间文件系统。它跟传统的文件系统如Ext4是一个类型,区别在于分布式存储提供了并行化的能力;
4.原生接口
除了以上3种存储接口,
还可以直接使用 librados 的原生接口,直接和RADOS通信;
原生接口的优点是是它直接和和应用代码集成,操作文件很方便;但它的问题是它不会主动为上传的数据分片;一个1G的大对象上传,落到 Ceph 的存储磁盘上就是1G的文件;
而以上三个接口是具有分片功能(即:条带化 file-striping)
服务端
元数据服务器
主要是实现集群元数据的分布式管理
对象存储集群
因为ceph的三种存储接口都是通过对象存储实现的,对象存储集群将数据和元数据作为对象存储,执行其他关键职能。
对象存储集群的核心组件是RADOS
(Reliable, AutonomicDistributed Object Store)。
集群监视器
执行监视功能,保证集群的健康运行和告警
3.2. Ceph组件介绍
服务端 RADOS 集群主要由两种节点组成:一种是为数众多的、负责完成数据存储和维护功能的OSD(Object Storage Device),另一种则是若干个负责完成系统状态检测和维护的monitor。
Ceph Monitor
Monitor: 集群提供了整个存储系统的节点信息等全局的配置信息,通过 Paxos 算法保持数据的一致性。
由该英文名字我们可以知道它是一个监视器,负责监视Ceph集群,维护Ceph集群的健康状态,同时维护着Ceph集群中的各种Map图,比如OSD Map、Monitor Map、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和object id等计算出数据最终存储的位置。
Mon节点监控着整个ceph集群的状态信息,监听于tcp的6789端口。每一个ceph集群中至少要有一个Mon节点,官方推荐每个集群至少部署三台。Mon节点中保存了最新的版本集群数据分布图(cluster map)的主副本。客户端在使用时,需要挂载mon节点的6789端口,下载最新的cluster map,通过crush算法获得集群中各osd的IP地址,然后再与osd节点直接建立连接来传输数据。所以对于ceph来说,并不需要有集中式的主节点用于计算与寻址,客户端分摊了这部分工作。而且客户端也可以直接和osd通信,省去了中间代理服务器的额外开销。
Mon节点之间使用Paxos算法来保持各节点cluster map的一致性;各mon节点的功能总体上是一样的,相互间的关系可以被简单理解为主备关系。如果主mon节点损坏,其他mon存活节点超过半数时,集群还可以正常运行。当故障mon节点恢复时,会主动向其他mon节点拉取最新的cluster map。
Mon节点并不会主动轮询各个osd的当前状态,相反,osd只有在一些特殊情况才会上报自己的信息,平常只会简单的发送心跳。特殊情况包括:1、新的OSD被加入集群;2、某个OSD发现自身或其他OSD发生异常。Mon节点在收到这些上报信息时,则会更新cluster map信息并加以扩散。
cluster map信息是以异步且lazy的形式扩散的。monitor并不会在每一次cluster map版本更新后都将新版本广播至全体OSD,而是在有OSD向自己上报信息时,将更新回复给对方。类似的,各个OSD也是在和其他OSD通信时,如果发现对方的osd中持有的cluster map版本较低,则把自己更新的版本发送给对方。
Ceph OSD
OSD的英文全称是Object Storage Device,它的主要功能是存储数据、复制数据、平衡数据、恢复数据等,与其它OSD间进行心跳检查等,并将一些变化情况上报给Ceph
Monitor。一般情况下一块硬盘对应一个OSD,由OSD来对硬盘存储进行管理,当然一个分区也可以成为一个OSD。
Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成,对于Ceph OSD Deamon而言,Linux文件系统显性的支持了其拓展性,一般Linux文件系统有好几种,比如有BTRFS、XFS、Ext4等,BTRFS虽然有很多优点特性,但现在还没达到生产环境所需的稳定性,一般比较推荐使用XFS。
在ceph中,每一个osd进程都可称作是一个osd节点,也就是说,每台存储服务器上可能包含了众多的osd节点,每个osd节点监听不同的端口,类似于在同一台服务器上跑多个mysql或redis。每个osd节点可以设置一个目录作为实际存储区域,也可以是一个分区,一整块硬盘。
Ceph MDS(可选)
全称是Ceph MetaData Server,Mds是ceph集群中的元数据服务器,而通常它都不是必须的,因为只有在使用cephfs的时候才需要它,对象存储和块存储设备是不需要使用该服务的,而目前云计算中用的更广泛的是另外两种存储方式。
Mds虽然是元数据服务器,但是它不负责存储元数据,元数据也是被切成对象存在各个osd节点中的
在创建CEPHFS时,要至少创建两个POOL,一个用于存放数据,另一个用于存放元数据。Mds只是负责接受用户的元数据查询请求,然后从osd中把数据取出来映射进自己的内存中供客户访问。所以mds其实类似一个代理缓存服务器,替osd分担了用户的访问压力
Ceph已经成为OpenStack后端存储标配,OpenStack作为IaaS系统,涉及到存储的部分主要是块存储服务模块、对象存储服务模块、镜像管理模块和计算服务模块,对应为其中的Cinder、Swift、Glance和Nova四个项目。
1.Ceph RBD块存储是以独立卷的方式挂接到OpenStcak
Cinder模块,主要用作数据盘,这种方式主要通过Cinder
Driver实现,删除虚拟机时卷依然存在。
2.Nova对接Ceph时,Ceph RBD块存储卷需要与虚拟机绑定,所以删除虚拟机时卷也删除,一般用作启动盘。
3.Ceph也可以和Glance对接用于镜像卷。
4.Keystone作为OpenStack对象Swift的认证模块,支持Ceph通过RADOSGW网关认证,给OpenStcak提供Swift存储服务。
Ceph做Openstack后端
5.安装部署Ceph
安装部署
1.修改主机名
hostnamectl set-hostname ceph-admin
hostnamectl set-hostname ceph-node1
hostnamectl set-hostname ceph-node2
hostnamectl set-hostname ceph-node3
2.修改hosts :vi
/etc/hosts
192.168.86.128 ceph-admin
192.168.86.129 ceph-node1
192.168.86.130 ceph-node2
192.168.86.131 ceph-node3
3、关闭防火墙
4、安装ntp
yum install ntp ntpdate ntp-doc -y
service ntpd start
5、更改Yum源
yum clean all
mkdir /mnt/bak
mv /etc/yum.repos.d/* /mnt/bak/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
vim /etc/yum.repos.d/ceph.repo
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
priority =1
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0
priority =1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS
gpgcheck=0
priority=1
6、创建用户
useradd -d /home/cephuser -m cephuser
echo “cephuser”|passwd --stdin
cephuser
echo “cephuser ALL = (root)
NOPASSWD:ALL” | sudo tee /etc/sudoers.d/cephuser
chmod 0440 /etc/sudoers.d/cephuser
sed -i s’/Defaults requiretty/#Defaults
requiretty’/g /etc/sudoers
chmod 777 /dev/null
su - cephuser
ssh-keygen -t rsa
分发到各个node
ssh-copy-id cephuser@192.168.86.128
ssh-copy-id cephuser@192.168.86.129
ssh-copy-id cephuser@192.168.86.130
ssh-copy-id cephuser@192.168.86.131
7、格式化磁盘
sudo parted -s /dev/vdb mklabel gpt mkpart
primary xfs 0% 100%
sudo mkfs.xfs /dev/sdb -f
//查看磁盘格式; sudo blkid -o value -s TYPE /dev/sdb
8、在ceph-admin上安装
sudo yum update -y && sudo yum
install ceph-deploy -y
mkdir cluster
cd cluster
ceph-deploy new ceph-admin
vi /home/cephuser/cluster/ceph.conf
[global]
fsid = b01095b8-d958-406f-b0fb-308ba5ab64e3
mon_initial_members = ceph-admin
mon_host = 192.168.86.128
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 192.168.86.128/24
osd pool default size = 3
9、开始安装
ceph-deploy install ceph-admin ceph-node1
ceph-node2 ceph-node3
cd /home/cephuser/cluster
ceph-deploy mon create-initial
ceph-deploy gatherkeys ceph-admin
11、查看节点可用磁盘
ceph-deploy disk list ceph-node1 ceph-node2
ceph-node3
删除磁盘上所有分区:
ceph-deploy disk zap ceph-node1:/dev/sdb
ceph-node2:/dev/sdb ceph-node3:/dev/sdb
准备OSD:
ceph-deploy osd prepare ceph-node1:/dev/sdb
ceph-node2:/dev/sdb ceph-node3:/dev/sdb
激活OSD:
ceph-deploy osd activate
ceph-node1:/dev/sdb1 ceph-node2:/dev/sdb1 ceph-node3:/dev/sdb1
12、拷贝密钥
ceph-deploy admin ceph-admin ceph-node1
ceph-node2 ceph-node3
sudo chmod 644
/etc/ceph/ceph.client.admin.keyring
以cephFS方式访问
先查看管理节点状态,默认是没有管理节点的。
[cephuser@ceph-admin ~]$ ceph mds stat
e1:
创建管理节点(ceph-admin作为管理节点)。
需要注意:如果不创建mds管理节点,client客户端将不能正常挂载到ceph集群!!
[cephuser@ceph-admin ~]
cd cluster/
[cephuser@ceph-admin cluster]$ ceph-deploy
mds create ceph-admin
再次查看管理节点状态,发现已经在启动中
[cephuser@ceph-admin cluster]$ ceph mds
stat
e2:, 1 up:standby
[cephuser@ceph-admin cluster] ps -ef|grep
cluster|grep ceph-mds
ceph 29093 1 0 12:46 ? 00:00:00
/usr/bin/ceph-mds -f --cluster ceph --id ceph-admin --setuser ceph –set group
ceph
创建pool,pool是ceph存储数据时的逻辑分区,它起到namespace的作用
[cephuser@ceph-admin cluster]$ ceph osd
lspools #先查看pool 0 rbd,
新创建的ceph集群只有rdb一个pool。这时需要创建一个新的pool
[cephuser@ceph-admin cluster]$ ceph osd
pool create cephfs_data 10 #后面的数字是PG的数量
pool ‘cephfs_data’ created
[cephuser@ceph-admin cluster]$ ceph osd
pool create cephfs_metadata 10 #创建pool的元数据
pool ‘cephfs_metadata’ created
[cephuser@ceph-admin cluster]$ ceph fs new
myceph cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
再次查看pool状态
[cephuser@ceph-admin cluster]$ ceph osd
lspools
0 rbd,1 cephfs_data,2 cephfs_metadata,
检查mds管理节点状态
[cephuser@ceph-admin cluster]$ ceph mds
stat
e5: 1/1/1 up {0=ceph-admin=up:active}
查看ceph集群状态
[cephuser@ceph-admin cluster]$ sudo ceph -s
cluster 33bfa421-8a3b-40fa-9f14-791efca9eb96
health HEALTH_OK
monmap e1: 1 mons at
{ceph-admin=192.168.10.220:6789/0}
election epoch 3, quorum 0 ceph-admin
fsmap e5: 1/1/1 up {0=ceph-admin=up:active}
#多了此行状态
osdmap e19: 3 osds: 3 up, 3 in
flags sortbitwise,require_jewel_osds
pgmap v48: 84 pgs, 3 pools, 2068 bytes
data, 20 objects
101 MB used, 45945 MB / 46046 MB avail
84 active+clean
查看ceph集群端口
[cephuser@ceph-admin cluster]$ sudo lsof
-i:6789
COMMAND PID USER FD TYPE DEVICE SIZE/OFF
NODE NAME
ceph-mon 28190 ceph 10u IPv4 70217 0t0 TCP
ceph-admin:smc-https (LISTEN)
ceph-mon 28190 ceph 19u IPv4 70537 0t0 TCP
ceph-admin:smc-https->ceph-node1:41308 (ESTABLISHED)
ceph-mon 28190 ceph 20u IPv4 70560 0t0 TCP
ceph-admin:smc-https->ceph-node2:48516 (ESTABLISHED)
ceph-mon 28190 ceph 21u IPv4 70583 0t0 TCP
ceph-admin:smc-https->ceph-node3:44948 (ESTABLISHED)
ceph-mon 28190 ceph 22u IPv4 72643 0t0 TCP
ceph-admin:smc-https->ceph-admin:51474 (ESTABLISHED)
ceph-mds 29093 ceph 8u IPv4 72642 0t0 TCP
ceph-admin:51474->ceph-admin:smc-https (ESTABLISHED)
安装ceph-fuse(这里的客户机是centos6系统)
[root@centos6-02~]#rpm-Uvh
https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@centos6-02 ~]# yum install -y
ceph-fuse
创建挂载目录
[root@centos6-02 ~]# mkdir /cephfs
复制配置文件
将ceph配置文件ceph.conf从管理节点copy到client节点(192.168.10.220为管理节点)
[root@centos6-02 ~]# rsync -e “ssh
-p22” -avpgolr root@192.168.10.220:/etc/ceph/ceph.conf /etc/ceph/
或者
[root@centos6-02~]#rsync-e"ssh-p22"-avpgolr
root@192.168.10.220:/home/cephuser/cluster/ceph.conf /etc/ceph/ #两个路径下的文件内容一样
复制密钥
将ceph的ceph.client.admin.keyring从管理节点copy到client节点
[root@centos6-02 ~]# rsync -e “ssh
-p22” -avpgolr root@192.168.10.220:/etc/ceph/ceph.client.admin.keyring
/etc/ceph/
或者
[root@centos6-02 ~]#
rsync-e"ssh-p22"-avpgolr root@192.168.10.220:/home/cephuser/cluster/ceph.client.admin.keyring
/etc/ceph/
查看ceph授权
[root@centos6-02 ~]# ceph auth list
installed auth entries:
mds.ceph-admin
key:
AQAZZxdbH6uAOBAABttpSmPt6BXNtTJwZDpSJg==
caps: [mds] allow
caps: [mon] allow profile mds
caps: [osd] allow rwx
osd.0
key:
AQCuWBdbV3TlBBAA4xsAE4QsFQ6vAp+7pIFEHA==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key:
AQC6WBdbakBaMxAAsUllVWdttlLzEI5VNd/41w==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.2
key:
AQDJWBdbz6zNNhAATwzL2FqPKNY1IvQDmzyOSg==
caps: [mon] allow profile osd
caps: [osd] allow *
client.admin
key: AQCNWBdbf1QxAhAAkryP+OFy6wGnKR8lfYDkUA==
caps: [mds] allow *
caps: [mon] allow *
caps: [osd] allow *
client.bootstrap-mds
key:
AQCNWBdbnjLILhAAT1hKtLEzkCrhDuTLjdCJig==
caps: [mon] allow profile bootstrap-mds
client.bootstrap-mgr
key:
AQCOWBdbmxEANBAAiTMJeyEuSverXAyOrwodMQ==
caps: [mon] allow profile bootstrap-mgr
client.bootstrap-osd
key:
AQCNWBdbiO1bERAARLZaYdY58KLMi4oyKmug4Q==
caps: [mon] allow profile bootstrap-osd
client.bootstrap-rgw
key:
AQCNWBdboBLXIBAAVTsD2TPJhVSRY2E9G7eLzQ==
caps: [mon] allow profile bootstrap-rgw
将ceph集群存储挂载到客户机的/cephfs目录下
[root@centos6-02 ~]# ceph-fuse -m
192.168.10.220:6789 /cephfs
2018-06-06 14:28:54.149796 7f8d5c256760 -1
init, newargv = 0x4273580 newargc=11
ceph-fuse[16107]: starting ceph client
ceph-fuse[16107]: starting fuse
[root@centos6-02 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_centos602-lv_root
50G 3.5G 44G 8% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/vda1 477M 41M 412M 9% /boot
/dev/mapper/vg_centos602-lv_home
45G 52M 43G 1% /home
/dev/vdb1 20G 5.1G 15G 26% /data/osd1
ceph-fuse 45G 100M 45G 1% /cephfs
由上面可知,已经成功挂载了ceph存储,三个osd节点,每个节点有15G(在节点上通过"lsblk"命令可以查看ceph data分区大小),一共45G
取消ceph存储的挂载
[root@centos6-02 ~]# umount /cephfs
二.使用COSBench工具对ceph进行压力测试
1.COSBench安装(测试Swift时候曾写过安装步骤,此安装步骤跳过)
COSBench是Intel团队基于java开发,对云存储的测试工具,全称是Cloud object Storage Bench,同所有的性能测试工具一样,COSBench也分控制台和发起请求的driver,且driver可以分布式部署。可以支持swift、s3、Openstack等接口
下载COSBench工具
下载地址为:https://github.com/intel-cloud/cosbench
2. 脚本配置
有很多模板的例子,在conf目录下,如librados-config-sample.xml、s3-config-sample.xml
这里只测试s3的接口,所以先关注s3的相关配置
配置的说明如下(参考userGuide.pdf)
对于s3接口来说,一般有下面几种work type: init、prepare、dispose、cleanup,具体可以参考demo文档
这里给出几个示例配置文档:
创建buckets
获取数据
<?xml version="1.0" encoding="UTF-8" ?> - - - -这里的workers表示并发数,totalOps表示总的操作数,driver为不同的压力机器,根据userGuide文档,里面有很多参数可选
上传数据
<?xml version="1.0" encoding="UTF-8" ?> - - - -3.查看结果
下图为测试完成后的一个结果截图
从图中我们可以看到与任务一个压力工具都是的指标
1、Avg-ResTime 响应平均时间
2、Avg-ProcTime 平均处理时间
3、Throughput:吞吐量,也就是我们常说的TPS
4、bandwith:带宽
5、succ-ratio :成功数