在windows和Linux系统之间进行数据备份

1. 数据备份目的

我希望将一些重要的文本数据保存在我的多台windows电脑和服务器中。这样实现数据的安全的同时,能随时在不同的windows电脑上对这些文件进行访问和实时修改。

为了实现这样的功能,我的操作方法是:以Linux服务器上的数据为主,每当开启我的某台windows系统后,我会点击桌面上的一个程序,开始和服务器上的数据进行同步;每当对数据文件进行修改后,再次点击桌面上的程序,再次进行和服务器的数据同步。具体备份机制则是使用rsync命令进行数据文件夹的同步,能检测各个文件的时间戳,从而对整个文件夹进行快速更新,而不是全部重新拷贝。

2. Windows系统下安装Cygwinapt-cyg软件

由于windows系统下没有后Linux系统的rsync命令,则推荐在windows系统下安装Cygwin软件。使用该软件能在windows系统下体验Linux应用的运行。下载最新版本的Cygwin软件,然后在windows系统下进行安装。需要注意的是,安装的时候要选择或填写可用的镜像站点网址(例如,http://mirrors.163.com/cygwin/)才能进行联网下载和安装。安装完毕后,双击windows系统桌面上的软件图标,则打开了一个Linux系统的终端,用于Linux系统命令的直接运行。此外,Cygwin软件在Windows目录C:\cygwin64\bin下生成了各个Linux命令的exe文件,可以用于windows下CMD中运行相应的命令。

Cygwin其实是在Windows系统上安装了一个可以在Windows系统中直接运行Linux命令的特殊的小型虚拟机。为了能在该虚拟的Linux系统中安装软件,还需要安装其包管理器软件apt-cyg。双击桌面上的Cygwin64 Terminal软件图标,打开终端,输入如下命令安装apt-cyg软件,再安装rsync命令:

# 从官网下载apt-cyg软件,其实是一个bash脚本程序
curl https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
chmod 755 apt-cyg
mv apt-cyg /usr/bin

# 设置apt-cyg的源
apt-cyg mirror http://mirrors.163.com/cygwin
# 下载并安装rsync和oenssh软件
apt-cyg install rsync openssh procps
# 若报错没有wget和lynx命令,则重新双击Cygwin安装软件再次安装,搜索并选中wget和lynx命令,额外安装这两个命令后,则可以让apt-cyg顺利运行。

其实,也可以在安装过程中安装一些需要的软件,例如: procps, gcc, make, cmake, openssh, curl, wget, perl, rsync, vim, lynx和chere等。

3. 在Cygwin终端中运行rsync命令备份数据

# 从服务器上下载ssh密钥
scp -r chenlianfu@47.104.224.181:~/.ssh ./

# 利用密钥将D盘上的一个文件夹备份到服务器上
rsync -a -v -P --delete -e 'ssh -i /home/ChenLianfu/.ssh/id_rsa' /cygdrive/d/ChenLianfu_Data chenlianfu@47.104.224.181:~/
# 使用-a参数能保留文件的时间戳和权限信息;使用-v参数输出程序运行日志信息;使用-P参数支持断点续传和进度信息;使用--delete参数则先在目的端删除本地没有的文件,再进行数据备份;使用-e参数设置ssh参数信息。

# 利用密钥将服务器上的数据下载到本地
rsync -a -v -P -e 'ssh -i /home/ChenLianfu/.ssh/id_rsa' chenlianfu@47.104.224.181:~/ChenLianfu_Data /cygdrive/d/

安装smcpp软件

在CentOS8系统直接安装smcpp软件

sudo dnf install mpfr mpfr-devel gmp gmp-devel gsl gsl-devel
pip3 uninstall numpy pandas
pip3 install numpy==1.19
pip3 install pandas==1.4
pip3 install git+https://github.com/popgenmethods/smcpp

也可以使用Conda安装smcpp软件:

# 下载最新版本的miniconda并安装
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
sh https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 将软件安装到指定目录/opt/biosoft/miniconda3_for_smcpp,并设置不要修改~/.bashrc

# 载入conda环境,更新conda,安装smcpp软件
export PATH=/opt/biosoft/miniconda3_for_smcpp/bin/:$PATH
conda update conda
conda create -n smcpp -c conda-forge -c terhorst smcpp

# 使用smcpp软件方法,需要先载入conda环境,再激活smcpp软件环境
export PATH=/opt/biosoft/miniconda3_for_smcpp/bin/:$PATH
source activate /opt/biosoft/miniconda3_for_smcpp
conda activate smcpp

# 使用smcpp软件命令
smc++

# 报错缺少libbz2库文件,安装bzip2软件
conda install -c conda-forge bzip2

# 报错
from pysam.libchtslib import * ImportError: /lib64/libm.so.6: version `GLIBC_2.29' not found,与当前gcc不兼容。使用当前版本gcc重新编译python的pysam模块。
rm -rf /opt/biosoft/miniconda3_for_smcpp/envs/smcpp/lib/python3.7/site-packages/pysam* 
cd /opt/biosoft/miniconda3_for_smcpp/
wget https://files.pythonhosted.org/packages/18/74/69018650a6ec9dae2eb2f710e158fa395134ce579c605f152e41890e7f3c/pysam-0.16.0.tar.gz
tar zxf pysam-0.16.0.tar.gz 
cd pysam-0.16.0/
python setup.py install

CentOS8系统使用小经验

1. 中文输入法安装

CentOS8系统安装完毕后,默认没有中文输入法,需要安装:

yum install -y ibus-libpinyin

若是已经在桌面环境中,则需要注销了重新进入桌面。然后打开控制面板,依次点击Region & Language —— Input Source下的加号 —— Chinese (China) —— Chinese (Intelligent Pinyin) —— Add。再在输入栏中输入字符前,按windows+空格即可切换中文输入法。

2. 双系统启动修改优先使用windows10系统

# 先备份系统启动配置文件
cp /boot/efi/EFI/centos/grubenv /boot/efi/EFI/centos/grubenv.bak

# 找到window10系统的启动菜单ID
menuentry_id=`perl -ne 'print $1 if m/Windows Boot Manager.*(osprober[\w-]+)/' /boot/efi/EFI/centos/grub.cfg`
echo $menuentry_id

# 将默认启动菜单ID替换为Window10系统启动菜单ID
echo perl -p -i -e \'s/saved_entry=.*/saved_entry=$menuentry_id/\' grubenv | sh

# 重启机器检测是否默认从Windows10启动系统
shutdown -r now

我的CEPH分布式存储方案

1. 服务器的硬件部署

我准备了6台存储服务器用于构建Ceph分布式存储。这些服务器连接在万兆交换机上。每台存储服务器的配置如下:

(1)DELL R510服务器准系统,带2电源、2散热器、H700阵列卡带512M缓存和电池、12硬盘架。服务器内部有两个2.5寸硬盘位,外部有12个热插拔3.5寸硬盘位。
(2)使用1颗CPU,Intel XEON L5630,主频2.13GHz,睿频2.4GHz,4核心8线程,TDP 40W。由于使用了一颗低功率的CPU,能达到省电的效果。此外,管理节点使用2颗CPU。
(3)使用4根REG DDR3 PC3-10600R 4G 1333MHz三星内存条,共16G内存。此外,管理节点内存量翻倍。
(5)使用2块DELL ST9146803SS 2.5寸 10K SAS 146G硬盘组RAID1,放置于服务器内部硬盘架上,用于安装系统。
(6)使用12块DELL ST4000NM0023 3.5寸4TB SAS硬盘,放置于外部热插拔硬盘位上。拿其中11块硬盘组RAID6,其中1块硬盘做热备盘,组阵列后的有效容量为36TB。
(7)将1块容量1TB、m.2接口、PCIE协议的nvme固态硬盘插入转接卡中后,插入到服务器的PCI-E 2.0接口上,用于机械硬盘的缓存,增加分布式存储的吞吐量(IOPS)。
(8)使用一张DELL万兆光纤网卡通过DELL单模光模块和单模光纤跳线连接到DELL万兆路由器上。

在Ceph说明文档中,一般推荐在管理节点硬件上使用更好的CPU和更大的内存量,推荐至少4核心CPU、8GB内存。而存储节点仅仅使用CRUSH算法计算数据的存放,消耗CPU和内存较少,推荐至少2核心CPU、2GB内存。当然,内存越大越好,特别是最新版本的Ceph使用Bluestore数据存储方法,它利用到内存来缓存数据。设置参数osd_memory_target值为4GB能保证OSD(Object Storage Device)的性能,设置该参数更大的值能对性能提升有帮助,适合于小文件存储和OSD容量较大(>=256GB)的情况。

在我的Ceph集群中,每台存储服务器使用阵列卡将12块硬盘做成一个RAID磁盘,将该RAID磁盘和nvme固态硬盘合并做一个大容量的OSD,设置osd_memory_target值为为12GB。这样能消耗较小的计算量和内存,因此选用的CPU偏向节能,内存也较少,更加经济。而常规的Ceph集群一般不使用RAID卡做磁盘阵列,让磁盘直接连接到服务器主板,并让每块物理机械硬盘单独做一个OSD,每个OSD都消耗内存和CPU资源,其物理磁盘数量越多,消耗的CPU资源和内存也越大,但是性能更好。因为组RAID阵列后的总体性能一般小于所有物理磁盘性能之和,特别是磁盘数量越多的时候,RAID卡成了磁盘性能的瓶颈。

2. Ceph集群中服务器的系统安装和基础配置

2.1 安装CentOS8系统

我在每台服务器上安装CentOS-8.1.1911-x86_64系统,并使用最大化安装方法:在Software Selection项目中左边栏每点击一项,右边栏都勾上所有软件,最后左边栏勾选Server with GUI,右边栏不要勾选.NET Core Development。安装完毕系统后,全程使用root用户进行后续的操作。

2.2 主机名设置

分别对每台节点设置主机名。例如,对第一台节点(管理节点)设置主机名,使用root用户执行:

cat << EOF > /etc/hostname
ceph1
EOF

cat << EOF > /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=ceph1
EOF

cat << EOF > /proc/sys/kernel/hostname
ceph1
EOF

每台节点设置不一样的主机名,编号为ceph1、ceph2、ceph3 …

2.3 网卡IP设置

推荐在CentOS8系统图形化桌面界面中,左键单击击屏幕右上角位置,打开控制面板界面,点击网络设置选项卡,然后对目标网卡进行固定IP设置,并允许开机启动。设置完毕以后,则可以获得内网固定IP。若需要修改其IP信息,可以使用如下命令行进行修改。例如,对第一台节点设置其IP信息,使用root用户执行:

perl -p -i -e 's/IPADDR=.*/IPADDR=192.168.160.151/' /etc/sysconfig/network-scripts/ifcfg-ens33
perl -p -i -e 's/ONBOOT=.*/ONBOOT=yes/' /etc/sysconfig/network-scripts/ifcfg-ens33
perl -p -i -e 's/PREFIX=.*/PREFIX=24/' /etc/sysconfig/network-scripts/ifcfg-ens33
perl -p -i -e 's/GATEWAY=.*/GATEWAY=192.168.160.2/' /etc/sysconfig/network-scripts/ifcfg-ens33
perl -p -i -e 's/DNS1=.*/DNS1=192.168.160.2/' /etc/sysconfig/network-scripts/ifcfg-ens33

systemctl restart network.service

2.4 将主机名和IP对应

在每台节点上生成生成/etc/hosts文件,囊括所有主机IP信息,在每台节点上使用root用户执行:

cat << EOF >> /etc/hosts
192.168.160.151 ceph1
192.168.160.152 ceph2
192.168.160.153 ceph3
192.168.160.154 ceph4
192.168.160.155 ceph5
192.168.160.156 ceph6
EOF

2.5 设置root用户无密码SSH登录各节点

将root用户设置成无密码ssh登录,保证在任何节点上都可以无密码直接登录其它任意节点。使用root用户在ceph1节点上进行操作:

# 生成rsa密钥对
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

# 将公钥上传给ceph2节点
ssh-copy-id ceph2

# 将授权文件copy到ceph1
scp ceph2:~/.ssh/authorized_keys ~/.ssh/

# 将包含密钥对,授权文件的~/.ssh文件夹拷贝给所有节点,包括ceph1自己
scp -r ~/.ssh ceph1:~/
scp -r ~/.ssh ceph2:~/
scp -r ~/.ssh ceph3:~/
scp -r ~/.ssh ceph4:~/
scp -r ~/.ssh ceph5:~/
scp -r ~/.ssh ceph6:~/
scp -r ~/.ssh ceph7:~/
# 每copy一次的时候,都要识别主机,输入yes和密码。拷贝成功后,则可以无密码SSH登录了。
# 以上scp命令运行成功后,则ceph1中的~/.ssh/known_hosts记录了所有的主机信息。而其它节点的该文件依然只记录了一部分主机信息。将以上命令一次性再全部运行一遍,则保证所有节点中的~/.ssh文件夹内容一致了,完全实现普通用户在各节点间无密码SSH登录。

2.6 启用Aliyun、EPEL和Ceph的YUM源

启用Aliyun源能让国内的软件下载速度更快,启用Extra Packages for Enterprise Linux (EPEL) 源能安装更多第三方软件,启用Ceph源有利于部署Ceph软件。使用root用户在每台节点上进行操作:

# 若已经安装EPEL和Ceph源,可以先删除软件和其配置文件
yum erase -y ceph-release epel-release 
/bin/rm -rf /etc/yum.repos.d/ceph.repo* /etc/yum.repos.d/epel.repo*

# 启用Aliyun镜像源:
/bin/mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
wget http://mirrors.aliyun.com/repo/Centos-8.repo -O /etc/yum.repos.d/CentOS-Base.repo

# 启用EPEL源:
yum install -y epel-release

# 启用Ceph源(对于CentOS8,推荐使用最新octopus版本或luminous版本):
rpm -Uvh https://download.ceph.com/rpm-octopus/el7/noarch/ceph-release-1-1.el7.noarch.rpm
# 以上命令生成/etc/yum.repos.d/ceph.repo文件,推荐对该文件内容进行修改,换成Aliyun镜像,速度更快
perl -p -i -e 's/download.ceph.com/mirrors.aliyun.com\/ceph/' /etc/yum.repos.d/ceph.repo

2.7 开启时间同步服务

在所有 Ceph 节点上安装并运行chrony服务,特别是监控节点,以免因时钟漂移导致故障。在每个节点上使用root用户进行操作:

# CentOS8系统使用chrony进行时间同步服务
systemctl restart chronyd.service
systemctl enable chronyd.service

# 若是CentOS7系统,则使用ntp服务
yum install -y ntp ntpdate ntp-doc
systemctl restart ntpd.service
systemctl enable ntpd.service

2.8 开放防火墙端口

Ceph的监控节点之间默认使用3300 / 6789端口通信, 存储节点之间默认用6800:7300这个范围内的端口通信,管理节点需要使用8843 / 9283端口。虽然Ceph软件部署时会自当开放其中一些端口,但推荐在各节点上先手动开放这些端口更好,有些端口软件部署时没有自动开放。使用root用户操作:

firewall-cmd --zone=public --add-port=3000/tcp --permanent
# 端口3000用于在网页管理界面展示性能统计信息(CPU内存网络消耗等)。
firewall-cmd --zone=public --add-port=3300/tcp --permanent
firewall-cmd --zone=public --add-port=6789/tcp --permanent
firewall-cmd --zone=public --add-port=8443/tcp --permanent
firewall-cmd --zone=public --add-port=9283/tcp --permanent
firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent
systemctl restart firewalld.service
systemctl enable firewalld.service
firewall-cmd --list-ports

3. 部署Ceph存储集群系统

3.1 Ceph软件简介

从我的角度看,Ceph软件用于搭建分布式存储集群,将多台存储服务器上磁盘分区整合成一个容量更大、性能更强、价格更便宜、数据可靠性较高的文件系统。

在存储集群中,存在如下几种服务器:(1)监控节点,用于监控管理节点、OSD、元数据服务器和CRUSH等运行的状态,这对集群的稳定运行是必不可少的,有利于集群中各节点的相互交流。因此,一般最少有3各监控节点来保证高可用性。(2)管理节点,用于收集和统计运行数据,对性能和负载进行分析,并提供WEB控制界面和REST API。正常情况下需要至少2个管理节点来保证高可用性。(3)OSD(Object Storage Daemon)节点,用来存储数据,并将相关信息提供给监控节点和管理节点。一般需要最少3个OSDs来做保证数据冗余和高可用性。(4)元数据服务器(Metadata Server / MDS),用来存储元数据, 有利于提供文件系统服务,然后就可以将分布式存储的文件系统挂载到多台客服机上。正常情况下需要至少2个Meta节点来保证高可用性。

3.2 Ceph集群进行数据存储的简单原理

CEPH能将多台存储服务器的存储空间合并为一个整体,得到一个容量超级大的虚拟磁盘设备,或者说一个容量超级大的分区(文件系统)。当我们将一个文件写入该分区中时,Ceph将该文件分割成很多大小为4MB的objects(小文件碎片),每个object随机均匀地保存到ceph集群中各节点的各物理磁盘上。若写入或读取的文件很大,则得到很多个objects,这些objects可以随机均匀地存储到集群中各存储设备(OSD / object storage device)上,那么其读写速度则非常非常快。这就是Ceph分布式存储的最大优点,即吞吐量非常大。此外,Ceph整合许多台存储服务器,则其容量也可以非常非常大。

为了让Ceph得到较好的存储可靠性,则其关键的是如何将object存储到各节点中的OSDs上。服务器节点多,每个节点下可能会有多个OSDs,它们都可能会出现无法访问的情况,因此ceph可以使用多副本和纠删码两种备份机制中的一种。(1)多副本方法,让每个object保存到多个不同节点的OSDs中。ceph默认使用了3副本方法,则表示object保存到了3个不同的OSDs,从而实现数据安全,但是这样会让有效的存储空间降到三分之一。即使使用2副本的方法,也只有50%的空间利用率。但是Ceph的多副本的方法能获得最好的性能。(2)纠删码方法,则是将数据分割成k份,再根据这k份数据计算出m份同样大小的纠删码数据,将数据保存到k+m个不同的OSDs上。若某一份数据丢失,则可以根据仍然存在的>=k份数据计算出丢失的数据,从而获得完整的数据。只要不超过m份数据丢失,则数据依然可以根据通过解码方法计算出完整的数据。对于纠删码的简单理解:1+2+3+4=10,根据前面4份数据,算出了第5份数据的值;当某一份数据丢失时,1+x+3+4=10,则可以根据纠删码的数据算出丢失的数据x=2,从而获得完整的数据。纠删码方式存储数据的好处是能获得更高的空间利用率。例如,k=4,m=1的空间利用率为80%,k=8,m=2的空间利用率也为80%。但是前者是解一元方程,后者是解二元方程,其计算量更大,但是允许故障的OSDs更多。因此,纠删码方法存储数据会消耗较大的计算量,建议给服务器配置更多的CPU线程。特别是当某个OSDs出故障情况下,对整个OSD的数据重建会消耗极大的计算资源和网络负荷。因为该OSD中数据可能和其他所有的OSDs都有联系,对该OSD数据进行重建,需要读取其他OSDs的数据并进行计算恢复。而多副本的方法,则只需要复制相应的数据即可。此外,将一个object存储到多个OSDs,描述其存放位置的术语为放置组(PG / Placement Group),即一个object数据是保存到一个PG中的。而PG如何映射到不同节点上的多个OSDs中,保证数据可靠性,则是 使用CRUSH算法进行

3.3 部署Ceph软件到管理节点

目前(2020.06.10),最新版本的Ceph为V15.2.3,其版本名称为octopus。值得注意的是,每个大版本的Ceph都赋予了一个专门的名称。我个人强烈推荐使用最新版本的Ceph,因为每次更新都有很多更先进的设置,能获得更好的性能。当前octopus版本和以前的版本相比,改变巨大,其安装方法和使用方法有了很大的改变。目前虽然有4种方法用于部署Ceph软件,但官方推荐使用cephadm安装octopus版本的Ceph。它最为简单快捷,容易成功。

首先,安装cephadm软件。它是Ceph的管理软件,可以用于ceph的部署和卸载。推荐在集群所有节点中都安装cephadm、ceph-common和ceph-osd这3个软件。ceph-common能生成命令ceph,用于查看集群状态,管理集群配置。ceph-osd能对集群的OSD进行操作。

for i in `perl -ne 'print "$1\n" if m/(ceph\d+)/' /etc/hosts`
do
    scp /etc/yum.repos.d/*.repo $i:/etc/yum.repos.d/
    ssh $i "yum install -y epel-release cephadm ceph-common ceph-osd"
done
# 需要先安装ceph和epel的yum源(见2.6步骤),才能安装cephadm、ceph-common和ceph-osd这些和ceph相关的软件。

然后,在管理节点上,部署Ceph管理服务、监控服务:

# 使用cepham命令在第一台管理节点ceph1上安装Ceph软件。
mkdir -p /etc/ceph
cephadm bootstrap --mon-ip 192.168.160.151 &> cephadm.log

以上操作在目标节点上部署了Ceph的管理和监控服务,并生成了如下重要文件:

/root/.ssh/authorized_keys
    SSH的授权登录文件,有利于SSH的无密码登录。
/etc/ceph/ceph.conf
    Ceph的配置文件。该配置文件包含最简单的配置信息:使用fsid标识了该存储集群的文件系统id。此外,根据命令中给定的主机名,在ceph.conf配置文件中也设置了对应的监控节点主机名和IP信息。推荐需要额外增加一些必须的参数,来保证Ceph的稳健运行。
/etc/ceph/ceph.client.admin.keyring
    记录Ceph客户端使用的用户和密码。若在客户端上挂在Ceph文件系统,则需要使用该文件中记录的明文用户名和密码。
/etc/ceph/ceph.pub
    SSH的公钥文件。需要将该文件信息追加到集群中每台服务器的/root/.ssh/authorized_keys文件尾部,以利于各集群服务器之间的SSH访问。因此安装完毕Ceph软件后,要将本教程中2.5部分的scp命令重新执行一遍,保证所有节点中的/root/.ssh/authorized_keys文件内容是一致的,有利于各节点之间的无密码SSH登录。

Ceph的配置文件一般需要修改:

cat << EOF >> /etc/ceph/ceph.conf
osd_pool_default_size = 3
osd_pool_default_min_size = 2
osd_pool_default_pg_num = 512
osd_pool_default_pgp_num = 512
mon_allow_pool_delete = true
EOF
perl -p -i -e 's/^\s*//' /etc/ceph/ceph.conf

systemctl restart ceph.target

在ceph1节点上安装Ceph软件完毕后,软件在屏幕上输出了一些网页使用的提示信息。则可以打开该节点上的firefox软件,打开其中的网址,输入用户名和密码进入Ceph的网页管理界面。

INFO:cephadm:Ceph Dashboard is now available at:
URL: https://ceph1:8443/ User: admin Password: p67wjmjana
INFO:cephadm:You can access the Ceph CLI with:
sudo /usr/sbin/cephadm shell --fsid 35b1d70e-a68c-11ea-9e33-000c29de8f44 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
INFO:cephadm:Please consider enabling telemetry to help improve Ceph:
ceph telemetry on
For more information see:
https://docs.ceph.com/docs/master/mgr/telemetry/
INFO:cephadm:Bootstrap complete.

3.4 添加其他主机并部署多个主机的监控服务和元数据服务

添加其他多个主机作为存储集群的节点:

# 查看当前的主机
ceph orch host ls

# 添加主机前先在每个节点ssh授权文件中添加授权信息
cat /etc/ceph/ceph.pub >> ~/.ssh/authorized_keys
for i in `perl -ne 'print "$1\n" if m/(ceph\d+)/' /etc/hosts`
do
    scp -r ~/.ssh $i:~/
done

# 再添加主机
ceph orch host add ceph2
ceph orch host add ceph3
ceph orch host add ceph4
ceph orch host add ceph5
ceph orch host add ceph6

当添加其他主机后,Ceph会自动在其它一台主机上部署管理服务,在其它两台主机上部署监控服务。一般推荐最少3台监控主机,2台管理主机。若需要在更多主机上部署监控服务:

ceph orch apply mon ceph1,ceph2,ceph3,ceph4
# 注意一定要包含至少一台当前部署了监控服务的主机,例如ceph1,否则程序会先删除在该列表中不存在的主机的监控服务,导致没有监控服务存在了,从而ceph无法运行,无法再重新部署新的监控主机。
# 部署监控主机可能需要等待较长时间。

在指定的主机上部署元数据服务(推荐在Ceph文件系统做好以后再执行,因为输入信息中包含对应文件系统的名称):

ceph orch apply mds cephfs ceph5,ceph6

操作完毕后,查看集群运行状态:

ceph -s
ceph orch ls

3.5 在各存储节点上部署OSD

Ceph软件的octopus版本推荐使用性能更好的BlueStore来进行OSD部署,一开始就接管没有任何分区信息的裸磁盘,能获得更好的性能。此外,还支持使用高速固态硬盘的裸磁盘或GTP分区进行辅助,增加OSD速度。若一个高速固态硬盘给一个机械硬盘OSD加速,则不用对固态硬盘进行分区;若一个高速固态硬盘给多个机械硬盘OSD进行加速,则使用parted命令对高速固态硬盘进行GPT分区。前者推荐使用网页管理界面进行OSD部署,和网页管理方式更兼容;后者推荐用命令行进行操作,网页官界面貌似不能将裸机械磁盘和固态硬盘的GPT分区合并做OSD,但可能和网页管理方式不兼容,导致网页管理中心跳会变黄色warning状态,提示管理不了OSDs。

推荐在网页中打开ceph的管理界面,依次点击Cluster——OSDs——Create,操作OSDs的添加,这样更加方便快捷。注意每添加一个OSD,等一会儿,待该OSD添加到集群中了,再添加下一个OSD。OSDs的设备包含3种

Primary devices (block):一般是各存储节点上的各存储设备,一块块的物理磁盘或阵列卡合并出的虚拟磁盘。

DB device (block.db):可选的设备,用于存放OSD的中间元数据(可以理解为ceph分布式存储集群运行过程中的各种状态信息,这些数据的信息量很大且非常碎片化,以数据库的方式存储)。一般推荐使用SSD固态硬盘存储这些信息,这样才能保证Ceph软件能快速读写元数据,维持软件的高效运行。Ceph会将要存储的元数据会尽可能存储到该设备上,只有当该设备写满后,才会将溢出的数据写入到Primary device。因此,该设备的性能要超过Primary device的性能才有意义。该设备的容量越大越好,一般推荐其容量为Primary device的1%到4%。特别是当ceph集群用于对象存储RGW时,其需要存储的元数据更大,该比例需要超过4%。而ceph集群用作块存储时,则通常1%到2%则足够。

WAL device (block.wal):可选的设备,用于存放journal或者write-ahead数据,一般使用速度更快的nvme固态硬盘会更加有意义。可以理解这个设备就等同于阵列卡的缓存,所有需要读写的文件数据都会先经过该设备,再写入分区中。

不推荐使用价格便宜的SSD硬盘用作DB/WAL设备。例如,有些价格便宜且容量较低的SSD固态硬盘连续写入速度可能只有200M/s,才和普通SAS机械硬盘的速度相当,则不能提高OSD的连续写入速度。也不推荐单块SSD硬盘同时和过多的Primary devices对应。例如,2块900G的SAS SSD硬盘配36块10TB SAS硬盘,则每块SSD对应18块SAS机械硬盘,单块SAS SSD的连续读写极限速度才550M/s,而18块SAS的连续读写速度之和约3.6G/s,这样使用SSD后虽然对IOPS性能有增加,但极大降低了Ceph集群的连续读写速度。

当快速存储设备容量较小(<1G)的时候,则推荐仅用来做WAL device;若容量较大,则推荐做DB device,此时若不做WAL,则缓存(journal)数据会自动存放到最快的设备上。

因此,推荐的方案是:当同时有SSD和nvme时,使用SSD作DB设备,使用nvme作WAL设备;当仅有SSD或nvme其中一种时,使其作DB设备即可。 

也可以使用命令行进行OSDs部署。相比于网页管理界面,命令行能批量化进行操作,适用于服务器中机械硬盘数量较多,创建的OSDs数量较多情况下的批量化处理。此外,命令行能较好支持一个高速硬盘的GPT分区运用到多个OSDs中。而网页管理界面中貌似不能支持,仅支持整个高速固态硬盘支持一个OSD。

# 查看集群中各节点可以进行OSD部署的设备详情
ceph orch device ls

# 使用ceph-volume(需要安装ceph-osd)准备OSD
# 仅仅使用机械硬盘做OSD,要求磁盘不能有分区信息
# ceph-volume lvm prepare --bluestore --data <device>
# 指定WAL / DB设备做OSD时,要求这两种设备是逻辑卷或GTP分区
# ceph-volume lvm prepare --bluestore --data <device> --block.wal <wal-device> --block.db <db-device>
# 在我的Ceph方案中,一个存储节点,只有一个RAID磁盘作block,一个固态硬盘作block.db
ceph-volume lvm prepare --bluestore --data /dev/sdb --block.db /dev/nvme0n1
# 可能会提示错误:[errno 13] RADOS permission denied (error connecting to the cluster)
# 则需要相应的密钥,采用如下命令生成密钥后再进行OSD准备
ceph auth get client.bootstrap-osd > /var/lib/ceph/bootstrap-osd/ceph.keyring

# 激活OSD,将该OSD增加到Ceph集群中,需要输入osd编号和osd的fsid
ceph-volume lvm activate --bluestore 1 0928d5cb-29ed-48c0-bf4a-195d12e973be
# 或者使用--all直接激活所有的OSDs。一般推荐将所有OSD准备好后,一次性让所有OSD激活,这样有利于数据的均衡。
ceph-volume lvm activate --bluestore --all
# 未激活的OSD在网页管理界面中属于down的状态,激活的OSD属于up状态。

# 若之前已经做过OSD的,使用如下命令删除其OSD,有利于重新部署OSD。
# 检测当前可用于做OSD的设备
ceph-volume inventory
# 列出当前的osd设备信息
ceph-volume lvm list
# 毁掉当前的osd设备,让磁盘成为裸盘
ceph-volume lvm zap --osd-id 7
ceph-volume lvm zap /dev/sdb --destroy
ceph-volume lvm zap /dev/nvme0n1 --destroy
# 进行以上删除操作前后,推荐重启服务器,否则可能不能刷新,导致不饿能重新部署OSD

3.6 部署Ceph的逻辑分区POOL

Ceph通过存储池(pool)来存储数据,相当于Ceph集群系统整合多台服务器得到大磁盘的逻辑分区。不同的pool分区有不同的数据存放规则,它管理着PG、CRUSH规则和数据备份机制,即object在PG中如何使用CRUSH规则,依照何种备份方法存放到OSDs中,从而让数据存储到Ceph集群上。注意的是,默认设置下逻辑分区pool是动态的,没有固定容量大小,能一直使用,直到达到最大容量。这和动态磁盘是一样的,好处是可以随时扩容。

创建pool,首先需要设置该pool的PG数量。一般来说,单个OSD的PG数量设置到100左右,能在较好的性能和较低的计算量之间取得平衡。当选择多副本备份机制时,pool的PG数量为:100 * OSD数量 / 副本数;当选择纠删码备份机制时,pool的PG数量为:100 * OSD数量 * k / (k+m)。最后pool的PG数量设置为2的n次方的一个值,该值最接近按以上方法算出来的PG数。例如,我的Ceph方案中,使用纠删码k=5 / m=1,PG数量应该要接近 100 * 6 * 5 / 6 = 500,故选择pg值为512。推荐在/etc/ceph/ceph.conf 配置文件中设置pg值,若不设置的话,其默认pg和pgp值都是32。

使用多副本的方法创建一个存放元数据的pool:

ceph osd pool create cephfs_metadata 128 128 replicated

使用纠删码方法创建一个存放文件数据的pool,需要先设置其备份机制参数

# 创建一个名为myprofile的参数配置
ceph osd erasure-code-profile set myprofile k=4 m=1 crush-failure-domain=host
# 以上设置k=4/m=1,则空间利用率为很高,为80%。

# 删除纠删码配置信息
ceph osd erasure-code-profile rm myprofile
# 查看纠删码参数信息
ceph osd erasure-code-profile get default
ceph osd erasure-code-profile get myprofile
# 查看纠删码参数信息名称
ceph osd erasure-code-profile ls

# 使用纠删码方法创建pool
ceph osd pool create cephfs_data 128 128 erasure myprofile

# 查看pools信息
ceph osd lspools

3.7 部署Ceph文件系统RADOS

Ceph的文件系统可以用于其他服务器的挂载和使用,称为RADOS(Reliable, Autonomic Distributed Object Store)。该文件系统需要两个pools:一个pool用于存放元数据,必须要使用多副本备份机制,因为元数据丢失会导致存储集群系统无法访问;另一个pool用于存放文件数据,可以使用纠删码备份机制,这时必须要求OSDs使用BlueStore数据存储方式。

# 使用EC pool需要设置该pool的allow_ec_overwrites参数值为true
ceph osd pool set cephfs_data allow_ec_overwrites true

# 利用两个pools创建名为cephfs的文件系统
ceph fs new cephfs cephfs_metadata cephfs_data --force

# 查看文件系统名称或其详情
ceph fs ls
ceph fs dump

# (可选)默认ceph文件系统运行最大存放单个文件大小1TB,增大10倍阈值
fs set cephfs max_file_size 10995116277760

# 文件系统创建好后,查看元数据服务处于激活的状态
ceph mds stat

4. Ceph集群系统的使用

4.1 挂载Ceph文件系统

在局域网内任意机器上使用mount命令挂载Ceph文件系统:

# 必须使用管理节点的IP来挂载。
mount -t ceph 192.168.160.151:/ /mnt/ -o name=admin,secret=AQCB+d9e33rCMxAA+O3Cpk3p1yEWkL4hJnQ+EA==

# 其中的用户名和密码查询/etc/ceph/ceph.client.admin.keyring文件。或使用如下命令获取
ceph auth get client.admin
ceph auth ls

我使用虚拟机做测试,每个虚拟机用15G的虚拟磁盘安装系统,用20G的虚拟SATA磁盘作OSD的block,用8GB的虚拟磁盘作OSD的block.db。使用纠删码(k=4/m=1)方式做data pool,使用3副本方式做metadata pool。挂载ceph文件系统的容量为85GB,即空间有效率为85/120=70.8%。

4.2 管理和使用Ceph集群系统的常用ceph命令

查看ceph集群状态:

ceph -s
# -s | --status参数能打印出当前集群状态。
ceph -w
# -w | --watch参数和-s参数一样,但是能实时动态显示集群状态。

集群管理orchestrator模块用于对主机和磁盘设备进行管理:

# 查看集群中各组分的状态
ceph orch ls

# 查看集群中的主机名称
ceph orch host ls
# 添加主机
ceph orch host add <hostname>
# 删除主机
ceph orch host rm <hostname>

# 查看集群中各主机下的磁盘信息
ceph orch device ls [hostname]
# 对集群中某个主机的磁盘进行zap,即删除磁盘分区信息,还原成裸磁盘状态,有利于OSD的创建。
ceph orch device zap <hostname> <path> --force

对集群中的OSDs进行操作:

# 对OSDs的名称、结构、状态和使用率进行查询
ceph osd ls
ceph osd tree
ceph osd status
ceph osd df          # df即disk 

# 对pool的名称和状态进行查看
ceph osd lspools
ceph osd pool ls
ceph osd pool stats [pool_name]

# 查看pool的副本数、纠删码的k/m值和pg[p]数
ceph osd pool get <pool_name> size
ceph osd pool get <pool_name> min_size
ceph osd pool get <pool_name> pg_num
ceph osd pool get <pool_name> pgp_num
ceph osd dump    # 导出pool的详细信息

4.3 Ceph分布式存储集群的全体关机和开机

由于Ceph集群的备份机制,若直接关闭某个主机,系统认为相应的OSDs挂掉,导致数据平衡操作发生,对数据的安全有一定影响。因此,关机需要对数据进行停止读写,并关闭备份机制,然后依次关闭纯OSD主机、元数据主机、监控主机、备用管理主机,最后关闭管理主机。开机的时候依次开启纯OSD主机、元数据主机、监控主机、管理主机和备用管理主机。

# 关闭数据读写和备份机制
ceph osd set noout
ceph osd set norecover
ceph osd set norebalance
ceph osd set nobackfill
ceph osd set nodown
ceph osd set pause

# 依次关闭纯OSD主机、元数据主机、监控主机、备用管理主机和管理主机
# 依次开启纯OSD主机、元数据主机、监控主机、管理主机和备用管理主机

# 开启数据读写和备份机制
ceph osd unset noout
ceph osd unset norecover
ceph osd unset norebalance
ceph osd unset nobackfill
ceph osd unset nodown
ceph osd unset pause

5. 卸载Ceph集群系统

卸载之前,先使用umount在相关节点中卸载ceph文件系统。若操作不成功,添加 -l 参数强行卸载,然后开始Ceph卸载。

首先,在管理节点上操作,删除所有demons:

cephadm rm-cluster --force --fsid `perl -ne 'print $1 if m/fsid = (\S+)/' /etc/ceph/ceph.conf`

再分别在各个节点上操作,以root权限进行操作:关闭ceph相关进程,删除OSDs,卸载ceph相关软件,删除ceph残留文件。

# 关闭名称中含有ceph关键词的所有进程
kill -s 9 `ps -aux | grep ceph | perl -ne 'print "$1 " if m/\s+(\d+)/'`

# 批量删除OSDs,将所有参与OSDs的磁盘恢复成裸磁盘
ceph-volume lvm list | perl -ne 'print "ceph-volume lvm zap --osd-id $1\n" if m/=+\s+osd\.(\d+)\s+=+/; print "ceph-volume lvm zap $1 --destroy\n" if m/\s*devices\s*(\S+)/' | sh
# 检测OSD是否存在
ceph-volume lvm list

# 卸载以ceph字符开头的系统软件
yum remove -y `rpm -qa | grep -P "^ceph" | perl -pe 's/\n/ /'`

# 删除ceph残留文件
rm -rf /etc/ceph /etc/systemd/system/ceph* /var/lib/ceph/

# 重启服务器
sync; sync; sync; shutdown -r now

6. Ceph集群系统的性能相关参数与设置