环境准备
在4台虚拟机上进行ceph集群的部署,这4台虚拟机上都安装了centos7.6的minimal版本,并为这4台虚机配置了静态IP,4台虚机的主机名和IP地址对应如下:
主机名 | IP地址 |
---|---|
node1 | 192.168.1.11 |
node2 | 192.168.1.12 |
node3 | 192.168.1.13 |
ceph-deploy | 192.168.1.10 |
各个节点上准备安装:
- node1: osd节点和mon节点
- node2: osd节点和mon节点
- node3: osd节点和mon节点
- ceph-deploy: ceph部署节点
安装ceph
集群配置
1、首先在各个节点上创建一个部署ceph集群的用户,并授予其sudo权限
1 | [root@ceph-deploy ~]# useradd cepher |
2、在各节点上关闭防火墙和selinux
1 | [root@ceph-deploy ~]$ setenforce 0 |
3、在ceph-deploy节点以cepher用户登陆,并配置host文件(其他节点也配置host文件)
1 | [cepher@ceph-deploy ~]$ cat /etc/hosts |
4、在ceph-deploy节点配置免密登陆,使得部署节点可以免密登陆其他节点
1 | [cepher@ceph-deploy ~]$ ssh-keygen |
5、在ceph-deploy节点自建ceph源,这样其他节点可以直接从部署节点获取ceph,一劳永逸。在自建源之前先在ceph-deploy节点配置ceph源,使用阿里源,这里我选择的是ceph nautilus版本。
1 | [Ceph] |
自建ceph源
1、首先在ceph-deploy节点yum安装epel-release
2、创建自建源文件夹,然后将ceph及相关软件包下载到自建源文件夹下
1 | [cepher@ceph-deploy ~]$ sudo mkdir -p /yum/ceph/nautilus |
3、创建内部源,源路径就是自建源路径/yum/ceph/nautilus/
1 | [cepher@ceph-deploy ~]$ sudo createrepo -pdo /yum/ceph/nautilus/ /yum/ceph/nautilus/ |
4、修改httpd配置文件/etc/httpd/conf/httpd.conf
,设置根路径为/yum/ceph/,然后启动httpd,将内部源通过httpd服务提供给其他节点
1 | DocumentRoot "/yum/ceph/" |
至此,内部源就创建好了
5、ssh免密登陆到待安装ceph节点,配置源指向内部源
1 | [cepher@node1 ~]$ cd /etc/yum.repos.d/ |
安装ceph
ssh免密登陆到各节点,安装ceph,命令如下:
1 | [cepher@node1 ~]$ sudo yum -y install ceph ceph-radosgw htop sysstat iftop iotop ntp ntpdate |
至此,各个待安装节点上均安装了ceph,版本是14.2.4,但是现在node1,node2,node3节点上还没有安装osd,mon,rgw等服务,因此还需进一步部署集群。
集群部署
集群的部署主要通过ceph-deploy命令进行。
1、首先,初始化集群
1 | [cepher@ceph-deploy ~]$ mkdir -p deploy |
ceph-deploy new初始化集群的时候会生成三个文件,分别是配置文件ceph.conf
、monitor key文件ceph.mon.keyring
和日志文件ceph-deploy-ceph.log,我们需要手动修改配置文件ceph.conf
,添加集群公网和集群内部网络的配置(这里只添加了集群公网配置)
1 | [cepher@ceph-deploy deploy]$ cat ceph.conf |
2、创建monitor
上步的初始化仅仅是初始化了monitor,还需要创建monitor
1 | [cepher@ceph-deploy deploy]$ ceph-deploy mon create-initial |
mon create-initial
会根据ceph.conf进行创建mon,判断monitor都创建成功后,会进行keyring的收集,这些keyring在后续创建其他成员的时候要用到。
3、分发集群keyring
1 | [cepher@ceph-deploy deploy]$ ceph-deploy admin node1 node2 node3 |
这个操作是将集群的admin.keyring
分发给指定的节点,这样这些节点就可以使用ceph命令了.
4、创建mgr
1 | [cepher@ceph-deploy deploy]$ ceph-deploy mgr create node1 node2 node3 |
5、创建osd
1 | [cepher@ceph-deploy deploy]$ ceph-deploy osd create --data /dev/sdb node1 |
我在node1,2,3三个节点上分别添加了sda和sdb两块硬盘,上述操作是将osd分别创建在三个节点的/dev/sdb上
6、创建rgw
1 | [cepher@ceph-deploy deploy]$ ceph-deploy rgw create node1 node2 |
7、在三个node节点上nptdate时钟,实现时钟同步
1 | ntpdate ntp1.aliyun.com #阿里云 |
8、查看集群状态
1 | [root@node1 ~]# ceph -s |
安装rgw
其实上面安装ceph的时候node1,node2,node3已经安装了rgw,直接可以创建rgw实例。rgw即RADOSGW,是一种服务,使客户端能够利用标准对象存储API来访问Ceph集群,支持Amazon S3和Openstack Swift API。rgw运行于librados之上,事实上就是一个称之为Civetweb的web服务器来响应api请求,客户端利用标准对象存储API与rgw通信,而rgw则使用librados与ceph集群通信。
创建rgw实例
1、在ceph部署节点,执行ceph-deploy rgw create <gateway-node>
,比如ceph-deploy rgw create node1这样就在node1节点创建了rgw实例,默认rgw已经启动。
ceph v0.80之后,Ceph对象网关运行在Civetweb(嵌入到ceph-radosgw
守护程序中)上,默认通过7480端口提供rgw对象服务。
1 | http://client-node:7480 |
rgw实例会返回如下response
1 | <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> |
2、更改默认端口
在ceph部署节点修改ceph.conf配置文件,以修改node1节点上的rgw默认端口为例,比如将端口修改为80,在[global]之下增加如下配置:
1 | [client.rgw.node1] |
port后面的=两端不要有空格
将更新的配置文件推送到您的Ceph对象网关节点(和其他Ceph节点):
1 | ceph-deploy --overwrite-conf config push node1 [<other-nodes>] |
最后重新启动Ceph对象网关,使新的端口设置生效:
1 | ssh node1 |
更多设置请查考Ceph Documentation
使用rgw
要使用REST接口,要首先为S3接口创建一个初始Ceph对象网关用户。然后,为Swift接口创建一个子用户。
1、创建用于S3访问的RADOSGW用户
命令如下:
1 | sudo radosgw-admin user create --uid="testuser" --display-name="First User" |
命令的输出将类似于以下内容:
1 | { |
NOTE:keys->access_key
和 keys->secret_key
是用于访问验证的
2、创建一个SWIFT用户
1 | ssh node1 |
命令的输出将类似于以下内容:
1 | { |
3、查看用户信息(需要指定用户id)
1 | radosgw-admin user info --uid=testuser |
4、编写python脚本测试S3接口
编写并运行Python测试脚本来验证S3访问。S3访问测试脚本将连接到radosgw
,创建一个新存储桶并列出所有存储桶。aws_access_key_id
和 aws_secret_access_key
对应于keys->access_key
和 keys->secret_key
需要安装python-boto
软件包:
1 | ssh node1 |
创建Python脚本:
1 | vi s3test.py |
其中{hostname}和{port}分别替换为rgw本机的主机名和端口号
执行该python脚本:
1 | [cepher@node1 ~]# python s3test.py |
得到上面的输出类似的输出,说明S3接口可以正常访问
5、使用s3cmd工具测试s3接口
首先安装s3cmd,通过pip或者yum可以直接安装
yum install s3cmd
pip search s3cmd
使用s3cmd前需要配置Access Key 和 Secret Key,这两个key便是创建s3用户时生成的,这个在前面提过。使用命令
s3cmd --configure
进行配置,下图是本机的配置过程:
注意图中红框中标出的(因为之前已经配置过,所以[]中记录的是之前的配置),配置完成之后会保存在.s3cfg文件中。vim打开配置文件.s3cfg,将signature_v2 = False
修改为signature_v2 = True
,本文在实验过程中发现如果不将signature_v2设置为True,s3的读写文件操作返回403(Forbidden),这样修改参考了:
s3cmd_issue,
但是还没有彻底解决,只是可以正常用了,只用签名v4该怎么做,这里还没解决。s3cmd的基本使用
- 列举出所有buckets(bucket相当于根文件夹)
s3cmd ls
- 创建 bucket,且 bucket 名称是唯一的,不能重复
s3cmd mb s3://my-bucket-name
- 删除空 bucket
s3cmd rb s3://my-bucket-name
- 列举 bucket 中的内容
s3cmd ls s3://my-bucket-name
- 上传文件到某个 bucket
s3cmd put file.txt s3://my-bucket-name/file.txt
- 上传并将权限设置为所有人可读
s3cmd put --acl-public file.txt s3://my-bucket-name/file.txt
,文件对应的可访问URL: http://192.168.1.11:80/my-bucket-name/file.txt - 从某个bucket下载文件,并进行保存为某文件
s3cmd get s3://my-bucket-name/file.txt xxx
- 删除某个文件
s3cmd del s3://my-bucket-name/file.txt
- 设置bucket的public权限
s3cmd setacl s3://myexamplebucket.calvium.com/ --acl-public --recursive
- 获得某个bucket所占用的空间大小
s3cmd du -H s3://my-bucket-name
- 列举出所有buckets(bucket相当于根文件夹)
6、访问验证,测试SWIFT接口
可以通过swift
命令行客户端验证快速访问,首先安装swift
客户端:
1 | sudo yum install python-setuptools |
要测试快速访问,执行以下操作:
1 | swift -V 1 -A http://{IP ADDRESS}:{port}/auth -U testuser:swift -K '{swift_secret_key}' list |
{IP ADDRESS}:{port}
用rgw服务主机的ip地址和端口号替换(默认7480),{swift_secret_key}
用创建swift
用户时的输出swift_keys->secret_key
替换。
输出应为:
1 | my-new-bucket |
输出结果说明swift
接口可以正常访问
ceph部署参考:http://strugglesquirrel.com/2019/04/23/centos7%E9%83%A8%E7%BD%B2ceph/