ceph环境搭建
一、节点规划
4个节点,1个管理节点,3个ceph节点。
hostname | IP | alias |
---|---|---|
xjcc-10-70 | 10.100.70.10 | admin-node |
xjcc-11-70 | 10.100.70.11 | node1 |
xjcc-12-70 | 10.100.70.12 | node2 |
xjcc-13-70 | 10.100.70.13 | node3 |
xjcc-20-70 | 10.100.70.20 | client |
- 修改host文件
sudo vim /etc/hosts
- 追加
# The following lines are used for ceph
10.100.70.10 xjcc-10-70
10.100.70.11 xjcc-11-70
10.100.70.12 xjcc-12-70
10.100.70.13 xjcc-13-70
二、准备工作&ceph-deploy安装
1.ceph-deploy setup(所有节点)
- 将Ceph存储库添加到ceph-deploy管理节点。
wget -q -O- 'http://mirrors.aliyun.com/ceph/keys/release.asc' | sudo apt-key add -
- 将Ceph软件包添加到存储库,ceph版本为:octopus。
注意:版本不能太新,服务器源可能没有最新版本
echo deb https://download.ceph.com/debian-octopus/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
- 更新仓库并安装ceph-deploy(管理节点)
sudo apt-get update
sudo apt-get install ceph-deploy
命令行归纳:
# 所有节点都需要设置的命令
wget -q -O- 'http://mirrors.aliyun.com/ceph/keys/release.asc' | sudo apt-key add -
echo deb https://download.ceph.com/debian-octopus/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt-get update
- 由于python3.8之后弃用了_platform.linux_distribution_,需要对ceph-deply做出以下修改:
/usr/lib/python3/dist-packages/ceph_deploy/hosts/remotes.py
def platform_information(_linux_distribution=None):
""" detect platform information from remote host """
- linux_distribution = _linux_distribution or platform.linux_distribution
- distro, release, codename = linux_distribution()
+ distro = release = codename = None
+ try:
+ linux_distribution = _linux_distribution or platform.linux_distribution
+ distro, release, codename = linux_distribution()
+ except AttributeError:
+ # NOTE: py38 does not have platform.linux_distribution
+ pass
2. 创建部署Ceph的用户(所有节点)
ceph-deploy工具必须以普通用户登录 ceph 节点,且此用户拥有无密码使用 sudo 的权限,因为它需要在安装软件及配置文件的过程中,不必输入密码。
- 在各个节点上创建新用户:cepher
sudo useradd -d /home/cepher -m cepher
sudo passwd cepher
- 新创建的用户赋予免密sudo权限
echo "cepher ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cepher
sudo chmod 0440 /etc/sudoers.d/cepher
usermod -s /bin/bash cepher #指定新建用户的shell
3. 无密码SSH登录(管理节点)
由于ceph-deploy不会提示输入密码,因此您必须在管理节点上生成SSH密钥,并将公用密钥分发给每个Ceph节点。 ceph-deploy将尝试为初始监视器生成SSH密钥。
- 生成SSH密钥,但不要使用sudo或root用户。 密码留为空。
ssh-keygen
- 将密钥复制到每个Ceph节点。
ssh-copy-id cepher@xjcc-11-70
ssh-copy-id cepher@xjcc-12-70
ssh-copy-id cepher@xjcc-13-70
- 修改 ~/.ssh/config 文件(没有则新增),这样 ceph-deploy 就能用所建的用户名登录 Ceph 节点了。
sudo vim ~/.ssh/config
内容如下:
Host xjcc-10-70
Hostname xjcc-10-70
User cepher
Host xjcc-11-70
Hostname xjcc-11-70
User cepher
Host xjcc-12-70
Hostname xjcc-12-70
User cepher
Host xjcc-13-70
Hostname xjcc-13-70
User cepher
- 测试是否设置成功
ssh cepher@xjcc-11-70
4. NTP安装
sudo apt install ntp
for i in {1..3}
do ssh xjcc-1${i}-70 "\
sudo apt install ntp
"
done
ntp配置文件修改
sudo vim /etc/ntp.conf
在上级服务器配置处添加
server 10.100.70.10 prefer
ntp服务重启命令
sudo /etc/init.d/ntp restart
三、集群搭建
在管理节点下执行:
1. 安装准备:创建文件夹
cd ~
mkdir my-cluster
cd my-cluster
注意:出错的话,remake:
# 删除安装包
ceph-deploy purge xjcc-10-70 xjcc-11-70 xjcc-12-70 xjcc-13-70
# 清除配置
ceph-deploy purgedata xjcc-10-70 xjcc-11-70 xjcc-12-70 xjcc-13-70
ceph-deploy forgetkeys
# 清除ceph-deploy创建的文件
rm ceph.*
2. 在每个节点上运行如下命令,自动修复存在异常的deb
sudo apt --fix-broken install
- 创建集群和监控(monitor)节点(mon节点)
创建集群并初始化监控节点,这里xjcc-11-70是监控节点,所以执行:
ceph-deploy new xjcc-11-70
4. 安装Ceph
在所有节点上安装ceph:
ceph-deploy install xjcc-10-70 xjcc-11-70 xjcc-12-70 xjcc-13-70
注意:安装过程中出错,使用如下两条指令
sudo apt --fix-broken install
dpkg -i --force-overwrite /var/cache/apt/archives/ceph-base_15.1.0-1bionic_amd64.deb # 后面这个参数根据报错内容更改
5. 配置初始 monitor(s)、并收集所有密钥
ceph-deploy mon create-initial
6. 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点
ceph-deploy admin xjcc-11-70 xjcc-12-70 xjcc-13-70
7. 部署管理器守护程序
ceph-deploy mgr create xjcc-11-70
8. 添加3个OSD
- 首先新建文件夹
ssh xjcc-11-70
sudo dd if=/dev/zero of=/var/local/osd0.img bs=1M count=1024 oflag=direct
sudo sgdisk -g --clear /var/local/osd0.img
sudo vgcreate ceph-osds $(sudo losetup --show -f /var/local/osd0.img)
sudo lvcreate -L1000M -nosd0 ceph-osds
sudo mkfs.xfs -f /dev/ceph-osds/osd0
sudo mount /dev/ceph-osds/osd0 /mnt
exit
ssh xjcc-12-70
sudo dd if=/dev/zero of=/var/local/osd1.img bs=1M count=1024 oflag=direct
sudo sgdisk -g --clear /var/local/osd1.img
sudo vgcreate ceph-osds $(sudo losetup --show -f /var/local/osd1.img)
sudo lvcreate -L1000M -nosd1 ceph-osds
sudo mkfs.xfs -f /dev/ceph-osds/osd1
sudo mount /dev/ceph-osds/osd1 /mnt
exit
ssh xjcc-13-70
sudo dd if=/dev/zero of=/var/local/osd2.img bs=1M count=1024 oflag=direct
sudo sgdisk -g --clear /var/local/osd2.img
sudo vgcreate ceph-osds $(sudo losetup --show -f /var/local/osd2.img)
sudo lvcreate -L1000M -nosd2 ceph-osds
sudo mkfs.xfs -f /dev/ceph-osds/osd2
sudo mount /dev/ceph-osds/osd2 /mnt
exit
- 在管理节点部署OSD
ceph-deploy osd create --data /dev/ceph-osds/osd0 xjcc-11-70
ceph-deploy osd create --data /dev/ceph-osds/osd1 xjcc-12-70
ceph-deploy osd create --data /dev/ceph-osds/osd2 xjcc-13-70
9. 检查集群的健康状况和OSD节点状况
ssh xjcc-11-70 sudo ceph health
ssh xjcc-11-70 sudo ceph -s
四、集群扩展
1. 添加mds
要使用CephFS,至少需要一个元数据服务器
ceph-deploy mds create xjcc-11-70
2. 添加mon
一个Ceph存储集群至少需要一个Ceph Monitor和Ceph Manager才能运行。 为了获得高可用性,Ceph存储群集通常运行多个Ceph监视器,因此单个Ceph监视器的故障不会使Ceph存储群集停机。
2. 首先,修改ceph.conf文件中mon_initial_members、mon_host和public network的配置为:
mon_initial_members = xjcc-11-70,xjcc-12-70,xjcc-13-70
mon_host = 10.100.70.11,10.100.70.12,10.100.70.13
public network = 10.100.70.10/24
- 将配置推送到其他节点
ceph-deploy --overwrite-conf config push xjcc-11-70 xjcc-12-70 xjcc-13-70
- 添加mon节点
ceph-deploy mon create-initial
3. 添加mgr
Ceph Manager守护进程以活动/备用模式运行。 部署其他管理器守护程序可确保如果一个守护程序或主机发生故障,则另一守护程序或主机可以接管而不会中断服务。
部署其他管理器守护程序:
ceph-deploy mgr create xjcc-12-70 xjcc-13-70
4. 添加RGW实例
要使用Ceph的Ceph对象网关组件,必须部署RGW的实例。
ceph-deploy rgw create xjcc-11-70
默认情况下,RGW实例将在端口7480上侦听。可以通过在运行RGW的节点上编辑ceph.conf进行更改,如下所示:
[client]
rgw frontends = civetweb port=80
五、存储/检索对象数据
要将对象数据存储在Ceph存储集群中,Ceph客户端必须:
- 设置对象名称
- 指定一个池
例子:存储一个对象
- 创建一个对象
echo hahaha > testfile.txt
# 创建一个池
sudo ceph osd pool create mytest 8
# sudo rados put {object-name} {file-path} --pool=mytest
sudo rados put test-object-1 testfile.txt --pool=mytest
- 验证Ceph存储集群是否存储了该对象
sudo rados -p mytest ls
- 确定对象位置
# sudo ceph osd map {pool-name} {object-name}
sudo ceph osd map mytest test-object-1
Ceph应该输出对象的位置,比如:
osdmap e537 pool 'mytest' (1) object 'test-object-1' -> pg 1.d1743484 (1.4) -> up [1,0] acting [1,0]
- 删除测试对象,使用rados rm命令
# sudo rados rm {object-name} --pool={pool-name}
sudo rados rm test-object-1 --pool=mytest
- 删除创建的pool
首先应该运行mon删除pool:在管理节点修改ceph.conf,添加以下内容
[mon]
mon allow pool delete = true
将配置推送到其他节点
ceph-deploy --overwrite-conf config push xjcc-11-70 xjcc-12-70 xjcc-13-70
重启mon节点
for i in {1..3}
do ssh xjcc-1${i}-70 "\
sudo systemctl restart ceph-mon.target
"
done
删除pool
# sudo ceph osd pool rm {pool-name} {pool-name} --yes-i-really-really-mean-it
sudo ceph osd pool rm mytest mytest --yes-i-really-really-mean-it
- 验证是否删除pool
sudo rados lspools
六、块设备快速入门(client安装)
1. 创建用户、配置无密码ssh并安装ceph
这里将xjcc-20-70作为client
- 在管理节点修改hosts文件,追加主机名xjcc-20-70
# The following lines are desirable for ceph clients
10.100.70.20 xjcc-20-70
ceph-deploy install xjcc-20-70
- 在管理节点上,使用ceph-deploy将Ceph配置文件和ceph.client.admin.keyring复制到ceph-client
ceph-deploy admin xjcc-20-70
注意,这里要确保密钥环文件具有适当的读取权限,例如sudo chmod + r /etc/ceph/ceph.client.admin.keyring
2. 创建一个块设备池
- 在client节点上,使用ceph工具创建一个池(建议使用名称“ rbd”)
sudo ceph osd pool create rbd
- 在管理节点上,使用rbd工具初始化池以供RBD使用:
ssh xjcc-11-70 rbd pool init rbd
3. 配置块设备
- 在ceph-client节点上,创建一个块设备映像
# rbd create foo --size 4096 --image-feature layering [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring] [-p {pool-name}]
# mon-IP:mon节点的IP地址
rbd create foo --size 4096 --image-feature layering -m 10.100.70.11 -k /etc/ceph/ceph.client.admin.keyring -p rbd
- 在ceph-client节点上,将映像映射到块设备
# sudo rbd map foo --name client.admin [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring] [-p {pool-name}]
sudo rbd map foo --name client.admin -m 10.100.70.11 -k /etc/ceph/ceph.client.admin.keyring -p rbd
- 通过在ceph-client节点上创建文件系统来使用块设备
# sudo mkfs.ext4 -m0 /dev/rbd/{pool-name}/foo
sudo mkfs.ext4 -m0 /dev/rbd/rbd/foo
# This may take a few moments.
- 在ceph-client节点上挂载文件系统
sudo mkdir /mnt/ceph-block-device
# sudo mount /dev/rbd/{pool-name}/foo /mnt/ceph-block-device
sudo mount /dev/rbd/rbd/foo /mnt/ceph-block-device
cd /mnt/ceph-block-device
手动搭建方式
1. 安装ceph (已作废)
- 为提高clone速度,将github的ceph导入到gitee,然后修改ceph/.gitmodules文件中submodules的仓库来源从github.com换到gitee,例如将"github.com/ceph/…“替换为"gitee.com/czy233/…”
ps. 其中由于gitee个伞兵把spawn认定为敏感词,所以ceph/spawn使用https://gitee.com/xuqiliang/spawn.git代替
pss. 子模块中又有子子模块,所以子子模块也要fork到gitee。 - 安装npm和cypress,因为后期老下载失败
sudo apt install npm
npm install cypress --save-dev
- clone源代码
git clone --recursive git@gitee.com:czy233/ceph.git
- 安装相应的库和依赖
首先,安装pip并换源,加速whl文件下载
clone mkcodes,防止从GitHub clone失败
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
git clone https://gitee.com/czy233/mkcodes.git /home/mcloud/ceph/install-deps-python3/src/mkcodes
创建 ~/.pip/pip.conf
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
然后,进入到ceph文件夹,安装依赖
cd ceph
./install-deps.sh
- cmake出makefile
cd ceph
./do_cmake.sh # debug版本
./do_cmake.sh ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo" # release版本
- 编译
cd build
sudo ninja -j16
- 安装
sudo ninja install -j16
- 测试
sudo ninja vstart # builds just enough to run vstart
../src/vstart.sh --debug --new -x --localhost --bluestore
./bin/ceph -s
安装ceph(从tar包导入)
- 从中科大镜像站get tarball
wget http://mirrors.ustc.edu.cn/ceph/tarballs/ceph_15.2.9.orig.tar.gz
- 解压
gzip -d ceph_15.2.9.orig.tar.gz
tar -xvf ceph_15.2.9.orig.tar
- 手动安装pip并换源
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py # 运行安装脚本
pip -v # 查看pip版本
# 创建 ~/.pip/pip.conf
mkdir ~/.pip
vim ~/.pip/pip.conf
# 加入以下内容
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
# 查看pip源
pip config list
- 安装相关依赖
cd ceph-15.2.9/
./install-deps.sh
- 修改./do_cmake.sh,取消更新submodules(此过程不重要,可选)
sed -i "s/git submodule update --init --recursive/# git submodule update --init --recursive/g" do_cmake.sh
- make & install
./do_cmake.sh -DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_MANPAGE=OFF -DWITH_BABELTRACE=OFF -DWITH_MGR_DASHBOARD_FRONTEND=OFF
cd build
make -j16
sudo make install
- 运行测试样例
sudo make vstart
../src/vstart.sh -d -n -x
./bin/ceph -s
../src/stop.sh
- 最后提供一个脚本start.sh来一键编译安装ceph
#!/bin/bash -e
wget http://mirrors.ustc.edu.cn/ceph/tarballs/ceph_15.2.9.orig.tar.gz
gzip -d ceph_15.2.9.orig.tar.gz
tar -xvf ceph_15.2.9.orig.tar
cd ceph-15.2.9/
sudo apt-get -y install python3-pip
mkdir ~/.pip
echo "[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com" >> ~/.pip/pip.conf
./install-deps.sh
sed -i "s/git submodule update --init --recursive/# git submodule update --init --recursive/g" do_cmake.sh
ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_MANPAGE=OFF -DWITH_BABELTRACE=OFF -DWITH_MGR_DASHBOARD_FRONTEND=OFF" ./do_cmake.sh
cd build
sudo make -j24
sudo make install
../src/vstart.sh --debug --new -x --localhost --bluestore
./bin/ceph -s
../src/stop.sh
ps1:目前已经将整个项目上传到gitee,可以从gitee上clone 代码存在问题,已作废,需要下载tar包手动安装
git clone https://gitee.com/czy233/ceph-invoke-fabric.git
下载的tar包push到git上之前,要打tag,否则就会编译失败
git tag v1.0
ps2:从gitee上clone后依然要进行pip安装与换源
ps3:由于fstream不支持路径“~”,需要修改log中的打开文件的绝对路径
2. 安装 ccache,提高本地编译速度
- 安装
sudo apt-get install ccache
- 查看ccache 安装位置
whereis ccache
- 启用ccache
vim ~/.bashrc
# 添加
export USE_CCACHE=1
export PATH=/usr/lib/ccache:$PATH
# 退出
- 设置ccache大小
ccache –M 50G
3. 错误处理
- 从tar包下载的项目推送到git之前先打个tag,然后本地编译一遍之后才能push到git,不然clone下来无法使用
- internal compiler error: Segmentation fault错误:重新编译