5.2 部署Ceph集群(Octopus-15.2.15)
(1) 版本控制说明
版本号具有三个组成部分,xyz。x标识发布周期(例如,Mimic为13)。y标识发布类型:
x.0.z - 开发版本(适用于早期测试人员和勇敢的人)
x.1.z - 发布候选(用于测试集群,勇敢的用户)
x.2.z - 稳定/错误修复版本(针对用户)
此版本控制约定始于 9.yz Infernalis 循环。在此之前,版本以 0.y 为开发版本,0.yz 为稳定系列。
(2) 版本对应信息
官方文档: https://docs.ceph.com/en/latest/releases/#active-releases
Ceph目前最新版本16(P版),市面上应用最广泛的是12(L版),由于部署Ceph需要yum源,国内的阿里源(https://mirrors.aliyun.com/ceph/)
还没有同步到最新的Ceph版本,所以我这里使用的Ceph版本为15.2.15(O版)稳定版。
2 服务器配置建议
(1) Ceph服务器配置推荐
最少三台Centos7系统用于部署Ceph集群,最低硬件配置为2C/2G,另外每台机器最少挂载2块独立硬盘(每块盘20G)。
环境 | 服务器数量 | CPU/内存配置 | 磁盘配置 |
---|---|---|---|
测试环境 | 3 | 2C/2G | 20G * 2 |
生产环境 | 3 | 8C/16G | 1T * 2 |
3 Ceph集群部署规划
主机名 | 操作系统 | IP地址 | CPU/内存配置 | 磁盘配置 | 服务器角色 |
---|---|---|---|---|---|
ceph-deploy | CentOS 7.5.1804 | 172.16.1.30 | 2C/2G | 系统盘: sda | ceph部署、集群控制节点 |
ceph-node01 | CentOS 7.5.1804 | 172.16.1.31 | 2C/2G | 系统盘: sda OSD盘: sdb、sdc | mon * 1、osd * 2、mgr * 1 |
ceph-node02 | CentOS 7.5.1804 | 172.16.1.32 | 2C/2G | 系统盘: sda OSD盘: sdb、sdc | mon * 1、osd * 2、mgr * 1 |
ceph-node03 | CentOS 7.5.1804 | 172.16.1.33 | 2C/2G | 系统盘: sda OSD盘: sdb、sdc | mon * 1、osd * 2、mgr * 1 |
ceph-node04 | CentOS 7.5.1804 | 172.16.1.34 | 1C/1G | 系统盘: sda | 用于ceph集群测试 |
(1) ceph-deploy
ceph集群部署节点,负责集群整体部署,这里单独找了一台服务器作为部署节点,也可以复用node节点。
(2) monitor
Ceph监视管理节点,承担Ceph集群重要的管理任务,负责集群状态维护,例如存储池副本数、PG状态、OSD数量等,至少部署1个(后期可扩容),一般
需要3或5个节点组建高可用(可用节点大于集群节点半数可用)。
(3) osd
Ceph存储节点,实际负责数据存储的节点,集群中至少有3个OSD,不少于默认副本数(3),每个OSD对应一块硬盘。
(4) mgr
MGR是Ceph L版本新增加的组件,主要作用是分担和扩展monitor的部分功能,减轻monitor的负担。建议每台monitor节点都部署一个mgr,以实现
相同级别的高可用。使用active/standby模式,多节点部署,可以在master down时,无缝顶替。
4 操作系统初始化配置
在 172.16.1.30-33节点上进行操作
(1) 关闭防火墙
# systemctl stop firewalld
# systemctl disable firewalld
(2) 关闭selinux
# sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久,重启生效
# setenforce 0 # 临时生效
(3) 关闭swap
# swapoff -a # 临时生效
# sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久,重启生效
(4) 根据规划设置主机名
1) 172.16.1.30节点
# hostnamectl set-hostname ceph-deploy
2) 172.16.1.31节点
# hostnamectl set-hostname ceph-node01
3) 172.16.1.32节点
# hostnamectl set-hostname ceph-node02
4) 172.16.1.33节点
# hostnamectl set-hostname ceph-node03
(5) 添加主机名与IP对应关系
注: 在172.16.1.30节点上配置即可,因为ceph-deploy工具部署ceph集群依赖于主机名。
# cat >> /etc/hosts << EOF
172.16.1.30 ceph-deploy
172.16.1.31 ceph-node01
172.16.1.32 ceph-node02
172.16.1.33 ceph-node03
EOF
(6) 同步网络时间和修改时区
# yum install ntpdate
# crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
(7) 设置文件描述符
# ulimit -SHn 65535 # 临时生效
# cat >> /etc/security/limits.conf << EOF # 永久,退出当前session,再进入生效
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
EOF
(8) 内核参数优化
# cat >> /etc/sysctl.conf << EOF
kernel.pid_max = 4194303
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF
# sysctl -p
(9) 配置免密登录到ceph-deploy、ceph-node01、ceph-node02、ceph-node03
注: 在172.16.1.30节点上操作
# ssh-keygen -t rsa
# ssh-copy-id root@ceph-deploy
# ssh-copy-id root@ceph-node01
# ssh-copy-id root@ceph-node02
# ssh-copy-id root@ceph-node03
(10) I/O Scheduler,SSD要用noop,SATA/SAS使用deadline(默认)
# echo "deadline" >/sys/block/sd[x]/queue/scheduler
# echo "noop" >/sys/block/sd[x]/queue/scheduler
5 Ceph集群部署
注: 在172.16.1.30节点上操作
(1) Ceph集群部署方式
yum # 常规的部署方式
ceph-ansible # 官方基于ansible写的自动化部署工具
https://docs.ceph.com/projects/ceph-ansible/en/latest/
ceph-deploy # ceph提供的简易部署工具,可以非常方便的部署ceph集群
https://docs.ceph.com/projects/ceph-deploy/en/latest/
(2) 先创建一个my-cluster目录,所有的命令都在此目录下进行
# mkdir -p /root/my-cluster/
# cd /root/my-cluster/
(3) 配置阿里云yum仓库
注: 在172.16.1.30-33节点上操作
# cat > /etc/yum.repos.d/ceph.repo << EOF
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/\$basearch
gpgcheck=0
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch
gpgcheck=0
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/SRPMS
gpgcheck=0
EOF
注:如果部署别的版本,将octopus替换为对应版本号即可。
# 配置centos的base源和epel源为阿里源
# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# yum clean all
# yum makecache fast
(4) 安装ceph-deploy工具
# yum -y install ceph-deploy
(5) 在管理节点和Ceph节点上安装ceph相关的软件包(时间较长,耐心等待)
# ceph-deploy install --no-adjust-repos ceph-deploy ceph-node01 ceph-node02 ceph-node03
注:
--no-adjust-repos参数是直接使用本地源,不使用官方默认源。
报错:
Traceback (most recent call last):
File "/usr/bin/ceph-deploy", line 18, in <module>
from ceph_deploy.cli import main
File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line 1, in <module>
import pkg_resources
ImportError: No module named pkg_resources
报错解决方法:
# yum install python2-pip -y
(6) 创建集群
1) 开始部署一个集群,生成ceph.conf配置文件、keyring、一个日志文件
# ceph-deploy new ceph-node01 ceph-node02 ceph-node03
# ls -l /root/my-cluster/
total 264
-rw-r--r-- 1 root root 250 Nov 15 17:54 ceph.conf
-rw-r--r-- 1 root root 259037 Nov 15 17:54 ceph-deploy-ceph.log
-rw------- 1 root root 73 Nov 15 17:54 ceph.mon.keyring
2) ceph.conf默认配置参数(其中的参数现在可以修改,例如:mon的数量,后面也可以修改)
# cat /root/my-cluster/ceph.conf
[global]
fsid = 14912382-3d84-4cf2-9fdb-eebab12107d8 # 集群标识ID
mon_initial_members = ceph-node01, ceph-node02, ceph-node03 # 初始monitor
mon_host = 172.16.1.31,172.16.1.32,172.16.1.33 # monitor IP地址
auth_cluster_required = cephx # 集群认证
auth_service_required = cephx # 服务认证
auth_client_required = cephx # 客户端认证
(7) 部署Monitor服务
1) 部署初始monitor成员,即配置ceph.conf文件中mon_initial_members中的monitors,部署直到它们形成表决团,然后搜集keys,并且在这
个过程中报告monitor的状态
# ceph-deploy mon create-initial
# ls -l /root/my-cluster/
total 540
-rw------- 1 root root 113 Nov 15 17:58 ceph.bootstrap-mds.keyring
-rw------- 1 root root 113 Nov 15 17:58 ceph.bootstrap-mgr.keyring
-rw------- 1 root root 113 Nov 15 17:58 ceph.bootstrap-osd.keyring
-rw------- 1 root root 113 Nov 15 17:58 ceph.bootstrap-rgw.keyring
-rw------- 1 root root 151 Nov 15 17:58 ceph.client.admin.keyring
-rw-r--r-- 1 root root 250 Nov 15 17:54 ceph.conf
-rw-r--r-- 1 root root 301492 Nov 15 17:58 ceph-deploy-ceph.log
-rw------- 1 root root 73 Nov 15 17:54 ceph.mon.keyring
补充: 显示的部署monitor,如果create后面不跟参数,则默认是mon_initial_members里的主机
# ceph-deploy mon create [HOST] [HOST…]
args: 'add', 'create', 'create-initial', 'destroy'
2) 使用ceph-deploy命令将配置文件ceph.conf和admin key复制到管理节点和Ceph节点的"/etc/ceph"目录下,以便每次执行ceph CLI命令
无需指定monitor地址和ceph.client.admin.keyring
# ceph-deploy admin ceph-deploy ceph-node01 ceph-node02 ceph-node03
# ls -l /etc/ceph
total 12
-rw------- 1 root root 151 Nov 15 18:01 ceph.client.admin.keyring
-rw-r--r-- 1 root root 250 Nov 15 18:01 ceph.conf
-rw-r--r-- 1 root root 92 Oct 20 22:50 rbdmap
-rw------- 1 root root 0 Nov 15 17:57 tmpLdknSV
(8) 部署OSD服务并添加硬盘
创建6个OSD,分别对应node节点上未使用的独立硬盘。
# ceph-deploy osd create --data /dev/sdb ceph-node01
# ceph-deploy osd create --data /dev/sdc ceph-node01
# ceph-deploy osd create --data /dev/sdb ceph-node02
# ceph-deploy osd create --data /dev/sdc ceph-node02
# ceph-deploy osd create --data /dev/sdb ceph-node03
# ceph-deploy osd create --data /dev/sdc ceph-node03
(9) 部署MGR服务
# ceph-deploy mgr create ceph-node01 ceph-node02 ceph-node03
注: MGR是Ceph L版本新增加的组件,主要作用是分担和扩展monitor的部分功能,减轻monitor的负担。建议每台monitor节点都部署一个mgr,以
实现相同级别的高可用。
(10) 查看ceph集群状态
# ceph -s
cluster:
id: 14912382-3d84-4cf2-9fdb-eebab12107d8
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 11m)
mgr: ceph-node01(active, since 21s), standbys: ceph-node02, ceph-node03
osd: 6 osds: 6 up (since 3m), 6 in (since 3m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 6.0 GiB used, 114 GiB / 120 GiB avail
pgs: 1 active+clean
报错:
cluster:
id: 14912382-3d84-4cf2-9fdb-eebab12107d8
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
Module 'restful' has failed dependency: No module named 'pecan'
报错解决办法:
分别在172.16.1.31-33节点执行如下命令:
# pip3 install pecan werkzeug
# ceph config set mon auth_allow_insecure_global_id_reclaim false
# systemctl restart ceph-mgr.target
(11) 查看ceph版本
# ceph -v
ceph version 15.2.15 (2dfb18841cfecc2f7eb7eb2afd65986ca4d95985) octopus (stable)
(12) 至此ceph集群就部署完成了,查看ceph各节点的进信息
(13) 集群健康状态可能会出现如下警告
cluster:
id: 14912382-3d84-4cf2-9fdb-eebab12107d8
health: HEALTH_WARN
Reduced data availability: 1 pg inactive, 1 pg peering
原因: 在生产当中,数据量比较大的时候,在加盘的时候,它会做平衡,集群通过crush算法平衡把这些pg对象写到新盘上,它会做些运算,会把数据
均衡到新加的盘上,等所有的平衡完之后,这个就能给用户正常提供访问了,它有两种状态,一种是OK,一种是WARN。
ceph集群各节点进程信息图示:
6 Ceph集群服务管理
ceph集群node节点上操作
(1) 启动所有守护进程
# systemctl restart ceph.target
(2) 按类型启动守护进程
# systemctl restart ceph-osd@id
# systemctl restart ceph-mon.target
# systemctl restart ceph-mds.target
# systemctl restart ceph-mgr.target
7 Ceph集群常用管理命令
ceph集群管理节点和node节点都可以操作
组件状态 | 命令 |
---|---|
POOL 状态 | ceph osd pool ls # 查看存储池 ceph osd lspools ceph osd pool ls detail |
PG 状态 | ceph pg stat ceph pg dump # pg详情 |
OSD 状态 | ceph osd stat ceph osd dump #OSD详情 ceph osd tree #OSD分布 ceph osd df #OSD使用 |
Monitor状态 | ceph mon stat ceph mon dump #mon详情 ceph quorum_status #mon的仲裁状态 |
集群空间使用 | ceph df |
查看ceph集群状态 | ceph -s ceph health detail #集群健康状态 ceph -w # 观察集群正在发生的事件 |
mgr的状态 | ceph mgr dump |
8 Ceph.conf 配置文件详解
(1) 默认配置
# cat /root/my-cluster/ceph.conf
[global]
fsid = 14912382-3d84-4cf2-9fdb-eebab12107d8 # 集群标识ID
mon_initial_members = ceph-node01, ceph-node02, ceph-node03 # 初始monitor
mon_host = 172.16.1.31,172.16.1.32,172.16.1.33 # monitor IP地址
auth_cluster_required = cephx # 集群认证
auth_service_required = cephx # 服务认证
auth_client_required = cephx # 客户端认证
(2) 该配置文件采用init文件语法,#和;为注释,ceph集群在启动的时候会按照顺序加载所有的conf配置文件,配置文件分为以下几大块配置
1) global
全局配置
2) osd
osd专用配置,可以使用osd.N,来表示某一个OSD专用配置,N为osd的编号,如0、2、1等
3) mon
mon专用配置,也可以使用mon.A来为某一个monitor节点做专用配置,其中A为该节点的名称,ceph-monitor-2、ceph-monitor-1等,使
用命令ceph mon dump可以获取节点的名称。
4) client
客户端专用配置
(3) 配置文件可以从多个地方进行顺序加载,如果冲突将使用最新加载的配置,其加载顺序为
1) $CEPH_CONF 环境变量
2) -c 指定的位置
3) /etc/ceph/ceph.conf
4) ~/.ceph/ceph.conf
5) ./ceph.conf
(4) 配置文件还可以使用一些元变量应用到配置文件,如
1) $cluster
当前集群名
2) $type
当前服务类型
3) $id
进程的标识符
4) $host
守护进程所在的主机名
5) $name
值为$type.$id
(5) ceph.conf 详细参数
# cat /root/my-cluster/ceph.conf
[global] # 全局设置
fsid = xxxxxxxxxxxxxxx # 集群标识ID
mon host = 10.0.1.1,10.0.1.2,10.0.1.3 # monitor IP 地址
auth cluster required = cephx # 集群认证
auth service required = cephx # 服务认证
auth client required = cephx # 客户端认证
osd pool default size = 3 # 最小副本数,默认是3
osd pool default min size = 1 # PG处于degraded(降级)状态不影响其IO能力,min_size是一个PG能接受IO的最小副本数
public network = 10.0.1.0/24 # 公共网络(monitorIP段)
cluster network = 10.0.2.0/24 # 集群网络
max open files = 131072 # 默认0,如果设置了该选项,Ceph会设置系统的max open fds
mon initial members = node1, node2, node3 # 初始monitor (由创建monitor命令而定)
##############################################################
[mon]
mon data = /var/lib/ceph/mon/ceph-$id
mon clock drift allowed = 1 # 默认值0.05,monitor间的clock drift(时钟偏移)
mon osd min down reporters = 13 # 默认值1,向monitor报告down的最小OSD数
mon osd down out interval = 600 # 默认值300,标记一个OSD状态为down和out之前ceph等待的秒数
##############################################################
[osd]
osd data = /var/lib/ceph/osd/ceph-$id
osd mkfs type = xfs # 格式化系统类型
osd max write size = 512 # 默认值90,OSD一次可写入的最大值(MB)
osd client message size cap = 2147483648 # 默认值100,客户端允许在内存中的最大数据(bytes)
osd deep scrub stride = 131072 # 默认值524288,在Deep Scrub(数据清洗)时候允许读取的字节数(bytes)
osd op threads = 16 # 默认值2,并发文件系统操作数
osd disk threads = 4 # 默认值1,OSD密集型操作例如恢复和Scrubbing时的线程
osd map cache size = 1024 # 默认值500,保留OSD Map的缓存(MB)
osd map cache bl size = 128 # 默认值50,OSD进程在内存中的OSD Map缓存(MB)
osd mount options xfs = "rw,noexec,nodev,noatime,nodiratime,nobarrier"
# 默认值rw,noatime,inode64,Ceph OSD xfs Mount选项
osd recovery op priority = 2 # 默认值10,恢复操作优先级,取值1-63,值越高占用资源越高
osd recovery max active = 10 # 默认值15,同一时间内活跃的恢复请求数
osd max backfills = 4 # 默认值10,一个OSD允许的最大backfills数
osd min pg log entries = 30000 # 默认值3000,修建PGLog是保留的最大PGLog数
osd max pg log entries = 100000 # 默认值10000,修建PGLog是保留的最大PGLog数
osd mon heartbeat interval = 40 # 默认值30s,OSD ping一个monitor的时间间隔
ms dispatch throttle bytes = 1048576000 # 默认值104857600,等待派遣的最大消息数
objecter inflight ops = 819200
# 默认值1024,客户端流控,允许的最大未发送io请求数,超过阀值会堵塞应用io,为0表示不受限
osd op log threshold = 50 # 默认值5,一次显示多少操作的log
osd crush chooseleaf type = 0 # 默认值为1,CRUSH规则用到chooseleaf时的bucket的类型
##############################################################
[client]
rbd cache = true # 默认值 true,RBD缓存
rbd cache size = 335544320 # 默认值33554432,RBD缓存大小(bytes)
rbd cache max dirty = 134217728
# 默认值25165824,缓存为write-back时允许的最大dirty(脏)字节数(bytes),如果为0,使用write-through
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为单位来管理缓存,增大该值可以提升性能。
rbd cache target dirty = 235544320 # 默认值16777216,开始执行回写过程的脏数据大小,不能超过rbd_cache_max_dirty
9 Ceph集群生效ceph.conf
默认生成的ceph.conf文件如果需要改动的话需要加一些参数,如果配置文件变化也是通过ceph-deploy进行推送。
(1) 推送修改的ceph.conf文件到所有节点(覆盖旧的ceph.conf)
# ceph-deploy --overwrite-conf config push ceph-deploy ceph-node01 ceph-node02 ceph-node03
(2) 根据修改的配置文件内容在ceph节点上重启ceph服务
1) 启动所有守护进程
# systemctl restart ceph.target
2) 按类型启动守护进程
# systemctl restart ceph-osd@id
# systemctl restart ceph-mon.target
# systemctl restart ceph-mds.target
# systemctl restart ceph-mgr.target