前言
Ceph 是一个高性能、可靠、可扩展的开源存储平台。它是一个自由的分布式存储系统,提供了对象、块和文件级存储的接口,并可以不受单点故障的影响而运行。上周调研了CEPH文件集群的优劣性,准备做一个实际搭建的性能测试,在物理机上虚了多个ubuntu出来,模拟多台物理机集群,参考网络资源,搭建起来的,但是有遇到一些错误,可能对于接触过linux的人来说都不算很严重的难题,这里做个记录。本文参考:https://linux.cn/article-8182-1.html, 但遇到了一些错误,记录搭建与解决错误是本文的主旨,错误处理在最后一节。
前提
1:5个安装了 Ubuntu 16.04 的服务器节点
2:所有节点上的 root 权限
(可选前提,如果配置osd为逻辑分区,需要在linux机器上挂一块逻辑分区,供格式化osd使用)
3:osd机器上sdb空闲分区
配置所有节点
配置5个节点来准备安装CEPH集群软件,所以你必须拥有root权限,在5台机器上都安装ssh-server。
1,创建cephuser用户,统一用户名和密码(tip:在所有节点都运行如下指令),
useradd -m -s /bin/bash cephuser passwd cephuser
创建完新用户后,我们需要给 cephuser 配置无密码的 sudo 权限。这意味着 cephuser可以不先输入密码而获取到 sudo 权限运行:
echo "cephuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephuser chmod 0440 /etc/sudoers.d/cephuser sed -i s'/Defaults requiretty/#Defaults requiretty'/g /etc/sudoers
2,安装 NTP 来同步所有节点的日期和时间。先运行 ntpdate 命令通过 NTP 设置日期。我们将使用 US 池的 NTP 服务器。然后开启并使 NTP 服务在开机时启动。
sudo apt-get install -y ntp ntpdate ntp-doc ntpdate 0.us.pool.ntp.org hwclock --systohc systemctl enable ntp systemctl start ntp
3,如果你和我一样在虚拟机里面搭建集群,那么附加运行:
sudo apt-get install -y open-vm-tools
因为ceph-deploy等需要python环境,所以安装python环境,和依赖包parted:
sudo apt-get install -y python python-pip parted
4,编辑hosts文件(vi /etc/hosts):
# ceph-admin 192.168.40.16 mlv1-VirtualBox # ceph-mon1 192.168.40.97 mlv2-VirtualBox # ceph-osd1 192.168.40.106 mlv4-VirtualBox # ceph-osd2 192.168.40.100 mlv6-VirtualBox # ceph-gateway (client) 192.168.40.95 mlv3-VirtualBox
这里hostname最好和你集群机器的主机名一样,我就因为不一样在ssh安装ceph到其他节点的时候报错了。
配置SSH服务器
这一步的目的是配置admin节点,完成admin节点无密码访问其他节点,首先登录到ceph-admin节点:
ssh root@mlv1-VirtualBox su - cephuser
管理节点用来安装配置所有集群节点,所以 ceph-admin 上的用户必须有不使用密码连接到所有节点的权限。我们需要为 ‘ceph-admin’ 节点的 cephuser 用户配置无密码 SSH 登录权限。
1, 生成密钥:
ssh-keygen # 提示输入密码的时候请回车,让密码为空
2,为 ssh 创建一个配置文件
vim ~/.ssh/config
我的配置文件如下:
Host ceph-admin Hostname mlv1-VirtualBox User cephuser Host mon1 Hostname mlv2-VirtualBox User cephuser Host ceph-osd1 Hostname mlv4-VirtualBox User cephuser Host ceph-osd2 Hostname mlv6-VirtualBox User cephuser Host ceph-client Hostname mlv3-VirtualBox User cephuser
保存退出,并赋予文件权限,接着通过 ssh-copy-id 命令增加密钥到所有节点。
chmod 644 ~/.ssh/config ssh-keyscan ceph-osd1 ceph-osd2 ceph-client mon1 >> ~/.ssh/known_hosts ssh-copy-id ceph-osd1 ssh-copy-id ceph-osd2 ssh-copy-id mon1
当请求输入密码时输入你的 cephuser 密码,完成以上配置之后admin节点就可以访问集群别的机器了,顺带截个图:
Ubuntu 防火墙配置
出于安全原因,我们需要在服务器打开防火墙。我们更愿使用 Ufw(不复杂防火墙)来保护系统,这是 Ubuntu 默认的防火墙。在这一步,我们在所有节点开启 ufw,然后打开 ceph-admin、ceph-mon 和 ceph-osd 需要使用的端口。
1,admin节点(安装ufw包)
ssh root@ceph-admin sudo apt-get install -y ufw # 打开 80,2003 和 4505-4506 端口,然后重启防火墙,开机启动。 sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 2003/tcp sudo ufw allow 4505:4506/tcp sudo ufw enable
2,其他节点防火墙配置
ssh ceph-osd1 sudo apt-get install -y ufw sudo ufw allow 22/tcp sudo ufw allow 6800:7300/tcp sudo ufw enable
这里列举osd1的配置,其他节点完全一样。
配置OSD节点
在我的osd上,我在虚拟机上分配了一个逻辑分区sdb,供ceph存数据使用,从 ceph-admin 节点,登录到所有 OSD 节点,然后格式化 /dev/sdb 分区为 XFS 文件系统,在osd的两个机器上运行如下指令:
# 检查分区表 sudo fdisk -l /dev/sdb # 格式化/dev/sdb 分区为 XFS 文件系统,使用 parted 命令创建一个 GPT 分区表。 sudo parted -s /dev/sdb mklabel gpt mkpart primary xfs 0% 100% sudo mkfs.xfs -f /dev/sdb # 查看成果 # 显示磁盘可用大小 sudo fdisk -s /dev/sdb # 显示sdb文件系统格式,现在应该是xfs sudo blkid -o value -s TYPE /dev/sdb
创建CEPH集群
回到admin节点
ssh root@ceph-admin su - cephuser
1,用 pip 命令在 ceph-admin 节点安装 ceph-deploy.
sudo pip install ceph-deploy
2,使用ceph-deploy创建新集群
# 创建一个配置文件目录 mkdir cluster cd cluster # ceph-deploy 命令通过定义监控节点 mon1 创建一个新集群。 # 命令将在集群目录生成 Ceph 集群配置文件 ceph.conf ceph-deploy new mon1
接下来我们需要更改生成的配置文件
vi ceph.conf
在 [global] 块下,粘贴下面的配置。
# 我们的ip地址 public network = 192.168.40.0/24 # 默认备份数 2 osd pool default size = 2
保存文件并退出编辑器,如果这里出现了错误,请查看本文最后一节。
3,安装 Ceph 到所有节点
现在用一个命令从 ceph-admin 节点安装 Ceph 到所有节点
ceph-deploy install ceph-admin ceph-osd1 ceph-osd2 mon1
命令将自动安装 Ceph 到所有节点:mon1、osd1-3 和 ceph-admin - 安装将花一些时间,建议更换ceph安装源,执行如下指令:
export CEPH_DEPLOY_REPO_URL=http://mirrors.163.com/ceph/debian-jewel export CEPH_DEPLOY_GPG_URL=http://mirrors.163.com/ceph/keys/release.asc
现在到 mon1 节点部署监控节点,这一步也很可能报错,报错请查看最后一节。
ceph-deploy mon create-initial1
命令将创建一个监控密钥,用 ceph 命令检查密钥。
ceph-deploy gatherkeys mon1
增加 OSD 到集群
在所有节点上安装了 Ceph 之后,现在我们可以增加 OSD 守护进程到该集群。OSD 守护进程将在磁盘 /dev/sdb 分区上创建数据和日志 。
检查所有 osd 节点的 /dev/sdb 磁盘可用性,应该看到是xfs格式可用磁盘。
ceph-deploy disk list ceph-osd1 ceph-osd2
下面,在所有 OSD 节点上用 zap 选项删除该分区表,这个命令将删除所有 Ceph OSD 节点的 /dev/sdb 上的数据。
ceph-deploy disk zap ceph-osd1:/dev/sdb ceph-osd2:/dev/sdb
现在准备所有 OSD 节点,请确保结果没有报错。
ceph-deploy osd prepare ceph-osd1:/dev/sdb ceph-osd2:/dev/sdb
当你看到log里面有:host ceph-osd2 is now ready forosd use。那么可以进行激活了,激活之前我们查看一下osd的sdb分区:
我们激活data分区就行(如果命令报错就activate sdb):
ceph-deploy osd activate ceph-osd1:/dev/sdb1 ceph-osd2:/dev/sdb1
接下来,部署管理密钥到所有关联节点。
ceph-deploy admin ceph-admin mon1 ceph-osd1 ceph-osd2
在所有节点运行下面的命令,改变密钥文件权限。
sudo chmod 644 /etc/ceph/ceph.client.admin.keyring
Ceph 集群在 Ubuntu 16.04 已经创建完成。
测试集群
看看ceph运行状态:
# 登录到任何节点ssh mon1sudo ceph health sudo ceph -s
截图
配置网关
1,安装ceph对象网关
我们之前配置了client节点,这里我们把gateway配置到client节点,在你的管理节点的工作目录下,给 Ceph 对象网关节点安装Ceph对象所需的软件包:
ceph-deploy install --rgw ceph-client
ceph-common 包是它的一个依赖性,所以 ceph-deploy 也将安装这个包。 ceph 的命令行工具就会为管理员准备好。为了让你的 Ceph 对象网关节点成为管理节点,可以在管理节点的工作目录下执行以下命令:
ceph-deploy admin ceph-client
2,新建网关实例
在你的管理节点的工作目录下,使用命令在 Ceph 对象网关节点上新建一个 Ceph对象网关实例:
ceph-deploy rgw create ceph-client
在网关服务成功运行后,你可以使用未经授权的请求来访问端口 7480 ,你可以在局域网里http://{client的ip}:7480,我这里是:http://192.168.40.95:7480/,网页内容如下:
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Owner> <ID>anonymous</ID> <DisplayName/> </Owner> <Buckets/> </ListAllMyBucketsResult>
Swift 访问实例
1,新建一个 SWIFT 用户
如果你想要使用这种方式访问集群,你需要新建一个 Swift 子用户。创建 Swift 用户包括两个步骤。第一步是创建用户。第二步是创建 secret key。
登录到client主机上,执行上诉两步:
sudo radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
输出如下:
{ "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "auid": 0, "subusers": [ { "id": "testuser:swift", "permissions": "full-control" } ], "keys": [ { "user": "testuser", "access_key": "UYAHFPMQH1HRGB6EG5N5", "secret_key": "DfjtneOIoVMDKsnEpPQ2YWpq3OlqO1FCJPwBYAKe" } ], "swift_keys": [ { "user": "testuser:swift", "secret_key": "0F2SWrRDNLL7skx4XLs9VagENv1XDjyNPTPjIGNw" } ], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "placement_tags": [], "bucket_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "user_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "temp_url_keys": []}
新建 secret key:
sudo radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret
输出如下:
{ "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "auid": 0, "subusers": [ { "id": "testuser:swift", "permissions": "full-control" } ], "keys": [ { "user": "testuser", "access_key": "UYAHFPMQH1HRGB6EG5N5", "secret_key": "DfjtneOIoVMDKsnEpPQ2YWpq3OlqO1FCJPwBYAKe" } ], "swift_keys": [ { "user": "testuser:swift", "secret_key": "lYPpmXg7UN2WNBRc3ftsChrruJaAMWuNdFyrygAl" } ], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "placement_tags": [], "bucket_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "user_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "temp_url_keys": []}
2,测试 SWIFT 访问
在任何局域网机器上安装swift环境:
sudo apt-get install python-setuptools sudo easy_install pip sudo pip install --upgrade setuptools sudo pip install --upgrade python-swiftclient
执行下面的命令验证 swift 访问:
swift -A http://{IP ADDRESS}:{port}/auth/1.0 -U testuser:swift -K '{swift_secret_key}' list
我的执行命令如下:
swift -A http://192.168.40.95:7480/auth -U testuser:swift -K 'lYPpmXg7UN2WNBRc3ftsChrruJaAMWuNdFyrygAl' list
如果成功的话,应该没输出,但是要是失败一定会报错,swift搭好了之后,我写了python脚本,做了测试,测试文档和脚本文件见地址:https://github.com/JakeRed/CephSwiftTest
错误处理
1, 对硬盘进行格式化: # mkfs.xfs /dev/sdb1, 系统显示:
mkfs.xfs error: command not found.
因为系统缺少xfs的部分包,安装解决:
apt-get -y install xfsprogs
2,安装集群时候,log显示:
Reading package lists... Done E: Problem executing scripts APT::Update::Post-Invoke-Success'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi' E: Sub-process returned an error code
系统libappstream3版本老久,解决:
sudo pkill -KILL appstreamcli wget -P /tmp https://launchpad.net/ubuntu/+archive/primary/+files/appstream_0.9.4-1ubuntu1_amd64.deb https://launchpad.net/ubuntu/+archive/primary/+files/libappstream3_0.9.4-1ubuntu1_amd64.deb sudo dpkg -i /tmp/appstream_0.9.4-1ubuntu1_amd64.deb /tmp/libappstream3_0.9.4-1ubuntu1_amd64.deb
3,install安装缓慢,前期vpn解决,后期换源:
export CEPH_DEPLOY_REPO_URL=http://mirrors.163.com/ceph/debian-jewel export CEPH_DEPLOY_GPG_URL=http://mirrors.163.com/ceph/keys/release.asc
4,在执行安装激活的时候报如下错误:
[ceph_deploy][ERROR ] ExecutableNotFound: Could not locate executable 'ceph-volume' make sure it is installed and available on .........
这个是因为ceph-Deploy的版本高了,需要卸载高版本,安装低版本(admin节点):
pip uninstall ceph-deploy
然后下载1.5版本的gz文件,这里我下载的地址: https://pypi.python.org/pypi/ceph-deploy/1.5.39
然后编译执行setup.py文件。
wget https://files.pythonhosted.org/packages/63/59/c2752952b7867faa2d63ba47c47da96e2f43f5124029975b579020df3665/ceph-deploy-1.5.39.tar.gz tar -zxvf ceph-deploy-1.5.39.tar.gz python setup.py build python setup.py install
好像如下方法也能解决:
pip install ceph-deploy==1.5.39
5.问题:
[mlv4-VirtualBox][WARNIN] ceph_disk.main.FilesystemTypeError: Cannot discover filesystem type: device /dev/sdb: Line is truncated: [mlv4-VirtualBox][ERROR ] RuntimeError: command returned non-zero exit status: 1 [ceph_deploy][ERROR ] RuntimeError: Failed to execute command: /usr/sbin/ceph-disk -v activate --mark-init systemd --mount /dev/sdb
首先查看系统状态,我的情况是prepare 之后,已经activate 状态了,可以通过ceph-deploy disk list ceph-osd1 ceph-osd2 查看状态,如果非activate,可以将sdb的用户权限给ceph:
sudo chown ceph:ceph /dev/sdb,
我的问题其实是发现sdb 激活报错,但是 sdb1 也就是 data部分,可以激活,通过:
ceph-deploy osd activate ceph-osd1:/dev/sdb1 ceph-osd2:/dev/sdb1
解决问题。
6.问题:
cephuser@mlv1-VirtualBox:~/cluster$ ceph osd tree 2018-04-11 14:41:40.987041 7f1e42a57700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin: (2) No such file or directory 2018-04-11 14:41:40.987511 7f1e42a57700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication 2018-04-11 14:41:40.987619 7f1e42a57700 0 librados: client.admin initialization error (2) No such file or directory Error connecting to cluster: ObjectNotFound
一般这个问题不会出现,但是出现了最简单的解决方法就是把之前cluster下的key文件(所有文件),cp到每一个节点的/etc/ceph文件夹下解决。
7.gateway搭建之后 auth怎么都不过,没找到具体原因,但重装是个好办法,作用于每一个节点安装:
ceph-deploy purge <ceph-node1> [<ceph-node2>] ceph-deploy purgedata <ceph-node1> [<ceph-node2>]
8.在删除了所有文件之后,集群还占有空间,没及时释放。
官方的解释说,文件对象删除之后,并不会立刻执行GC机制,这个GC机制是可配置的,配置项如下:
"rgw_gc_max_objs": "521", "rgw_gc_obj_min_wait": "1200", "rgw_gc_processor_max_time": "600", "rgw_gc_processor_period": "600",