ceph-luminous-版本部署-bluestore

ceph 的 luminous版本里bluestore已经稳定了,这里尝试部署一下使用bluestore

Bluestore原理说明

对象可以直接存放在裸盘上,不需要任何文件系统接口。
BlueStore 直接使用一个原始分区,ceph对象将直接写在块设备上,不再需要任何的文件系统;
和osd一起进来的元数据将存储在 一个 名为 RocksDB 的键值对 数据库;

各层意义

RocksDB :存储 WAL 日志和元数据(omap)
BlueRocksEnv: 与RocksDB 交互的接口
BlueFS  : 一个类似文件系统的 mini C++,使 rocksdb 生效,ENv 接口(存储 RocksDB 日志和 sst 文件);
因为rocksdb 一般跑在一个文件系统的上层,所以创建了 BlueFS。

RocksDB 存放的数据类型

对象的元数据
write-ahead 日志
ceph omap  数据
allocator metadata(元数据分配器):决定数据存放位置;此功能可插拔

默认BlueStore模型

第一个小分区(XFS或者ext4),包括ceph files 
(init system descriptor,status,id,fsid,keyring 等)和RocksDB 文件
第二个分区是一个原始分区

优点

每一部分都可以存放在不同的磁盘中,RocksDB WAL 和 DB 可以存放在不同的磁盘或者小分区中

查看

1
# ceph-bluestore-tool show-label --path /var/lib/ceph/osd/ceph-0/

环境说明

在node1、node2、node3上分别有两块磁盘:vdb 和vdc
其中vdb不分区,用于存储osd数据
vdc有一个分区:vdc1,(类似于之前filestore下的日志分区,可以用ssd磁盘), 用于存放block.db

安装流程

系统环境

主机名 IP 部署 系统 磁盘
node1 172.28.7.239 管理、存储、监控 Centos7最小安装 2块(osd、block.db)
node2 172.28.7.240 存储、监控 Centos7最小安装 2块(osd、block.db)
node3 172.28.7.241 存储、监控 Centos7最小安装 2块(osd、block.db)

Centos7系统安装完成执行:
yum update

所有添加Ceph源

vim /etc/yum.repos.d/ceph.repo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[ceph]
name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-luminous/el7/$basearch
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-luminous/el7/noarch
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-luminous/el7/SRPMS
enabled=0
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

所有节点安装epel源

1
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

所有节点初始化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# Kernel pid max
echo 4194303 > /proc/sys/kernel/pid_max
#关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
##停止firewall 禁止firewall开机启动
systemctl stop firewalld.service
systemctl disable firewalld.service
##关闭自带网络管理
systemctl stop NetworkManager
systemctl disable NetworkManager
##host访问
vim /etc/hosts:
172.28.7.239 node1
172.28.7.240 node2
172.28.7.241 node3
## 安装ntp
yum installl ntp
## 修改启动ntp服务
##注释如下四项,然后选择内部的时钟服务器或者ceph管理节点
server 172.25.0.110
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
##启动
systemctl restart ntpd.service
systemctl enable ntpd.service
## 终端
sudo visudo
找到
Defaults requiretty
选项,把它改为
Defaults:ceph !requiretty
或者直接注释掉
## 其他
yum install vim net-tools

管理节点执行

生成密钥

1
2
3
4
5
##生成秘钥,免密码登陆
ssh-keygen
ssh-copy-id root@node1
ssh-copy-id root@node2
ssh-copy-id root@node3

安装配置 ceph-deploy

1
2
3
4
5
6
7
yum install ceph-deploy
vim /usr/lib/python2.7/site-packages/ceph_deploy/hosts/centos/install.py:
def install(…):
adjust_repos = False ##添加该行

创建集群

创建目录

1
mkdir my_cluster

生成ceph.conf和kering

1
2
cd my-cluster
ceph-deploy new node1 node2 node3 ##会生成ceph.conf和ceph.mon.keyring

配置ceph.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
cd my-cluster
vim ceph.conf:
[global]
fsid = 2595ba62-8ae1-difg-893a-892a675757c6
mon_initial_members = node01, node02, node03
mon_host = 172.28.7.239,172.28.7.240,172.28.7.241
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
##如果有两块可以连通的网卡,配置public_network和cluster_network,如果是测试环境没有,就不配置
#public_network = 172.28.7.0/22 #管理网络
#cluster_network = 172.28.11.0/22 #集群网络
mon_pg_warn_max_per_osd = 1000
osd_pool_default_size = 3
osd_pool_default_min_size = 2
mon_osd_backfillfull_ratio = 0.75
mon_osd_full_ratio = .85
mon_osd_nearfull_ratio = .70
osd_failsafe_full_ratio = 0.90
osd_deep_scrub_randomize_ratio = 0.01
[mgr]
mgr modules = dashboard
[osd]
osd_max_write_size = 1024
osd_recovery_op_priority = 1
osd_recovery_max_active = 1
osd_recovery_max_single_start = 1
osd_recovery_max_chunk = 1048576
osd_recovery_threads = 1
osd_max_backfills = 1
osd_scrub_begin_hour = 22
osd_scrub_end_hour = 7
osd_recovery_sleep = 0
osd_crush_update_on_start = false ##如果初始化的时候,把该值设置为true,然后重启所有osd。不然创建完pool会提示:100.000% pgs unknown100.000% pgs unknown。所有osd都加入,集群ok后,再统一把该值设置为false, 然后重启所有osd

注意:只要新创建了pool, 所有osd 设置:osd_crush_update_on_start = true 才会进行调整

安装ceph

1
ceph-deploy install node1 node2 node3

集群初始化

1
2
3
4
5
6
7
cd my-cluster
##如果给mon 单独一块磁盘存储数据,这里需要把每个mon节点的磁盘mount 到/var/lib/ceph/mon/
## mount /dev/sdj1 /var/lib/ceph/mon/
#然后再执行:
#ceph-deploy mon create node1 node2 node3
ceph-deploy mon create-initial # 会生成ceph.bootstrap-osd.keyring、ceph.client.admin.keyring等认证文件

拷贝管理文件

根据实际情况,拷贝管理文件到设定的管理节点

1
ceph-deploy admin node1 node2 node3

统一节点上ceph.conf文件命令:

1
# ceph-deploy config push node node node3

添加osd

由于Luminous里默认使用Bluestore,可以直接操作裸盘,data和block-db会使用lv。综合成本及性能,我们把block.db使用ssd的分区,osd仍然使用sas,block.wal不指定. 这里vdb作为osd盘,vdc作为block-db盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
首先ssh到各个存储节点,block.db使用的ssd分区,这里node1举例:
# ssh node1
# pvcreate /dev/vdb # 创建pv, 这里使用的整块磁盘(与后面的分区对比), pvs 查看pv列表
Physical volume "/dev/vdb" successfully created.
# vgcreate data_vg1 /dev/vdb # 创建vg, vgs查看vg列表
Volume group "data_vg1" successfully created
# lvcreate -n data_lv1 -L 1020.00m data_vg1 #创建lv,lvs查看lv列表, -n指定lv名称, -L指定lv的大小,需要小于或者等于vg的VSize
Logical volume "data_lv1" created.
---------------------------------------------
生产环境一块ssd磁盘会对应多块osd,所以这里也需要把ssd多个分区
# parted /dev/vdc
(parted) mklabel gpt
(parted) mkpart primary 0% 25% #因为测试,这里只做了一个占据磁盘25%容量的分区,实际情况根据osd数目划分相应的分区数
(parted) quit
# pvcreate /dev/vdc1 # 创建pv, 这里使用的是磁盘分区, pvs 查看pv列表
Physical volume "/dev/vdc1" successfully created.
# vgcreate block_db_vg1 /dev/vdc1 # 创建vg, vgs查看vg列表
Volume group "block_db_vg1" successfully created
# lvcreate -n block_db_lv1 -L 1020.00m block_db_vg1 # 创建lv, lvs查看lv列表, -L指定lv的大小,需要小于或者等于 vg的VSize
Logical volume "block_db_lv1" created.
---------------------------------------------
# 不需要加--bluestore 参数,默认就是使用bluestore方式,data_vg1/data_lv1 是数据盘,block_db_vg1/block_db_lv1是block-db
管理节点执行:
ceph-deploy --overwrite-conf osd create node1 --data data_vg1/data_lv1 --block-db block_db_vg1/block_db_lv1
ceph-deploy --overwrite-conf osd create node2 --data data_vg1/data_lv1 --block-db block_db_vg1/block_db_lv1
ceph-deploy --overwrite-conf osd create node3 --data data_vg1/data_lv1 --block-db block_db_vg1/block_db_lv1

配置dashboard

使用node1(172.28.7.239) 作为dashboard, 登陆到172.28.7.239执行:

1
2
ceph config-key put mgr/dashboard/server_addr 172.28.7.239
ceph config-key put mgr/dashboard/server_port 7000

创建mgr

1
2
3
ceph-deploy mgr create node1:node1-mgr node2:node2-mgr node3:node3-mgr
## 登陆到管理节点启动dashboard
ceph mgr module enable dashboard

netstat -tunlp|grep 7000
systemctl restart ceph-mgr@node1

访问dashboard

http://172.28.7.239:7000

清除安装

有时候我们安装错误,可以执行清理操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 管理节点执行:
ceph-deploy purge node1
ceph-dpeloy purgedata node1
## ssh到node1
ssh node1
vgs ## 获取vg信息
vgremove VG ##删除上面获取的vg ##如果不执行该步骤,则该磁盘无法再次被使用
pvs ##查看pv信息
pvremove PV ##删除pv
parted /dev/vdc
rm 1 ##删除之前block.db的分区
quit

简单性能测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#创建测试池mytest
ceph osd pool create mytest 128
rados lspools
# ceph osd pool set mytest size 2 #副本为2
# ceph osd pool delete mytest #删除
#Rados性能测试(关注 bandwidth带宽,latency延迟)
rados bench -p mytest 10 write --no-cleanup #写测试10秒
rados bench -p mytest 10 seq #顺序读
rados bench -p mytest 10 rand #随机读
rados -p mytest cleanup #清理测试数据
#rbd块设备测试
rbd create --size 2G mytest/test1 #创建块设备映像test1
rbd ls mytest
rbd info mytest/test1
rbd map mytest/test1 #映射块设备
#/dev/rbd0
#rbd showmapped #查看已映射块设备
#挂载
mkfs.xfs /dev/rbd0
mkdir -p /mnt/ceph
mount /dev/rbd0 /mnt/ceph/
df -h /mnt/ceph
#测试
rbd bench-write mytest/test1
#默认参数io 4k,线程数16,总写入1024M, seq顺序写
rbd unmap mytest/test1 #取消块设备映射
rbd rm mytest/test1 #删除块设备映像