0%

概述

ceph-deploy官方认可的ceph部署工具。它不同于ansible、puppet。

架构

ceph-deploy-frame

各个模块

parser

主命令参数解析,子命令参数解析

cli

加载子命令模块,选择调用哪个子命令执行操作

new 子命令

创建集群,及 ceph.conf 配置文件

install 子命令

跟据节点的不通角色(mon、mds、osd、rgw等),安装相关的软件包

uninstall 子命令

卸载节点的ceph软件

purge 子命令

清除ceph安装包

purgedata子命令

清除ceph在该节点上产生的数据

mon 子命令

管理mon节点,添加、创建、删除等操作

gatherkeys子命令

收集ceph中的keyring

osd子命令

管理osd节点,准备、创建、激活等操作

disk子命令

管理硬盘,格式化硬盘分区等操作

mds子命令

管理mds节点,仅支持创建操作

forgetkeys子命令

删除“mon”、“client.admin”、“bootstrap-osd”、“bootstrap-mds”、“bootstrap-rgw”的keyring文件

config子命令

从(往)指定的节点获取(输出)集群配置信息

admin子命令

为指定的节点赋予admin角色

pkg子命令

包管理器,安装(卸载)指定的软件包

calamari子命令

rgw子命令

按配置文件中的配置启动rgw服务(建议使用CivetWeb)

repo子命令

管理节点repo信息,添加、删除repo操作

conf

ceph.conf集群配置文件读写、解析等支持类操作

host

按不同操作系统进行区别操作

lib

与系统相关的操作类库(如:连接管理、命令执行、文件操作等)

util

支持库(如:ssh连接管理、服务管理、RPM包管理、APT包管理、日志管理等)

概述

SimpleMessenger,继承了Messenger类,用于实现各个模块间传输命令及数据。

架构图

ceph-messenger-simple-frame

通讯协议

子模块

  • Pipes模块
    用于管理tcp网络链接,负责接受、发送数据。
  • Accepter模块
    仅用于接受外部请求链接,而不接收数据。将接收到的链接保存到Pipes模块中,然后由Pipes模块去收发数据。
  • DispatchQueue模块
    接收外部发送来的数据和命令,然后通过“dispatcher”或“fast dispatcher”模块,将数据和命令传送给各个dispatcher
  • dispatcher模块
    用于管理dispatchers,如OSD,MON,MDS等等各种需要通讯的client。
  • fast dispatcher模块
    用于管理 fast dispatchers

持久性

持久性是数据丢失的概率,可以用于度量一个存储系统的可靠性,俗称 “多少个9”。数据的放置(DataPlacement)决定了数据持久性,而Ceph的CRUSH MAP又决定了数据的放置,因此CRUSH MAP的设置决定了数据持久性。

数学模型

公式

P = Pr x M / C(R,N)

解释

P

P为丢失数据的概率,持久性,可用1-P来计算。

Pr

Pr = P1(any) x P2(any) x P3(any)

Pr为一年内R(ceph副本数)个OSD发生故障的概率。

  • P1(any)为一年内第一个OSD发生故障的概率
    硬盘在一定时间内的失败概率符合Possion(伯松)分布 Pn(入,t)(为lamda),由于我们不太容易直接计算任意一个OSD顺坏的概率,但可以计算出没有OSD出现故障的概率,再用1减去无OSD节点故障的概率,就得到了P1(any)
    入=FIT x NFIT=AFR/(24×365),AFR为硬盘年故障概率;
    t为一年的小时数,24x365

  • P2(any)为一个OSD恢复周期内第二个OSD发生故障的概率
    中的N为N-1
    t 为一个OSD恢复周期,OSD恢复周期 = 恢复数据量 / 恢复速度恢复数据量 = 硬盘容量 x 使用率恢复速度 = 每个OSD写速度 x 参与恢复的OSD数量

  • P3(any)为一个OSD恢复周期内第三个OSD发生故障的概率
    中的N为N-2
    t 为一个OSD恢复周期,算法同上

M

Copy Set个数,copy set上至少有一个PG的所有副本。
丢失数据必须是主副本数据同时丢失,数据不可恢复才算。而一个copy set,包含一个PG的所有主副本数据,所以一个copy set损坏(或丢失)导致至少一个PG的主副本数据丢失,数据不可恢复。

C(R,N)

N为OSD数量(一个OSD对应一个硬盘),R为副本数,C(R,N)为N个OSD中任意挑选R个OSD的组合数。

优化

综上所述,我们能调节的参数包括:

  • OSD恢复周期(recovery time)
    增加参与恢复的OSD数量可以缩短OSD恢复周期,从而降低丢失数据的概率
  • copy set个数
    减少copy set个数,可以降低丢失数据的概率

以上优化需要修改Crush map

使用prmc计算持久性

获取prmc

从github上下载prmc代码

1
git clone https://github.com/zhoubofsy/persistence_calculation.git

配置输入参数

修改config.py文件中的prmc字典

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
# 算法名称
name = 'prmc'

prmc = {
# 副本数
'replica_num' : 3,

# 集群OSD总数数量
'osd_num' : 14,

# AFR(硬盘年故障率)
'disk_afr' : 0.017,

# 磁盘平均容量(MB)
'disk_capacity' : 1000.0,

# 磁盘平均写速度(MB/s)
'disk_writerate' : 50.0,

# 磁盘使用率
'disk_usage' : 0.75,

# 一个Host中OSD的数量
'num_osd_in_host' : 4,

# 一个副本域的host数量
'num_host_in_replic_domain' : 1,

# rack数量
'num_rack_in_root' : 4,

# 副本域数量
'num_replic_domain_in_root' : 1
}

程序会根据name的设置,选择相关的算法,不同的算法会采用不同的配置参数,目前只支持prmc算法

执行计算

执行main.py进行计算持久性

1
./main.py

参考&鸣谢

OSD配置优化

Filestore

参数名 描述 默认值 推荐值
filestore max sync interval 从日志到数据盘最大同步间隔(秒) 5 15
filestore min sync interval 从日志到数据盘最小同步间隔(秒) 0.1 10
filestore queue max ops 最大未完成io数 50 25000
filestore queue max bytes 最大未完成io字节数(B) 100 << 20 10 << 20
filestore queue committing max ops 数据盘能够commit的操作数 500 5000
filestore queue committing max bytes 数据盘能够commit的最大字节数(B) 100 << 20 1000 << 20
filestore op threads 并发文件系统操作线程数 2 32
filestore fd cache size 对象文件句柄缓存大小 128 8192
filestore wbthrottle_xfs_bytes_start_flusher xfs文件系统开始执行回刷的脏数据 41943040 90 << 20
filestore wbthrottle_xfs_bytes_hard_limit xfs文件系统允许的最大脏数据 419430400 500 << 20

Journal

参数名 描述 默认值 推荐值
osd journal size OSD 日志大小(MB) 5120 20000
journal max write bytes 日志一次异步io的最大字节数(B) 10 << 20 1 << 30
journal max write entries 日志一次异步io的最大记录数 100 10000

Recovery

None

PG

PGs = (Total_number_of_OSD * 100) / max_replication_count
如果有15个OSD,副本数为3,根据公式计算PGs为500,最接近512,所以需要设置该pool的pg_numpgp_num都为512

1
2
ceph osd pool set {pool name} pg_num 512
ceph osd pool set {pool name} pgp_num 512

CRUSH Map

Todo…

Client

参数名 描述 默认值 推荐值
objecter inflight ops 客户端允许的最大未发送io请求数 1024 1 << 20
objecter inflight op bytes 客户端允许的最大未发送脏数据 100 << 20 10 << 30

Other

参数名 描述 默认值 推荐值
osd max write size OSD一次可写入的最大值(MB) 90 512
osd client message size 客户端允许在内存中的最大数据(B) 500 << 20 2 << 30
osd deep scrub stride 在Deep Scrub时允许读取的字节数(B) 512 << 10 128 << 10
osd op threads OSD进程操作的线程数 2 8
osd disk threads OSD恢复和Scrubbing时的线程数 1 4
osd map cache size OSD Map 的缓存(MB) 200 1024
ms_dispatch_throttle_bytes 控制DispatcherQueue队列深度大小 100 << 20 1 << 30

参考&鸣谢

目标

  • 优化OSD节点性能
  • 关闭OSD节点瓶颈项

优化项

CPU Status

将cpu status 设置为 performance,可通过BIOS设置,或在系统中进行如下配置,修改后需要重启生效

1
for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do [ -f $CPUFREQ ] || continue; echo -n performance > $CPUFREQ; done

Hyper-Threading(HT)

开启VT和HT,在BIOS中配置

NUMA

关闭NUMA,可通过BIOS关闭,也可在加载Kernel是设置
打开/etc/grub2-efi.cfg,修改kernel加载部分,修改后需要重启生效

1
linuxefi /vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet LANG=en_US.UTF-8 numa=off

关闭前

1
2
3
4
$ lscpu | grep -i numa
NUMA node(s): 2
NUMA node0 CPU(s): 0-5,12-17
NUMA node1 CPU(s): 6-11,18-23

关闭后

1
2
3
$ lscpu | grep -i numa
NUMA node(s): 1
NUMA node0 CPU(s): 0-23

Jumbo Frames

将cluster network 的网卡MTU设置为9000,修改后需要重启生效

1
echo "MTU=9000" | tee -a /etc/sysconfig/network-script/ifcfg-{网卡}

通过ifconfig查看mtu修改情况

1
2
3
4
5
6
7
8
9
$ ifconfig
ens5f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9000
inet 192.168.43.5 netmask 255.255.255.0 broadcast 192.168.43.255
inet6 fe80::92e2:baff:febf:3800 prefixlen 64 scopeid 0x20<link>
ether 90:e2:ba:bf:38:00 txqueuelen 1000 (Ethernet)
RX packets 5218040 bytes 661253942 (630.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5170015 bytes 605082933 (577.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

SSD Trim

为减少SSD写放大,需要开启Trim。
判断SSD是否支持Trim

1
2
$ hdparm -I /dev/{SSD硬盘} | grep -i trim
* Data Set Management TRIM supported (limit 8 blocks)

出现 “TRIM supported” 表示支持Trim,否则表示不支持Trim指令.

在xfs文件系统中开启trim指令,需要挂载xfs文件系统时,option中增加discard

Scheduler

硬盘I/O调度机制配置,SSD 推荐采用“noop”,机械硬盘推荐采用“deadline”
修改/etc/udev/rules.d/60-schedulers.rules,增加如下:

1
2
3
# system default: set cfq scheduler for rotating disks
ACTION=="add|change",KERNEL=="sd[a-z]",ATTR{queue/rotational}=="1",ATTR{queue/scheduler}="deadline"
ACTION=="add|change",KERNEL=="sd[a-z]",ATTR{queue/rotational}=="0",ATTR{queue/scheduler}="noop"

rotational 为 “1” 表示机械硬盘,为“0”表示SSD

查看修改是否生效

1
cat /sys/block/{硬盘}/queue/scheduler

read_ahead_kb

设置硬盘预读大小为8k
修改/etc/udev/rules.d/60-schedulers.rules,增加如下:

1
ACTION=="add|change",KERNEL=="sd[b-z]",ATTR{queue/read_ahead_kb}="8192"

查看是否生效

1
cat /sys/block/{硬盘}/queue/read_ahead_kb

xfs option

xfs 挂载增加如下option:

rw 允许读写操作
noexec 不允许运行操作
nodev 不支持设备文件
noatime 不更新inode访问时间
nobarrier 关闭cache 回写机制

FD,core & PID

FD & core

修改 max open files 最大值,系统默认是1024,将其修改为131072
修改 core 值,当程序崩溃时,会输出core文件,便于分析错误原因
修改/etc/security/limits.conf文件,增加:

1
2
3
*   soft    core    10240
* soft nofile 131072
* hard nofile 131072

修改后,可通过ulimit -a查看。

PID

修改pid max值,打破系统运行进程数量瓶颈,将其设置为4194303(系统默认是 32768)
修改/etc/sysctl.conf文件,增加kernel.pid_max=4194303

cgroup

若集群搭建采用超融合方案(计算节点与存储节点混搭),使用cgroup将cpu与OSD进程绑定,减少cpu时间片切换次数,提高OSD相应速度

参考&鸣谢

需求

所有使用非windows的用户在需要下载迅雷资源的时候,大概都有两种方法。其一,使用wine,装一个xunlei,然后下载资源;其二,利用离线下载,先下载到离线服务器上,然后利用http或ftp协议下载到本地。

为啥迅雷不开发一个linux版呢!(个人猜测,估计是怕linux里面的license吧)相信为啥没有linux版本,只有迅雷知道。

为了能让linux下载迅雷资源,做了如下调研。。。

thunder 地址解码

通常能看到的 thunder 地址,都是通过base64 encode 过的 http 或 ftp 地址。所以解码,也需要用base64

1
2
3
4
5
6
7
# base64 加密后的http 或 ftp 地址
thunder://QUFmdHA6Ly9keWdvZDE6ZHlnb2QxQGQxMzEuZHlnb2QuY246MzA0OS/pnZ7or5rli7/mibBEVkRzY3IvW+eUteW9seWkqeWggnd3dy5keWdvZC5jbl3pnZ7or5rli7/mibBjZDEucm12Ylpa

# 经过 base64 -d decode 之后
echo QUFmdHA6Ly9keWdvZDE6ZHlnb2QxQGQxMzEuZHlnb2QuY246MzA0OS/pnZ7or5rli7/mibBEVkRzY3IvW+eUteW9seWkqeWggnd3dy5keWdvZC5jbl3pnZ7or5rli7/mibBjZDEucm12Ylpa | base64 -d

AAftp://dygod1:dygod1@d131.dygod.cn:3049/非诚勿扰DVDscr/[电影天堂www.dygod.cn]非诚勿扰cd1.rmvbZZ%

看到了吧,去掉开头的“AA”,去掉结尾的“ZZ%”,就剩下了一个ftp地址,这个ftp地址,就是迅雷下载时使用的ftp地址。

迅雷资源下载

使用 wget 下载上文中的ftp资源

1
2
3
4
5
6
7
8
$ wget -v ftp://i:i@d3.dl1234.com:6958/\[电影天堂www.dy2018.com\]神战权力之眼BD中英双字.rmvb
--2016-05-25 14:58:52-- ftp://i:*password*@d3.dl1234.com:6958/[%E7%94%B5%E5%BD%B1%E5%A4%A9%E5%A0%82www.dy2018.com]%E7%A5%9E%E6%88%98%E6%9D%83%E5%8A%9B%E4%B9%8B%E7%9C%BCBD%E4%B8%AD%E8%8B%B1%E5%8F%8C%E5%AD%97.rmvb
=> ‘.listing’
Resolving d3.dl1234.com (d3.dl1234.com)... 218.93.205.139
Connecting to d3.dl1234.com (d3.dl1234.com)|218.93.205.139|:6958... failed: Connection refused.
--2016-05-25 14:58:52-- ftp://i:*password*@d3.dl1234.com:6958/[%E7%94%B5%E5%BD%B1%E5%A4%A9%E5%A0%82www.dy2018.com]%E7%A5%9E%E6%88%98%E6%9D%83%E5%8A%9B%E4%B9%8B%E7%9C%BCBD%E4%B8%AD%E8%8B%B1%E5%8F%8C%E5%AD%97.rmvb
=> ‘.listing’
Connecting to d3.dl1234.com (d3.dl1234.com)|218.93.205.139|:6958... failed: Connection refused.

结果被无情的 refused 了,后来又用别的ftp客户端尝试下载结果,依然失败。。。

痛定思痛,上网搜索了一下,有片文章的分析我觉得可能是正确的,其文如下:

”(我揣测)迅雷走的是P2SP,也就是先访问它的索引server,找到真实可用的ip。换句话说,这个URL仅仅起到一个资源标识符的作用,本身也许未必能直接用于下载。 所以说这个东西,不逆向官方客户端恐怕是没法搞的,因为不知道它和服务器之间的协议。“

结论

根据网友的分析,后续可以下载一个迅雷软件分析看看

参考&鸣谢

集成原理

1
2
3
4
5
6
7
8
9
+-----------+
| |
| |
| | +-- ISCSI SR ----+
| XenServer | +---------+ | | +------------+
| | ------> |SR Driver| -----+-- NFS SR ----+-----| XenCenter |
| | +---------+ | | +------------+
| | +-- RBD SR ----+
+-----------+ ( Fork ISCSI SR)

步骤

1. 搭建ceph J版集群

详细请见:

2. 调整ceph集群crush tunables与XenServer内核匹配

针对XenServer6.5,需要调整crush tunables 为 bobtail

1
ceph osd crush tunables bobtail

查看更改

1
ceph osd crush show-tunables

3. 创建ceph rbd块设备

  • 为了保证快设备可映射、可快照、可克隆,必须使用format 2
  • ceph J版必须指定feature 为 layering
  • 快设备名称必须使用uuid(不带“-”分隔)
1
2
uuidgen | sed 's/-//g'     # 生成无“-”分隔符的rbd名称
rbd create --size {size} {rbd名称} --image-feature layering

4. XenServer节点安装RBDSR patch

详细请见:
RBDSR README

5. 使用XenCenter创建SR

同上

注意

  • ceph J版 开始抛弃KRBD
  • ceph J版 tunables会引发集群告警“crush map has legacy tunables (require bobtail, min is firefly)”(可忽略)
  • 创建rbd快设备必须使用format 2 格式,否则不能正常映射(map)
  • ceph J版 rbd格式feature中只能包含layering,不能包含其他feature,否则不能正常映射(map)

参考&鸣谢