Ceph 简介
Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务。在虚拟化领域里,比较常用到的是Ceph的块设备存储,比如在OpenStack项目里,Ceph的块设备存储可以对接OpenStack的cinder后端存储、Glance的镜像存储和虚拟机的数据存储,比较直观的是Ceph集群可以提供一个raw格式的块存储来作为虚拟机实例的硬盘。
Ceph相比其它存储的优势点在于它不单单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,同时由于Ceph的良好设计,采用了CRUSH算法、HASH环等方法,使得它不存在传统的单点故障的问题,且随着规模的扩大性能并不会受到影响。
Ceph 核心组件
Ceph的核心组件包括Ceph OSD、Ceph Monitor和Ceph MDS。
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。
伴随OSD的还有一个概念叫做Journal盘,一般写数据到Ceph集群时,都是先将数据写入到Journal盘中,然后每隔一段时间比如5秒再将Journal盘中的数据刷新到文件系统中。一般为了使读写时延更小,Journal盘都是采用SSD,一般分配10G以上,当然分配多点那是更好,Ceph中引入Journal盘的概念是因为Journal允许Ceph OSD功能很快做小的写操作;一个随机写入首先写入在上一个连续类型的journal,然后刷新到文件系统,这给了文件系统足够的时间来合并写入磁盘,一般情况下使用SSD作为OSD的journal可以有效缓冲突发负载。
Ceph Monitor:由该英文名字我们可以知道它是一个监视器,负责监视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等计算出数据最终存储的位置。
Ceph MDS:全称是Ceph MetaData Server,主要保存的文件系统服务的元数据,但对象存储和块存储设备是不需要使用该服务的。
ceph-deploy 部署 ceph
部署环境(两台服务器都挂两块硬盘,一块系统盘,一块osd)
IP地址 | 主机名 |
---|---|
10.0.2.12/24 | ceph1 |
10.0.2.13/24 | ceph2 |
两台服务器均配置hosts:
[root@localhost ~]# vim /etc/hosts
10.0.2.12 ceph1
10.0.2.13 ceph2
两台服务器均配置主机名:
[root@localhost ~]# hostnamectl set-hostname ceph1
[root@localhost ~]# hostnamectl set-hostname ceph2
ceph1 执行配置允许无密码SSH登录:
[root@ceph1 ~]# ssh-keygen
[root@ceph1 ~]# ssh-copy-id ceph1
[root@ceph1 ~]# ssh-copy-id ceph2
配置ceph.repo
[root@ceph1 ~]# vim /etc/yum.repos.d/ceph.repo
[ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/$basearch
enabled=1
gpgcheck=1
priority=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch
enabled=1
gpgcheck=1
priority=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS
enabled=0
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
安装ceph-deploy
[root@ceph1 ~]# yum update -y
[root@ceph1 ~]# yum install -y ceph-deploy python-setuptools
创建一个 Ceph 存储集群
[root@ceph1 ~]# mkdir /etc/ceph && cd /etc/ceph
[root@ceph1 ceph]# ceph-deploy new ceph1 ###配置
[root@ceph1 ceph]# vi ceph.conf #在ceph.conf中追加以下内容,有一个 Monitor 和两个 OSD 守护进程
osd_pool_default_size = 2 ## 存储集群副本个数
[mgr] # 开启监控模块
mgr modules = dashboard
管理节点和osd节点都需要安装ceph 集群
[root@ceph1 ceph]# ceph-deploy install ceph1 ceph2
配置MON初始化
[root@ceph1 ceph]# ceph-deploy mon create-initial
查看ceph集群状态
[root@ceph1 ceph]# ceph -s
cluster:
id: d13e7b4d-0c0f-4dfd-99da-8b2088c291f2
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph1
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
开启监控模块
[root@ceph1 ceph]# ceph-deploy mgr create ceph1
查看集群支持的模块
[root@ceph1 ceph]# ceph mgr dump
{
"epoch": 3,
"active_gid": 4109,
"active_name": "ceph1",
"active_addr": "10.0.2.12:6800/31229",
"available": true,
"standbys": [],
"modules": [
"balancer",
"restful",
"status"
],
"available_modules": [
"balancer",
"dashboard",
"influx",
"localpool",
"prometheus",
"restful",
"selftest",
"status",
"telemetry",
"zabbix"
],
"services": {}
}
[root@ceph1 ceph]# ceph mgr module enable dashboard # 启用dashboard模块
[root@ceph1 ceph]# ceph mgr dump
{
"epoch": 7,
"active_gid": 4112,
"active_name": "ceph1",
"active_addr": "10.0.2.12:6800/31229",
"available": true,
"standbys": [],
"modules": [
"balancer",
"dashboard",
"restful",
"status"
],
"available_modules": [
"balancer",
"dashboard",
"influx",
"localpool",
"prometheus",
"restful",
"selftest",
"status",
"telemetry",
"zabbix"
],
"services": {
"dashboard": "http://ceph1:7000/"
}
}
[root@ceph1 ceph]# ceph mgr module enable dashboard
[root@ceph1 ceph]# ceph mgr dump
{
"epoch": 8,
"active_gid": 4112,
"active_name": "ceph1",
"active_addr": "10.0.2.12:6800/31229",
"available": true,
"standbys": [],
"modules": [
"balancer",
"dashboard",
"restful",
"status"
],
"available_modules": [
"balancer",
"dashboard",
"influx",
"localpool",
"prometheus",
"restful",
"selftest",
"status",
"telemetry",
"zabbix"
],
"services": {
"dashboard": "http://ceph1:7000/"
}
}
[root@ceph1 ceph]# ceph -s
cluster:
id: d13e7b4d-0c0f-4dfd-99da-8b2088c291f2
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 2
services:
mon: 1 daemons, quorum ceph1
mgr: ceph1(active)
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
设置dashboard的ip和端口
[root@ceph1 ceph]# ceph config-key put mgr/dashboard/server_addr 10.0.2.12
set mgr/dashboard/server_addr
[root@ceph1 ceph]# ceph config-key put mgr/dashboard/server_port 7000
set mgr/dashboard/server_port
[root@ceph1 ceph]# netstat -tulnp |grep 7000
tcp6 0 0 :::7000 :::* LISTEN 31229/ceph-mgr
创建osd
[root@ceph1 ceph]# ceph-deploy disk zap ceph1 /dev/sdb #先删除磁盘数据
[root@ceph1 ceph]# ceph-deploy disk zap ceph2 /dev/sdb
[root@ceph1 ceph]# ceph-deploy osd create ceph1 --data /dev/sdb #创建osd
[root@ceph1 ceph]# ceph-deploy osd create ceph2 --data /dev/sdb
ceph秘钥拷贝(主节点执行)及修改密钥权限
[root@ceph1 ceph]# ceph-deploy admin ceph1 ceph2 #用 ceph-deploy 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点,这样每次执行 Ceph 命令行时就无需指定 monitor 地址和 ceph.client.admin.keyring 了
修改密钥权限(所有节点上执行)
[root@ceph1 ceph] # chmod +r /etc/ceph/ceph.client.admin.keyring
[root@ceph2] # chmod +r /etc/ceph/ceph.client.admin.keyring