ceph介绍
我们常见的存储需求可以简单归纳成3个:
1.对象存储 Object Storage
2.块存储 Block Storage
3.文件系统 FileSystem
ceph则是一个满足了3种不同需求的存储开源解决方案,不仅有分布式存储的功能,还有不同的灾备机制,以及灵活的机制以对接到现有的各种虚拟化接口,使用户可以用简单的服务器+磁盘搭建有分布式存储特性的服务,还可以应用到自身的云平台当中。本例子我们会用”块存储“,服务作为搭建使用ceph的实验演示,选择这个作为实验对象是因为块服务可以直接对接到云平台的虚拟机虚拟磁盘,第二篇文章会实验ceph+kvm技术,虚拟化技术使用kvm,虚拟磁盘会使用ceph的块服务。
以下大部分资料来自于ceph官网文档
http://docs.ceph.com/docs/master/
部署环境及拓扑图
软件 |
版本 |
OS |
Ubuntu 14.04 Server 64bit |
官方文档的逻辑架构图:
Alt text
我们参考官方然后设计了自己试验环境拓扑图:
Alt text
单元功能 |
IP地址 |
描述 |
ceph-deploy |
192.168.85.100 |
ceph部署管理机,通过该服务器可以部署集群 |
mon-node1 |
192.168.85.102 |
ceph集群管理机,该机器维护着整个集群的各种状态信息 |
osd0-node2 |
192.168.85.101 |
OSD数据服务器,负责存储数据以及数据的相关操作 |
osd1-node3 |
192.168.85.105 |
OSD数据服务器,负责存储数据以及数据的相关操作 |
ceph-client |
192.168.85.110 |
ceph客户端,测试ceph块服务的节点 |
kvm-server |
192.168.85.145 |
kvm服务端,测试ceph块服务的kvm服务器 |
前期准备
所有服务器保证时区与时间的准确性,具体可以参考相关资料文档,这里不详细描述。
各服务器配置好相关主机名hostname
编辑/etc/hostname文件,修改好对应的主机名
更新主机名
$ hostname 主机名
配置服务器hosts列表
所有服务器 /etc/hosts 文件增加以下内容
1
2
3
4
5
6
|
192.168.85.100 ceph-deplog
192.168.85.102 mon-node1
192.168.85.101 osd0-node2
192.168.85.105 osd1-node3
192.168.85.110 ceph-client
192.168.85.145 kvm-server
|
服务器ssh免密码访问
配置ceph-deploy主机ssh到mon-node1,osd0-node2,osd1-node3主机免密码
在ceph四台服务器上面执行一下命令
1
2
3
|
ssh-keygen
cd ~/.ssh/
cat id_rsa.pub >> authorized_keys
|
把ceph-deploy的~/.ssh/id_rsa.pub秘钥增加到mon-node1,osd0-node2,osd1-node3主机的~/.ssh/authorized_keys文件里面,同时把mon-node1,osd0-node2,osd1-node3主机的~/.ssh/id_rsa.pub秘钥添加到ceph-deploy主机的~/.ssh/authorized_keys文件里面,这时候ceph-deploy主机已经能免密码ssh到mon-node1,osd0-node2,osd1-node3主机了。
1
2
3
4
|
$ ssh root@mon-node1
$ ssh root@osd1-node2
$ ssh root@osd2-node3
|
1
2
3
|
#ceph-deploy主机安装ceph部署包 ceph-deploy
$ apt-get update && apt-get install ceph-deploy
#安装完毕之后,进入下一个阶段,部署ceph集群
|
部署ceph集群
在osd1-node2主机执行一下命令
1
2
|
$ mkdir /var/local/osd0
|
在osd2-node3主机执行一下命令
1
2
|
$ mkdir /var/local/osd1
|
在ceph-deploy主机执行以下命令
使用ceph块服务之——ceph-client
使用ceph-client的方式使用ceph块服务
1
2
3
|
#ceph-deploy执行部署ceph-client
$ ceph-deploy install ceph-client
$ ceph-deploy admin ceph-client
|
部署完毕ceph-client之后,就可以在ceph-client服务器上调用ceph的块服务了
#在ceph-client执行
#-m mon IP
$ rbd create foo --size 1024 -m 192.168.85.102 -k
/etc/ceph/ceph.client.admin.keyring
$ rbd map foo --name client.admin -m 192.168.85.102 -k
/etc/ceph/ceph.client.admin.keyring
#执行完毕之后,我们可以看到/dev/rbd/rbd下面多了一个
foo的磁盘设备,接下来我们对齐进行格式化并挂载
$ mkfs.ext4 -m0 /dev/rbd/rbd/foo
$ mkdir /mnt/ceph-block-device
$ mount /dev/rbd/rbd/foo /mnt/ceph-block-device
#完成之后,我们就可以正常使用ceph提供的分布式块存储服务了
使用ceph块服务之——kvm+libvirt+rbd
在kvm中使用ceph块服务作为虚拟器的虚拟磁盘,关于kvm的部署使用等请参考
http://blog.eflypro.com/2015/07/27/kvm-iscsi/ 详情就不在这里描述,这里只是介绍通过配置虚拟机的xml文件使用ceph块服务设备。下面是ceph块服务的逻辑栈
Alt text
到目前为止,ceph块服务支持以下接口:
支持项 |
描述 |
Commands |
命令行方式 |
Kernel Modules |
内核模块 |
Snapshots |
快照 |
QEMU |
qemu虚拟化 |
libvirt |
libvirt是虚拟化的常见API接口层,目前支持QEMU/KVM XEN LXC VirtualBox等,我们的kvm方案就使用libvirt作为实验对象 |
Cache Settings |
|
OpenStack |
开源虚拟化平台 |
CloudStack |
|
Manpage rbd |
|
Manpage rbd-fuse |
|
Manpage ceph-rbdnamer |
|
RBD Replay |
|
Manpage rbd-replay-prep |
|
Manpage rbd-replay |
|
Manpage rbd-replay-many |
|
librbd |
API |
libvirt与ceph块服务的对接方案如下图:
Alt text
先为kvm虚拟机创建存储池以及相关权限
#ceph-deploy执行
#先安装qemu工具库
$ apt-get install qemu-utils
#创建存储池libvirt-pool
$ ceph osd pool create libvirt-pool 128 128
#查看是否创建成功
$ ceph osd lspools
0 data,1 metadata,2 rbd,3 libvirt-pool,
#创建及配置ceph用户权限
$ ceph auth get-or-create client.libvirt mon 'allow r'
osd 'allow class-read object_prefix rbd_children, allow rwx
pool=libvirt-pool'
#检查用户及权限情况
$ ceph auth list
installed auth entries:
osd.0
key: AQBzdBxWoLH7JRAADjlJL0St0A+1x/cwYEb7BA==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key: AQB6dBxWILjsMBAAWXdg1YAQWyQNSB69CW8Ttw==
caps: [mon] allow profile osd
caps: [osd] allow *
client.admin
key: AQBfcxxW2GEhHRAA382/y9k+UvAV1pqv1xzyKw==
caps: [mds] allow
caps: [mon] allow *
caps: [osd] allow *
client.bootstrap-mds
key: AQBgcxxWGIdFAhAAl7BYUp4HlAI6zwyh5zGMhg==
caps: [mon] allow profile bootstrap-mds
client.bootstrap-osd
key: AQBfcxxWcGmFLRAAhvGkUHPm0Cfx8Ypzcvfx7A==
caps: [mon] allow profile bootstrap-osd
client.libvirt
key: AQAFqxxWkJvZBBAAEpkVKhwys8g+obqKP/h4NQ==
caps: [mon] allow r
caps: [osd] allow class-read object_prefix rbd_children,
allow rwx pool=libvirt-pool
#在池libvirt-pool里面创建一个给kvm使用的块,大小为2G
$ qemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G
#查看是否成功创建
$ rbd -p libvirt-pool ls
new-libvirt-image
#最后,创建ceph用户key文件已给到kvm服务器使用ceph块服务时认证用到
$ ceph auth get-key client.libvirt | tee client.libvirt.key
#执行完毕之后会产生一个client.libvirt.key密钥文件,我们把它copy
到kvm-server去,自此ceph-deploy部分命令已经完结,下面到kvm-server
kvm配置使用ceph块设备作为虚拟机虚拟磁盘
#在kvm-server创建secret.xml文件,内容如下
1
2
3
4
5
|
<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>
|
1
2
3
4
5
6
|
#kvm-server执行以下命令,创建secret uuid
$ virsh secret-define --file secret.xml
xxxxx bca96153-b84f-45d0-a312-9361fe566458 xxxxx
#把命令返回输出的uuid记录下来,然后执行,其中uuid是之前产生的,
client.libvirt.key文件是ceph-deploy产生的
$ virsh secret-set-value --secret bca96153-b84f-45d0-a312-9361fe
566458 --base64 $(cat client.libvirt.key)
|
我们贴上虚拟机的完整xml配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<domain type='kvm'>
<name>ceph001</name> //虚拟机名称
<memory>524288</memory> //最大内存512MB
<currentMemory>524288</currentMemory> //可用内存512MB
<vcpu>1</vcpu> //虚拟cpu个数
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='cdrom'/> //光盘启动
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<disk type='network' device='disk'>
<source protocol='rbd' name='libvirt-pool/
new-libvirt-image' >
<host name='192.168.85.102' port=
'6789'/>
</source>
<auth username='libvirt'>
<secret type='ceph' uuid='bca96153
-b84f-45d0-a312-
9361fe566458'/>
</auth>
<target dev='vda' bus='virtio'/>
</disk>
<disk type='file' device='cdrom'>
<source file='/opt/iso/ubuntu-14.04.2-server
-amd64.iso'/> //
光盘镜像路径
<target dev='hdb' bus='ide'/>
</disk>
<interface type='bridge'>
//虚拟机网络连接方式
<source bridge='br0'/>
<mac address="54:52:00:aa:aa:01"/>
//为虚拟机分配mac地址,
务必唯一,否则dhcp获得同样ip,引起冲突
<virtualport type='openvswitch'></virtualport>
<model type='virtio'/>
</interface>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' listen = '0.0.0.0'
keymap='en-us'
/>//vnc方式登录,端口号自动分配,自动加1
</devices>
</domain>
|
创建启动虚拟机
1
2
3
4
5
6
7
|
$ virsh define cephvm.xml
$ virsh start ceph001
$ virsh vncdisplay ceph001
$ virsh qemu-monitor-command --hmp ceph001 'info block'
|