ubuntu16.04搭建ceph集群
一、集群状况概述
本文旨在基于Ubuntu16.04版本搭建ceph的3节点集群,并在其上部署RADOS块设备,cephFS以及基于rgw的对象存储功能,先介绍整个集群的一些基本配置。
概述 | |
---|---|
宿主机 | Ubuntu16.04 , 8G内存, 150G硬盘, 4核i5 6300 |
虚拟化 | 给予KVM搭建虚拟环境,用libvirt进行虚拟机管理 |
ceph版本 | luminous 12.2.12 |
集群节点系统镜像 | CentOS-7-x86_64-Minimal-1810.iso |
集群节点资源配置 | 1cpu, 1G MEM, 20G DISK(分为sda装系统和sdb专门做OSD存储) |
集群结构
二、部署集群
虚拟机的安装可以参考基于KVM的虚拟机环境搭建
2.1 安装集群前的准备工作
- 安装常用工具
yum install net-tools -y
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install -y yum-plugin-priorities
yum install -y yum-utils
- 配置ceph镜像源
touch /etc/yum.repos.d/ceph.repo
vi /etc/yum.repos.d/ceph.repo
在文件中写入,这里配置的是luminous版本
如果下载出错,可以考虑配置国内的镜像站
- 更新镜像源
yum update -y
- 网络配置
官方文档建议在集群中使用两个网络,一个用于集群与用户数据交互的公用网络,一个用于节点之间连接的集群网络。本文中的虚拟机只配置了一块网卡eth0
,所以就将公用网络和集群网络公享。先将网络配置为静态ip,
修改DNS
vi /etc/sysconfig/network
修改静态ip
vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改配置为
#BOOTPROTO="dhcp" //这一行需要注释掉
BOOTPROTO="static"
NM_CONTROLLED=no
IPADDR=192.168.122.122 //IP 和原先IP一样也可
NETMASK=255.255.255.0
GATEWAY=192.168.122.1
修改hosts文件
建立ip地址到主机名的映射
vi /etc/hosts
192.168.122.122 node
192.168.122.123 node1
192.168.122.124 node2
192.168.122.125 node3
192.168.122.120 ceph-client
关闭防火墙
firewall-cmd --zone=public --add-service=ceph-mon --permanent
firewall-cmd --zone=public --add-service=ceph --permanent
firewall-cmd --reload
iptables -A INPUT -i eth0 -p tcp -s 192.168.122.0/24 -d 192.168.122.254 -j ACCEPT
iptables-save
sudo setenforce 0
最后一条指令只是暂时禁用SELinux,如果要永久禁用,需要修改SELinux为permissive
vi /etc/selinux/config
重启网络服务
service network restart
- 安装时钟服务,官方建议安装,保证集群内各节点的时间同步,避免出现问题
yum install -y ntp ntpdate ntp-doc
如果还是出现时间不同步的警告,可查看各monitor的ntpd服务是否开启,开启后再检查
6. 创建ceph用户
由于ceph这一用户名已经被ceph使用,官方建议不要以此建立用户,在虚拟机上创建用户并配置其免密登录,方便之后管理节点ssh登录集群节点。
useradd -g root -m cephD -d /home/cephD
passwd cephD #设置密码
echo "cephD ALL=(ALL)NOPASSWD: ALL" | sudo tee /etc/sudoers.d/cephD
chmod 0440 /etc/sudoers.d/cephD
2.2 ceph-deploy部署ceph集群
集群其余节点的克隆可参考克隆虚拟机节点。注意集群中的节点与admin节点不同的是,除了系统镜像安装的磁盘镜像sda外,还额外配置了一块专门作为OSD的vdb盘,官方也是建议两者分开。
克隆完成后,libvirt管理的虚拟机为,其中的centos7.0-01是admin节点,centos7.0是客户机(客户机不必创建ceph用户)。
- 在admin节点node上安装ceph-deploy工具
ceph-deploy是ceph快速部署的工具,通过远程ssh登录到集群的节点上控制节点完成相应的动作。
yum install -y ceph-deploy
- 切换到cephD用户并创建集群目录
su - cephD
mkdir ~/my-cluster;
cd ~/my-cluster;
- 配置ssh登录
生成ssh秘钥并分发到集群各节点以及用户机
ssh-keygen
ssh-copy-id cephD@node1
ssh-copy-id cephD@node2
ssh-copy-id cephD@node3
ssh-copy-id cephD@ceph-client
修改ssh配置文件,方便之后直接以自定义的hostname登录到相应节点
touch ~/.ssh/config;
vi ~/.ssh/config
Host node1
Hostname node1
User cephD
Host node2
Hostname node2
User cephD
Host node3
Hostname node3
User cephD
Host ceph-cient
Hostname ceph-client
User root
这一步正确完成之后,节点之间是可以相互ping通的,也可以从admin节点ssh登录到其他节点
4. 创建集群
ceph-deploy new node1
这会创建集群,并且其monitor节点为node1,my-cluster文件夹下会生成几个文件出现no module named pkg_respources,安装setuptools和pip distribute
修改其中的ceph.conf
文件,设置集群中pool的默认副本数为2,实际上一般设置为3更合适
如果出现“no nodule named pkg-resources"的错误,是由于系统镜像是minimal版本,而2.0以后的ceph-deploy会不兼容,此时安装python-setuptools即可
osd pool default size = 2
public_network = 192.168.122.0/24
- 集群安装ceph
ceph-deploy install --release luminous node node1 node2 node3 ceph-client
这种部署方式是由admin节点顺序远程访问各虚拟机完成安装,如果太慢的话,可以在一台虚拟机上安装ceph,然后克隆该虚拟机即可
yum install ceph
- 初始化ceph-moni服务
ceph-deploy mon create-initial
这会生成其余的keyring文件
- 将admin的秘钥配置到其它节点
ceph-deploy admin node node1 node2 node3 ceph-client
这条命令是通过ssh方式(不必额外分发ssh秘钥,此命令已包含)把keyring和ceph.conf等文件都拷贝到其余节点,以后若是多个节点的配置都变了,也可以考虑使用ssh的scp指令进行覆盖。ceph-deploy提供config push指令
如果ssh无法访问的话(提示秘钥已经变化),尝试在admin节点的cephD用户路径下的.ssh/knownhosts中删除已有的出错主机即可
- 安装管理服务
从luminous版本开始,mgr从mon服务中剥离出来,需要单独安装
ceph-deploy mgr create node1
- 为集群添加OSD
ceph-deploy osd create --data /dev/vdb node2
ceph-deploy osd create --data /dev/vdb node3
集群中至少需要3个osd和3个monitor(不然各种health_warn)并且貌似三个osd要跨3个节点,否则照样有degraded的状态,这里的create相当于旧版本的prepare和activate。
如果原来已在硬盘分区创建过OSD,是删除ceph集群后再新建的话需要注意,原来的lvm与volume group的配置还在,需要删除,具体见
[node4][DEBUG ] Running command: /bin/ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring osd purge-new osd.3 --yes-i-really-mean-it
[node4][DEBUG ] stderr: purged osd.3
[node4][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy.osd][ERROR ] Failed to execute command: /usr/sbin/ceph-volume --cluster ceph lvm create --bluestore --data /dev/sdc --block.wal /dev/sdb2 --block.db /dev/sdb1
[ceph_deploy][ERROR ] GenericError: Failed to create 1 OSDs
修复:
node节点卸载挂载分区
[root@node4 ~]# umount /var/lib/ceph/osd/ceph-3
查看lvs
[root@node4 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
osd-block-ab4df89f-8682-4233-b683-e05c161089a4 ceph-183df03c-83fb-441c-a82e-d7b560e1a611 -wi-a----- 50.00g
root cl -wi-ao---- 35.12g
swap cl -wi-ao---- 3.88g
删除lv,vg,pv
[root@node4 ~]# lvremove osd-block-ab4df89f-8682-4233-b683-e05c161089a4 ceph-183df03c-83fb-441c-a82e-d7b560e1a611
Volume group "osd-block-ab4df89f-8682-4233-b683-e05c161089a4" not found
Cannot process volume group osd-block-ab4df89f-8682-4233-b683-e05c161089a4
Do you really want to remove active logical volume ceph-183df03c-83fb-441c-a82e-d7b560e1a611/osd-block-ab4df89f-8682-4233-b683-e05c161089a4? [y/n]: y
Logical volume "osd-block-ab4df89f-8682-4233-b683-e05c161089a4" successfully removed
//直接这一步就行
[root@node4 ~]# vgremove ceph-183df03c-83fb-441c-a82e-d7b560e1a611
Volume group "ceph-183df03c-83fb-441c-a82e-d7b560e1a611" successfully removed
[root@node4 ~]# pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.
删除/var/lib/ceph/osd/ 所有
[root@node4 ~]# rm /var/log/ceph/ceph-* -rf
删除 ceph 日志
[root@node4 ~]# rm -rf /var/lib/ceph/*
monitor1 上重置node4 的sdc分区
[root@monitor1 ceph-cluster]# ceph-deploy disk zap node4 /dev/sdc
monitor1 上重新创建osd节点
[root@monitor1 ceph-cluster]# ceph-deploy osd create node4 --bluestore --data /dev/sdc --block-db /dev/sdb1 --block-wal /dev/sdb2
- 检查集群状态
至此,3节点的ceph集群搭建完毕,可以检测是否正确部署,有两种方式。
ssh node1 sudo ceph health
ssh node2 sudo ceph health
ssh node3 sudo ceph health
或者
ceph -s
如果ceph -s出错,可以尝试为ceph的keyring文件增加’r’属性,如果这样还不行,非要sudo ceph -s才可以的话,尝试sudo chown cephD:root /etc/ceph/*
三、扩展和使用集群
3.1 扩展集群
- 添加monitor
集群的monitor至少需要一个活跃,为提高可靠性,应有奇数个的多个monitor节点工作。新增monitor节点node2,原来的monitor节点node1是leader。安装L版时2个monitor也没事,N版两个就会出警告,加到3个就好了
ceph-deploy mgr create node2
ceph-deploy mon add node2
- 添加OSD
为对应的虚拟机增加磁盘并挂载,比如在node2上再添加一个osd,挂载在新加的磁盘vdc上
ceph-deploy osd create --data /dev/vdc node2
E版之后副本数默认是3,所以至少需要3个OSD才不会出现undersize的警告,但是装了N版的之后,3个OSD也不行,需要跨3个host才行
3.2 修改集群布局
ceph集群定义了多种故障域,比如磁盘、节点、机架 ( rack) 、行 ( row) 、开关 、 电源电路、房间 、 数据中心等 。集群布局可以通过两种方式修改
- 编辑CRUSH map
# 获取集群map
ceph osd getcrushmap -0 crushmap.txt
# 反编译map
crushtool -d crushmap.txt -0 crushmap-decompile
# 修改集群布局
vi crushmap-decompile
# 重新编译这个新的CRUSH map
crushtool - c crushmap-decompile -0 crushmap-compiled
# 将新的CRUSH map应用到Ceph集群
ceph osd setcrushmap -i crushmap-compiled
- 命令行修改
比如为集群增加机架
ceph osd crush add-bucket rackOl rack
ceph osd crush add-bucket rack02 rack
ceph osd crush move node1 rack=rackOl
ceph osd crush move node2 rack=rack02
ceph osd crush move rack01 root=default
ceph osd crush move rack02 root=default
检查新布局
ceph osd tree
注意ceph只能有一个root,如果有多个root会造成PG degraded的警告,需要crush rm掉
3.3 ceph数据管理
测试在ceph集群中的数据读写
echo "He110 Ceph" > /tmp/he11oceph
ceph osd poo1 create mytest 128 128 # 创建资源池指定其中PG的数目,默认为8
ceph osd poo1 set mytest size 2 # 设定池子副本数
rados -p mytest put obj-11 /tmp/he11oceph # 将文件存入池中并命名为obj-1
rados -p HPC_Poo1 ls # 查看池中对象
ceph osd map HPC_Poo1 obj-1 # 展示池中对象与实际OSD间的映射关系
注意:map指令是通过对象名和池中PG的信息哈希出对象存放的PG ID,所以即使没有此对象存在也能获得PG ID
老版本可以通过map得到的信息去对应的节点寻找/var/lib/ceph/osd/ceph-1/current
,该文件夹下有实际存放的对象,但是L版我并没有找到current文件夹,貌似是与新版本开始使用bluestore作为底层的文件系统有关系?
3.4 RADOS块设备的创建与使用
块设备能够为用户提供块存储服务,本节将在ceph集群中部署块存储服务,并将其映射到之前创建好的client客户机,作为其挂载的外部磁盘。
- 登录集群中任意monitor节点或是admin节点,创建ceph RBD
旧版本默认建有名为rbd的资源池,L版需要自己创建名为rbd的池子;然后创建名为myrbd1,大小为1G的块设备
ceph osd pool create rbd 100 100
rbd create myrbd1 --size 1024 # 创建RBD设备
rbd --image myrbd1 info # 查看RBD镜像信息
- 前文中已建立客户机,并完成了网络配置和秘钥分发,可以直接从客户机上访问集群,从客户机上执行,将集群中的块设备映射至客户机
rbd map rbd/myrbd1 # 映射RBD设备
rbd showmapped #查看已映射的设备
如果映射不成功,出现0x38错误码,那么是由于rbd块的feature太多,而centos不支持这么多feature,需要手动配置将多余的feature关闭。详见
然后在RBD设备创建文件系统
fdisk -1 /dev/rbdO
mkfs.xfs /dev/rbdO
mkdir /mnt/ceph-vo11
mount /dev/rbdO /mnt/ceph-vo11
注意客户机关机后该磁盘将不再挂载,重开机需要map+mount后即可
然后就可以正常向该磁盘上进行读写,也可以调整ceph RBD的大小,或者进行快照或是复制,方便数据的复制和回滚,并且块设备为云平台中的虚拟机创建副本提供支持。
3.5 cephFS
cephFS需要配置mds服务才可以正常使用,至少需要一个mds节点,我们在node1上部署mds。
ceph-deploy mds create node1
但是此时ceph -s
是看不到mds服务活跃的,需要创建文件系统和存储池,在admin节点创建名为mycephfs
的文件系统
ceph osd pool create cephfs_data 100 100
ceph osd pool create cephfs_metadata 100 100
ceph fs new mycephfs cephfs_metadata cephfs_data
查看客户秘钥
cat ceph.client.admin.keyring
用内核驱动的方式挂载cephFS,也可通过FUSE挂载
mount -t ceph 192.168.122:123:6789:/ /mnt/mycephfs -0
name=admin , secretfi1e=[秘钥]
注意:秘钥不要输错否则错误代码为-1,ip为monitor节点的ip,输错会有110的错误
部署成功
3.6 ceph RADOS网关的对象存储rgw
本文在monitor节点node1上部署了rgw服务,如果有条件rgw可以使用专门的节点。部署安装rgw服务
ceph-deploy install --rgw node1
ceph-deploy rgw create node1
部署成功后,可以看到rgw服务为active,执行
ps -ef | grep ceph
也会看到rgw服务启动
关闭防火墙
rgw服务默认使用的7480端口,也可以进行修改
sudo firewall-cmd --list-all
sudo firewall-cmd --zone=public --add-port 80/tcp --permanent
sudo firewall-cmd --reload
部署成功后进行检查
curl node1:7480
四、结语
至此,3节点的ceph集群已经在Ubuntu16.04上搭建完成并进行了测试使用。官方文档尽量看英文的保证跟版本一致,中文的目前貌似只到10.0版本。