安装 Python 构建依赖项
dnf install -y git python3 sshpass tmux python3-devel libffi-devel gcc openssl-devel python3-libselinux python3-netaddr
下载ceph-ansible
git clone -b stable-6.0 https://github.com/ceph/ceph-ansible.git
生成ceph虚拟环境
python3 -m venv /opt/oslostack/ceph-venv
激活虚拟环境
source /opt/oslostack/ceph-venv/bin/activate
更新pip
pip install -U pip -i https://mirrors.aliyun.com/pypi/simple
下载ansible
pip install -r /opt/oslostack/ceph-ansible/requirements.txt -i https://mirrors.aliyun.com/pypi/simple
安装 ceph-ansible ansible galaxy 依赖项
cd ceph-ansible
ansible-galaxy install -r requirements.yml
创建host_vars目录
mkdir ceph-ansible/host_vars
为每个节点单独配置osd磁盘信息,文件名以主机名命名
[root@ceph1 ceph-ansible]# cat /opt/ceph/ceph-ansible/host_vars/ceph1.yaml |grep -v -e '^[[:space:]]$' -e '^[[:space:]]#'
dummy:
devices:
/dev/sdb
/dev/sdc
/dev/sdd
bluestore_wal_devices:
/dev/sdf
[root@ceph1 ceph-ansible]#
[root@ceph1 ceph-ansible]#
[root@ceph1 ceph-ansible]#
[root@ceph1 ceph-ansible]# cat /opt/ceph/ceph-ansible/host_vars/ceph2.yaml |grep -v -e '^[[:space:]]$' -e '^[[:space:]]#'
dummy:
devices:
/dev/sdb
[root@ceph1 ceph-ansible]#
[root@ceph1 ceph-ansible]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
198.18.2.124 controller
198.18.2.125 compute1
198.18.2.126 compute2
198.18.2.137 ceph1
198.18.2.138 ceph2
[root@ceph1 ceph-ansible]#
主配置文件放在group_vars/all.yml里,包含ceph调优部分
(venv) [root@ceph1 ceph-ansible]# cat group_vars/all.yml
# ceph
cephx: true
ceph_origin: distro
configure_firewall: false
osd_scenario: lvm
osd_objectstore: bluestore
#osd_auto_discovery: true
# 显式设置 db 空间大小,单位为 bytes,默认 -1 为平分空间
block_db_size: -1
osd_journal_size: 20480
# 根据实际情况填写
public_network: "172.16.1.0/24"
cluster_network: "172.16.1.0/24"
monitor_interface: eno2
ntp_service_enabled: false
dashboard_enabled: false
#dashboard_admin_password: PsD26%g-H_<a
#grafana_admin_password: PsD26%g-H_<a
# crush_rule_config: true
ceph_conf_overrides:
global:
max_open_files: 131072
osd:
# osd_memory_target: 4294967296
#每个OSD进程能申请到的内存大小
osd_pool_default_min size: 1
#个PG能接受IO的最小副本数
osd_journal_size: 20000
#osd journal大小
osd_max_write_size: 512
# OSD一次可写入的最大值
osd_client_message_size_cap: 2147483648
#客户端允许在内存中的最大数据(bytes)
osd_deep_scrub_stride: 131072
#在Deep Scrub时候允许读取的字节数(bytes)。
osd_op_threads: 16
#并发文件系统操作数
osd_disk_threads: 4
#OSD密集型操作例如恢复和Scrubbing时的线程
osd_map_cache_size: 1024
#保留OSD Map的缓存(MB)
osd_map_cache_bl_size: 128
#OSD进程在内存中的OSDMap缓存(MB)
osd_recovery_op_priority: 2
#恢复操作优先级,取值1-63,值越高占用资源越高
osd_recovery_max_active: 10
#同一时间内活跃的恢复请求数
osd_max_backfills: 4
#一个OSD允许的最大backfills数。
osd_min_pg_log_entries: 30000
#修建PGLog是保留的最小PGLog数
osd_max_pg_log_entries: 100000
#修建PGLog是保留的最大PGLog数
osd_mon_heartbeat_interval: 40
# 默认值30s,OSD ping一个monitor的时间间隔
ms_dispatch_throttle_bytes: 1048576000
# 默认值104857600,等待派遣的最大消息数(bytes)
objecter_inflight_ops: 819200
# 默认值1024,客户端流控,允许的最大未发送io请求数,超过阀值会堵塞应用io,为0表示不受限
osd_op_log_threshold: 50
# 默认值5,一次显示多少操作的log
osd_crush_chooseleaf_type: 0
# 默认值为1,CRUSH规则用到chooseleaf时的bucket的类型,0 表示让数据尽量散列
osd_recovery_max_single_start: 1
# OSD在某个时刻会为一个PG启动恢复操作数。
# 和osd_recovery_max_active一起使用,假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为10,
# 那么,这意味着OSD在某个时刻会为一个PG启动一个恢复操作,而且最多可以有10个恢复操作同时处于活动状态。
osd_recovery_max_chunk: 1048576
# 默认为8388608, 设置恢复数据块的大小,以防网络阻塞
osd_recovery_threads: 10
# 恢复数据所需的线程数
osd_recovery_sleep: 0
# 默认为0,recovery的时间间隔,会影响recovery时长,如果recovery导致业务不正常,可以调大该值,增加时间间隔
# 通过sleep的控制可以大大的降低迁移磁盘的占用,对于本身磁盘性能不太好的硬件环境下,可以用这个参数进行一下控制,能够缓解磁盘压力过大引起的osd崩溃的情况
# 参考值: sleep=0;sleep=0.1;sleep=0.2;sleep=0.5
osd_crush_update_on_start: true
# 默认true。false时,新加的osd会up/in,但并不会更新crushmap,prepare+active期间不会导致数据迁移
osd_op_thread_suicide_timeout: 600
# 防止osd线程操作超时导致自杀,默认150秒,这在集群比较卡的时候很有用
osd_op_thread_timeout: 300
# osd线程操作超时时间,默认15秒
osd_recovery_thread_timeout: 300
# osd恢复线程超时时间,默认30秒
osd_recovery_thread_suicide_timeout: 600
# 防止osd恢复线程超时导致自杀,默认300秒,在集群比较卡的时候也很有用
osd_scrub_begin_hour: 0
# 开始scrub的时间(含deep-scrub),为每天0点
osd_scrub_end_hour: 8
# 结束scrub的时间(含deep-scrub),为每天8点,这样将deep-scrub操作尽量移到夜间相对client io低峰的时段,避免影响正常client io
osd_max_markdown_count: 10
# 当osd执行缓慢而和集群失去心跳响应时,可能会被集群标记为down(假down),默认为5次,超过此次数osd会自杀,必要时候可设置osd nodown来避免这种行为
mon:
mon_clock_drift_allowed: 1
# monitor间的clock drift
mon_osd_min_down_reporters: 13
# 向monitor报告down的最小OSD数
mon_osd_down_out_interval: 600
# 标记一个OSD状态为down和out之前Ceph等待的秒数。
client:
rbd_cache_enabled: true
# 默认值 true,RBD缓存
rbd_cache_size: 335544320
# 默认值33554432,RBD能使用的最大缓存大小(bytes)
rbd_cache_max_dirty: 235544320
# 默认值25165824,缓存为write-back时允许的最大dirty(脏)字节数(bytes),不能超过 rbd_cache_size,如果为0,使用write-through
rbd_cache_target_dirty: 134217728
# 默认值16777216,开始执行回写过程的脏数据大小,不能超过rbd_cache_max_dirty
rbd_cache_max_dirty_age: 30
# # 默认值1,在被刷新到存储盘前dirty数据存在缓存的时间(seconds),避免可能的脏数据因为迟迟未达到开始回写的要求而长时间存在
rbd_cache_writethrough_until_flush: false
# # 默认值true,该选项是为了兼容linux-2.6.32之前的virtio驱动,避免因为不发送flush请求,数据不回写。
# # 设置该参数后,librbd会以writethrough的方式执行io,直到收到第一个flush请求,才切换为writeback方式。
rbd_cache_max_dirty_object: 2
# # 默认值0,最大的Object对象数,默认为0,表示通过rbd cache size计算得到,librbd默认以4MB为单位对磁盘Image进行逻辑切分。
# # 每个chunk对象抽象为一个Object;librbd中以Object为单位来管理缓存,增大该值可以提升性能。
执行部署(必须在ceph-ansible目录下)
ansible-playbook -i /opt/ceph
/inventory site.yml.sample