CEPH环境搭建与Swift调用

原创 2018年04月17日 18:06:55

前言

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节点就可以访问集群别的机器了,顺带截个图:
image

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-initial

命令将创建一个监控密钥,用 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分区:
image

我们激活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 mon1
sudo ceph health
sudo ceph -s

截图
image

配置网关

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",
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012359453/article/details/79978574

用PicoContainer和Nanning实现事务管理

用PicoContainer和Nanning实现事务管理Transaction Manager, with PicoContainer and Nanning作者:冰云Blog:http://icec...
  • icecloud
  • icecloud
  • 2004-02-25 10:31:00
  • 2472

【Java】Ceph对Swift的支持及Java…

Ceph对Swift的支持     和Ceph一样,(No Taylor)Swift也是优秀的分布式的对象存储系统,OpenStack开发Swift的攻城狮对二者进行过比较,简单来说,就是各司其职,C...
  • qq_32524177
  • qq_32524177
  • 2017-07-28 09:15:56
  • 378

Ceph与Swift简易对比

Ceph Ceph采用强一致性设计,即Write-All-Read-One,这种模式的好处在于读取效率较高,而且工程难度较低,比较适合与读多写少的系统。 Write-All-Rea...
  • DesireV
  • DesireV
  • 2017-08-03 20:49:47
  • 1819

Ceph和Swift的比较-为什么他们没有撕逼

Ceph and Swift: Whywe are not fighting                      原文:Ceph and Swift: Why weare not fight...
  • qq_32524177
  • qq_32524177
  • 2017-07-28 09:15:53
  • 1256

swift ceph 性能对比

  • 2015年12月04日 11:41
  • 2.54MB
  • 下载

ceph环境搭建

  • 2016年06月14日 09:27
  • 582KB
  • 下载

Openstack 对象存储服务之争:Ceph或者Swift

背景 Ceph现在已经是Openstack官方主要支持的存储后端,而最新的Ceph不仅可以提供快服务,文件服务,而且还可以提供对象存储。Openstack Swift也提供对象存储服务,那这两者到底是...
  • u012815727
  • u012815727
  • 2014-04-01 20:22:14
  • 6587

让你真正明白cinder与swift、glance的区别

http://www.aboutyun.com/thread-10060-1-1.html 问题导读 1.你认为cinder与swift区别是什么? 2.cinder是否存在单点故障? 3.cinde...
  • liukuan73
  • liukuan73
  • 2015-09-18 15:48:32
  • 3782

比较Swift与HDFS话Ceph本质(by quqi99)

作者:张华  发表于:2014-06-21版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99 )...
  • quqi99
  • quqi99
  • 2014-06-21 17:27:41
  • 9394

docker registry接入ceph Swift API

博文源地址:http://bingdian.blog.51cto.com/94171/1893658/ 1.下载 Docker 的 ceph镜像 并启动 doc...
  • qq_21398167
  • qq_21398167
  • 2017-03-24 17:08:22
  • 517
收藏助手
不良信息举报
您举报文章:CEPH环境搭建与Swift调用
举报原因:
原因补充:

(最多只允许输入30个字)