0%

创建repository

1、首先在github账号下建立repository(与账号同名.github.io),我这里叫lnsyyj。

1
lnsyyj.github.io

安装Hexo

1、安装Node.js

2、安装hexo

1
npm install -g hexo-cli

初始化repository

1、将repository clone到本地

1
git clone git@github.com:lnsyyj/lnsyyj.github.io.git && cd lnsyyj.github.io

2、创建并切换branch

1
git checkout -b hexo main

3、初始化hexo并提交到远程repository

1
2
3
4
hexo init lnsyyj.github.io
git add .
git commit -am "init hexo" --signoff
git push origin hexo:hexo

发布博客

1、进入init后的hexo目录

1
cd lnsyyj.github.io/

2、修改_config.yml(站点配置文件)

1
2
3
4
deploy:
type: git
repo: https://github.com/lnsyyj/lnsyyj.github.io.git
branch: main

3、生成hexo静态文件

1
hexo generate

4、部署hexo

1
2
3
4
5
6
$ hexo deploy
INFO Validating config
ERROR Deployer not found: git

如上报错,再部署
$ npm install hexo-deployer-git --save

5、等待片刻,使用浏览器访问 https://lnsyyj.github.io/

修改主题

1、首先fork主题到自己的repository

1
https://github.com/theme-next/hexo-theme-next

2、然后clone主题

1
git clone git@github.com:lnsyyj/hexo-theme-next.git themes/next

3、修改_config.yml(站点配置文件)

1
theme: next

OSD

换盘操作

1、确保删除OSD时,集群没有接近near full

2、检查删除OSD时,是否有数据丢失, ceph osd ok-to-stop {osd-num}

1
2
3
4
5
6
7
8
无数据丢失情况
root@ceph:~# ceph osd ok-to-stop 2
OSD(s) 2 are ok to stop without reducing availability or risking data, provided there are no other concurrent failures or interventions.
70 PGs are likely to be degraded (but remain available) as a result.

有数据丢失情况
root@ceph:~# ceph osd ok-to-stop 2
Error EBUSY: 18 PGs are already too degraded, would become too degraded or might become unavailable

3、标记OSD out, ceph osd out {osd-num}

1
2
3
4
5
6
7
8
9
10
11
root@ceph:~# ceph osd out 3
marked out osd.3.

root@ceph:~# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.08997 root default
-3 0.08997 host ceph
0 ssd 0.02249 osd.0 up 1.00000 1.00000
1 ssd 0.02249 osd.1 up 1.00000 1.00000
2 ssd 0.02249 osd.2 up 1.00000 1.00000
3 ssd 0.02249 osd.3 down 0 1.00000

4、停止OSD进程, systemctl stop ceph-osd@{osd-num}

1
2
3
4
5
6
root@ceph:~# systemctl stop ceph-osd@3

root@ceph:~# ps -ef | grep ceph-osd
ceph 3334 1 0 10:19 ? 00:00:13 /usr/bin/ceph-osd -f --cluster ceph --id 2 --setuser ceph --setgroup ceph
ceph 3336 1 0 10:19 ? 00:00:10 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
ceph 3337 1 0 10:19 ? 00:00:10 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph

5、从crush map中删除OSD, ceph osd purge {osd-num} –yes-i-really-mean-it

1
2
3
4
5
6
7
8
9
10
root@ceph:~# ceph osd purge 3 --yes-i-really-mean-it
purged osd.3

root@ceph:~# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.06747 root default
-3 0.06747 host ceph
0 ssd 0.02249 osd.0 up 1.00000 1.00000
1 ssd 0.02249 osd.1 up 1.00000 1.00000
2 ssd 0.02249 osd.2 up 1.00000 1.00000

6、从ceph.conf中删除OSD

7、卸载OSD挂载点, umount /var/lib/ceph/osd/ceph-{osd-num}

1
umount /var/lib/ceph/osd/ceph-3

8、删除/var/lib/ceph/osd/ceph-{osd-num}/目录

1
rm -rf /var/lib/ceph/osd/ceph-3/

9、换盘后,重新添加OSD

课程地址:https://www.imooc.com/video/21088

Golang语言趋势图:https://www.tiobe.com/tiobe-index/go/

内建方法

在任何的包、任何的文件都可以引用这样的方法,无需导入包就可以使用。

常用的内建方法

make

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
make:创建slice、map、chan (这三种类型必须使用make创建,这三种类型必须要Golang帮我们初始化好,避免在使用中出现问题)
make返回类型引用
(slice类似于数组,数组在golang中是不可变化长度的,slice是可变长度的。map是一个key、value数据结构。chan是管道。)



func main() {
makeSlice()
makeMap()
makeChan()
}
// makeSlice 创建切片
func makeSlice() {
mSlice := make([]string, 3)
mSlice[0] = "dog"
mSlice[1] = "cat"
mSlice[2] = "tiger"
fmt.Println(mSlice)
}
// makeMap 创建map
func makeMap() {
mMap := make(map[int]string)
mMap[10] = "dog"
mMap[100] = "cat"
fmt.Println(mMap)
}
// makeChan 创建没有缓存的chan
func makeChan() {
mChan := make(chan int)
close(mChan)
}

程序执行结果:
[dog cat tiger]
map[10:dog 100:cat]

new

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
内存置零
返回传入类型的指针地址

func main() {
NewMap()
}

func NewMap() {
mNewMap := new(map[int]string)
mMakeMap := make(map[int]string)
fmt.Println(reflect.TypeOf(mNewMap))
fmt.Println(reflect.TypeOf(mMakeMap))
}

程序执行结果:
*map[int]string
map[int]string

append & delete & copy

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
slice -> append & copy
map -> delete



// 向切片中添加元素并打印出切片的长度和容量
func main() {
appendElementForSlice()
}

func appendElementForSlice() {
mIDSlice := make([]string, 2)
mIDSlice[0] = "id-1"
mIDSlice[1] = "id-2"
fmt.Println("len=",len(mIDSlice))
fmt.Println("cap=",cap(mIDSlice))
mIDSlice = append(mIDSlice, "id-3")
fmt.Println(mIDSlice)
fmt.Println("After len=",len(mIDSlice))
fmt.Println("After cap=",cap(mIDSlice))
}

程序执行结果:
len= 2
cap= 2
[id-1 id-2 id-3]
After len= 3
After cap= 4



// 拷贝切片 test 1
func main() {
copyForSlice()
}

func copyForSlice() {
mIDSliceDst := make([]string, 2)
mIDSliceDst[0] = "id-dst-1"
mIDSliceDst[1] = "id-dst-2"

mIDSliceSrc := make([]string, 2)
mIDSliceSrc[0] = "id-src-1"
mIDSliceSrc[1] = "id-src-2"

copy(mIDSliceDst, mIDSliceSrc)
fmt.Println(mIDSliceDst)
}

程序执行结果:
[id-src-1 id-src-2]

// 拷贝切片 test 2
func main() {
copyForSlice()
}

func copyForSlice() {
mIDSliceDst := make([]string, 3)
mIDSliceDst[0] = "id-dst-1"
mIDSliceDst[1] = "id-dst-2"
mIDSliceDst[2] = "id-dst-3"

mIDSliceSrc := make([]string, 2)
mIDSliceSrc[0] = "id-src-1"
mIDSliceSrc[1] = "id-src-2"

copy(mIDSliceDst, mIDSliceSrc)
fmt.Println(mIDSliceDst)
}

程序执行结果:
[id-src-1 id-src-2 id-dst-3]

// 拷贝切片 test 3
func main() {
copyForSlice()
}

// 拷贝切片
func copyForSlice() {
mIDSliceDst := make([]string, 2)
mIDSliceDst[0] = "id-dst-1"
mIDSliceDst[1] = "id-dst-2"

mIDSliceSrc := make([]string, 3)
mIDSliceSrc[0] = "id-src-1"
mIDSliceSrc[1] = "id-src-2"

copy(mIDSliceDst, mIDSliceSrc)
fmt.Println(mIDSliceDst)
}

程序执行结果:
[id-src-1 id-src-2]

说明copy操作不会为mIDSliceDst扩容

// delete test 1
func main() {
deleteFormMap()
}

func deleteFormMap() {
mIDMap := make(map[int]string)
mIDMap[0] = "id-1"
mIDMap[1] = "id-2"
delete(mIDMap, 0)
fmt.Println(mIDMap)
}

程序执行结果:
map[1:id-2]

panic & recover

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
49
50
51
52
53
54
55
56
57
58
59
处理异常,panic抛出异常,recover捕获异常

// panic test 1
func main() {
receivePanic()
}

func receivePanic() {
panic("I am panic")
}

程序执行结果:
panic: I am panic

goroutine 1 [running]:
main.receivePanic(...)
D:/SourceCode/GitHub/Golang/src/github.com/lnsyyj/gin_test_project/test/main.go:13
main.main()
D:/SourceCode/GitHub/Golang/src/github.com/lnsyyj/gin_test_project/test/main.go:9 +0x40

// panic test 2
func main() {
receivePanic()
}

func receivePanic() {
defer func() {
recover()
}()
panic("I am panic")
}

程序执行结果:
Process finished with exit code 0

// panic test 3
func main() {
receivePanic()
}

func receivePanic() {
defer coverPanic()
panic("I am panic")
}

func coverPanic() {
message := recover()
switch message.(type) {
case string:
fmt.Println("string message : ", message)
case error:
fmt.Println("error message : ", message)
default:
fmt.Println("unknown panic : ", message)
}
}
程序执行结果:
string message : I am panic

len & cap & close

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
len -> string、array、slice、map、chan
cap -> slice、array、chan
close -> chan

// len & cap test
func main() {
getLen()
}

func getLen() {
mIDSliceDst := make([]string, 2, 5)
mIDSliceDst[0] = "id-dst-1"
mIDSliceDst[1] = "id-dst-2"
mIDSliceDst = append(mIDSliceDst, "id-dst-3")
mIDSliceDst = append(mIDSliceDst, "id-dst-4")
mIDSliceDst = append(mIDSliceDst, "id-dst-5")
mIDSliceDst = append(mIDSliceDst, "id-dst-6")
fmt.Println("mIDSliceDst len : ", len(mIDSliceDst))
fmt.Println("mIDSliceDst cap: ", cap(mIDSliceDst))
}

程序执行结果:
mIDSliceDst len : 6
mIDSliceDst cap: 10

// close test
func main() {
closeChan()
}

func closeChan() {
mChan := make(chan int, 1)
defer close(mChan)
mChan <- 1
// 业务代码
}

结构体

创建&初始化

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
func main() {
TestForStruct()
}

type Dog struct {
ID int
Name string
Age int
}

func TestForStruct() {
// 方式1
var dog Dog
dog.ID = 0
dog.Name = "KiKi"
dog.Age = 3
fmt.Println(dog)
// 方式2
dog_2 := Dog{ID: 1, Name: "Yaya", Age: 2}
fmt.Println(dog_2)
// 方式3
dog_3 := new(Dog)
dog_3.ID = 3
dog_3.Name = "Tom"
dog_3.Age = 4
fmt.Println(dog_3)
}

程序执行结果:
{0 KiKi 3}
{1 Yaya 2}
&{3 Tom 4}

属性及函数

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
func main() {
TestForStruct()
}

type Dog struct {
ID int
Name string
Age int
}

func (d *Dog)Run() {
fmt.Println("ID : ", d.ID, " Dog is running")
}

func TestForStruct() {
// 方式1
var dog Dog
dog.ID = 0
dog.Name = "KiKi"
dog.Age = 3
dog.Run()
}

程序执行结果:
ID : 0 Dog is running

组合

1

学习地址:https://www.imooc.com/video/20215

版本信息

1
2
3
golang 1.12
gin 1.4.0
goland

快速开始

安装gin

1
2
3
4
5
6
7
8
9
yujiang@yujiangdeMacBook-Pro-13 ~ % mkdir -p $GOPATH/src/github.com/lnsyyj/go_test_project
yujiang@yujiangdeMacBook-Pro-13 ~ % cd $_
yujiang@yujiangdeMacBook-Pro-13 go_test_project %

yujiang@yujiangdeMacBook-Pro-13 go_test_project % export GO111MODULE=on
yujiang@yujiangdeMacBook-Pro-13 go_test_project % go mod init
go: creating new go.mod: module github.com/lnsyyj/go_test_project

yujiang@yujiangdeMacBook-Pro-13 go_test_project % go get -v github.com/gin-gonic/gin@v1.5

快速开始

使用goland,打开/Users/yujiang/go/src/github.com/lnsyyj/go_test_project刚刚创建的项目。启用Enable Go Modules(vgo) integration,如果不启用会找不到刚刚下载的类库。

1

监控ISCSI GATEWAYS

Ceph为iSCSI gateway环境提供了一个附加工具,以监视导出的RADOS Block Device (RBD) images的性能。

gwtop工具是一个类似top的工具,用于显示通过iSCSI导出到客户端的RBD images的聚合性能指标。 这些指标来自Performance Metrics Domain Agent(PMDA)。 来自Linux-IO target (LIO) PMDA的信息用于列出每个已导出的RBD image以及所连接的客户端及其相关的I/O指标。

Requirements:

正在运行的Ceph iSCSI gateway

Installing:

1、以root用户身份在每个iSCSI gateway节点上安装ceph-iscsi-tools package:

1
# yum install ceph-iscsi-tools

2、以root用户身份在每个iSCSI gateway节点上安装performance co-pilot package:

1
# yum install pcp

3、以root用户身份在每个iSCSI gateway节点上安装LIO PMDA package:

1
# yum install pcp-pmda-lio

4、以root用户身份,在每个iSCSI gateway节点上启用并启动performance co-pilot service:

1
2
# systemctl enable pmcd
# systemctl start pmcd

5、以root用户身份注册pcp-pmda-lio agent:

1
2
cd /var/lib/pcp/pmdas/lio
./Install

默认情况下,gwtop假定iSCSI gateway configuration object存储在rbd pool中的一个名为gateway.conf的RADOS object中。 此configuration定义了收集性能统计信息的iSCSI gateways。 可以使用-g或-c标志将其覆盖。 有关更多详细信息,请参见gwtop –help。

LIO configuration决定要从performance co-pilot提取的性能统计信息的类型。 gwtop启动时,它会查看LIO configuration,如果找到user-space disks,则gwtop会自动选择LIO collector。

示例gwtop输出

1
2
3
4
5
6
7
8
9
10
11
gwtop  2/2 Gateways   CPU% MIN:  4 MAX:  5    Network Total In:    2M  Out:    3M   10:20:00
Capacity: 8G Disks: 8 IOPS: 503 Clients: 1 Ceph: HEALTH_OK OSDs: 3
Pool.Image Src Size iops rMB/s wMB/s Client
iscsi.t1703 500M 0 0.00 0.00
iscsi.testme1 500M 0 0.00 0.00
iscsi.testme2 500M 0 0.00 0.00
iscsi.testme3 500M 0 0.00 0.00
iscsi.testme5 500M 0 0.00 0.00
rbd.myhost_1 T 4G 504 1.95 0.00 rh460p(CON)
rbd.test_2 1G 0 0.00 0.00
rbd.testme 500M 0 0.00 0.00

在Client列中,(CON)表示iSCSI initiator (client)当前已登录iSCSI gateway。 如果显示-multi-,则多个clients映射到单个RBD image。

使用ANSI配置ISCSI TARGET

Ceph iSCSI gateway是iSCSI target node,也是Ceph client node。 Ceph iSCSI gateway可以是独立节点,也可以位于Ceph Object Store Disk (OSD) node上。 完成以下步骤,将安装Ceph iSCSI gateway并将其配置为基本操作。

要求:

  • 正在运行的Ceph Luminous(12.2.x)集群或更高版本
  • Red Hat Enterprise Linux/CentOS 7.5(或更高版本); Linux内核v4.16(或更高版本)
  • 在所有iSCSI gateway节点上安装ceph-iscsi package

安装:

在Ansible installer节点(可以是管理节点也可以是专用部署节点)上,执行以下步骤:

1、以root用户身份安装ceph-ansible package:

1
# yum install ceph-ansible

2、在/etc/ansible/hosts文件中为gateway group添加一个entry:

1
2
3
[iscsigws]
ceph-igw-1
ceph-igw-2

注意如果将iSCSI gateway与OSD部署同一节点,则将OSD节点添加到[iscsigws] section。

配置:

ceph-ansible package在/usr/share/ceph-ansible/group_vars/目录中放置了一个名为iscsigws.yml.sample的文件。 创建此示例文件的副本iscsigws.yml。 查看以下Ansible变量和说明,并进行相应更新。 有关高级变量的完整列表,请参见iscsigws.yml.sample。

Variable(变量) Meaning/Purpose(含义/目的)
seed_monitor 每个gateway都需要访问ceph集群以进行rados和rbd calls。 这意味着iSCSI gateway必须已定义适当的/etc/ceph/目录。 seed_monitor host用于填充iSCSI gateway的/etc/ceph/目录。
cluster_name 自定义存储集群名称(默认为ceph)
gateway_keyring Define a custom keyring name.
deploy_settings 如果设置为true,则在运行playbook时deploy the settings。
perform_system_checks 这是一个布尔值,用于检查每个gateway上的multipath和lvm configuration settings。 必须至少在第一次运行时将其设置为true,以确保正确配置了multipathd和lvm。
api_user API的用户名。 默认值为admin。
api_password 使用API的密码。 默认值为admin。
api_port 使用API的TCP端口号。 默认值为5000。
api_secure 如果必须使用TLS,则为True。 默认为false。 如果为true,则用户必须创建必要的certificate和key files。 有关详细信息,请参见gwcli man文件。
trusted_ip_list 有权访问API的IPv4或IPv6地址的列表。 默认情况下,只有iSCSI gateway节点可以访问。

Deploying:

在Ansible installer节点上,执行以下步骤。

1、以root用户身份执行Ansible playbook:

1
2
# cd /usr/share/ceph-ansible
# ansible-playbook site.yml --limit iscsigws

注意Ansible playbook将处理RPM dependencies,设置daemons并安装gwcli,因此可用于创建iSCSI targets并将RBD images导出为LUN。 在以前的版本中,iscsigws.yml可以定义iSCSI target和其他objects,如clients, images和LUNs, 但现在不再支持该功能。

2、从iSCSI gateway节点验证配置:

1
# gwcli ls

请参阅Configuring the iSCSI Target using the Command Line Interface,使用gwcli工具创建gateways, LUNs和clients。

1
重要提示尝试使用targetcli工具更改配置将导致以下问题,例如ALUA配置错误和路径故障转移问题。 可能会损坏数据,configuration across iSCSI gateways不匹配,WWN information不匹配,这将导致client multipath问题。

Service Management:

ceph-iscsi package安装configuration management logic和一个名为rbd-target-api的Systemd service。启用Systemd service后,rbd-target-api将在引导时启动,并将恢复Linux IO状态。Ansible playbook会在部署期间禁用target service。以下是与rbd-target-api Systemd服务交互命令。

1
# systemctl <start|stop|restart|reload> rbd-target-api
  • reload

reload request将强制rbd-target-api重新读取配置并将其应用于当前正在运行的环境。 通常不需要这样做,因为changes是从Ansible并行部署到所有iSCSI gateway节点的。

  • stop

stop request将关闭gateway的portal interfaces,断开与客户端的连接,并从内核中清除当前的LIO配置。这将使iSCSI gateway返回到clean状态。 当客户端断开连接时,客户端multipathing layer会将active I/O(活动的I/O)重新安排到其他iSCSI gateways。

Removing the Configuration:

ceph-ansible package提供了Ansible手册,可删除iSCSI gateway配置和相关的RBD images。 Ansible playbook是/usr/share/ceph-ansible/purge_gateways.yml。 运行此Ansible playbook时,系统会提示您执行清除的类型:

lio :

在此模式下,将在已定义的所有iSCSI gateways上清除LIO配置。 在Ceph storage集群中,创建的Disks保持不变。

all :

选择all后,将删除LIO配置以及在iSCSI gateway环境中定义的所有RBD images,其他不相关的RBD images将不会删除。

1
2
3
警告清除操作是对iSCSI gateway环境的破坏性操作。

警告如果RBD images具有snapshots或clones并通过Ceph iSCSI gateway导出,则清除操作将失败。
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
[root@rh7-iscsi-client ceph-ansible]# ansible-playbook purge_gateways.yml
Which configuration elements should be purged? (all, lio or abort) [abort]: all


PLAY [Confirm removal of the iSCSI gateway configuration] *********************


GATHERING FACTS ***************************************************************
ok: [localhost]


TASK: [Exit playbook if user aborted the purge] *******************************
skipping: [localhost]


TASK: [set_fact ] *************************************************************
ok: [localhost]


PLAY [Removing the gateway configuration] *************************************


GATHERING FACTS ***************************************************************
ok: [ceph-igw-1]
ok: [ceph-igw-2]


TASK: [igw_purge | purging the gateway configuration] *************************
changed: [ceph-igw-1]
changed: [ceph-igw-2]


TASK: [igw_purge | deleting configured rbd devices] ***************************
changed: [ceph-igw-1]
changed: [ceph-igw-2]


PLAY RECAP ********************************************************************
ceph-igw-1 : ok=3 changed=2 unreachable=0 failed=0
ceph-igw-2 : ok=3 changed=2 unreachable=0 failed=0
localhost : ok=2 changed=0 unreachable=0 failed=0

使用COMMAND LINE INTERFACE配置ISCSI TARGET

Ceph iSCSI gateway是iSCSI target节点,也是Ceph client节点。 Ceph iSCSI gateway可以是独立节点,也可以位于Ceph Object Store Disk (OSD)节点上。 完成以下步骤,将安装Ceph iSCSI gateway并将其配置为基本操作。

Requirements:

  • 正在运行的Ceph Luminous(12.2.x)集群或更高版本
  • Red Hat Enterprise Linux/CentOS 7.5(或更高版本); Linux内核v4.16(或更高版本)
  • 必须从Linux发行版的软件repository中安装以下软件包:
    • targetcli-2.1.fb47 or newer package
    • python-rtslib-2.1.fb68 or newer package
    • tcmu-runner-1.4.0 or newer package
    • ceph-iscsi-3.2 or newer package
1
重要说明:如果存在这些packages的先前版本,则必须在安装较新版本之前首先将其删除。

在继续Installing section之前,请在Ceph iSCSI gateway节点上执行以下步骤:

1、如果Ceph iSCSI gateway未在OSD节点上,则将/etc/ceph/中的Ceph配置文件复制到iSCSI gateway 节点。 Ceph配置文件必须存在于/etc/ceph/下的iSCSI gateway节点上。

2、安装和配置Ceph Command-line Interface

3、请在防火墙上打开TCP端口3260和5000。

1
注意对端口5000的访问应仅限于受信任的内部网络或仅使用gwcli或正在运行ceph-mgr daemons的单个主机。

4、创建一个新的或使用现有的RADOS Block Device (RBD)。

Installing:

如果您使用upstream ceph-iscsi package,请遵循 manual install instructions

对于基于rpm的指令,请执行以下命令:

1、以root用户身份,在所有iSCSI gateway节点上,安装ceph-iscsi package:

1
# yum install ceph-iscsi

2、以root用户身份,在所有iSCSI gateway节点上,安装tcmu-runner package:

1
# yum install tcmu-runner

Setup:

1、gwcli需要一个名称为rbd的pool,因此它可以存储iSCSI配置之类的元数据。 要检查是否已创建此pool,请运行:

1
# ceph osd lspools

如果不存在,则可以在RADOS pool operations page上找到创建pool的说明。

2、在iSCSI gateway节点上,以root身份在/etc/ceph/目录中创建一个名为iscsi-gateway.cfg的文件:

1
# touch /etc/ceph/iscsi-gateway.cfg

2.1、编辑iscsi-gateway.cfg文件并添加以下行:

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
49
50
51
52
[config]
# Name of the Ceph storage cluster. A suitable Ceph configuration file allowing
# access to the Ceph storage cluster from the gateway node is required, if not
# colocated on an OSD node.
cluster_name = ceph

# Place a copy of the ceph cluster's admin keyring in the gateway's /etc/ceph
# drectory and reference the filename here
gateway_keyring = ceph.client.admin.keyring


# API settings.
# The API supports a number of options that allow you to tailor it to your
# local environment. If you want to run the API under https, you will need to
# create cert/key files that are compatible for each iSCSI gateway node, that is
# not locked to a specific node. SSL cert and key files *must* be called
# 'iscsi-gateway.crt' and 'iscsi-gateway.key' and placed in the '/etc/ceph/' directory
# on *each* gateway node. With the SSL files in place, you can use 'api_secure = true'
# to switch to https mode.

# To support the API, the bear minimum settings are:
api_secure = false

# Additional API configuration options are as follows, defaults shown.
# api_user = admin
# api_password = admin
# api_port = 5001
# trusted_ip_list = 192.168.0.10,192.168.0.11



# ------------------------------------------------------
# 翻译如下
[config]
#Ceph存储集群的名称。如果不位于OSD节点上,则需要一个合适的Ceph配置文件,该文件允许从gateway节点访问Ceph存储群集。
cluster_name = ceph

#将ceph集群的admin keyring的副本放置在gateway的/etc/ceph文件夹中,并在此处引用filename
gateway_keyring = ceph.client.admin.keyring


#API设置。
#API支持许多选项,可让您根据本地环境进行定制。如果要在https下运行API,则需要为每个iSCSI gateway节点创建兼容的cert/key文件,该节点未锁定到特定节点。必须将SSL cert和key文件命名为'iscsi-gateway.crt'和'iscsi-gateway.key',并放置在每个gateway节点上的'/etc/ceph/'目录中。放置好SSL文件后,您可以使用'api_secure = true'切换到https模式。

#为了支持API,至少需要配置如下:
api_secure = false

#其他API配置选项如下,显示的默认值。(trusted翻译为信任)
# api_user = admin
# api_password = admin
# api_port = 5001
# trusted_ip_list = 192.168.0.10,192.168.0.11

注意trusted_ip_list是每个iscsi gateway上IP地址的列表,将用于管理操作,如创建target,lun导出等。该IP可以与用于iSCSI data的IP相同,例如与RBD image之间的READ/WRITE命令,但建议使用单独的IP。

1
重要说明:在所有iSCSI gateway节点上,iscsi-gateway.cfg文件必须相同。

2.2、以root用户身份将iscsi-gateway.cfg文件复制到所有iSCSI gateway节点。

2.3、以root用户身份,在所有iSCSI gateway节点上,启用并启动API服务:

1
2
3
# systemctl daemon-reload
# systemctl enable rbd-target-api
# systemctl start rbd-target-api

Configuring:

gwcli将创建和配置iSCSI target和RBD images,并在上一部分中的gateways设置之间复制配置。 较低级别的工具(例如targetcli和rbd)可用于查询本地配置,但不应用于对其进行修改。 下一节将演示如何创建iSCSI target并将RBD image导出为LUN 0。

1、以root用户身份,在iSCSI gateway节点上,启动iSCSI gateway command-line interface:

1
# gwcli

2、转到iscsi-targets并创建名为iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw的目标:

1
2
> /> cd /iscsi-target
> /iscsi-target> create iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw

3、创建iSCSI gateways。 下面使用的IP是用于iSCSI data(如READ和WRITE命令)的IP。 它们可以是trusted_ip_list中列出的用于管理操作相同的IP,但是建议使用不同的IP。

1
2
3
> /iscsi-target> cd iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/gateways
> /iscsi-target...-igw/gateways> create ceph-gw-1 10.172.19.21
> /iscsi-target...-igw/gateways> create ceph-gw-2 10.172.19.22

如果不使用RHEL/CentOS或使用upstream或ceph-iscsi-test kernel,则必须使用skipchecks=true参数。 这将避免Red Hat kernel和rpm checks:

1
2
3
> /iscsi-target> cd iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/gateways
> /iscsi-target...-igw/gateways> create ceph-gw-1 10.172.19.21 skipchecks=true
> /iscsi-target...-igw/gateways> create ceph-gw-2 10.172.19.22 skipchecks=true

4、在rbd pool中添加名称为disk_1的RBD image:

1
2
> /iscsi-target...-igw/gateways> cd /disks
> /disks> create pool=rbd image=disk_1 size=90G

5、创建一个客户端,使用initiator名称iqn.1994-05.com.redhat:rh7-client:

1
2
> /disks> cd /iscsi-target/iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/hosts
> /iscsi-target...eph-igw/hosts> create iqn.1994-05.com.redhat:rh7-client

6、将客户端的CHAP用户名设置为myiscsiusername,将密码设置为myiscsipassword:

1
> /iscsi-target...at:rh7-client>  auth username=myiscsiusername password=myiscsipassword

警告必须始终配置CHAP。 如果没有CHAP,target将拒绝任何登录请求。

7、将disk添加到客户端:

1
> /iscsi-target...at:rh7-client> disk add rbd/disk_1

下一步是配置iSCSI initiators。

手动安装CEPH-ISCSI

Requirements

要完成ceph-iscsi的安装,有4个步骤:

1、从Linux发行版的软件repository安装common packages

2、安装Git以直接从其Git repositories中获取其余packages

3、确保使用兼容的kernel

4、安装ceph-iscsi的所有组件并启动相关的daemons:

  • tcmu-runner
  • rtslib-fb
  • configshell-fb
  • targetcli-fb
  • ceph-iscsi

1、安装COMMON PACKAGES

ceph-iscsi和target工具将使用以下packages。 必须从Linux发行版的软件repository中将它们安装在将成为iSCSI gateway的每台计算机上:

  • libnl3
  • libkmod
  • librbd1
  • pyparsing
  • python kmod
  • python pyudev
  • python gobject
  • python urwid
  • python pyparsing
  • python rados
  • python rbd
  • python netifaces
  • python crypto
  • python requests
  • python flask
  • pyOpenSSL

2、安装GIT

为了安装使用Ceph运行iSCSI所需的所有packages,您需要使用Git直接从其repository中下载它们。 在CentOS/RHEL上执行:

1
> sudo yum install git

在Debian/Ubuntu上执行:

1
> sudo apt install git

要了解有关Git及其工作方式的更多信息,请访问https://git-scm.com

3、确保使用了兼容的KERNEL

确保使用支持Ceph iSCSI patches的kernel:

  • 具有内核v4.16或更高版本的所有Linux发行版
  • Red Hat Enterprise Linux或CentOS 7.5更高版本

如果您已经在使用兼容的kernel,则可以转到下一步。 但是,如果您不使用兼容的kernel,请查看发行版的文档以获取有关如何构建此kernel的特定说明。 唯一的Ceph iSCSI特定要求是必须启用以下构建选项:

1
2
3
CONFIG_TARGET_CORE=m
CONFIG_TCM_USER2=m
CONFIG_ISCSI_TARGET=m

4、安装CEPH-ISCSI

最后,可以直接从其Git repositories中获取其余工具,并启动其相关服务

TCMU-RUNNER

Installation:

1
2
> git clone https://github.com/open-iscsi/tcmu-runner
> cd tcmu-runner

运行以下命令以安装所有必需的依赖项:

1
> ./extra/install_dep.sh

现在,您可以构建tcmu-runner。 为此,请使用以下构建命令:

1
2
> cmake -Dwith-glfs=false -Dwith-qcow=false -DSUPPORT_SYSTEMD=ON -DCMAKE_INSTALL_PREFIX=/usr
> make install

启用并启动守护程序:

1
2
3
> systemctl daemon-reload
> systemctl enable tcmu-runner
> systemctl start tcmu-runner

RTSLIB-FB

Installation:

1
2
3
> git clone https://github.com/open-iscsi/rtslib-fb.git
> cd rtslib-fb
> python setup.py install

CONFIGSHELL-FB

Installation:

1
2
3
> git clone https://github.com/open-iscsi/configshell-fb.git
> cd configshell-fb
> python setup.py install

TARGETCLI-FB

Installation:

1
2
3
4
5
> git clone https://github.com/open-iscsi/targetcli-fb.git
> cd targetcli-fb
> python setup.py install
> mkdir /etc/target
> mkdir /var/target

警告ceph-iscsi工具假定它们正在管理系统上的所有targets。 如果已设置targets并由targetcli管理,则必须禁用targets服务。

CEPH-ISCSI
Installation:

1
2
3
4
5
> git clone https://github.com/ceph/ceph-iscsi.git
> cd ceph-iscsi
> python setup.py install --install-scripts=/usr/bin
> cp usr/lib/systemd/system/rbd-target-gw.service /lib/systemd/system
> cp usr/lib/systemd/system/rbd-target-api.service /lib/systemd/system

启用并启动daemon:

1
2
3
4
5
> systemctl daemon-reload
> systemctl enable rbd-target-gw
> systemctl start rbd-target-gw
> systemctl enable rbd-target-api
> systemctl start rbd-target-api

安装完成。 进入main ceph-iscsi CLI page上的setup部分。

Ubuntu版本

1
2
3
4
5
6
7
8
9
10
11
12
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

常用命令

1、add-apt-repository

add-apt-repository是用于添加apt source.list条目的脚本。它可用于添加任何repository,还提供用于添加Launchpad PPA repository的简写语法(Personal Package Archive,个人软件包存档)。

1
2
3
4
5
6
7
8
sudo add-apt-repository ppa:g2p/storage
sudo apt-get update
sudo apt-get install bcache-tools

sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:ansible/ansible-2.8
sudo apt-get update
sudo apt-get -y install ansible

2、vim 粘贴串行问题

1
2
3
4
5
在粘贴前设置(粘贴前不会自动缩进)
set paste

在粘贴后恢复
set nopaste

3、安装package常用操作

1
2
3
4
5
sudo apt clean   #清空缓存
sudo apt install -d software_name #只下载不安装,缓存位置 /var/cache/apt/archives
sudo dpkg -i *.deb

apt-get install -f 修复损坏的软件包,尝试卸载出错的包,重新安装正确版本

设置网络

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@yujiang-ceph-1:~# cat /etc/netplan/50-cloud-init.yaml 
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
ens160:
dhcp4: false
addresses: [192.168.1.127/24]
gateway4: 192.168.1.1
nameservers:
addresses: [192.168.1.1, 114.114.114.114]
version: 2

编译deb

1
2
3
4
5
6
7
8
9
10
11
12
13
解压xz文件
xz -d prometheus_2.1.0+ds-1.debian.tar.xz
tar -xvf prometheus_2.1.0+ds-1.debian.tar

压缩xz文件
tar cvf prometheus_2.1.0+ds-1.debian.tar debian/
xz -z prometheus_2.1.0+ds-1.debian.tar

apt-get install debhelper dh-golang golang-github-aws-aws-sdk-go-dev golang-github-azure-azure-sdk-for-go-dev golang-github-azure-go-autorest-dev golang-github-cespare-xxhash-dev golang-github-cockroachdb-cmux-dev golang-github-fsnotify-fsnotify-dev golang-github-go-kit-kit-dev golang-github-gogo-protobuf-dev golang-github-golang-snappy-dev golang-github-gophercloud-gophercloud-dev golang-github-grpc-ecosystem-grpc-gateway-dev golang-github-hashicorp-go-cleanhttp-dev golang-github-hashicorp-serf-dev golang-github-miekg-dns-dev golang-github-mwitkow-go-conntrack-dev golang-github-opentracing-contrib-go-stdlib-dev golang-github-opentracing-opentracing-go-dev golang-github-pkg-errors-dev golang-github-prometheus-client-golang-dev golang-github-prometheus-client-model-dev golang-github-prometheus-common-dev golang-github-prometheus-tsdb-dev golang-github-samuel-go-zookeeper-dev golang-go golang-golang-x-net-dev golang-golang-x-oauth2-google-dev golang-golang-x-time-dev golang-google-api-dev golang-google-genproto-dev golang-google-grpc-dev golang-gopkg-alecthomas-kingpin.v2-dev golang-gopkg-yaml.v2-dev

dpkg-buildpackage -uc -us

dpkg-buildpackage -rfakeroot -Tclean

ceph在扩容或缩容期间会有数据rebalance。如何控制在rebalance时,尽量降低对client IO的影响?调研如下:

首先,在什么情况下ceph会出现数据rebalance?

本质上,用户数据写入ceph时,会被切分成大小相等的object,这些object由PG承载,分布到不同的OSD上(每个OSD一般会对应一块硬盘)。数据的迁移会以PG为单位进行,所以当PG发生变化时,就会有数据rebalance。

那么在什么时候PG会变化呢?

从用户使用角度讲一般有如下几种场景:

  • 添加/删除OSD
  • 重新调整pool的PG数

Client IO优先

降低recovery的I/O优先级

1
2
3
4
5
6
7
调整后
[root@ceph ~]# ceph daemon osd.2 config show | grep osd_recovery_op_priority
"osd_recovery_op_priority": "3",

使用默认值
[root@ceph ~]# ceph daemon osd.2 config show | grep osd_client_op_priority
"osd_client_op_priority": "63",

降低recovery的I/O带宽及backfill带宽

1
2
3
4
5
6
7
调整后
[root@ceph ~]# ceph daemon osd.2 config show | grep osd_recovery_max_active
"osd_recovery_max_active": "1",

调整后
[root@ceph ~]# ceph daemon osd.2 config show | grep osd_recovery_sleep
"osd_recovery_sleep": "0.200000",

调整相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ceph ~]# ceph daemon osd.2 config set osd_recovery_op_priority 3
{
"success": "osd_recovery_op_priority = '3' (not observed, change may require restart) "
}
[root@ceph ~]# ceph daemon osd.2 config show | grep osd_recovery_op_priority
"osd_recovery_op_priority": "3",

获取osd ID
[root@ceph ~]# ll /var/run/ceph/ | grep osd | awk '{print $9}' | sed 's/ceph-\(.*\).asok/\1/'
osd.13
osd.2
osd.5
osd.8

添加OSD时

1、BACK FILLING

当新的OSD加入群集时,CRUSH将把placement groups从群集中的OSD重新分配给新添加的OSD。强制新OSD立即接受重新分配的placement groups会给新OSD带来过多的负担。用placement groups backfilling OSD在后台运行。backfilling完成后,新的OSD将在准备就绪后开始处理请求。

在backfilling操作期间,您可能会看到以下几种状态之一:

  • backfill_wait:表示backfilling操作尚未完成,但尚未进行
  • backfilling:表示正在进行backfilling操作
  • backfill_toofull:表示已请求backfill操作,但由于存储容量不足而无法完成

如果无法重新backfilled placement group,则可以认为该placement group considered incomplete(不完整)

backfill_toofull状态可能是瞬态的。随着PG的移动,空间可能变得可用。 backfill_toofull与backfill_wait类似,因为一旦条件发生变化,backfill就可以继续进行。

Ceph提供了许多设置来管理将placement groups重新分配给OSD(尤其是新OSD)相关的负载峰值。默认情况下,osd_max_backfill设置OSD之间最大并发backfill数为1。backfill full ratio可以使OSD拒绝接受backfill请求(默认为90%),使用ceph osd set-backfillfull-ratio命令进行更改。如果OSD拒绝backfill请求,则osd backfill retry interval使OSD可以重试该请求(默认为30秒后)。OSD还可以设置osd backfill scan min和osd backfill scan max以管理扫描间隔(默认为64和512)。

1
2
3
4
Option("osd_max_backfills", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
.set_default(1)
.set_description("Maximum number of concurrent local and remote backfills or recoveries per OSD ")
.set_long_description("There can be osd_max_backfills local reservations AND the same remote reservations per OSD. So a value of 1 lets this OSD participate as 1 PG primary in recovery and 1 shard of another recovering PG."),

参考资料

【1】https://blog.csdn.net/Linux_kiss/article/details/82857117

【2】http://www.zphj1987.com/2017/08/10/Ceph-recover-speed-control/

最常见的Ceph Block Device用例是向虚拟机提供block device images。例如,用户可以创建”golden” image。 然后,对image做snapshot。最后,用户clone snapshot(通常多次)。 有关详细信息,请参见 Snapshots。snapshot的clone具有copy-on-write能力,意味着Ceph可以快速将block device images配置给虚拟机,因为客户端不必在每次启动新虚拟机时都下载整个映像。

Ceph Block Devices可以与QEMU虚拟机集成。 有关QEMU的详细信息,请参阅QEMU Open Source Processor Emulator。 有关QEMU文档,请参见QEMU Manual。 有关安装的详细信息,请参见 Installation

1
重要说明要将Ceph Block Devices与QEMU一起使用,你必须能够访问正在运行的Ceph的集群。

USAGE(用法)

QEMU命令行要求您指定pool名称和image名称。 您也可以指定snapshot名称。

QEMU将假设Ceph configuration文件位于默认位置(例如,/etc/ceph/$cluster.conf),并且您以默认的client.admin user身份执行命令,除非您明确指定另一个Ceph configuration文件路径或另一个user。指定user时,QEMU使用ID而不是完整的TYPE:ID。有关详细信息,请参见User Management - User。请勿在user ID的开头添加客户端类型(即,client),否则您将收到验证错误。您应该具有admin user的key,或者使用:id={user}选项指定的另一个user的key,存储在默认路径中的keyring文件中。(即,/etc/ceph或具有适当文件所有权和权限的本地目录)用法如下:

1
qemu-img {command} [options] rbd:{pool-name}/{image-name}[@snapshot-name][:option1=value1][:option2=value2...]

例如,指定id和conf选项如下所示:

1
qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf

提示:包含:, @, 或 =可以使用\开头的字符进行转义。

CREATING IMAGES WITH QEMU(使用QEMU创建IMAGES)

可以从QEMU创建block device image。 必须指定rbd,pool名称和要创建的image名称。 还必须指定image的size。

1
qemu-img create -f raw rbd:{pool-name}/{image-name} {size}

例如:

1
qemu-img create -f raw rbd:data/foo 10G

重要说明:raw data format(原始数据格式)实际上是与RBD一起使用的唯一明智格式选项。从技术上讲,您可以使用其他QEMU支持的格式(例如qcow2或vmdk),但是这样做会增加额外的开销,并且在启用缓存(请参阅下文)时,对于虚拟机实时迁移也将使该卷不安全。

RESIZING IMAGES WITH QEMU(使用QEMU调整IMAGES大小)

您可以从QEMU调整block device image的大小。 您必须指定rbd,pool名称以及要调整大小的image名称。 您还必须指定image的size。

1
qemu-img resize rbd:{pool-name}/{image-name} {size}

例如:

1
qemu-img resize rbd:data/foo 10G

RETRIEVING IMAGE INFO WITH QEMU(使用QEMU检索IMAGE信息)

您可以从QEMU中检索block device image信息。 您必须指定rbd,pool名称和image名称。

1
qemu-img info rbd:{pool-name}/{image-name}

例如:

1
qemu-img info rbd:data/foo

RUNNING QEMU WITH RBD(运行QEMU与RBD)

QEMU可以将block device从host传递到guest,但是从QEMU 0.15开始,无需将image映射为host上的block device。相反,QEMU可以直接通过librbd作为virtual block device访问image。这样会更好,因为它避免了额外的context(上下文)切换,并且可以利用RBD caching

您可以使用qemu-img将现有的virtual machine images转换为Ceph block device images。例如,如果您有一个qcow2 image,则可以运行:

1
qemu-img convert -f qcow2 -O raw debian_squeeze.qcow2 rbd:data/squeeze

要运行从该image启动的virtual machine,可以运行:

1
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze

RBD caching可以明显提高性能。 从QEMU 1.2开始,QEMU的cache选项控制librbd caching:

1
qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback

如果您使用的是较旧版本的QEMU,则可以将librbd cache configuration设置为”file”参数的一部分(如任何Ceph配置选项一样):

1
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze:rbd_cache=true,cache=writeback

重要说明:如果设置rbd_cache=true,则必须设置cache=writeback。如果不使用cache=writeback,则QEMU不会将刷新请求发送到librbd,如果QEMU在此配置中异常退出,则 rbd 顶部的文件系统可能会损坏。

ENABLING DISCARD/TRIM(启用DISCARD/TRIM)

从Ceph 0.46版和QEMU 1.1版开始,Ceph Block Devices支持discard(丢弃)操作。这意味着guest可以发送TRIM请求,让Ceph block device回收未使用的空间。在客户机中mount ext4XFS时,通过discard选项启用它。

为了使此功能可供guest使用,必须为block device显式启用它。 为此,必须指定与drive关联的dispatch_granularity

1
2
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze,id=drive1,if=none \
-device driver=ide-hd,drive=drive1,discard_granularity=512

请注意,这使用了IDE driver。 virtio driver不支持discard。

如果使用libvirt,请使用virsh edit编辑domain的配置文件,以包含xmlns:qemu值。然后,添加qemu:commandline block作为该domain的子级。以下示例为如何将qemu id=设置到两个不同的devices,并且discard_granularity值不同。

1
2
3
4
5
6
7
8
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<qemu:commandline>
<qemu:arg value='-set'/>
<qemu:arg value='block.scsi0-0-0.discard_granularity=4096'/>
<qemu:arg value='-set'/>
<qemu:arg value='block.scsi0-0-1.discard_granularity=65536'/>
</qemu:commandline>
</domain>

QEMU CACHE OPTIONS(QEMU缓存选项)

QEMU的cache选项与以下Ceph RBD Cache设置相对应。

Writeback:

1
rbd_cache = true

Writethrough:

1
2
rbd_cache = true
rbd_cache_max_dirty = 0

None:

1
rbd_cache = false

QEMU的cache设置会覆盖Ceph的cache设置(包括在Ceph配置文件中设置)。

实验

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
[root@ceph ~]# qemu-img create -f raw rbd:rbd/yujiang 10G
Formatting 'rbd:rbd/yujiang', fmt=raw size=10737418240 cluster_size=0
[root@ceph ~]# rbd info yujiang
rbd image 'yujiang':
size 10GiB in 2560 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.25dbd6b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
create_timestamp: Fri Nov 15 15:15:20 2019

[root@ceph ~]# qemu-img resize rbd:rbd/yujiang 20G
Image resized.
[root@ceph ~]# rbd info yujiang
rbd image 'yujiang':
size 20GiB in 5120 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.25dbd6b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
create_timestamp: Fri Nov 15 15:15:20 2019

[root@ceph ~]# qemu-img info rbd:rbd/yujiang
image: rbd:rbd/yujiang
file format: raw
virtual size: 20G (21474836480 bytes)
disk size: unavailable