Ceph 源码部署
源码的编译见Ceph Compile
Ceph 0.87, 系统ubuntu
参考官方配置文档
集群需要至少1个monitor和2个OSD(对应两个副本)
集群的配置会按照如下的结构,node1作为monitor,node2和node3作为OSD节点。
配置monitor
1.登录到monitor节点
1 | ssh {hostname} |
2.Ceph的默认配置目录是 /etc/ceph 。创建配置文件,默认是 ceph.conf ,其中ceph表示集群名
3.集群ID
1 | #生成集群唯一ID |
4.添加初始monitor(s)和IP地址到配置文件
1 | mon initial menbers = {hostname}[,{hostname}] |
Note: 如果是IPv6,需要设置 ms bind ipv6 为 true,参考Network Configuration Reference。
5.创建集群密钥环
1 | #为monitor生成密钥 |
6.使用hostname,IP地址和FSID生成monitor映射。保存为 /tmp/monmap
1 | monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap |
7.在monitor上创建一个默认的数据目录
1 | sudo mkdir -p /var/lib/ceph/mon/{cluster-name}-{hostname} |
详细配置见Monitor Config Reference - Data
8.将monitor映射和密钥环添加到monitor守护进程
1 | sudo ceph-mon --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring |
9.配置模板
1 | [global] |
根据前面的配置,得到:
1 | [global] |
10.新建 done 文件
1 | #标记monitor已经创建,准备好启动了。 |
11.启动monitor
- 在Ubuntu,使用Upstart
1 | sudo start ceph-mon id=ubuntu |
启动monitor的时候如果遇到 start: Unknown job: ceph-mon, 是因为使用
make install安装时不会安装 upstart script , 可以手动将src/upstart中的脚本复制到/etc/init/,但是该方法有个问题,应为编译安装的目录是/usr/local/bin,但upstart中配置文件的启动目录是/usr/bin,所以需要手动修改ceph-mon.conf中两处代码, `pre-start’ 中的test路径,和exec的执行路径。不知道有没有更好的方法。
- 对于 Debian/CentOs/RHEL,使用sysvinit:
1 | sudo /etc/init.d/ceph -c /etc/ceph/ceph.conf start mon.{hostname} |
注意
1 | #centos下,也需要将ceph手动添加到启动项 |
12.验证Ceph创建的默认池
1 | ceph osd lspools |
- 如果出现 python的import xx找不到,需要把ceph/src/pybind包含到Python查找路径下,例如,在.bashrc中, export PYTHONPATH=$PYTHONPATH:~/ceph/src/pybind
- 如果出现
OSError: librados.so.2,需要安装librados包(sudo apt-get install librados-dev),详见librados-intro - 如果出现
missing keyring, cannot use cephx for authentication,需要修改keyring的属性,详见auth-config-ref
12.验证monitor正在运行
1 | ceph -s |
添加OSD
monitor启动后,就可以添加OSDs了。只有当集群有足够OSDs来处理object的副本时,集群才能达到 active+clean状态(例如,osd pool default size=2 需要至少两个OSDs)。 在monitor引导启动后,集群有了默认的CRUSH映射,然而,映射中还没有任何Ceph OSD 的守护进程映射到Ceph节点。
简单配置
Ceph提供了 ceph-disk 工具,可以处理磁盘、分区或者目录。该工具通过自增的索引来创建OSD ID。并且该工具会把新的OSD自动添加到主机的CRUSH映射。执行 ceph-disk -h 来获得命令的详细信息。工具会自动执行下面复杂配置的流程。
1.准备OSD
1 | ssh {node-name} |
2.激活OSD
1 | sudo ceph-disk activate {data-path} [--activate-key {path}] |
Note: 如果Ceph节点上没有 /var/lib/ceph/bootstrop-osd/{cluster}.keyring 需要添加参数 --activate-key 。
复杂配置
不利用工具的情况下,可以通过如下配置实现创建OSD,添加OSD到CRUSH映射。通过下面的过程可以更好的了解整个过程。分别登录node2和node3执行以下步骤。
1.登录到OSD主机
1 | ssh {node-name} |
2.为OSD生成UUID
1 | uuidgen |
3.创建OSD,如果不设置UUID,在OSD启动时会自动设定。该命令会输出OSD的编号,在下面的步骤中会用到。
1 | ceph osd create [{uuid}] |
4.在新的OSD上创建默认目录
1 | sudo mkdir -p /var/lib/ceph/osd/ceph-{osd-number} |
5.如果OSD是硬盘而不是系统,需要挂载到刚创建的目录
1 | sudo mkfs -t {fstype} /dev/{hdd} |
6.初始化OSD的数据目录
1 | ssh {new-osd-host} |
在运行 ceph-osd --mkkey 之前,该目录必须是空的。并且,ceph-osd 工具需要用参数 --cluster 指定自定义的集群名。
注意
- OSD的大小要略于配置文件中的
osd journal size,配置单位为MB。 - 如果因为配置错误,需要删除osd的挂载目录,该目录是带有只读属性的,可以用chattr修改
7.注册OSD的认证密钥。路径中 ceph-{osd-num} 的 ceph 值为 $cluster-$id 。如果集群名不是 ceph , 使用你对应的集群名。
1 | sudo ceph auth add osd.{osd-num} osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring |
8.添加Ceph节点到CRUSH映射中
1 | ceph osd crush add-bucket {hostname} host |
9.把Ceph节点放到根节点 default 下
1 | ceph osd crush move node1 root=default |
10.把OSD添加到CRUSH映射,这样就可以开始接受数据了。 同样也可以反编译CRUSH的映射,把OSD添加到设备列表,把主机作为一个bucket(在它还没有加入CRUSH映射前),在主机中把设备当做项目添加,指定一个权重后重新编译并设置。
1 | ceph osd crush add {id-or-name} {weight} [{bucket-type}={bucket-name} ...] |
11.在添加一个OSD到Ceph后,OSD就在配置文件中了。但是还没有运行,OSD处于 down 和 in 状态。必选启动新的OSD才能开始接收数据。
- Ubuntu中,使用Upstart
1 | sudo start ceph-osd id={osd-num} |
注意,和monitor一样,需要复制 src/upstart 下的 ceph-osd 到 /etc/init/ ,同时需要修改文件中 /usr/bin 为 /usr/local/bin, /usr/libexec 为 /usr/local/libexec 。
- Debian/CentOS/RHEL中,使用sysvint
1 | sudo /etc/init.d/ceph start osd.{osd-num} |
一旦启动了OSD,它就处于 up 和 in 状态。
总结
一旦有了monitor和两个OSD启动并运行,通过如下的执行可以查看placement groups节点。
1 | ceph -w |
要添加或移除额外的monitors,详见Add/Remove Monitors。要添加或移除额外的Ceph OSD守护进程,详见Add/Remove OSDs。
注意,monitor和OSD的通信需要在防火墙添加例外,centos 6是iptables,centos 7是firewall。