本文简要介绍在Ubuntu 16.04服务器上安装和构建Ceph集群。
介绍
Ceph是一个开源的存储平台,它提供高性能,可靠性和可扩展性。 它是一个免费的分布式存储系统,提供对象,块和文件级存储的接口,并且可以在没有单点故障的情况下运行。 Ceph 的强大可以改变您公司的 IT 基础架构和海量数据管理能力。
CEPH 对象存储
- REST 风格的接口
- 与 S3 和 Swift 兼容的 API
- S3 风格的子域
- 统一的 S3/Swift 命名空间
- 用户管理
- 利用率跟踪
- 条带化对象
- 云解决方案集成
- 多站点部署
- 灾难恢复
CEPH 块设备
- 瘦接口支持
- 映像尺寸最大 16EB
- 条带化可定制
- 内存缓存
- 快照
- 写时复制克隆
- 支持内核级驱动
- 支持 KVM 和 libvirt
- 可作为云解决方案的后端
- 增量备份
CEPH 文件系统
- 与 POSIX 兼容的语义
- 元数据独立于数据
- 动态重均衡
- 子目录快照
- 可配置的条带化
- 有内核驱动支持
- 有用户空间驱动支持
- 可作为 NFS/CIFS 部署
-
可用于 Hadoop (取代 HDFS )
- CephFS 还缺乏健壮得像 ‘fsck’ 这样的检查和修复功能。存储重要数据时需小心使用,因为灾难恢复工具还没开发完。
Ceph集群
Ceph集群由以下组件组成:
-
Ceph OSD(osd) - 处理数据存储,数据复制和恢复。 Ceph集群至少需要两个Ceph OSD服务器。 我们将在此设置中使用三台Ubuntu 16.04服务器。
-
Ceph监视器(mon) - 监视集群状态并运行OSD映射和CRUSH映射。 我们将在这里使用一台服务器。
-
Ceph Meta数据服务器(mds) - 如果要使用Ceph作为文件系统,则需要这样做。
准备
- 系统, 安装了Ubuntu 16.04服务器的6个服务器节点,并配置到 192.168.10.0 网段, 信息如下
192.168.10.147 admin
192.168.10.148 node1
192.168.10.160 node2
192.168.10.161 node3
- 修改镜像源
file=/etc/apt/sources.list
mv $file $file.bak
cat <<EOF >>$file
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic universe
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates universe
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security universe
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security multiverse
EOF
cat $file
- 创建Ceph用户
账户名: cephuser
创建一个名为’ cephuser ‘的新用户, 并配置cephuser以获取无密码的sudo权限
user=cephuser
useradd -m -s /bin/bash $user
echo -e "$user\n$user" |passwd $user
echo "$user ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/$user
chmod 0440 /etc/sudoers.d/$user
sed -i s'/Defaults requiretty/#Defaults requiretty'/g /etc/sudoers
- 安装和配置NTP
安装NTP以在所有节点上同步日期和时间。 运行ntpdate命令通过NTP设置日期和时间。 我们将使用阿里云的NTP池服务器。 然后启动并启用NTP服务器在引导时运行。
sudo apt-get install -y ntp ntpdate ntp-doc
ntpdate -u ntp2.aliyun.com
hwclock --systohc
systemctl enable ntp
systemctl start ntp
- 安装 Open-vm-tools
在运行VMware内的所有节点,则需要安装此虚拟化实用程序。
sudo apt-get install -y open-vm-tools
- 安装Python
sudo apt-get install -y python python-pip parted
- 配置主机文件
file=/etc/hosts
mv $file $file.bak
cat <<EOF >>$file
192.168.10.147 admin
192.168.10.148 node1
192.168.10.160 node2
192.168.10.161 node3
EOF
cat $file
- 修改主机 hostname
分别执行以下命令
hostnamectl set-hostname admin
hostnamectl set-hostname node1
...
配置ssh
我们将配置ceph -admin节点 。 管理节点用于配置监控节点和osd节点。 登录到ceph -admin节点并访问’ cephuser ‘。
ssh root@admin
su - cephuser
管理节点用于安装和配置所有集群节点,因此admin节点上的用户必须具有连接到没有密码的所有节点的权限。 我们需要在’admin’节点上为’cephuser’配置无密码的SSH访问。
ssh-keygen
为ssh配置创建一个配置文件。
file=~/.ssh/config
cat <<EOF >>$file
Host admin
Hostname admin
User cephuser
Host node1
Hostname node1
User cephuser
Host node2
Hostname node2
User cephuser
Host node3
Hostname node3
User cephuser
EOF
cat $file
将配置文件的权限更改为644。
chmod 644 ~/.ssh/config
现在使用ssh-copy-id命令将密钥添加到所有节点。
ssh-keyscan node1 node2 node3 client mon1 >> ~/.ssh/known_hosts
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
现在尝试从admin节点访问node1服务器,以测试无密码登录是否工作。
ssh node1
sudo apt update
配置Ubuntu防火墙
出于安全考虑,我们需要打开服务器上的防火墙。 最好使用Ufw(简单防火墙),这是默认的Ubuntu防火墙来保护系统。 我们将在所有节点上启用ufw,然后打开admin,mon和osd所需的端口。
管理节点/admin
ssh root@admin
sudo apt-get install -y ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 2003/tcp
sudo ufw allow 4505:4506/tcp
sudo ufw enable
监视器节点/node1
登录到监视器节点’node1’并安装ufw。
ssh node1
sudo apt-get install -y ufw
sudo ufw allow 22/tcp
sudo ufw allow 6789/tcp
sudo ufw enable
存储节点/node1,node2,node3
- 在每个osd节点上打开这些端口:node1,node2和node3
- 端口6800-7300。
sudo apt-get install -y ufw
sudo ufw allow 22/tcp
sudo ufw allow 6800:7300/tcp
sudo ufw enable
ufw防火墙配置完成。
配置Ceph OSD节点
-
文件系统背景知识
-
XFS 、 btrfs 和 ext4 相比较 ext3 而言,在高伸缩性数据存储方面有几个优势。
-
XFS 、 btrfs 和 ext4 都是日志文件系统,这使得在崩溃、断电后恢复时更健壮,因为这些文件系统在写入数据前会先记录所有变更。
-
xfs 由 Silicon Graphics 开发,是一个成熟、稳定的文件系统。相反, btrfs 是相对年轻的文件系统,它致力于实现系统管理员梦寐以求的大规模数据存储基础,和其他 Linux 文件系统相比它有独一无二的功能和优势。
-
btrfs 是写时复制( copy-on-write , cow )文件系统,它支持文件创建时间戳和校验和(可校验元数据完整性)功能,所以它能探测到数据坏副本,并且用好副本修复。写时复制功能是说 btrfs 支持可写文件系统快照。 btrfs 也支持透明压缩和其他功能。
-
btrfs 也集成了多设备管理功能,据此可以在底层支持异质硬盘存储,和数据分配策略。未来开发社区还会提供 fsck 、拆分、数据加密功能,这些诱人的功能正是 Ceph 集群的理想选择。
我们有3个OSD节点,每个节点都有两个硬盘分区。
/dev/sda 为系统分区
/dev/sdb 是空分区 - 20GB
使用 /dev/sdb 作为ceph磁盘。
从admin节点登录到所有OSD节点,并使用XFS文件系统格式化 /dev/sdb 分区。
ssh node1
ssh node2
ssh node3
sudo fdisk -l /dev/sdb
通过使用parted命令,使用XFS文件系统和GPT分区表格式化 /dev/sdb 分区。
sudo parted -s /dev/sdb mklabel gpt mkpart primary xfs 0% 100%
使用mkfs命令格式化XFS格式的分区。
sudo apt install -y xfsprogs
sudo mkfs.xfs -f /dev/sdb
现在检查分区,你会看到一个XFS /dev/sdb 分区。
sudo fdisk -s /dev/sdb
sudo blkid -o value -s TYPE /dev/sdb
构建Ceph群集
集群架构:
我们将在admin的节点上安装Ceph
ssh root@admin
su - cephuser
在admin节点上安装ceph-deploy
我们已经在系统上安装了python和python-pip。 现在我们需要从pypi python存储库安装Ceph部署工具’ceph-deploy ‘。
使用pip命令在ceph-admin节点上安装ceph-deploy。
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ceph-deploy
安装ceph-deploy工具后,为Ceph群集配置创建一个新目录。
创建一个新的集群
创建一个新的集群目录。
mkdir cluster
cd cluster/
接下来,通过定义监视节点’ node1 ‘,使用’ ceph-deploy ‘命令创建一个新的集群。
ceph-deploy new node1
该命令将在集群目录中生成Ceph集群配置文件’ceph.conf’。
在[global]块下,粘贴以下配置。
nano ceph.conf
# Your network address
public network = 192.168.10.0/24
在所有节点上安装Ceph
现在使用单个命令从 admin节点的所有节点安装Ceph。
ceph-deploy install node1 node2 node3
该命令将自动在所有节点上安装Ceph:node1-3 安装将需要一些时间。
在admin上执行,部署监视器节点,收集密钥。
ceph-deploy mon create-initial
该命令将创建一个监视器密钥,使用此ceph命令检查密钥。
ceph-deploy gatherkeys mon1
拷贝配置文件及管理密钥
ceph-deploy admin node1 node2 node3
部署管理节点
ceph-deploy mgr create node1
添加 OSD磁盘
ceph-deploy osd create --data /dev/sdb node1
ceph-deploy osd create --data /dev/sdb node2
ceph-deploy osd create --data /dev/sdb node3
检查集群状态
ssh mon1 sudo ceph health
ssh mon1 sudo ceph -s
添加监控节点
ceph-deploy mon add node2 node3
添加管理节点
ceph-deploy mgr create node2 node3
ssh node1 sudo ceph -s
添加CEPH对象网关
要使用Ceph的CEPH对象网关组件,必须部署RGW实例。执行以下操作以创建新的RGW实例:
ceph-deploy rgw create node1
默认情况下,RGW实例将监听端口7480。这可以通过在运行RGW的节点上编辑ceph.conf进行更改,如下所示:
[client]
rgw frontends = civetweb port=80
存储/检索对象数据
要在Ceph存储集群中存储对象数据,Ceph客户端必须:
- 设置对象名称
- 指定池
Ceph客户端检索最新的集群映射,CRUSH算法计算如何将对象映射到放置组,然后计算如何动态地将放置组分配给Ceph OSD守护进程。要查找对象位置,只需要对象名和池名。例如:
ceph osd map {poolname} {object-name}
#As an exercise, lets create an object. Specify an object name, a path to a test file containing some object data and a pool name using the rados put command on the command line. For example:
echo {Test-data} > testfile.txt
ceph osd pool create mytest
rados put {object-name} {file-path} --pool=mytest
rados put test-object-1 testfile.txt --pool=mytest
# To verify that the Ceph Storage Cluster stored the object,
rados -p mytest ls
# identify the object location:
ceph osd map {pool-name} {object-name}
ceph osd map mytest test-object-1
# To remove the test object
rados rm test-object-1 --pool=mytest
#To delete the mytest pool:
ceph osd pool rm mytest
其他
将OSDS添加到群集
在所有节点上安装Ceph之后,现在我们可以将OSD守护程序添加到集群中。 OSD守护进程将在磁盘 /dev/sdb 上创建数据和日志分区。
检查所有osd节点上的可用磁盘 /dev/sdb 。
ceph-deploy disk list osd1 osd2 osd3
显示如下:
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/cephuser/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/local/bin/ceph-deploy disk list osd1 osd2 osd3
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] debug : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] subcommand : list
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fb6a25a35f0>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] host : ['osd1', 'osd2', 'osd3']
[ceph_deploy.cli][INFO ] func : <function disk at 0x7fb6a2a77ad0>
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] default_release : False
[osd1][DEBUG ] connection detected need for sudo
[osd1][DEBUG ] connected to host: osd1
[osd1][DEBUG ] detect platform information from remote host
[osd1][DEBUG ] detect machine type
[osd1][DEBUG ] find the location of an executable
[osd1][INFO ] Running command: sudo fdisk -l
[osd1][INFO ] Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
[osd1][INFO ] Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
[osd2][DEBUG ] connection detected need for sudo
[osd2][DEBUG ] connected to host: osd2
[osd2][DEBUG ] detect platform information from remote host
[osd2][DEBUG ] detect machine type
[osd2][DEBUG ] find the location of an executable
[osd2][INFO ] Running command: sudo fdisk -l
[osd2][INFO ] Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
[osd2][INFO ] Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
[osd3][DEBUG ] connection detected need for sudo
[osd3][DEBUG ] connected to host: osd3
[osd3][DEBUG ] detect platform information from remote host
[osd3][DEBUG ] detect machine type
[osd3][DEBUG ] find the location of an executable
[osd3][INFO ] Running command: sudo fdisk -l
[osd3][INFO ] Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
[osd3][INFO ] Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
接下来,使用zap选项删除所有节点上的分区表。
ceph-deploy disk zap osd1 /dev/sdb
ceph-deploy disk zap osd2 /dev/sdb
ceph-deploy disk zap osd3 /dev/sdb
该命令将删除Ceph OSD节点上/dev/sdb上的所有数据。
初始化 osd 节点上的sdb磁盘
# 省略db 与wal的说明,只指定data则为 (创建于同一个盘)
ceph-deploy --overwrite-conf osd create --data /dev/sdb osd1
ceph-deploy --overwrite-conf osd create --data /dev/sdb osd2
ceph-deploy --overwrite-conf osd create --data /dev/sdb osd3
# 数据日志存在不同的盘符
# ceph-deploy osd create node1 --data /dev/sde --block-db /dev/sdf1 --block-wal /dev/sdf2
现在可以再次检查OSDS节点上的sdb磁盘。
ceph-deploy disk list osd1 osd2 osd3
结果是/dev/sdb现在有两个分区:
- /dev/sdb1 - Ceph数据
- /dev/sdb2 - Ceph Journal
或者您直接在OSD节点上查看。
ssh osd1
sudo fdisk -l /dev/sdb
接下来,将管理密钥部署到所有关联的节点。
ceph-deploy admin admin mon1 osd1 osd2 osd3
通过在所有节点上运行以下命令来更改密钥文件的权限。
sudo chmod 644 /etc/ceph/ceph.client.admin.keyring
测试Ceph
从admin节点登录到Ceph监视服务器 ‘ mon1 ‘
ssh mon1
运行以下命令以检查群集运行状况。
sudo ceph health
现在检查集群状态。
sudo ceph -s
您可以看到以下结果:
确保Ceph健康状况正常 ,并且有一个监视器节点’ mon1 ‘,IP地址为“ 192.168.10.148 ”。
有3台OSD服务器,所有这些都是启动和运行的,应该有可用的磁盘空间为45GB - 3x15GB Ceph Data OSD分区。
至此已成功构建了一个新的Ceph集群。
卸载
ceph-deploy purge admin mon1 osd1 osd2 osd3
ceph-deploy purgedata admin mon1 osd1 osd2 osd3
ceph-deploy forgetkeys
rm ceph.*
命令记录
重启osd服务
systemctl status ceph-osd.target
vi /etc/systemd/system/ceph-osd.target.wants/ceph-osd@0.service
systemctl daemon-reload
systemctl restart ceph-osd.target
问题
monclient: ERROR: missing keyring, cannot use cephx for authentication
https://blog.csdn.net/don_chiang709/article/details/93620825
http://www.tang-lei.com/tags/ceph/
pip 报错
apt-get remove python-pip python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py
#sudo python -m pip install --upgrade --force pip
pip install pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple