Ceph版本:14.2.22
Linux版本:ubuntu-server 18.04
第一部分 集群组织架构
注:上图中的管理节点并不属于ceph集群,只是一个普通的主机,没有安装ceph,下文所说的集群节点指的是安装了ceph软件的节点。
第二部分 下载Ceph源码
2.1 配置Ceph源码镜像源
Ceph源码是托管在Github上,由于某些原因,国内访问Github网站很慢,所以需要从其他途径加速获取源码。Github官方给出了几个Github的镜像网站:
本地需要修改~/.gitconfig文件,才可以从上面镜像网站获取源码,相关配置如下:
#Github镜像源
[url "https://hub.fastgit.org/"]
insteadOf = https://github.com/
注:国内也有Ceph源码的镜像,比如Gitee、Gitcode,但不建议从这些网站上获取。因为Ceph源码中使用了大量的第三方源码作为自己的子模块,而Gitee、Gitcode不一定将这些子模块全部同步过来。相反,上面的两个镜像网站和Github完全是同步的,所以可以放心使用。
2.2 克隆ceph源码
Ceph源码很大,可根据需要,选择性下载哪个版本或哪个分支。本案例拉取v14.2.22版本的源码。版本和分支的区别:版本的代码不会随时间改变,被定格在打标签的那一刻;分支的代码会随时间不断开发改变。
# 根据自己需要更换 v14.2.22 为自己需要的版本
git clone -b v14.2.22 --depth=1 https://github.com/ceph/ceph.git
2.3 同步子模块源码
Ceph源码中使用大量的子模块,在 ceph/.gitmodules 文件中罗列出所有的子模块。在后面执行do_cmake.sh 脚本生成 build 目录时,do_cmake.sh 首先同步子模块源码到指定目录。根据经验,在同步子模块源码时很容易出现同步不全,或同步失败,这直接会导致构建 build 目录失败。为了防止此状况发生,建议提前手动去同步子模块源码。
git submodule update --init --recursive
注:如果发现同步子模块源码失败,重复执行上面命令即可。如果中断同步子模块源码,此时必须要到相应目录下删除该子模块所有文件,尤其是 .git 文件。如果不删除 .git,重复执行上面命令时,则会直接跳过同步该子模块,导致子模块源码缺失。这个问题无法被检测到,因为执行完上面命令后,依然会显示同步成功,而不会提示哪个子模块没有被同步。
第三部分 源码编译
3.1 安装依赖
Ceph源码安装依赖很简单,直接执行源码根目录下install-deps.sh脚本,根据经验发现,该脚本存在一些问题,需要稍微修改一下。
3.1.1 修改launchpad源
脚本会安装gcc环境,安装包源url只需要保留一个即可,修改install-deps.sh脚本中的函数ensure_decent_gcc_on_ubuntu
deb [lang=none] http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu $codename main
#deb [arch=amd64 lang=none] http://mirror.cs.uchicago.edu/ubuntu-toolchain-r $codename main
#deb [arch=amd64,i386 lang=none] http://mirror.yandex.ru/mirrors/launchpad/ubuntu-toolchain-r $codename main
3.1.2 屏蔽调用安装libboost的部分
脚本会安装 libboost 库,编译源码过程会再次下载 boost 源码包,因此脚本中不应该再安装 libboost,屏蔽install-deps.sh以下2个地方
*Bionic*)
#install_boost_on_ubuntu bionic
;;
3.1.3 设置pypi镜像源
脚本会安装pypi库,默认url下载很慢,需要设置pypi库镜像源。创建 ~/.pip/pip.conf 文件,并追加以下内容
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
3.1.4 安装其他依赖
编译源码过程中会遇到很多函数用到zstd库,默认情况下ubuntu18.04只安装了libzstd1,但没有用,需要安装 libzstd1-dev
sudo apt install libzstd1-dev
3.1.5 执行脚本
./install-deps.sh
3.2 编译Ceph源码(可以跳过)
此步骤原则上是可以直接跳过,因为下文中在制作deb包执行dpkg-buildpackage命令时,会自动去编译;为了防止编译过程中出现错误并及时解决报错问题,建议先编译源码。
3.2.1 开启debug模式
如果想要调试Ceph源码,需要设置编译源码模式为debug模式,默认编译模式为release模式,该模式是不能调试源码。向 ceph/CMakeList 文件的 set(VERSION 14.2.22) 后追加以下内容
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -Wall -g")
set(CMAKE_CXX_FLAGS "-O0 -Wall -g")
set(CMAKE_C_FLAGS "-O0 -Wall -g ")
3.2.2 构建build目录
直接执行do_cmake脚本,该脚本会进行一系列检测,包括源码是不是完整,依赖是不是都安装了等等。如果出现问题,构建出的build目录是不完整的,最直接的影响是无法生成makefile文件,导致无法编译。
./do_cmake.sh
3.2.3 下载boost源码包
在执行make编译的时候,脚本会自动下载 boost_1_72_0.tar.bz2,由于下载地址和网络问题,下载很慢,为了节省时间,提前手动下载,下载地址:https://download.ceph.com/qa/boost_1_72_0.tar.bz2,将下载的好的包放在ceph/build/boost/src即可。
3.2.4 编译
使用make编译必须要到ceph/build目录下执行,ceph源码可以单独编译某一个模块,也可以全部编译。使用make可以指定多线程编译,提高编译速度,但要合理分配线程数,建议使用4线程编译即可。
#方式1:全部编译
make all -j4
#方式2:单独编译osd某块
make ceph-osd -j4
#查看所有模块
make help
注:源码编译会生成很多库文件和二进制文件,分别放在ceph/build/lib和ceph/build/bin目录下
第四部分 制作本地软件仓库源
4.1 制作deb包
Ceph官网提供制作deb包方法,经过测试发现会有问题。如果直接执行dpkg-buildpackage,会出现签证问题,导致制作失败。此处应该禁用签证,并开启多线程。在ceph源码根目录下执行以下命令
dpkg-buildpackage --build=binary -us -ui -uc -j4
注:
- 上面制作过程很漫长,另外所有的包全部放在了ceph源码外面,和ceph源码同级目录
- 默认会生成2种deb包,一种是带dbg后缀的,一种是不带dbg后缀的;区别在于,dbg包可以用来调试代码。比如:如果想要调试osd进程,需要同时安装ceph-osd和ceph-osd-dbg包
4.2 创建Ceph软件目录
mkdir -p package/pools
mkdir -p package/keys
mkdir -p package/dists/bionic/main/binary-i386
mkdir -p package/dists/bionic/main/binary-amd64
注:bionic是ubuntu18.04的名字
4.3 将所有deb包放到pools下
mv *.deb package/pools
4.4 生成Packages和Release文件
经过测试发现,需要分别为pools和dists/bionic目录生成Packages和Release文件,如果只为pools生成Packages和Release文件,在执行apt update时会因为无法找到Release文件而报错。
4.4.1 为pools生成Packages和Release文件
cd package
#生成Packages文件
apt-ftparchive packages pools | tee -a dists/bionic/main/binary-i386/Packages
gzip -c dists/bionic/main/binary-i386/Packages > dists/bionic/main/binary-i386/Packages.gz
apt-ftparchive packages pools | tee -a dists/bionic/main/binary-amd64/Packages
gzip -c dists/bionic/main/binary-amd64/Packages > dists/bionic/main/binary-amd64/Packages.gz
#生成Release文件
apt-ftparchive release pools | tee -a dists/bionic/main/binary-i386/Release
apt-ftparchive release pools | tee -a dists/bionic/main/binary-amd64/Release
4.4.2 为dists/bionic生成Packages和Release文件
cd package
apt-ftparchive release dists/bionic | tee -a dists/Release | mv dists/Release dists/bionic
4.5 生成签名
签名会根据上面的Release文件和用户的key生成Release.gpg文件,因此首先要生成用户key,然后再分别为pools和dists/bionic单独生成Release.gpg文件。
4.5.1 生成key
gpg --gen-key
4.5.2 为pools生成InRelease和Release.gpg文件
cd package
gpg --clearsign -o dists/bionic/main/binary-i386/InRelease dists/bionic/main/binary-i386/Release
gpg -abs -o dists/bionic/main/binary-i386/Release.gpg dists/bionic/main/binary-i386/Release
gpg --clearsign -o dists/bionic/main/binary-amd64/InRelease dists/bionic/main/binary-amd64/Release
gpg -abs -o dists/bionic/main/binary-amd64/Release.gpg dists/bionic/main/binary-amd64/Release
4.5.3 为dists/bionic生成InRelease和Release.gpg文件
cd package
gpg --clearsign -o dists/bionic/InRelease dists/bionic/Release
gpg -abs -o dists/bionic/Release.gpg dists/bionic/Release
4.5.4 导出key文件
cd package
gpg -a --export 857BAAF7E89478946A67362DF07995A7191CA249 | tee -a keys/release.asc
注:857BAAF7E89478946A67362DF07995A7191CA249是pubkey id,可以通过以下命令查看并获取
gpg -k
结果如下:
/home/admins/.gnupg/pubring.kbx
-------------------------------
pub rsa3072 2022-01-17 [SC] [expires: 2024-01-17]
857BAAF7E89478946A67362DF07995A7191CA249
uid [ultimate] ceph-14.2.22 <1146038583@qq.com>
sub rsa3072 2022-01-17 [E] [expires: 2024-01-17]
4.5.5 添加key到系统
使用apt update时,必须将public key添加到系统中,否则会提示NO_PUBKEY错误信息
cd package
sudo apt-key add keys/release.asc
最终的目录结构如下
├── dists
│ └── bionic
│ ├── InRelease
│ ├── main
│ │ ├── binary-amd64
│ │ │ ├── InRelease
│ │ │ ├── Packages
│ │ │ ├── Packages.gz
│ │ │ ├── Release
│ │ │ └── Release.gpg
│ │ └── binary-i386
│ │ ├── InRelease
│ │ ├── Packages
│ │ ├── Packages.gz
│ │ ├── Release
│ │ └── Release.gpg
│ ├── Release
│ └── Release.gpg
├── keys
│ └── release.asc
└── pools
├── ceph_14.2.22-1_amd64.deb
├── ceph-base_14.2.22-1_amd64.deb
├── ceph-base-dbg_14.2.22-1_amd64.deb
├── ceph-common_14.2.22-1_amd64.deb
├── ceph-common-dbg_14.2.22-1_amd64.deb
├── cephfs-shell_14.2.22-1_all.deb
├── ceph-fuse_14.2.22-1_amd64.deb
├── ceph-fuse-dbg_14.2.22-1_amd64.deb
4.6 添加ceph.list
创建ceph.list文件,并将该文件添加到/etc/apt/source.list.d/下,该步骤可以省略,因为ceph-deploy在安装ceph时会自动创建该文件
echo "deb http://192.168.3.10/ceph bionic main" | sudo tee -a /etc/apt/sources.list.d/ceph.list
注:上面采用http方式,需要安装apache服务才可以使用
4.7 安装Apache服务
sudo apt install apache2
安装完之后,浏览器访问http://192.168.3.10,默认是apche界面,需要设置,以便可以访问http://192.168.3.10/ceph
sudo ln -sf /home/admins/package /var/www/html/ceph
第五部分 集群部署
如果之前已经安装了ceph,无论是哪个版本的,请按照 第六部分 集群卸载 步骤执行卸载动作
5.1 修改主机名
在ceph集群中,每一个主机是一个节点,为了方便管理集群,建议同时修改主机名
5.1.1 修改/etc/hostname文件
登录每一个集群节点,修改/etc/hostname文件,用以下内容覆盖文件中原内容
node1
5.1.2 修改/etc/hosts文件
登录每一个 集群节点,修改/etc/hosts文件
192.168.3.11 node1 #模拟真实ip地址
注:
- 实际环境,每个主机都有一个真正的ip,因此为每虚拟机增加一个虚拟网卡,ip地址范围192.168.3.11-192.168.3.12
- 其他节点主机的修改以此类推
5.1.3 添加节点host到管理节点
在ssh远程登录一个节点时,默认情况下必须要输入对应的ip地址,为了方便管理集群,避免直接使用ip,可以将集群节点的主机名和ip添加到管理节点hosts文件中
192.168.3.11 node1
192.168.3.12 node2
192.168.3.13 node3
5.2 新建用户并获取sudo权限
ceph-deploy安装ceph软件到不同主机的过程中需要以拥有sudo权限的用户登录到不同主机上,因此官方推荐为集群中每一个主机新建一个用户,用户名可以相同。但用户名不能为ceph
5.2.1 创建一个新用户
登录每一个 集群节点,执行以下命令,格式如下sudo useradd -d /home/用户名 -m 用户名 sudo passwd 用户名
sudo useradd -d /home/siscte -m siscte
sudo passwd siscte
5.2.2 新用户获取sudo权限
登录每一个 集群节点,执行以下命令 ,格式如下echo "用户名 ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/用户名 sudo chmod 0440 /etc/sudoers.d/用户名
echo "siscte ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/siscte
sudo chmod 0440 /etc/sudoers.d/siscte
注:
- 如果当前用户是root,可以忽略2.2.1和2.2.2
- 如果非要新建一个新的普通用户,则必须执行2.2.1和2.2.2
- 如果当前已经是普通用户,不建议按照官方说的再新建一个新用户,只需要为当前用户获取sudo权限即可
5.3 设置免密登录
ceph-deploy工具安装ceph软件到不同主机的过程中需要以拥有sudo权限的用户登录到不同主机上,如果用户是普通用户,必然需要输入密码。但是ceph-deploy工具在实现过程中完全采取自动化方式去部署软件,不支持交互式操作。所以需要设置免密
5.3.1 生成ssh key
登录 管理节点,执行以下命令,一路回车,不要输入任何东西
ssh-keygen
5.3.2 将ssh key拷贝到所有主机上
登录 管理节点,执行以下命令 ,格式如下:ssh-copy-id 用户名@主机名 或者 ssh-copy-id 用户名@ip地址
ssh-copy-id siscte@node1
ssh-copy-id siscte@node2
ssh-copy-id siscte@node3
注:此处免密方式是使用ssh key管理方式
5.3.3 设置免用户名登录
ceph-deploy部署ceph软件到集群中各个节点的过程,实际上是通过ssh远程登录的方式,而ssh远程登录需要指定用户名和密码。当然ceph-deploy可以通过 --username 参数指定用户名。此处建议在 ~/.ssh/config 文件中指定用户名,可以避免ceph-deploy部署时要求指定用户。
登录 管理节点,使用vim新建~/.ssh/config,并添加以下内容
Host node1
Hostname node1
User siscte
Host node2
Hostname node2
User siscte
Host node3
Hostname node3
User siscte
5.4 设置时间同步
ceph集群,OSD进程心跳机制,MON进程维护集群map,要求每个主机之间时间同步,否则会影响集群。登录每一个 集群节点,执行以下命令,安装ntp
sudo apt install ntp
5.5 安装ceph-deploy部署工具
ubuntu仓库默认自带了ceph-deploy工具,但不建议安装此版本,该版本太低,可能不支持ceph 14.2.22版本相关操作。因此需要到官方下载最新版本的,下载地址:ceph-deploy_2.0.1。下载完之后,执行以下命令安装即可
sudo dpkg -i ceph-deploy_2.0.1_all.deb
5.6 创建一个集群
登录 管理节点,执行以下命令,在node1节点上部署一个新的集群,格式如下ceph-deploy new 主机名
ceph-deploy new node1
5.7 修改ceph-deploy配置文件
默认情况下,ceph-deploy安装脚本中指定的是ceph13版本的地址,需要重新指定为ceph14版本的地址
登录 管理节点,向~/.cephdeploy.conf文件中追加以下内容
[ceph]
baseurl=http://192.168.3.10/ceph
gpgkey=http://192.168.3.10/ceph/keys/release.asc
default=true
注:
- sources.list中ceph软件源地址对ceph-deploy脚本无效,对手动安装ceph有效,因为ceph-deploy安装ceph时会覆盖sources.list中ceph软件源地址
- ~/.cephdeploy.conf文件中所有行都必向左顶格,不能有空格,否则会报错
5.8 安装ceph软件
登录 管理节点,执行以下命令,为集群中每一个节点都安装ceph软件,格式如下:ceph-deploy install 主机名1 主机名2 ...
ceph-deploy install node1 node2 node3
5.9 创建和初始化mon进程
登录 管理节点,执行以下命令,在node1节点上初始化mon进程
ceph-deploy mon create-initial
5.10 创建mgr进程
登录 管理节点,执行以下命令,在node1节点上创建mgr进程,格式如下:ceph-deploy mgr create 主机名
ceph-deploy mgr create node1
5.11 创建osd进程
登录 管理节点,执行以下命令,分别为node1节点、node2节点、node3节点创建osd进程,格式如下:
bluestore模式:ceph-deploy osd create --data 磁盘设备名 主机名
filestore模式:ceph-deploy osd create --data 磁盘设备名1 --journal 磁盘设备名2 --filestore 主机名
默认情况下,ceph-deploy采用的是bluestore模式。如果仅仅为了学习或测试,建议采用filestore模式,因为filestore模式下,可以看到数据存在哪个目录下;而bluestore则无法看到
bluestore模式:
ceph-deploy osd create --data /dev/sdb node1
ceph-deploy osd create --data /dev/sdb node2
ceph-deploy osd create --data /dev/sdb node3
filestore模式:
ceph-deploy osd create --data /dev/sdb --journal /dev/sdc --filestore node1
ceph-deploy osd create --data /dev/sdb --journal /dev/sdc --filestore node2
ceph-deploy osd create --data /dev/sdb --journal /dev/sdc --filestore node3
5.12 将ceph.conf和ceph.client.admin.keyring添加到/etc/ceph目录下
ceph通过ceph命令来管理集群,如果想要使用ceph命令,需要将相关的key文件和ceph.conf文件放到指定路径下
登录 管理节点,执行以下命令,将key文件和ceph.conf文件分发到每一个集群节点上,格式如下ceph-deploy admin 主机名1 主机名2 ...
ceph-deploy admin node1 node2 node3
注: 不需要分发到所有集群节点上,如果想要在其他主机上也能使用ceph命令,重复此步骤,将节点名更改为对应节点
如果之前有安装过ceph,并且ceph相关的文件没有删除干净,使用下面命令
5.13 修改ceph.client.admin.keyring权限
登录每一个 集群节点,执行以下命令
sudo chmod +r /etc/ceph/ceph.client.admin.keyring
5.14 查看集群状态
登录集群中 任何一个节点,执行以下命令
ceph -s
第六部分 集群卸载
删除集群很简单,但也容易删除不干净,主要包括:卸载ceph软件、删除逻辑卷
6.1 卸载ceph
6.1.1 删除ceph软件
登录 管理节点,执行以下命令,格式如下:ceph-deploy purge 主机名1 主机名2 ...
ceph-deploy purge node1 node2 node3
6.1.2 删除数据
登录 管理节点,执行以下命令,格式如下:ceph-deploy purgedata 主机名1 主机名2 ...
ceph-deploy purgedata node1 node2 node3
6.1.3 删除密钥
登录 管理节点,执行以下命令
ceph-deploy forgetkeys
6.2 删除逻辑卷
ceph-deploy在创建osd时,会将每个osd对应的硬盘以逻辑卷的形式挂在到系统中。如果不删除osd对应的逻辑卷,下次再部署相同id的osd时,会发现osd对应的逻辑卷已经存在,直接导致osd创建失败。
6.2.1 查看osd 逻辑卷
登录每一个 集群节点,执行以下命令
sudo vgdisplay
结果如下:
--- Volume group ---
VG Name ceph-38503e2e-ff3c-4513-ae4c-27197145c4ac
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <10.00 GiB
PE Size 4.00 MiB
Total PE 2559
Alloc PE / Size 2559 / <10.00 GiB
Free PE / Size 0 / 0
VG UUID x0XARi-ztWg-0LI8-y3GS-FbBM-zMQZ-Z6Yhjq
--- Volume group ---
VG Name ceph-86ebc595-b0ed-4020-a5a3-469fb43f56db
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <10.00 GiB
PE Size 4.00 MiB
Total PE 2559
Alloc PE / Size 2559 / <10.00 GiB
Free PE / Size 0 / 0
VG UUID jLj3vl-EgKz-vqxf-18P4-06pW-2JzD-zk4krZ
......
6.2.2 删除osd逻辑卷
登录每一个 集群节点,执行以下命令,格式如下:sudo vgremove VG Name
sudo vgremove ceph-38503e2e-ff3c-4513-ae4c-27197145c4ac