开源实践分享:Ceph bluestore部署实践
https://blog.51cto.com/99cloud/2119884
Ceph bluestore部署
首先为大家分享Ceph bluestore具体该如何部署,使用环境如下
• 单节点
• CentOS 7.4
• 使用 ceph-deploy 进行部署
准备 centos 7.4 系统的机器,并配置好 ssh 的无密码登录。
安装 ceph-deploy
yum install https://download.ceph.com/rpm-luminous/el7/noarch/ceph-deploy-2.0.0-0.noarch.rpm
数据 ceph 安装包
mkdir ceph-install
cd ceph-install
ceph-deploy new node1
把如下内容加入到 ceph.conf 里面,把默认的副本数据调成1。
[global]
osd pool default size = 1
osd pool default min size = 1
安装 ceph 包
ceph-deploy install --release luminous node2
初始化 mon
ceph-deploy mon create-initial
ceph-deploy admin node1
这时 ceph 已经可以访问了
$ ceph -s
cluster:
id: 5b2f0020-fc24-44de-a6c9-a88efdc5074f
health: HEALTH_OK
services:
mon: 1 daemons, quorum node1
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 0 kB used, 0 kB / 0 kB avail
pgs:
接下来要部署 ceph mgr, 这个组件在 Luminous 里面是必装组件
ceph-deploy mgr create node1
接下来部署 ceph osd, 现在推荐使用 ceph-volume lvm 来管理磁盘。所有安装的时候 ,就需要准备一个 lv 出来。为了测试 bluestore 的 block.db 和 block.wal, 我们来做三个lv 分别用于单 osd 。
$ pv create /dev/sdb
Physical volume "/dev/sdb" successfully created.
$ vgcreate ceph-pool /dev/sdb
Volume group "ceph-pool" successfully created
$ lvcreate -n osd0.wal -L 1G ceph-pool
Logical volume "osd0.wal" created.
$ lvcreate -n osd0.db -L 1G ceph-pool
Logical volume "osd0.db" created.
$ lvcreate -n osd0 -l 100%FREE ceph-pool
Logical volume "osd0" created.
接下来,就可以创建 OSD 了。
ceph-deploy osd create \
--data ceph-pool/osd0 \
--block-db ceph-pool/osd0.db \
--block-wal ceph-pool/osd0.wal \
--bluestore node1
这样,一个最小的集群就建好了
$ ceph -s
cluster:
id: 5b2f0020-fc24-44de-a6c9-a88efdc5074f
health: HEALTH_OK
services:
mon: 1 daemons, quorum node1
mgr: node2(active)
osd: 1 osds: 1 up, 1 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 2048 MB used, 37883 MB / 39931 MB avail
pgs:
$ ls -alh /var/lib/ceph/osd/ceph-0/
total 52K
drwxrwxrwt. 2 ceph ceph 340 Apr 4 16:27 .
drwxr-x---. 3 ceph ceph 20 Apr 4 16:27 ..
-rw-r--r--. 1 ceph ceph 183 Apr 4 16:27 activate.monmap
lrwxrwxrwx. 1 ceph ceph 19 Apr 4 16:27 block -> /dev/ceph-pool/osd0
lrwxrwxrwx. 1 root root 23 Apr 4 16:27 block.db -> /dev/ceph-pool/osd0.wal
lrwxrwxrwx. 1 root root 23 Apr 4 16:27 block.wal -> /dev/ceph-pool/osd0.wa
-rw-r--r--. 1 ceph ceph 2 Apr 4 16:27 bluefs
-rw-r--r--. 1 ceph ceph 37 Apr 4 16:27 ceph_fsid
-rw-r--r--. 1 ceph ceph 37 Apr 4 16:27 fsid
-rw-------. 1 ceph ceph 55 Apr 4 16:27 keyring
-rw-r--r--. 1 ceph ceph 8 Apr 4 16:27 kv_backend
-rw-r--r--. 1 ceph ceph 21 Apr 4 16:27 magic
-rw-r--r--. 1 ceph ceph 4 Apr 4 16:27 mkfs_done
-rw-r--r--. 1 ceph ceph 41 Apr 4 16:27 osd_key
-rw-r--r--. 1 ceph ceph 24 Apr 4 16:27 path_block.db
-rw-r--r--. 1 ceph ceph 6 Apr 4 16:27 ready
-rw-r--r--. 1 ceph ceph 10 Apr 4 16:27 type
-rw-r--r--. 1 ceph ceph 2 Apr 4 16:27 whoami
bluestore & rocksdb & ceph-volume
ceph 的组件多采用插件的机制,包括后端存储,KV 数据库,磁盘管理等。各组件之间可以灵活的组合。
基于后端存储包括 filestore, kvstore,memstore 和新的 bluestore。 Ceph Luminous 引用了 bluestore 的存储类型,不依赖文件系统,直接管理物理磁盘,相比filestore, 在 io 写入的时候路径更短,也避免了二次写入的问题,性能会更加好。
KV 存储主要包括 LevelDB, MemDB 和新的 RocksDB。 RocksDB 是 Facebook 基于 LevelDB 开发的 key-value 数据,并对闪存(flash)有更友好的优化。
磁盘管理之前只有个 ceph-disk, 现在新引入了 ceph-volume。基于 lvm 来管理磁盘,并会逐渐废弃掉 ceph-disk。
其中比较有意思的是 RocksDB 的实现,RocksDB 原本只基于文件系统的。但是得益于它本身的灵活性,bluestore 实现了一套 RocksDB 的 Env 接口,还在 BlueStore 上面实现了一套 BlueFS 的接口与 BluestoreEnv 对接。使得 RocksDB 可以存储在 BlueStore 上面。
wal & db 的大小问题
在 ceph bluestore 的情况下,wal 是 RocksDB 的 write-ahead log, 相当于之前的 journal 数据,db 是 RocksDB 的 metadata 信息。在磁盘选择原则是 block.wal > block.db > block。当然所有的数据也可以放到同一块盘上。
默认情况下, wal 和 db 的大小分别是 512 MB 和 1GB, 包括 Sage Weil 的 PPT 里面也是这样标明的【注释1请添加链接描述】。现在没有一个好的理论值,好像和 ceph 本身承载的数据类型有关系。更多讨论可以参看【注释2请添加链接描述】。
值得注意的是,如果所有的数据都在单块盘上,那是没有必要指定 wal & db 的大小的。如果 wal & db 是在不同的盘上,由于 wal/db 一般都会分的比较小,是有满的可能性的。如果满了,这些数据会迁移到下一个快的盘上(wal - db - main)。所以最少不会因为数据满了,而造成无法写入【注释3请添加链接描述】。
使用 bluestore 时的 osd 分区
如果是使用的 ceph-disk 管理磁盘,他会建立一个 100MB 的分区,来存放 keyring / whoami 这些信息,这和之前的逻辑是一样的。
如果使用 ceph-volume 管理磁盘,/var/lib/ceph/osd/ceph-0 分区会从 tmpfs 挂载过来(也就是内存)
$ mount | grep osd
tmpfs on /var/lib/ceph/osd/ceph-0 type tmpfs (rw,relatime,seclabel)
$ ls -Alh /var/lib/ceph/osd/ceph-0
lrwxrwxrwx. 1 ceph ceph 19 Apr 7 21:36 block -> /dev/ceph-pool/osd0
lrwxrwxrwx. 1 root root 22 Apr 7 21:36 block.db -> /dev/ceph-pool/osd0.db
lrwxrwxrwx. 1 root root 23 Apr 7 21:36 block.wal -> /dev/ceph-pool/osd0.wal
-rw-------. 1 ceph ceph 37 Apr 7 21:36 ceph_fsid
-rw-------. 1 ceph ceph 37 Apr 7 21:36 fsid
-rw-------. 1 ceph ceph 55 Apr 7 21:36 keyring
-rw-------. 1 ceph ceph 6 Apr 7 21:36 ready
-rw-------. 1 ceph ceph 10 Apr 7 21:36 type
-rw-------. 1 ceph ceph 2 Apr 7 21:36 whoami
至于目录中的这些文件则是从 bluestore 盘一开始的BDEV_LABEL_BLOCK_SIZE=4096位置读取过来的。通过以下命令,可以把所有的 label 打印出来:
$ ceph-bluestore-tool show-label --path /var/lib/ceph/osd/ceph-0
{
"/var/lib/ceph/osd/ceph-0/block": {
"osd_uuid": "c349b2ba-690f-4a36-b6f6-2cc0d0839f29",
"size": 2147483648,
"btime": "2018-04-04 10:22:25.216117",
"description": "main",
"bluefs": "1",
"ceph_fsid": "14941be9-c327-4a17-8b86-be50ee2f962e",
"kv_backend": "rocksdb",
"magic": "ceph osd volume v026",
"mkfs_done": "yes",
"osd_key": "AQDgNsRaVtsRIBAA6pmOf7y2GBufyE83nHwVvg==",
"ready": "ready",
"whoami": "0"
}
}
相关代码参看
• ceph-volume activate
• ceph-bluestore-tool prime-osd-dir
使用ceph-volume, 不管 store 使用的是 filestore 还是 bluestore, 都会把一些 tag 存在 lvm 上面, 可以使用以下命令查看(做了格式化处理)
$lvs -o lv_tags /dev/mapper/ceph--pool-osd
LV Tags
ceph.block_device=/dev/ceph-pool/osd
ceph.block_uuid=dRW0FO-KiVS-vBjB-PE42-RnSd-mL04-FRQmAz
ceph.cephx_lockbox_secret=
ceph.cluster_fsid=14941be9-c327-4a17-8b86-be50ee2f962e
ceph.cluster_name=ceph
ceph.crush_device_class=None
ceph.encrypted=0
ceph.osd_fsid=c349b2ba-690f-4a36-b6f6-2cc0d0839f29
ceph.osd_id=0
ceph.type=block
osd 的盘是如何挂载的
ceph 依赖 systemd 来管理挂载,不需要配置 /etc/fstab 文件。在初始化 osd 的时候, ceph 会 enable 一个 ceph-volume@x.service 服务,其中 x 的格式如 {lvm|simple}-{osd id}-{osd uuid}, 这个服务会在系统的local-fs.target 组里面,当系统挂载本地盘的时候,会自动挂载上。
这个 ceph-volume@.service 定义如下:
$systemctl cat ceph-volume@lvm-0-b7b4fa98-d36e-430b-9789-a432a078292c
# /usr/lib/systemd/system/ceph-volume@.service
[Unit]
Description=Ceph Volume activation: %i
After=local-fs.target
Wants=local-fs.target
[Service]
Type=oneshot
KillMode=none
Environment=CEPH_VOLUME_TIMEOUT=10000
ExecStart=/bin/sh -c 'timeout $CEPH_VOLUME_TIMEOUT /usr/sbin/ceph-volume-systemd %i'
TimeoutSec=0
[Install]
WantedBy=multi-user.target
可以看到, 他是把参数传递给了 ceph-volume-systemd 命令, 而这个命令又把参数解析后,传给了 ceph-volume 命令,最后执行的命令是:
ceph-volume lvm trigger {osd id} {osd uuid]
需要ceph-volume-systemd 这个命令的原因应该是systemd只能传一个参数。
这个 trigger 会调用 ceph-volume lvm activate 命令,去准备相对应挂载及里面的数据初始化。
最后, ceph-volume lvm activate 会调用 ceph-bluestore-tool pirme-osd-dir 命令来初始化里面的数据。
其他
ceph osd purge
ceph Limunous 新加了一个 ceph osd purge 命令,很好用,可以一个命令,把某个 osd 相关的信息都清除掉。包括
• osd
• crush rule
• auth key
ceph-disk lvm
ceph-disk 应试不支持 lvm , 参见 :
http://tracker.ceph.com/issues/5461
不过 kolla 是否支持,可以验证下, 因为 kolla 的脚本里面不依赖 ceph-disk
参考链接:
http://www.sysnote.org/2016/08/19/ceph-bluestore/
https://ceph.com/community/new-luminous-bluestore/
http://liyichao.github.io/posts/ceph-bluestore-%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html
开源实践分享:Ceph bluestore部署实践的更多相关文章
- Hangfire项目实践分享
Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...
- 《OpenStack部署实践》
<OpenStack部署实践> 基本信息 作者: 张子凡 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115346797 上架时间:2014-2-27 出版日期:2014 ...
- WOT干货大放送:大数据架构发展趋势及探索实践分享
WOT大数据处理技术分会场,PingCAP CTO黄东旭.易观智库CTO郭炜.Mob开发者服务平台技术副总监林荣波.宜信技术研发中心高级架构师王东及商助科技(99Click)顾问总监郑泉五位讲师, ...
- 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...
- 让互联网更快:新一代QUIC协议在腾讯的技术实践分享
本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...
- 百度APP移动端网络深度优化实践分享(一):DNS优化篇
本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<一>DNS优化>,感谢原作者的无私分享. 一.前言 网络优化是客户端几大技术方 ...
- 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)
基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势) 前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...
- DEVOPS落地实践分享
DEVOPS落地实践分享 转载本文需注明出处:微信公众号EAWorld,违者必究. 引言: DevOps的理念已经说了很多年,其带来的价值逐渐被接受,很多企业也逐渐引入了DevOps.目前普元DevO ...
- SD-WAN用户实践分享:老网工趟出的SD-WAN成功路
在这个离开“人大物云”(人-人工智能.大-大数据.物-物联网.云-云计算)话题都张不开嘴的年代,在这个在咖啡店谈生意都不好意思低于1个亿的年代,反思我的老本行——网络,正在以一种全新的.更加重要的姿态 ...
随机推荐
- Echarts和Highcharts学习笔记01——入门了解
Echarts是国内百度团队开发的(开源),基于Canvas,适合数据量较大的情况: Highcharts是国外的(商用需授权),基于SVG,方便自己定制,但能使用的图表类型有限: Echarts ...
- webpack.config.js配置入口出口文件
目录结构: 新建webpack.config.js配置文件 const path = require('path') //导出 path是node内置的包 通过npm init初始化得到package ...
- 每天一个linux命令:head(15)
head head命令用于显示文件的开头的内容.在默认情况下,head命令显示文件的头10行内容. 格式 head [参数] [文件] 参数选项 参数 备注 -q 不显示文件名的头信息 -v 总是 ...
- Fmx在android下InputBox输入框点击Cancel取消按钮后报异常
在网上搜索半天也没有找到相关信息,估计遇到这个问题的相当少, 解决办法: 找到FMX.Dialogs.Android.pas, 将121行中 FValues[I] := FDefaultValues ...
- python 操作yaml文件
yaml 5.1版后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数yaml 5.1之 ...
- js中的$符
js中的$代表什么意思呢? 首先js的作用是什么呢?是修饰网页动态内容的.那么修饰就需要定位主题,比如你把html比喻一个美女,让她唱一首歌.那么首先你要定位出是你想让哪个美女唱歌,通常我们用id来定 ...
- Hibernate:More than one row with the given identifier was found解决办法
今天写一个Action 通过 HQL 查询一个表 出现异常 “More than one row with the given identifier was found” 问题原因: 数据库出现数据异 ...
- Django中执行原生SQL语句【新编辑】
参考我的个人博客 这部分迁移到了个人博客中:Django中执行原生SQL语句 这里需要补充一下,还有一个extra方法: ret = models.Student.objects.all().extr ...
- Linux随笔 - linux 多个会话同时执行命令后history记录不全的解决方案【转载】
基本认识linux默认配置是当打开一个shell终端后,执行的所有命令均不会写入到~/.bash_history文件中,只有当前用户退出后才会写入,这期间发生的所有命令其它终端是感知不到的. 问题场景 ...
- CSS最基础的语法和三种引入方式
**CSS语法** CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明.选择器通常是您需要改变样式的 HTML 元素. selector {declaration1; declaration ...