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-deploy1
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-deploy1
sudo yum update && sudo yum install ceph-deploy
2.更改节点的hostname1
vi /etc/sysconfig/network
修改后的内容如下1
2NETWORKING=yes
HOSTNAME=mon-1
其他机器的hostname依次改成osd-1,osd-2。重启后生效。
3.所有节点安装ntp服务,确保集群内所有节点时间一致。
安装ntp和ntpdate,并通过修改ntp配置文件(/etc/ntp.conf)使各节点从同一个服务器同步时间,从而保证所有节点时间一致。1
2yum install ntp ntpdate
service ntpd restart
4.新建ceph用户
admin节点需要可以无密码ssh访问其他节点,并且ssh的用户必须拥有sudo权限。
新建用户的操作需要在每台节点上都要操作。1
2useradd -d /home/ceph -m ceph
passwd ceph
为新建用户添加sudo权限1
2echo "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
2ssh-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
并将权限设置为06001
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
2mkdir ceph
cd ceph
如果以前有安装过ceph,或在安装过程出错需要重新安装时,请用以下的命令清除之前的安装信息1
2ceph-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.安装ceph1
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.初始化监控节点,收集key1
ceph-deploy mon create-initial
执行完这一步后,在文件夹里会看到ceph.bootstrap-mds.keyring
、ceph.bootstrap-osd.keyring
、ceph.client.admin.keyring
、ceph.mon.keyring
四个keyring文件。
5.准备并激活OSD节点
我在这里使用文件夹代替使用整块硬盘。
先ssh到各osd节点,在/var/local/下新建osd文件夹1
2
3
4
5
6
7ssh 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
然后激活osd1
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-31
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
3ssh osd-3
sudo mkdir /var/local/osd3
exit
3.准备并激活osd节点1
2ceph-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
2rados put {object-name} {file-path} --pool=data
rados put test-object-1 testfile.txt --pool=data
为了验证Ceph存储集群已存储该对象,执行如下命令:1
rados -p data ls
现在,可标识对象位置:1
2ceph 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可自动完成迁移而无须你手动操作。