ceph集群搭建手记

参考官方文档,记录一下ceph的安装过程,以备以后查阅。

先暂把集群搭起来,故只用了最低配置:用了三台服务器,一台mon节点(兼部署时的admin)节点,两台osd节点。一旦这个集群是active + clean状态, 通过增加第三个Ceph OSD 守护进程,一个元数据服务器(mds)和另外两个Ceph监控器(mon)来扩展它。

环境说明

host ip OS
mon-1 192.168.51.235 centos 6.6
osd-1 192.168.51.236 centos 6.6
osd-2 192.168.51.237 centos 6.6

预检

1.修改yum源,安装ceph-deploy

1
vi /etc/yum.repos.d/ceph.repo

添加如下内容,并修改ceph-release和distro。这里我ceph-release用的是giant,distro是centos6,故改成el6。

1
2
3
4
5
6
7
[ceph-noarch]
name=Ceph noarch packages
baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc

更新源后安装ceph-deploy

1
sudo yum update && sudo yum install ceph-deploy

2.更改节点的hostname

1
vi /etc/sysconfig/network

修改后的内容如下

1
2
NETWORKING=yes
HOSTNAME=mon-1

其他机器的hostname依次改成osd-1,osd-2。重启后生效。
3.所有节点安装ntp服务,确保集群内所有节点时间一致。
安装ntp和ntpdate,并通过修改ntp配置文件(/etc/ntp.conf)使各节点从同一个服务器同步时间,从而保证所有节点时间一致。

1
2
yum install ntp ntpdate
service ntpd restart

4.新建ceph用户
admin节点需要可以无密码ssh访问其他节点,并且ssh的用户必须拥有sudo权限。
新建用户的操作需要在每台节点上都要操作。

1
2
useradd -d /home/ceph -m ceph
passwd ceph

为新建用户添加sudo权限

1
2
echo "ceph ALL = (root) NOPASSWD:ALL" | tee /etc/sudoers.d/ceph
chmod 0440 /etc/sudoers.d/ceph

5.切换到ceph用户,生成ssh密钥对,并将公钥添加到其他节点的ceph用户信任公钥里。
在新建密钥对的时候,密码留空。

1
2
3
4
5
6
7
8
9
[ceph@mon-1 ~]$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ceph/.ssh/id_rsa):
Created directory '/home/ceph/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ceph/.ssh/id_rsa.
Your public key has been saved in /home/ceph/.ssh/id_rsa.pub.
......

将公钥复制到其他节点上

1
2
ssh-copy-id ceph@osd-1
ssh-copy-id ceph@osd-2

编辑.ssh/config文件,使admin节点ssh和scp到其他节点的时候不需要指定用户。修改后的文件如下:

1
2
3
4
5
6
7
8
9
10
[ceph@mon-1 ~]$ vi .ssh/config
Host mon-1
Hostname mon-1
User ceph
Host osd-1
Hostname osd-1
User ceph
Host osd-2
Hostname osd-2
User ceph

并将权限设置为0600

1
chmod 0600 .ssh/config

6.配置防火墙,打开所需端口,monitor节点需要6789端口,osd节点需要6800:7000端口。配置方法这里不详述。
7.在centos和redhat里,还需要使用visudo命令编辑/etc/sudoers文件,修改#Defaults requiretty#这一行为#Defaults:ceph !requiretty#,或者将这一行注释掉。注:每个节点都

1
2
#Defaults    requiretty
Defaults:ceph !requiretty

8.关闭安全策略

1
setenforce 0

安装

以下操作均在admin节点的ceph用户环境下。
1.安装前准备
新建文件夹

1
2
mkdir ceph
cd ceph

如果以前有安装过ceph,或在安装过程出错需要重新安装时,请用以下的命令清除之前的安装信息

1
2
ceph-deploy purgedata {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys

也可以用以下命令来清除指定节点上的ceph包

1
ceph-deploy purge {ceph-node} [{ceph-node}]

2.配置mon节点

1
ceph-deploy new mon-1

执行完上面的命令后,使用ll命令可以看到ceph文件夹下的ceph.conf、ceph.log和ceph.mon.keyring三个文件。
修改ceph.conf文件。因为我们只有两个osd节点,要激活active+clean模式,必须修改此配置文件。在[gloable]下增加“osd pool default size = 2”,修改后的文件如下:

1
2
3
4
5
6
7
8
9
10
[global]
auth_service_required = cephx
filestore_xattr_use_omap = true
auth_cluster_required = cephx
auth_client_required = cephx
ms_bind_ipv6 = true
mon_host = [::1]
mon_initial_members = localhost
fsid = 3030a1a7-b31e-4756-b411-59411d329764
osd pool default size = 2

如果有多块网卡,还需要配置public network项。
3.安装ceph

1
ceph-deploy install mon-1 osd-1 osd-2

注意:我在这里出现如下一个error:

1
2
3
4
5
6
[mon-1][INFO  ] Running command: rpm -Uvh --replacepkgs http://ceph.com/rpm-giant/el6/noarch/ceph-release-1-0.el6.noarch.rpm
[mon-1][WARNIN] curl: (22) The requested URL returned error: 404 Not Found
[mon-1][DEBUG ] Retrieving http://ceph.com/rpm-giant/el6/noarch/ceph-release-1-0.el6.noarch.rpm
[mon-1][WARNIN] error: skipping http://ceph.com/rpm-giant/el6/noarch/ceph-release-1-0.el6.noarch.rpm - transfer failed
[mon-1][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: rpm -Uvh --replacepkgs http://ceph.com/rpm-giant/el6/noarch/ceph-release-1-0.el6.noarch.rpm

网上找到如下解决办法:

1
ceph-deploy install --repo-url http://ceph.com/rpm-giant/el6/ mon-1 osd-1 osd-2

在安装过程中,如果出现超时错误,可以手动执行 sudo yum install ceph。
4.初始化监控节点,收集key

1
ceph-deploy mon create-initial

执行完这一步后,在文件夹里会看到ceph.bootstrap-mds.keyringceph.bootstrap-osd.keyringceph.client.admin.keyringceph.mon.keyring四个keyring文件。
5.准备并激活OSD节点
我在这里使用文件夹代替使用整块硬盘。
先ssh到各osd节点,在/var/local/下新建osd文件夹

1
2
3
4
5
6
7
ssh osd-1
sudo mkdir /var/local/osd1
exit

ssh osd-2
sudo mkdir /var/local/osd2
exit

使用ceph-deploy osd prepare命令准备osd节点

1
ceph-deploy osd prepare osd-1:/var/local/osd1 osd-2:/var/local/osd2

然后激活osd

1
ceph-deploy osd activate osd-1:/var/local/osd1 osd-2:/var/local/osd2

官方文档上说用ceph-deploy osd create命令可以一步执行prepare和activate命令,没尝试成功。
6.复制配置文件和admin key到管理节点和osd节点
使用ceph-deploy命令将配置文件和管理密钥复制到管理节点和你的Ceph节点。下次你再使用ceph命令界面时就无需指定集群监视器地址,执行命令时也无需每次都指定ceph.client.admin.keyring。

1
ceph-deploy admin mon-1 osd-1 osd-2

7.给ceph.client.admin.keyring文件读权限

1
sudo chmod +r /etc/ceph/ceph.client.admin.keyring

8.检查ceph集群是否健康

1
ceph health

或用ceph status查看集群的状态。ps:因为我在集群搭建完成后又添加了一个osd节点,故这里显示有3个osd节点。

1
2
3
4
5
6
7
8
[ceph@mon-1 my-cluster]$ ceph status
cluster 85da1883-3767-4100-8917-c80271b7f89b
health HEALTH_OK
monmap e1: 1 mons at {mon-1=192.168.51.99:6789/0}, election epoch 1, quorum 0 mon-1
osdmap e39: 3 osds: 3 up, 3 in
pgmap v78: 64 pgs, 1 pools, 0 bytes data, 0 objects
18421 MB used, 31623 MB / 52743 MB avail
64 active+clean

看到返回的结果为active+clean状态,说明集群ok。

扩展

在这里演示扩展添加osd、mds、mon节点。采用centos 6.6操作系统。
首先,需要按照预检步骤里一样,添加ceph用户,修改hosts,在~/.ssh/config里添加osd、mds、mon节点信息,安装ntp服务确保集群里面的所有节点时间一致,关闭selinux,配置好iptables或关闭防火墙。

添加osd节点

host ip OS
osd-3 192.168.51.240 centos 6.6

1.在管理节点(我这里用的mon-1)使用ceph-deploy install命令安装ceph到osd-3

1
ceph-deploy install osd-3

在这里如果遇到[WARNIN] curl: (22) The requested URL returned error: 404 Not Found的错误,请加上--repo-url参数重新安装一遍。

1
ceph-deploy install --repo-url http://ceph.com/rpm-giant/el6/ osd-3

2.ssh到osd3节点上,创建/var/local/osd3文件夹

1
2
3
ssh osd-3
sudo mkdir /var/local/osd3
exit

3.准备并激活osd节点

1
2
ceph-deploy osd prepare osd-3:/var/local/osd3
ceph-deploy osd activate osd-3:/var/local/osd3

4.复制配置文件和admin key到osd节点

1
ceph-deploy admin osd-3

5.查看集群状态

1
ceph status

添加mds节点

host ip OS
mds-1 192.168.51.141 centos 6.6

如同添加osd节点一样,先安装好ceph,然后用下面的命令添加mds节点到集群。

1
ceph-deploy mds create mds-1

添加mon节点

host ip OS
mds-2 192.168.51.99 centos 6.6
mds-2 192.168.51.219 centos 6.6

一个Ceph存储集群至少需要一台Ceph监视器。为了保证高可用性,Ceph存储集群中通常会运行多个Ceph监视器,任意单台Ceph监视器的宕机都不会影响整个Ceph存储集群正常工作。由于Ceph使用Paxos算法,这需要多个Ceph监视器组成Quoram(如1,2:3,3:4,3:5,4:6等)。
安装好ceph后,利用下面命令将原有的mon节点和待添加的mon节点添加到集群中。

1
ceph-deploy mon create mon-2 mon-3

当你增加Ceph监视器后,Ceph将开始同步各监视器并形成Quoram。你可通过如下方式检查Quoram状态:

1
ceph quorum_status --format json-pretty

使用ceph存储对象数据

为了能够操作Ceph存储集群中的对象数据,Ceph客户端必需满足:

1. 设置一个对象名
2. 指定一个数据池

Ceph客户端取回最新的集群映射表,并根据CRUSH算法先计算如何将对象映射到某个PG中,然后再计算如何将该PG动态映射入一个Ceph OSD进程上。为了查找对象位置,你需要的仅仅是对象名称和数据池名称,例如:

1
ceph osd map {poolname} {object-name}

练习:定位一个对象

作为一个练习,我们先创建一个对象。使用rados put命令指定对象名称、存储对象数据的测试文件路径和地址池名称。例如:

1
2
rados put {object-name} {file-path} --pool=data
rados put test-object-1 testfile.txt --pool=data

为了验证Ceph存储集群已存储该对象,执行如下命令:

1
rados -p data ls

现在,可标识对象位置:

1
2
ceph osd map {pool-name} {object-name}
ceph osd map data test-object-1

Ceph将输出对象位置信息,例如:

1
osdmap e537 pool 'data' (0) object 'test-object-1' -> pg 0.d1743484 (0.4) -> up [1,0] acting [1,0]

如果要删除测试对象,使用rados rm命令即可,例如:

1
rados rm test-object-1 --pool=data

当集群扩展后,对象位置可能会动态变更。Ceph动态平衡的一个好处就是Ceph可自动完成迁移而无须你手动操作。