目前,公司所用的云环境在计算,网络和存储三大方面,只在计算做了虚拟化,对于网络和存储都只是用了最简单的方式,网络用linux bridge,存储用cinder直接管理NAS,为了增加弹性,应对互联网业务的冲击,就启动了存储和网络虚拟化的研究,其中我就负责存储虚拟化的项目。Ceph作为OpenStack的backend之一,必然需要对其进行研究,首先写一篇Ceph的分布式部署手册。
一 、环境准备:
该部署使用3台机器(ubuntu 14.04),两台机器做osd,一台机器做mon和mds,具体服务情况如下:
- ceph1(192.168.21.140):osd.0
- ceph2(192.168.21.141):osd.1 osd.2
- ceph3(192.168.21.142):mon mds
- 修改各自的hostname,并能够通过hostname来互相访问。
- 各节点能够ssh互相访问而不输入密码(通过ssh-keygen命令)。
二、配置免密码登陆:
在每个节点上:
ssh-keygen -t rsa
touch /root/.ssh/authorized_keys
首先配置ceph1
scp /root/.ssh/id_rsa.pub ceph2:/root/.ssh/id_rsa.pub_ceph1
scp /root/.ssh/id_rsa.pub ceph3:/root/.ssh/id_rsa.pub_ceph1
ssh ceph2 "cat /root/.ssh/id_rsa.pub_ceph1>> /root/.ssh/authorized_keys"
ssh ceph3 "cat /root/.ssh/id_rsa.pub_ceph1 >> /root/.ssh/authorized_keys"
节点ceph2和ceph3也需要参照上面的命令进行配置。
三、安装ceph 库
在每个节点上安装Ceph库:
apt-get install ceph ceph-common ceph-mds
显示ceph 版本信息:
ceph -v
四、在ceph1上创建ceph 配置文件
vim /etc/ceph/ceph.conf
[global]
max open files = 131072
auth cluster required = none
auth service required = none
auth client required = none
osd pool default size = 2
[osd]
osd journal size = 1000
filestore xattruse omap = true
osd mkfs type = xfs
osd mkfs options xfs = -f #default for xfs is "-f"
osd mount options xfs = rw,noatime # default mount option is"rw,noatime"
[mon.a]
host = ceph3
mon addr = 192.168.21.142:6789
[osd.0]
host = ceph1
devs = /dev/sdb
[osd.1]
host= ceph2
devs= /dev/sdc
[osd.2]
host = ceph2
devs = /dev/sdb
[mds.a]
host= ceph3
配置文件创建成功之后,还需要拷贝到除纯客户端之外的每个节点中(并且后续也要始终保持一致):
scp /etc/ceph/ceph.conf ceph2:/etc/ceph/ceph.conf
scp /etc/ceph/ceph.conf ceph3:/etc/ceph/ceph.conf
五、创建数据目录:
在每个节点上执行
mkdir -p /var/lib/ceph/osd/ceph-0
mkdir -p /var/lib/ceph/osd/ceph-1
mkdir -p /var/lib/ceph/osd/ceph-2
mkdir -p /var/lib/ceph/mon/ceph-a
mkdir -p /var/lib/ceph/mds/ceph-a
六、创建分区并挂载:
对于osd所在的节点ceph1和ceph2,需要对新分区进行xfs格式化并mount到指定目录:
ceph1:
mkfs.xfs -f /dev/sdb
mount /dev/sdb /var/lib/ceph/osd/ceph-0
ceph2:
mkfs.xfs -f /dev/sdc
mount /dev/sdc /var/lib/ceph/osd/ceph-1
mkfs.xfs -f /dev/sdb
mount /dev/sdb /var/lib/ceph/osd/ceph-2
七、初始化
注意,每次执行初始化之前,都需要在每个节点上先停止Ceph服务,并清空原有数据目录:
/etc/init.d/ceph stop
rm -rf /var/lib/ceph/*/ceph-*/*
然后,就可以在mon所在的节点ceph3上执行初始化了:
sudo mkcephfs -a -c /etc/ceph/ceph.conf -k /etc/ceph/ceph3.keyring
注意,一旦配置文件ceph.conf发生改变,初始化最好重新执行一遍。
八 、启动ceph
在mon所在的节点ceph3上执行:
sudo service ceph -a start
注意,执行上面这步时,可能会遇到如下提示:
=== osd.0 ===
Mounting xfs onceph4:/var/lib/ceph/osd/ceph-0
Error ENOENT: osd.0 does not exist. create it before updating the crush map
执行如下命令后,再重复执行上面那条启动服务的命令,就可以解决:
ceph osd create
九 、遇到的坑
- ubuntu不能远程通过root用户登录
修改 vim /etc/ssh/sshd_config 将 PermitEmptyPasswords 修改为no 重启ssh - ceph osd tree 看到3个osd的host同为ubuntu因为我是用虚拟机做的实验,虚拟机是clone得到的,因此hostname相同,vim /etc/hostname
- ceph osd tree 看到3个osd的host同为ceph3在ceph1和ceph2上重启ceph服务 /etc/init.d/ceph restart
- ceph -s 看到有warning 不是ok
root@ceph3:/var/lib/ceph/osd# ceph -s
cluster 57b27255-c63d-4a70-8561-99e76615e10f
health HEALTH_WARN 576 pgs stuck unclean
monmap e1: 1 mons at {a=192.168.21.142:6789/0}, election epoch 1, quorum 0 a
mdsmap e6: 1/1/1 up {0=a=up:active}
osdmap e57: 3 osds: 3 up, 3 in
pgmap v108: 576 pgs, 3 pools, 1884 bytes data, 20 objects
3125 MB used, 12204 MB / 15330 MB avail
576 active+remapped解决办法,在/etc/ceph/ceph.conf 中[global]加入
osd pool default size = 2
推测应该是osd的数量应该大于副本数,ceph才可以正常运行