一、ceph基础
1.1 ceph 简介
Ceph 是一个开源的分布式存储系统,同时支持对象存储、块设备、文件系统.
ceph 是一个对象(object)式存储系统,它把每一个待管理的数据流(文件等数据)切分为一到多个固定大小(默认 4 兆)的对象数据,并以其为原子单元(原子是构成元素的最小单元)完成数据的读写。
对象数据的底层存储服务是由多个存储主机(host)组成的存储集群,该集群也被称之为RADOS(reliable automatic distributed object store)存储集群,即可靠的、自动化的、分布式的对象存储系统。
librados 是 RADOS 存储集群的 API,支持 C/C++/JAVA/python/ruby/php/go等编程语言客户端。
1.2 ceph 设计思想
Ceph 的设计旨在实现以下目标: 每一组件皆可扩展
无单点故障
基于软件(而非专用设备)并且开源(无供应商锁定) 在现有的廉价硬件上运行
尽可能自动管理,减少用户干预
1.3 ceph 集群角色定义
https://docs.ceph.com/en/latest/start/intro/
http://docs.ceph.org.cn/start/intro/
一个 ceph 集群的组成部分:
若干的 Ceph OSD(对象存储守护程序)
至少需要一个 Ceph Monitors 监视器(1,3,5,7...)
两个或以上的 Ceph 管理器 managers,运行 Ceph 文件系统客户端时还需要高可用的 Ceph Metadata Server(文件系统元数据服务器)。
RADOS cluster:由多台 host 存储服务器组成的 ceph 集群
OSD(Object Storage Daemon):每台存储服务器的磁盘组成的存储空间
Mon(Monitor):ceph 的监视器,维护 OSD 和 PG 的集群状态,一个 ceph 集群至少要有一个
mon,可以是一三五七等等这样的奇数个。
Mgr(Manager):负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率,当前性能指标和系统负载等。
1.3.1 Monitor(ceph-mon) ceph 监视器:
在一个主机上运行的一个守护进程,用于维护集群状态映射(maintains maps of the cluster state),比如 ceph 集群中有多少存储池、每个存储池有多少 PG 以及存储池和 PG 的映射关系等, monitor map, manager map, the OSD map, the MDS map, and the CRUSH map,这些映射是 Ceph 守护程序相互协调所需的关键群集状态,此外监视器还负责管理守护程序和客户端之间的身份验证(认证使用 cephX 协议)。通常至少需要三个监视器才能实现冗余和高可用性。
1.3.2 Managers(ceph-mgr)的功能:
在一个主机上运行的一个守护进程,Ceph Manager 守护程序(ceph-mgr)负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph
Manager 守护程序还托管基于 python 的模块来管理和公开 Ceph 集群信息,包括基于 Web
的 Ceph 仪表板和 REST API。高可用性通常至少需要两个管理器。
1.3.3 Ceph OSDs(对象存储守护程序 ceph-osd):
提供存储数据,操作系统上的一个磁盘就是一个 OSD 守护程序,OSD 用于处理 ceph 集群数据复制,恢复,重新平衡,并通过检查其他 Ceph OSD 守护程序的心跳来向 Ceph 监视器和管理器提供一些监视信息。通常至少需要 3 个 Ceph OSD 才能实现冗余和高可用性。
1.3.4 MDS(ceph 元数据服务器 ceph-mds):
代表 ceph 文件系统(NFS/CIFS)存储元数据,(即 Ceph 块设备和 Ceph 对象存储不使用
MDS)
1.3.5 Ceph 的管理节点:
1. ceph 的常用管理接口是一组命令行工具程序,例如 rados、ceph、rbd 等命令,ceph 管理员可以从某个特定的 ceph-mon 节点执行管理操作
2. 推荐使用部署专用的管理节点对 ceph 进行配置管理、升级与后期维护,方便后期权限管理,管理节点的权限只对管理人员开放,可以避免一些不必要的误操作的发生。
1.4 ceph 逻辑组织架构:
Pool:存储池、分区,存储池的大小取决于底层的存储空间。
PG(placement group):一个 pool 内部可以有多个 PG 存在,pool 和 PG 都是抽象的逻辑概念,一个 pool 中有多少个 PG 可以通过公式计算。
OSD(Object Storage Daemon,对象存储设备):每一块磁盘都是一个 osd,一个主机由一个或多个 osd 组成.
ceph 集群部署好之后,要先创建存储池才能向 ceph 写入数据,文件在向 ceph 保存之前要先进行一致性 hash 计算,计算后会把文件保存在某个对应的 PG 的,此文件一定属于某个
pool 的一个 PG,在通过 PG 保存在 OSD 上。
数据对象在写到主 OSD 之后再同步对从 OSD 以实现数据的高可用。
第一步: 计算文件到对象的映射
计算文件到对象的映射,假如 file 为客户端要读写的文件,得到 oid(object id) = ino + ono ino:inode number (INO),File 的元数据序列号,File 的唯一 id。
ono:object number (ONO),File 切分产生的某个 object 的序号,默认以 4M 切分一个块大小。
第二步:通过 hash 算法计算出文件对应的 pool 中的 PG:第一步: 计算文件到对象的映射:
通过一致性 HASH 计算 Object 到 PG, Object -> PG 映射 hash(oid) & mask-> pgid
第三步: 通过 CRUSH 把对象映射到 PG 中的 OSD
通过 CRUSH 算法计算 PG 到 OSD,PG -> OSD 映射:[CRUSH(pgid)->(osd1,osd2,osd3)]
第四步:PG 中的主 OSD 将对象写入到硬盘
第五步: 主 OSD 将数据同步给备份 OSD,并等待备份 OSD 返回确认第六步: 主 OSD 将写入完成返回给客户端
二 、ceph集群部署
2.1 服务器准备
集群部署至少三台服务器,本次规划如下:
cat /etc/hosts
192.168.21.150 deploy.example.local deploy
192.168.21.151 node1.example.local node1
192.168.21.152 node2.example.local node2
192.168.21.153 node3.example.local node3
192.168.21.154 mon1.example.local mon1
192.168.21.155 mon2.example.local mon2
192.168.21.156 mon3.example.local mon3
192.168.21.157 mgr.example.local mgr
cluster 网络网段为192.168.81.0/24 ,主机位与public网络相同。其中node节点上均增加3块20G磁盘
2.2 系统准备
均安装Ubuntu 18.04 ,时间同步,关闭防火墙 配置hosts 域名解析
2.3 配置清华大学镜像源
root@deploy:~# cat /etc/apt/sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific/ bionic main
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific/ bionic main
root@deploy:~#
2.4 创建用户
groupadd -r -g 2023 magedu && useradd -r -m -s /bin/bash -u 2023 -g 2023 magedu && echo magedu:123456 | chpasswd
各服务器允许magedu 用户以sudo用户执行特权命令
echo "magedu ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers
配置deploy节点免密钥登录 其他各节点
切换到magedu 用户 执行ssh-keygen
ssh-copy-id magedu@192.168.21.151
ssh-copy-id magedu@192.168.21.152
ssh-copy-id magedu@192.168.21.153
ssh-copy-id magedu@192.168.21.154
ssh-copy-id magedu@192.168.21.155
ssh-copy-id magedu@192.168.21.156
ssh-copy-id magedu@192.168.21.157
2.5 安装部署工具
在deploy 节点安装ceph-deploy
2.6 初始化mon节点
创建ceph-cluster目录,保存集群初始化信息
Ubuntu 各服务器需要单独安装 Python2:
建立集群并验证
magedu@deploy:~/ceph-cluster$ ceph-deploy new --cluster-network 192.168.81.0/24 --public-network 192.168.21.0/24 mon1.example.local
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/magedu/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy new --cluster-network 192.168.81.0/24 --public-network 192.168.21.0/24 mon1.example.local
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fd8d148edc0>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] ssh_copykey : True
[ceph_deploy.cli][INFO ] mon : [‘mon1.example.local‘]
[ceph_deploy.cli][INFO ] func : <function new at 0x7fd8ce745ad0>
[ceph_deploy.cli][INFO ] public_network : 192.168.21.0/24
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] cluster_network : 192.168.81.0/24
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] fsid : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
[ceph_deploy.new][INFO ] making sure passwordless SSH succeeds
[mon1.example.local][DEBUG ] connected to host: deploy
[mon1.example.local][INFO ] Running command: ssh -CT -o BatchMode=yes mon1.example.local
[mon1.example.local][DEBUG ] connection detected need for sudo
[mon1.example.local][DEBUG ] connected to host: mon1.example.local
[mon1.example.local][DEBUG ] detect platform information from remote host
[mon1.example.local][DEBUG ] detect machine type
[mon1.example.local][DEBUG ] find the location of an executable
[mon1.example.local][INFO ] Running command: sudo /bin/ip link show
[mon1.example.local][INFO ] Running command: sudo /bin/ip addr show
[mon1.example.local][DEBUG ] IP addresses found: [u‘192.168.81.154‘, u‘192.168.21.154‘]
[ceph_deploy.new][DEBUG ] Resolving host mon1.example.local
[ceph_deploy.new][DEBUG ] Monitor mon1 at 192.168.21.154
[ceph_deploy.new][DEBUG ] Monitor initial members are [‘mon1‘]
[ceph_deploy.new][DEBUG ] Monitor addrs are [u‘192.168.21.154‘]
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
magedu@deploy:~/ceph-cluster$ ls
bak ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
magedu@deploy:~/ceph-cluster$ cat ceph.conf
[global]
fsid = f8b123bf-1b48-4eda-8b2f-4aff6a69318a
public_network = 192.168.21.0/24
cluster_network = 192.168.81.0/24
mon_initial_members = mon1
mon_host = 192.168.21.154
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
magedu@deploy:~/ceph-cluster$ cat ceph.mon.keyring
[mon.]
key = AQCAZB9hAAAA
ABAA6TWcbs1Z5mFDbPPRj9yaIw==
caps mon = allow *
初始化存储节点
在mon节点安装mon
初始化mon并验证
2.7 分发admin密钥
各节点安装ceph-common组件
apt install ceph-common -y
增加magedu 用户权限
setfacl -m u:magedu:rw /etc/ceph/ceph.client.admin.keyring && ll /etc/ceph
部署mgr节点
首先在mgr节点安装mgr
root@mgr:~# apt install ceph-mgr
在部署节点添加mgr
magedu@deploy:~/ceph-cluster$ ceph-deploy mgr create mgr
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/magedu/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy mgr create mgr
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] mgr : [(‘mgr‘, ‘mgr‘)]
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] subcommand : create
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fccf3ac8f50>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] func : <function mgr at 0x7fccf3f2b150>
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.mgr][DEBUG ] Deploying mgr, cluster ceph hosts mgr:mgr
[mgr][DEBUG ] connection detected need for sudo
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
[mgr][DEBUG ] connected to host: mgr
[mgr][DEBUG ] detect platform information from remote host
[mgr][DEBUG ] detect machine type
[ceph_deploy.mgr][INFO ] Distro info: Ubuntu 18.04 bionic
[ceph_deploy.mgr][DEBUG ] remote host will use systemd
[ceph_deploy.mgr][DEBUG ] deploying mgr bootstrap to mgr
[mgr][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[mgr][WARNIN] mgr keyring does not exist yet, creating one
[mgr][DEBUG ] create a keyring file
[mgr][DEBUG ] create path recursively if it doesn‘t exist
[mgr][INFO ] Running command: sudo ceph --cluster ceph --name client.bootstrap-mgr --keyring /var/lib/ceph/bootstrap-mgr/ceph.keyring auth get-or-create mgr.mgr mon allow profile mgr osd allow * mds allow * -o /var/lib/ceph/mgr/ceph-mgr/keyring
[mgr][INFO ] Running command: sudo systemctl enable ceph-mgr@mgr
[mgr][INFO ] Running command: sudo systemctl start ceph-mgr@mgr
[mgr][INFO ] Running command: sudo systemctl enable ceph.target
ceph-deploy 管理ceph集群
apt install ceph-common #安装common组件
ceph-deploy admin deploy #推送密钥给自己
setfacl -m:u:magedu:rw /etc/ceph/ceph.client.admin.keyring #授权
ceph -s、
、
ceph config set mon auth_allow_insecure_global_id_reclaim false #消除mon告警
准备 OSD 节点:
OSD 节点安装运行环境:
擦除各个存储节点的磁盘
创建各个存储节点数据盘
设置 OSD 服务自启动:
systemctl enable ceph-osd@0
systemctl enable ceph-osd@1
systemctl enable ceph-osd@2
依次设置其他节点