手记

CEPH环境搭建与Swift调用

前言

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",

               原文出处

                                               


0人推荐
随时随地看视频
慕课网APP