Linux下离线部署指定版本的Ceph集群

Ceph版本:14.2.22
Linux版本:ubuntu-server 18.04

 
 

第一部分 集群组织架构

Linux下离线部署指定版本的Ceph集群
注:上图中的管理节点并不属于ceph集群,只是一个普通的主机,没有安装ceph,下文所说的集群节点指的是安装了ceph软件的节点。
 
 

第二部分 下载Ceph源码

2.1 配置Ceph源码镜像源

Ceph源码是托管在Github上,由于某些原因,国内访问Github网站很慢,所以需要从其他途径加速获取源码。Github官方给出了几个Github的镜像网站:

  1. https://github.com.cnpmjs.org/
  2. https://hub.fastgit.org/

本地需要修改~/.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

注:

  1. 上面制作过程很漫长,另外所有的包全部放在了ceph源码外面,和ceph源码同级目录
  2. 默认会生成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地址

注:

  1. 实际环境,每个主机都有一个真正的ip,因此为每虚拟机增加一个虚拟网卡,ip地址范围192.168.3.11-192.168.3.12
  2. 其他节点主机的修改以此类推

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

注:

  1. 如果当前用户是root,可以忽略2.2.1和2.2.2
  2. 如果非要新建一个新的普通用户,则必须执行2.2.1和2.2.2
  3. 如果当前已经是普通用户,不建议按照官方说的再新建一个新用户,只需要为当前用户获取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

注:

  1. sources.list中ceph软件源地址对ceph-deploy脚本无效,对手动安装ceph有效,因为ceph-deploy安装ceph时会覆盖sources.list中ceph软件源地址
  2. ~/.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
上一篇:Ceph 修复 PG (归置组)不一致


下一篇:【Leetcode】675. Cut Off Trees for Golf Event