Ceph 集群部署
本次部署会直接使用和改造 ceph-ansible-4.0 工具。由于内部的机器都能访问外网。所以会采用有网络部署方式,直接使用阿里云的 ceph 源。这里主要搭建 Ceph Nautilus 版本 (14) 的集群,将会在该版本上进行操作和实验。
1. 初始化集群节点
这部分完成了一个简单的 playbook ,主要是实现以下几个功能:
- 拷贝 master 节点的 /etc/hosts 到所有其他主机;
- 对各个主机按照 /etc/hosts 的名称重命名;
- 每个主机新建 store 用户以及 store 户组;然后跳板机对所有主机拷贝其密钥实现免密登录;
- 如果所有机器都能联网,则直接给所有机器添加每分钟执行的定时任务,定时向阿里云同步时钟,确保集群内时钟正常;
2. ceph-ansible 项目介绍
ceph-ansible 是 ceph 官方出品的用于自动化部署 ceph 集群的工具,点此直达官方文档。注意官网说明,有坑误踩:
注:本人曾经在部署时候犯了个错误,浪费了大半天的时间。当时是19年年中,那会 ceph-ansible 的最新是 4.x 版本,ceph 最新为 N 版本。我拿 master 分支代码去部署 ceph mimic 版本,总是失败。纠结了好久后才发现应该选择 ceph-ansible-3.2的版本去部署 mimic 版本,血泪教训啊!
此外,官方文档中对于 ceph 集群的部署有如下说明:
- 推荐使用 Cephadmin:容器化部署 ceph 集群;
- ceph-ansible: 基于 ansible 完成的部署 ceph 集群工具,广泛使用中;
- ceph-deploy:不在维护。不再支持 ceph 14 版本之后以及不支持 CentOS 8;
- deepsea:基于 saltstack 部署 ceph集群,比较少用;
- 支持手工部署,能学到更多,有没有兴趣尝试下?
ceph-ansible 的使用非常简单,按照官方文档,写好部署 mon、mgr、rgw 等的服务机器列表即可。参考如下:
[store@master ceph-ansible-4.0.20-spyinx]$ cat hosts
[mons]
ceph-[1:3]
[mgrs]
ceph-[1:3]
[osds]
ceph-[1:3]
[rgws]
ceph-[1:2]
如果只是单纯的使用 ceph-ansible-4.0 工具,我们只需要调整 group_vars/all.yml
中的相关配置即可:
[store@master ceph-ansible-4.0.20-spyinx]$ cat group_vars/all.yml
---
############下载包相关的源配置###############
ceph_origin: repository
ceph_repository: community
ceph_mirror: https://mirrors.aliyun.com/ceph/
ceph_stable_key: "{
{ ceph_mirror }}/keys/release.asc"
ceph_stable_release: nautilus
ceph_stable_repo: "{
{ ceph_mirror }}/debian-{
{ ceph_stable_release }}"
ceph_stable_distro_source: bionic
cephx: "true"
############非常重要参数###################
public_network: 192.168.26.0/24
cluster_network: 192.168.26.0/24
mon_host: 192.168.26.120
mon_initial_members: ceph-1,ceph-2,ceph-3
monitor_interface: ens33
#########################################
rbd_cache: "true"
rbd_cache_writethrough_until_flush: "true"
rbd_concurrent_management_ops: 21
rbd_client_directories: true
############创建osd必要的参数###############
osd_objectstore: bluestore
devices:
- '/dev/sdb'
- '/dev/sdc'
- '/dev/sdd'
osd_scenario: lvm
#########################################
mds_max_mds: 1
radosgw_frontend_type: beast
radosgw_thread_pool_size: 512
radosgw_interface: "{
{ monitor_interface }}"
email_address: 2894577759@qq.com
dashboard_enabled: False
dashboard_protocol: http
dashboard_port: 8443
dashboard_admin_user: admin
dashboard_admin_password: admin@123!
grafana_admin_user: admin
grafana_admin_password: admin
grafana_uid: 472
grafana_datasource: Dashboard
grafana_dashboard_version: nautilus
grafana_port: 3000
grafana_allow_embedding: True
直接安装即可,基本上只要网络正常,就不会存在多大问题。注意,如果内网的话,可以把对应的防护墙给关掉。默认的 ceph-ansible 每次跑的时候都会自动把防火墙启起来,有时候会有影响。
[store@master ceph-ansible-4.0.20-spyinx]$ cat roles/ceph-defaults/defaults/main.yml | grep configure_firewall
# If configure_firewall is true, then ansible will try to configure the
configure_firewall: False
在 ceph-ansible 中存在一个问题和我们的业务不兼容,还需要对 ceph-ansible的代码进行改造,使之符合我们的业务需求,请看下面的内容。
3. 改造 ceph-ansible-4.0
我们改造 ceph-ansible-4.0 主要是解决创建 osd 进程的 id 顺序问题,以保证在一台机器上创建的 osd 进程的进程号连续。此外,我们的存储节点编号从1~3,需要根据对应的编号自行生成 osd-id。比如我们有3台虚拟机,分别命名为 ceph-1~ceph-3,每个节点上启动3个osd 进程,分别对应 /dev/sdb
、/dev/sdc
和 /dev/sdd
三块盘,因此在三台机器的 osd-id 编号需要为:
- ceph-1: 0~2
- ceph-2: 3~5
- ceph-3: 6~8
3.1 代码分析
首先看不做任何操作搭建的 ceph 集群的 osd-id 效果,如下:
我们看到每个节点上3个 osd 进程的 osd-id 并不连续。这是因为 ceph-ansible 中使用的是如下的模块去完成 osd 的创建:
可以看到,前面设置 devices 变量时,会执行批量格式化磁盘,创建 osd 进程,因此这里无法对每个 osd 进程设置osd-id 的值。然而前一个的任务则正是单个单个盘进行格式化,正是我们改造的突破口:
我们先来分析下这个 ceph-volume 模块的内容,代码位置是 library/ceph_volume.py
:
# ...
def run_module():
module_args = dict(
cluster=dict(type='str', required=False, default='ceph'),
objectstore=dict(type='str', required=False, choices=[
'bluestore', 'filestore'], default='bluestore'),
action=dict(type='str', required=False, choices=[
'create', 'zap', 'batch', 'prepare', 'activate', 'list',
'inventory'], default='create'), # noqa 4502
data=dict(type='str', required=False),
data_vg=dict(type='str', required=False),
journal=dict(type='str', required=False),
journal_vg=dict(type='str', required=False),
db=dict(type='str', required=False),
db_vg=dict(type='str', required<