前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住给大家分享一下。点击跳转到网站:https://www.captainai.net/dongkelun
前言
记录Ceph分布式集群安装配置过程及问题解决
1. 服务器环境说明
主机名 | 角色 | IP地址 |
---|---|---|
ceph1 | ceph-deploy、mon、mgr、osd | 192.168.44.128 |
ceph2 | mon、mgr、osd | 192.168.44.129 |
ceph3 | mon、mgr、osd | 192.168.44.130 |
要保证每台机器能连接外网
2. 服务器环境准备
2.1 配置yum源
1 | wget -qO /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo |
2.2 同步服务器时间
2.3 配置主机名解析
1 | cat >> /etc/hosts << EOF |
2.4 关闭防火墙和selinux
2.4.1 防火墙
1 | service firewalld stop |
2.4.2 selinux
临时禁用1
setenforce 0
永久禁用(重启机器)1
2vim /etc/sysconfig/selinux
将SELINUX改为disabled
1 | SELINUX=disabled |
2.5 配置免密认证
3. 搭建Ceph集群
3.1 安装ceph-deploy工具
ceph-deploy工具只需要安装在ceph1节点上,命令如下:1
yum -y install python-setuptools ceph-deploy ceph
安装ceph包的目的是为了以后能在ceph-admin节点中查看ceph集群的状态
在ceph1节点上创建集群的工作目录,该目录会存放ceph-deploy指令行执时生成的日志和秘钥信息等:1
mkdir -p /usr/local/ceph-cluster
3.2 初始化集群
在ceph1节点上进入/usr/local/ceph-cluster目录,执行ceph-deploy命令初始化集群设置,初始化要求指定节点作为mon,命令如下:1
ceph-deploy new --public-network 192.168.44.0/24 --cluster-network 192.168.44.0/24 ceph1
–public-network代表ceph集群对外提供调用的网络,–cluster-network代表用于集群内部> 通信的网络。一般情况下ceph集群中需要有两个网络,这样可以保证ceph集群的安全性。由> > 于此次搭建的环境中只有一个网络,所以此处两个配置项填写同一个网段的地址。
上面的命令执行完成后会将ceph1节点配置为mon,并且会在/usr/local/ceph-cluster目录下生成集群的配置文件、key文件(用于身份验证)、日志文件等:1
2
3
4
5[root@ceph1 ceph-cluster]# ll
total 128
-rw-r--r-- 1 root root 266 Jan 7 14:33 ceph.conf
-rw-r--r-- 1 root root 90678 Jan 7 15:00 ceph-deploy-ceph.log
-rw------- 1 root root 73 Jan 7 14:33 ceph.mon.keyring
配置文件ceph.conf内容如下:1
2
3
4
5
6
7
8
9[global]
fsid = f528b0f0-b93e-427f-a2da-4a3ac8cdca18
public_network = 192.168.44.0/24
cluster_network = 192.168.44.0/24
mon_initial_members = ceph1
mon_host = 192.168.44.128
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
3.3 安装ceph组件
接下来需要在各个osd节点安装ceph组件包:1
yum -y install ceph ceph-mon ceph-mgr ceph-mds ceph-radosgw
3.4 初始化 mon
在初始化集群的过程中已经指定了mon的节点,现在需要对mon进行初始化,在ceph1节点的/usr/local/ceph-cluster目录下执行如下命令进行初始化:1
ceph-deploy mon create-initial
初始化完成后,会在当前目录下生成各个组件需要的key文件:1
2
3
4
5
6
7
8
9
10[root@ceph1 ceph-cluster]# ll
total 128
-rw------- 1 root root 71 Jan 7 14:37 ceph.bootstrap-mds.keyring
-rw------- 1 root root 71 Jan 7 14:37 ceph.bootstrap-mgr.keyring
-rw------- 1 root root 71 Jan 7 14:37 ceph.bootstrap-osd.keyring
-rw------- 1 root root 71 Jan 7 14:37 ceph.bootstrap-rgw.keyring
-rw------- 1 root root 63 Jan 7 14:37 ceph.client.admin.keyring
-rw-r--r-- 1 root root 266 Jan 7 14:33 ceph.conf
-rw-r--r-- 1 root root 90678 Jan 7 15:00 ceph-deploy-ceph.log
-rw------- 1 root root 73 Jan 7 14:33 ceph.mon.keyring
接下来将admin用户的key文件拷贝给各个osd节点,如果为了在ceph1节点中使用ceph命令查看集群状态,那么也需要将key文件拷贝给ceph1节点(ceph1节点需要安装ceph包)1
ceph-deploy admin ceph1 ceph2 ceph3
拷贝完成后执行ceph -s命令可以查看到当前集群的状态:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@ceph1 ceph-cluster]# ceph -s
ceph -s
cluster:
id: 38ea5f1d-d0bf-447e-9ef4-34def8e8db78
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph1
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
可以看到当前集群中已经有一个mon节点。
3.5 安装mgr进程
配置ceph1节点作为mgr,在ceph1节点的/usr/local/ceph-cluster目录下执行如下命令:1
ceph-deploy mgr create ceph1
查看集群状态,可以看到启动了一个mgr daemon:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[root@ceph1 ceph-cluster]# ceph -s
cluster:
id: 38ea5f1d-d0bf-447e-9ef4-34def8e8db78
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph1
mgr: ceph1(active)
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
3.6 部署OSD节点
当前环境中,每个OSD节点都有一块未分配的空的sdb磁盘 ,信息如下:1
2
3
4
5
6
7
8[root@ceph-node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 200M 0 part /boot
└─sda2 8:2 0 19.8G 0 part
├─centos-root 253:0 0 17.8G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
接下来将每个OSD节点上的sdb磁盘加入到ceph集群中,命令如下:1
2
3
4
5for host in 1 2 3
do
ceph-deploy disk zap ceph${host} /dev/sdb
ceph-deploy osd create ceph${host} --data /dev/sdb
done
ceph-deploy disk zap命令用于将目标磁盘的分区表和内容擦除,实际上它是调用/bin/dd
if=/dev/zero of=/dev/sdb bs=1M count=10,这里需要注意是磁盘必须为空的,没有分配的
conv=fsync命令来销毁GPT和MBR。如果目标磁盘是未被分区的,可以不使用该命令。
执行完上面的命令sdb磁盘变成这样:
1
2 sdb
└─ceph--11759f08--4bdc--4374--8f46--26d997b409eb-osd--block--3b3a96dc--0a5d--41ed--a740--9b903a18bf75
此时查看ceph集群的状态,可以看到有三个OSD已经被加入到集群中:
1 | [root@ceph1 ceph-cluster]# ceph -s |
3.7 扩展mon和mgr节点
mon和mgr是ceph集群中非常重要的组件,其中mon作为整个集群的控制中心,里面存放着集群的信息,所以需要确保mon和mgr处于高可用的状态,为了保证选举正常,节点数要为奇数。
3.7.1 扩容mon节点
首先将ceph2和ceph3扩容为mon节点:1
2ceph-deploy mon add ceph2
ceph-deploy mon add ceph3
扩容完成后查看集群状态:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[root@ceph1 ceph-cluster]# ceph -s
cluster:
id: 38ea5f1d-d0bf-447e-9ef4-34def8e8db78
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active)
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 3.01GiB used, 1.46TiB / 1.46TiB avail
pgs:
3.7.2 扩容mgr节点
接下来扩容mgr节点,命令如下:1
ceph-deploy mgr create ceph2 ceph3
查看集群信息:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[root@ceph1 ceph-cluster]# ceph -s
cluster:
id: 38ea5f1d-d0bf-447e-9ef4-34def8e8db78
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2, ceph3
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 3.01GiB used, 1.46TiB / 1.46TiB avail
pgs:
可以看到mgr变为3个节点,其中两个节点处于standby状态。
4. 创建RBD块存储
4.1 创建pool
在ceph1节点上执行如下命令创建pool:1
2ceph osd pool create rbd 64 64
pool 'rbd' created
第一个64代表设置的pg数量,第二个64代表设置的pgp数量
使用如下命令查看当前已有的pool:1
2[root@ceph1 ~]# ceph osd lspools
1 rbd
查看指定pool中的pg和pgp数量:1
2
3
4[root@ceph1 ~]# ceph osd pool get rbd pg_num
pg_num: 64
[root@ceph1 ~]# ceph osd pool get rbd pgp_num
pgp_num: 64
查看指定 pool 中的副本数(副本数默认为3):1
2[root@ceph2 ~]# ceph osd pool get rbd size
size: 3
查看指定 pool 的调度算法(默认为replicated_rule):1
2[root@ceph1 ~]# ceph osd pool get rbd crush_rule
crush_rule: replicated_rule
调整指定pool的pg和pgp数量:1
2ceph osd pool set rbd pg_num 128
ceph osd pool set rbd pgp_num 128
调整指定pool的副本数:1
ceph osd pool set rbd size 2
一般来说,创建pool后,需要对这个pool进行初始化,例如用于rbd块存储的pool使用rbd > > pool init命令就可以将指定pool初始化为rbd类型的application。如果不进行这个初始化的> 操作,不会影响存储的使用,但是会在集群信息中显示报警信息。
5. 创建RGW对象存储
5.1. 创建RGW
在ceph1节点的/usr/local/ceph-cluster目录下执行如下命令创建RGW:
ceph-deploy rgw create ceph1 ceph2 ceph3
执行完成后查看集群信息,可以看到已经启用了三个RGW:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21[root@ceph1 ceph-cluster]# ceph -s
cluster:
id: 38ea5f1d-d0bf-447e-9ef4-34def8e8db78
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2, ceph3
osd: 3 osds: 3 up, 3 in
rgw: 3 daemons active
data:
pools: 5 pools, 160 pgs
objects: 14 objects, 2.10KiB
usage: 3.01GiB used, 1.46TiB / 1.46TiB avail
pgs: 5.000% pgs unknown
152 active+clean
8 unknown
io:
client: 3.42KiB/s rd, 5op/s rd, 0op/s wr
在ceph1、ceph2、ceph3节点上查看RGW监听的端口(默认为 7480):
netstat -anplut | grep 74801
2netstat -anplut | grep 7480
tcp 0 0 0.0.0.0:7480 0.0.0.0:* LISTEN 9540/radosgw
5.2. RGW多节点代理
配置RGW多节点代理:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32yum -y install nginx
vi /etc/nginx/nginx.conf
在
http {
}
中添加如下配置:
upstream rgw {
server 192.168.44.128:7480;
server 192.168.44.129:7480;
server 192.168.44.130:7480;
}
server {
listen 8080;
server_name localhost;
client_max_body_size 0;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
proxy_pass http://rgw;
}
}
systemctl restart nginx # 重启nginx服务使配置生效
systemctl status nginx # 查看nginx服务状态
systemctl enable nginx # 设置nginx服务开机自启动
5.3. 创建访问S3的用户
创建的用户有两种,一种是兼容S3风格,还有一种是Swift风格。
5.3.1 创建访问S3的用户
使用如下命令创建一个用于访问S3的用户:1
radosgw-admin user create --uid emr-s3-user --display-name "EMR S3 User Demo"
命令执行后会输出如下结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37{
"user_id": "emr-s3-user",
"display_name": "EMR S3 User Demo",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "emr-s3-user",
"access_key": "access_key",
"secret_key": "secret_key"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw"
}
上面的内容中显示了用户的key信息以及一些用户的配额信息。以上的信息也可以通过如下命令再次输出:1
radosgw-admin user info --uid emr-s3-user
5.3.2 测试s3接口访问
使用python程序来测试s3接口的访问,首先安装名为名称为:python-boto的python包:1
yum -y install python-boto
创建名为s3test.py的文件,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import boto.s3.connection
access_key = 'access_key'
secret_key = 'secret_key'
conn = boto.connect_s3(
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
host='192.168.44.128', port=8080,
is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
)
bucket = conn.create_bucket('emr-bucket')
for bucket in conn.get_all_buckets():
print "{name} {created}".format(
name=bucket.name,
created=bucket.creation_date,
)
需要注意的是,要将程序中的access_key和secret_key修改为前面生成用户的相关信息。host 需要修改为Nginx服务的地址,port修改为相应代理端口。
执行这个python程序,会输出如下信息:1
2[root@ceph1 ~]# python s3test.py
emr-bucket 2022-09-27T09:14:48.206Z
这代表成功创建一个bucket。
5.4 使用命令行工具访问s3接口
5.4.1 使用命令行工具访问s3接口配置s3cmd
在命令行中调用s3接口来管理对象存储,首先需要安装s3cmd软件包:1
yum -y install s3cmd
安装完成后需要对s3cmd进行配置,配置过程如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51s3cmd --configure
Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.
Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: access_key # 设置访问用户的Access Key
Secret Key: secret_key # 设置访问用户的Secret Key
Default Region [US]: CN
Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [s3.amazonaws.com]: 192.168.44.128:8080 # 设置RWG的代理地址和端口
Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: 192.168.44.128:8080/%(bucket)s # 设置bucket的名称(可以将IP地址更换为域名)
Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: # 不设置密码
Path to GPG program [/usr/bin/gpg]: # 使用gpg加密
When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]: no # 不使用 HTTPS
On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name: # 不设置代理访问
New settings:
Access Key: 3347B8YK03UDM8OCUVYV
Secret Key: jpWtK9Ra09cKqQudBVyGbgPPEfncy24IjjxBrFyM
Default Region: CN
S3 Endpoint: 192.168.44.128:8080
DNS-style bucket+hostname:port template for accessing a bucket: 192.168.44.128:8080/%(bucket)s
Encryption password:
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: False
HTTP Proxy server name:
HTTP Proxy server port: 0
Test access with supplied credentials? [Y/n] y # 验证访问
Please wait, attempting to list all buckets...
ERROR: Test failed: 403 (SignatureDoesNotMatch)
Retry configuration? [Y/n] n
Save settings? [y/N] y # 保存配置
Configuration saved to '/root/.s3cfg'
配置完成后,配置文件存储在/root/.s3cfg文件中,需要将该文件中的signature_v2 配置项改为True,否则在后续执行命令的时候会触发 ERROR: S3 error: 403 (SignatureDoesNotMatch) 报错:1
signature_v2 = True
保存退出后,就可以使 s3cmd命令来管理对象存储,首先使用如下命令查看当前的bucket:1
2[root@ceph1 ~]# s3cmd ls
2022-09-27 09:14 s3://emr-bucket
创建一个新的bucket:1
2
3
4
5
6
7
8
9
10
11[root@ceph1 ~]# s3cmd mb s3://emr-s3-demo
ERROR: S3 error: 400 (InvalidLocationConstraint): The specified location-constraint is not valid
vi /root/.s3cfg
将
bucket_location = CN
修改为
bucket_location = US
[root@ceph1 ~]# s3cmd mb s3://emr-s3-demo
Bucket 's3://emr-s3-demo/' created
5.4.2 上传文件
将本地的/etc/fstab文件上传到对象存储中,并将存储的名称修改为fstab-demo:1
2
3
4
5
6[root@ceph1 ~]# s3cmd put /etc/fstab s3://emr-s3-demo/fstab-demo
upload: '/etc/fstab' -> 's3://emr-s3-demo/fstab-demo' [1 of 1]
743 of 743 100% in 1s 403.24 B/s done
[root@ceph1 ~]# s3cmd ls s3://emr-s3-demo
2021-01-07 09:04 465 s3://emr-s3-demo/fstab-demo
这样Ceph分布式集群安装配置就完成了,我们下篇文章再讲如何用Spark读写Ceph S3
6. 参考
- http://www.soolco.com/post/89854_1_1.html
- https://www.cnblogs.com/flytor/p/11380026.html
- https://blog.csdn.net/inrgihc/article/details/112005710
- https://www.cnblogs.com/freeitlzx/p/11281763.html
问题解决
主要是hostname导致的问题,因为我是在现有的HDP环境下安装的Ceph,而且已经配过了hosts和hostname,但是我不想用已有的hostname,我在/etc/hosts文件里新添加了ceph的host配置,但是没有修改hostname,这样就导致了问题的发生。
问题出现在命令1
ceph-deploy mon create-initial
报错:
1 | ceph1][INFO ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.ceph1.asok mon_status |
报没有文件/var/run/ceph/ceph-mon.ceph1.asok,那么我们看一下路径下有什么1
2ls /var/run/ceph/
ceph-mon.indata-192-168-44-128.asok
发现是有asok文件的,但是名字不一样,名字是和配的旧的host一致
尝试解决思路:
修改/etc/hosts配置顺序
将ceph的host放在最前面,该思路无效,和顺序无关
用旧的host重新ceph-deploy
1 | ceph-deploy new --public-network 192.168.44.0/24 --cluster-network 192.168.44.0/24 indata-192-168-44-128 |
然后再执行1
ceph-deploy --overwrite-conf mon create-initial
但是会报错:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[ceph_deploy.mon][WARNIN] mon.indata-192-168-44-128 monitor is not yet in quorum, tries left: 5
[ceph_deploy.mon][WARNIN] waiting 5 seconds before retrying
[indata-192-168-44-128][INFO ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.indata-192-168-44-128.asok mon_status
[ceph_deploy.mon][WARNIN] mon.indata-192-168-44-128 monitor is not yet in quorum, tries left: 4
[ceph_deploy.mon][WARNIN] waiting 10 seconds before retrying
[indata-192-168-44-128][INFO ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.indata-192-168-44-128.asok mon_status
[ceph_deploy.mon][WARNIN] mon.indata-192-168-44-128 monitor is not yet in quorum, tries left: 3
[ceph_deploy.mon][WARNIN] waiting 10 seconds before retrying
[indata-192-168-44-128][INFO ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.indata-192-168-44-128.asok mon_status
[ceph_deploy.mon][WARNIN] mon.indata-192-168-44-128 monitor is not yet in quorum, tries left: 2
[ceph_deploy.mon][WARNIN] waiting 15 seconds before retrying
[indata-192-168-44-128][INFO ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.indata-192-168-44-128.asok mon_status
[ceph_deploy.mon][WARNIN] mon.indata-192-168-44-128 monitor is not yet in quorum, tries left: 1
[ceph_deploy.mon][WARNIN] waiting 20 seconds before retrying
[ceph_deploy.mon][ERROR ] Some monitors have still not reached quorum:
[ceph_deploy.mon][ERROR ] indata-192-168-44-128
原因是mons名称不一致,因为ceph-mon.indata-192-168-44-128.asok是通过ceph1创建的,所以它里面的内容也是ceph1,而不是indata-192-168-44-128
1 | "mons": [ |
那么我们需要重新生成asok,但是asok是在什么条件下生成的呢(只删asok是不行的),执行下面的命令就可以(捣鼓了半天,没有资料,有点坑~)
1 | sudo rm -r /var/lib/ceph/mon/ |
这样就会重新生成,再用命令验证一下看内容是否变了,然后再执行ceph-deploy –overwrite-conf mon create-initial果然成功了,但是这样是用的旧的hostname,我还是想用ceph1试一下,因为上面已经搞懂了怎么重新生成asok
首先删除一些生成的文件
1 | sudo rm -r /usr/local/ceph-cluster/* |
然后修改各个节点的hostname1
hostnamectl set-hostname ceph1.bigdata.com
这样重新生成的asok文件名就为ceph-mon.ceph1.asok了
然后再重新执行命令:1
2ceph-deploy new --public-network 192.168.44.0/24 --cluster-network 192.168.44.0/24 ceph1
ceph-deploy --overwrite-conf mon create-initial
这样问题就解决了,另外/etc/ceph下面也有ceph相关的配置文件,如果我们一开始不懂,把这个文件夹删了,我们需要手动创建该文件夹,然后重新执行上面的命令就可以了