找回密码
 注册
查看: 1416|回复: 1

Centos 7.9 部署Ceph L版整理

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-12-8 15:36:38 | 显示全部楼层 |阅读模式
ceph L版已经发布很久了,官方说默认使用BlueStore作为OSD的存储后端,在Cephalocon APAC 2018上也是讨论的焦点之一。
提到BlueStore,不得不说一说Ceph的STORAGE DEVICES。
STORAGE DEVICES
Ceph守护进程将数据存储在磁盘上:
1
$ p. h+ p, N' J- t2
1 ?. Z2 ?+ s+ f! U0 `3: ~- o) a. s3 V" i+ n
4! k, d$ ]! V  S6 t) p- f/ t
5
) W8 U% w2 s7 c# q( P5 b, ~+ Z9 I# R% w69 N, a2 t3 Y- f( w, E
Ceph OSDs ( Object Storage Daemons )
9 }8 j6 W4 Q) c" Z" X    Client端的大多数数据写入Ceph后被存储的地方,一般而言,每个OSD都由单一存储设备支持,如传统硬盘(HDD)或固态硬盘(SSD)。! Q) t6 w( \, ]
    OSD还可以由多种设备组合,如存储数据的HDD和存储某些元数据的SSD(或SSD的分区)。
! t' }" ]/ n8 E3 o  O- E! h& S    群集中OSD的数量通常取决于你要存储的数据量,还需要考虑每个存储设备的容量以及冗余级别和存储类型(replication或erasure coding)。; X& ?0 X: j6 [# k% Z  F
Ceph Monitor
2 `8 \5 ~5 L* ]! O. [    管理关键群集状态,如cluster membership和authentication信息。对于较小的集群,需要几千兆字节(几个GB),然而对于较大的集群,monitor的数据库可以达到几十甚至几百千兆(几十个GB甚至几百个GB)。3 X' w' [4 p3 L; b, H1 h; ?
) s& h9 A: ~( ^
OSD BACKENDS
OSD可以通过两种方式管理存储的数据。从Luminous 12.2.z发行版开始,新的默认(推荐)后端是 BlueStore。在Luminous之前,默认(也是唯一的选择)是 FileStore。
BLUESTORE
BlueStore是专门用于Ceph OSD管理磁盘上的数据的专用存储后端。在过去十年间,受到了FileStore管理OSD经验的启发.
2 k9 ]6 V9 K' C4 h* Q+ h5 HBlueStore的主要功能包括:
1
6 y! l5 r' x, I) D; Y, S2/ A: g# X, N; o! t
3
, _- {' i2 X! A. ?2 k4
6 l! \* S$ N5 f. s% j! I% ?5
) i; r6 |) L) N( L69 E. ^/ V7 K4 V0 g8 K/ m* |4 J
7
" `% E; H; ?# T0 S4 k& z- E8. u$ y6 M: `/ `
9
; }# `& x# H1 l4 f10
  I! J3 H3 V4 C# c11
- }: y% h! ^5 V2 }! H1 u2 U; L- W12
( ]: t1 ^: `# Y) v' f  Y) y, A( D' G$ c13
) Q9 ]: f5 [7 N) e) t( l6 n14
8 e# q1 o: ~- q# a" H3 O. x15
/ Q* F! U0 k9 q$ i, U16
# R5 M* T4 v. t, ~17
3 r! g" m7 P: _; _2 S' Z5 _5 q2 z18
$ O# R9 F6 B) x3 }1 H) W0 `19$ q* X) J/ {& p9 d3 ~1 S8 @# c
直接管理存储设备 ( Direct management of storage devices )+ O5 t( W! M7 H- y. `
    BlueStore使用原始块设备或分区。这避免了任何可能限制性能或增加复杂性的抽象层(如像XFS这样的本地文件系统)。
6 h7 s4 r8 }! M3 A# T: [
! k( R. ?- n2 O  x' l使用RocksDB进行元数据管理 ( Metadata management with RocksDB )$ Z6 {: L/ V7 I2 D
    为了管理内部元数据,我们嵌入了RocksDB的key/value数据库。例如在磁盘上,从object names到block locations的映射。
! m, U' m9 R( Q9 x# \: m; p7 E+ x3 p/ C! ~$ ^
完整的数据和元数据校验 ( Full data and metadata checksumming )
; V2 A9 h) j: _8 V8 @! u; G9 M  Z    默认情况下,写入BlueStore的所有数据和元数据都受到一个或多个校验和的保护。没有数据或元数据在未经过验证的情况下,就从磁盘读取或返回给用户。
0 o( X! ]5 @0 `% ^  O
2 l8 [5 N9 A: r5 a/ b内置压缩 ( Inline compression )  H/ R, R1 b5 C% W
    写入的数据在写入磁盘之前可以选择压缩。
0 n, @+ Q1 |0 J! i  `! S+ v: v5 K' v. X, F2 m8 H& |
多设备元数据分层 ( Multi-device metadata tiering )7 D3 a4 {: s  p! x
    BlueStore允许将其内部journal(预写日志,write-ahead log)写入单独的高速设备(如SSD,NVMe或NVDIMM)以提高性能。
- X4 w+ t- q% Y* \    如果有大量更快速的存储可用,则内部元数据也可以存储在更快的设备上。$ @( |# z& C) X% \
6 v$ z3 [% k( d
高效的写时复制 ( Efficient copy-on-write )
% h$ k* ?2 u# L" a) |    RBD和CephFS快照依赖于copy-on-write clone机制,也在BlueStore中得到了有效的实现。这将为常规快照和erasure coded池提供高效的IO(依靠clone实现高效的two-phase commits)
2 ^& E; M' h1 h2 o# f5 \" d- [$ _
9 N3 C# o1 N, T) [" a$ f1 w
& F% E# t. C4 {5 M5 Q+ n, b  h9 L
FILESTORE
FileStore是在Ceph中存储objects的传统方法。它依赖于标准文件系统(通常是XFS)和某个元数据的key/value数据库(传统上是LevelDB,现在是RocksDB)结合使用。- N) f" r9 Q( t5 l/ e$ `
FileStore经过良好测试并广泛用于生产,但由于其整体设计和对传统文件系统存储object数据的依赖性,因此存在许多性能缺陷。
" H+ b8 q/ U0 \( x, `9 s+ }尽管FileStore通常能够在大多数与POSIX兼容的文件系统(包括btrfs和ext4)上运行,但我们只建议使用XFS。) B) \8 I3 [: F7 z
btrfs和ext4都有已知的bug和缺陷,使用它们可能会导致数据丢失。默认情况下,所有的Ceph提供的工具都将使用XFS。
在ceph L版代码结构改动比较大,增加了CEPH-MGR向外部监测和管理系统提供额外的监测接口,今天就用虚拟机搭建实验环境玩一玩。
环境信息
1
  k, ?, Z8 j+ J% G. S+ K  `2/ X1 r1 u7 f& @0 @5 l
3
" z3 @. V$ P  X6 E' _& T4  i6 ]( [2 v4 R' d% N9 H5 d+ j
5. B! L; `2 K8 K
6
3 i: Y" _) W! g7
3 k& y( v8 f5 l8
/ h' r1 \0 {4 W$ W9
$ m3 M0 O. g" f, p106 H) N6 a' Q4 K1 g
115 `* X# a$ s; I- x. R* b; d' e
12  _  @4 p9 G* \9 `5 t. D9 i
13
) V3 C5 ]0 k+ p* C14: \! D* R; n( ?3 a0 {, \; l5 d" w4 V
15
, H* r* o* w  {8 z! e, C9 s& P16; L/ p" q' i0 T* T* M
17
1 V) T3 ?- a0 m# S. n18
+ Q5 c0 K7 C5 i6 K9 A
[root@cephL ~]# yum install -y redhat-lsb1 `0 P$ a/ h6 Y; F
[root@cephL ~]# lsb_release -a1 {! G5 a( s& ^1 k5 t
LSB Version:        :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
) `) l( q- ~* N( ?5 x; I, TDistributor ID:        CentOS
; o, A" M& `! a2 \) [* eDescription:        CentOS Linux release 7.4.1708 (Core)
- a) l! Y# `1 I6 D/ zRelease:        7.4.17081 b+ w- T) @" d# u; Q, z5 R4 Y
Codename:        Core; E/ o# }" I$ q, L

8 R5 ?. r+ r3 ?2 D[root@cephL ~]# lsblk7 r1 ?1 Z$ j# ]9 o" K4 p2 h
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
. {1 U6 L1 r- s. z% O* xsda               8:0    0   40G  0 disk. d- y5 ?! F: L/ ?' ~
├─sda1            8:1    0    1G  0 part /boot; m1 ]4 [$ o, b& g, n/ T7 b
└─sda2            8:2    0   39G  0 part
. F8 p/ s! P6 j  ├─centos-root 253:0    0   36G  0 lvm  /
! {7 Y* z2 U( u/ e6 k  └─centos-swap 253:1    0    3G  0 lvm  [SWAP]9 H; E  v5 w- e
sdb               8:16   0   30G  0 disk
. @1 _; O; N. z1 ?! S. i* z: hsdc               8:32   0   30G  0 disk- [9 @2 T- u8 a/ k$ G+ {1 b
sr0              11:0    1 1024M  0 rom. @& z7 Q; y9 m
+ K  G* e6 w1 I1 ^* b/ N
安装安装pip和ceph-deploy
1
9 L8 \- ~( i0 e; ]6 z; W6 F2" b% D( g  h% o1 e2 F& z
36 _! X* Q7 A1 [& c. S( q
4
( i  T/ V& w- p4 ]4 V+ R& z. X0 ?5' j4 l+ p5 O- Q2 C
6
6 n2 l; B2 z$ E7
/ G) A! B% g4 T
[root@cephL ~]# curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
- a2 Z/ s$ j3 K[root@cephL ~]# python get-pip.py( V+ z; ^$ ?2 s& v( L
[root@cephL ~]# python -m pip install -U pip
0 M5 V( e& |0 P& V3 c[root@cephL ~]# pip install --upgrade setuptools3 E0 S3 q, k+ }( N+ ~
[root@cephL ~]# pip install ceph-deploy
+ U/ o) O6 Y0 A% S* a+ _# b[root@cephL ~]# ceph-deploy --version
' R5 t: y, C! H3 i- |! O2.0.0
# t; |- x0 O- O+ g' b

0 E2 b& u" ]7 Z安装ceph软件包
18 W3 S  E$ ]$ c- K$ T+ P
2. }9 W. w# U; h: f0 o* J
[root@cephL ~]# mkdir ceph-deploy && cd ceph-deploy+ }* A6 g$ ]! V& U0 z
[root@cephL ceph-deploy]# ceph-deploy install cephL --release luminous
: ]2 K% R& k' ^+ O7 \/ Y  U' h

+ X0 H0 {' Q! k2 p' ?开始部署一个新的集群,然后为它写一个CLUSTER.conf和keyring
1
1 \# A5 q7 i- o; e* L
[root@cephL ceph-deploy]# ceph-deploy new --public-network 192.168.56.101/24  --cluster-network 192.168.56.101/24 cephL: Z& E- B! F% b& i

9 _* L9 Q, O! z/ Q6 d! f部署MON
10 T8 i; n4 A* \
2
6 H5 ~( ~; j' V7 ^1 B3: D* l& N! ], u" X$ Q
[root@cephL ceph-deploy]# ceph-deploy mon create-initial0 _. x) Y' @" T# T; g( u
[root@cephL ceph-deploy]# ceph-deploy mon create cephL5 V/ _9 Z  L1 \. z$ m: G; ~
ceph        1110       1  0 12:57 ?        00:00:01 /usr/bin/ceph-mon -f --cluster ceph --id cephL --setuser ceph --setgroup ceph
! c7 q& f  I8 o4 j
) a) |( O8 g, h; K5 e0 }9 `5 w
部署OSD
bluestore方法
1* Z! x+ k' ]/ A9 M- M6 n/ Q
2
' b# w1 j3 O. T* V4 D: ~8 x4 P3
4 W- q' `3 G3 {' W3 s1 l3 @7 K2 Q. |4
8 {9 B% r% q9 K( ^% n% N8 e5
: i) Z3 ]4 m. v* i" M- K
# 在创建osd时,L版默认是bluestore
/ m8 |4 G8 b+ w3 t2 ?* I5 Y[root@cephL ceph-deploy]# ceph-deploy osd create --data /dev/sdb cephL5 A" d6 [$ b. V; I0 D
ceph        1514       1  0 12:57 ?        00:00:01 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph6 f& d, o. H' k; R. b$ b9 \, N/ |1 ~3 X
[root@cephL ceph-deploy]# ceph-deploy osd create --data /dev/sdc cephL  H. d0 [' v3 @
ceph        1518       1  0 12:57 ?        00:00:01 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph2 x7 g! c3 p! f

% P! O3 l1 m, ~" G1 W3 P5 m* u" R
遇到问题
1" ]' s% H/ D3 a5 R/ K
2
# X+ W6 v6 o6 U9 S  M3) m4 ]1 n* {. t* D" l/ |1 y
4
: r+ S+ X+ p5 c3 D" n4 E) f( n3 ]5: `3 `( S, m" L
67 P9 H& ?: P# G; y9 T, V
7
0 p  y; r' L9 c1 s7 u  Q) L8- S8 p* T3 M( X+ t
94 \# U6 j+ d2 W3 }' G/ \: G
10
7 I: a! v) o# O4 {7 \: \* Q11
; _7 P1 o* j5 D5 P! W12  G/ }6 r0 x1 k# b( t
13
0 ^  Y/ u% J( w6 R- s1 g14
' `- Q) ]6 z2 C% }1 X9 S$ d155 l4 T! Q, ~1 N% o
166 `# _$ P) w4 G! T6 Q, ^1 h% q0 L
17- s, L( }1 r  c% V
18
: x% p  |% }+ }3 j/ A, V( J19
% W0 r+ v% `& P5 S20
5 V( x, g. D  b* f' z21
4 c0 ^, q3 ~3 Y) E# `, y' I229 r4 m5 F2 K1 l% s8 ~8 w8 s# T# p
23
, o5 m5 N% a+ w3 u; o! Y24$ B% d5 S/ r: j, S3 I6 b
[root@cephL ceph-deploy]# ceph -s
1 v. G5 X3 C& x2018-04-10 12:00:19.660298 7fd1fe0ae700 -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
# q+ ^* q& I9 \0 H+ g2018-04-10 12:00:19.660310 7fd1fe0ae700 -1 monclient: ERROR: missing keyring, cannot use cephx for authentication
! @# L7 V: i$ T5 w+ Q# A' F2018-04-10 12:00:19.660312 7fd1fe0ae700  0 librados: client.admin initialization error (2) No such file or directory
" P# b! ?9 J5 @. E3 R[errno 2] error connecting to the cluster
6 m" G3 s% i+ o! q" f: _3 a, n, _: J9 \$ S0 e; Y2 x
[root@cephL ceph-deploy]# chmod +r *4 V: }& O! l) d* ~! M4 w: a, V
[root@cephL ceph-deploy]# cp ceph.client.admin.keyring /etc/ceph/
7 E/ b" z& ?3 o! F2 k5 D! _9 q* p& n[root@cephL ceph-deploy]# ceph -s; m& p+ m" J! c2 u; Z
  cluster:  W* @; O& w& }! I1 p7 M1 w
    id:     765752b7-1f77-4d0d-bc18-936b8ad409fd& y/ n) R6 h/ N
    health: HEALTH_WARN' ~8 n% B4 o, X+ i3 C" Y; ^) n
            no active mgr1 `, d; i! b# Y8 B+ s5 P
; c1 }- q, K' E
  services:
7 B/ C) R0 y' p" i* n( z% N* c    mon: 1 daemons, quorum cephL
# i+ h, M$ U9 l' l) E1 Z. V* e' \2 F7 X    mgr: no daemons active- I) \6 S2 w: I0 z0 ]
    osd: 2 osds: 2 up, 2 in
" x; ~) Y" n& t* p) p* I$ J6 v* c; E3 E* e1 s
  data:- t( p* z' l* C! s  A. ?7 p
    pools:   0 pools, 0 pgs
; e, H8 X0 s1 [  m3 g    objects: 0 objects, 0 bytes
9 x8 N- @% @9 s% {( y* p    usage:   0 kB used, 0 kB / 0 kB avail: H9 ]$ C5 }+ a
    pgs:- l$ n7 h. U, b& X, q1 m( O. E' ]

) {/ z9 h1 s& J! D
filestore方法
12 f5 x  x4 L; i& U1 M( N# O% n
2
( _7 f7 G0 ^2 b% F& ^! G1 O5 s: y" `3
6 E" r% P6 n4 p4
$ Y1 M# X: l& z5: M9 m' U; {+ p" |" `, o
69 r4 a; a$ y( f3 z
7! G2 D! H6 Q; P! h, P! q
8
1 n; g  e8 _: h+ q( ~9
; R' @1 j' G3 u  r2 I10
2 ?" |' S! ?: ]0 G! T+ J5 q% d/ Y11% {+ c  a) A) u6 O5 T' g6 Q
12# I6 K% H2 b; H
13! `0 ?7 g6 z5 x, t6 w0 @
14
7 i" q0 U1 i8 B8 T0 s; j' u8 m15
2 s8 A5 h. j1 j8 j/ H167 M7 @4 Z; ^' X7 w& o
17
4 a; @2 p9 `0 `" w) v7 i) Q18
1 j" d) l( U1 g1 e' m- q2 w19% T5 r6 ~- w: I9 j6 _
20
( Q+ y5 o: y2 c  f3 @+ V& Y& h6 G* A21
  i7 K) f/ S& R1 `( X  K9 g22
6 ]- l5 ]; g" x' f23
$ y  O2 B1 p. d24: ?$ |6 z8 W0 ?; K2 {
254 Q2 _- w) z' B" r$ ]. j# y
263 Z. v  ]/ F" s0 {* O# d  J% U* r& v
27
3 ^& w' u5 N3 K- b1 a28
: U1 _2 c$ _, {4 _290 e6 o: ]; Z' |9 `) V& W
301 g/ `* c8 R9 ^8 A$ Y* S
31
% {6 S/ I- c5 a  a/ p32, m! P5 ]0 [* a* ~
33  y2 {! ]7 o* Q% y9 u
34
( M" s  F0 r8 w: W- v2 h, h7 T35/ y& p: L1 n! Q8 L1 s
36  L$ n$ L6 M4 e" f
37
0 P4 [8 E0 R2 V0 b38
9 q& n! m. d/ ?/ Y6 d$ O39
7 b$ `# t" e6 E403 v) Z8 f( i7 }2 G& i4 h
41' H1 |6 P8 ]* Y" T
42/ g1 r. B: T4 g" w" L9 X1 L2 A; I
43
! s: V0 u2 K( o44
+ q5 r, S! D% Y- T. M8 m45
/ h0 j) R' x3 }# F! o5 }+ _46; O7 t- @" h, |7 m7 E/ e" c
47+ f+ _$ A- A& X
48: c1 @! o0 y# m) L% n# I2 a
49
/ B- o9 V" z# W" T% o2 g50
4 c6 H! p. d8 S% ^51
" p& w9 N; W, H  _% K* O: s52( P/ u' Y3 f/ U- i
53/ i" p" i) c! I
54
; s* N0 @1 l/ G( {* b' z1 j. d55
  ?: k6 A8 s4 |  r56
+ E( m! [, z# g57
( j3 a2 ?2 \3 |) _% b* ]  G/ O581 v1 d! C, @' g% s
59# K; _. `6 l% H8 ]8 z6 ]% x  i( W
60- G# k8 U! i  P! F" j9 H, R; }" _
61: v" d1 P6 i- S% s4 X. b8 E1 {. y
62
0 ~1 o% N6 g! Z: _( T5 r633 k) q, A3 E  {: q* W" g% Z5 l! z
64
& u, H$ @! k. l2 y% s65
6 K, j0 t( z- U" b, R0 A# t5 Z66
) N3 j5 v7 K( t+ ?5 m67; d; _8 j( N3 U- X. S4 z4 h" |
68
6 \" z  T% N% `: k1 E( Z' j69! ^# B" ?: b: j% L/ L9 q2 O5 ^8 Y
70& X3 P; l0 m- ?4 s. s
71# {) s$ c- A& Q7 a* z* m
72; h  A* A: h) C1 o4 O( t+ p/ G0 {
73- b) S# n4 {6 w- [9 E& c
74
! N* s' b, v: w& r; g/ U; q; T75
# ^: v7 E* @$ l4 Q- |76: S5 q! i( Z+ ?/ F1 \
77
0 w$ f" Q  y* h9 `7 n) J2 K, z0 ~78; D0 \3 T" T1 u: X2 ~# O( H
79' ?0 f& A6 K* H
80% ?- U' a) J. F: E1 A
81- ]3 M* a) u* m
826 s1 f, ]$ D" M# @" I/ r
839 c: D6 J. A& c+ W
84
. N. x9 E. Y+ D; C85+ V4 ^2 d! f. r* f% J# k, O
86
7 E6 {" ~7 V% ]( A0 o* Y" Z) L+ M87
/ i8 T; y: {: p. P$ G# w) g& ~2 ~88
) r! A- O/ i0 N* O89
4 k' N4 ?7 a' P* ^  C! @$ {90& e( _, c8 S: t9 m, K& H9 J* c
91
! s1 {0 I7 t0 \( A5 o0 ?3 s92
4 s2 q, f% t% H( F93
! m3 @1 M  W( I) O8 n- K94( B% f" Q2 i# W, o+ x1 R' C- l2 P
956 S- Q; p2 n) o7 _* G; z
96. ~" ^: }7 r8 r9 r  G* P
97+ {8 T+ {% a' w8 l" h
98. I. V: X& m. }- a" r
99
7 R( O# ?- o/ M* @- S4 n  r( Y100
* |7 K6 Q" C9 J- ~' k/ X8 ]8 y101
# A4 ?: T4 D+ ]' X  n: C102
7 A8 p$ m  \. P, \1031 T+ M) o5 g9 X' y
104! Q" m9 ^4 v* ]" h
105
) i: f3 g+ r) T: Z7 l0 z1060 T0 Y+ q* B3 _  i
1075 J8 z6 m" P8 b) p; `
108
# r: [: z" |& v. W) c" ?  Q3 |1097 v- n* {. T, n  U: L) M0 G& }: K
110
+ m$ P! V. t& v. B# J; F, x1118 \& p& X- T) u9 l3 ?
1126 \3 S# l; T6 w/ `- `& I
113
4 `7 C( F  a: A3 ^8 R+ Y114# g) I0 s6 D3 i* c2 I
115% \1 c% @1 ?$ j* k# E. R5 l) q! {! V
1164 w  o7 x. Y! j* W/ a  v
1174 d  ~' D5 Y, E0 X( S( ?: Q
118
0 g- y3 _9 A* I; W3 g) F119* p: A# O% S; z
120
$ `6 I* H. C+ [  z; V121- f) f: i( p/ D& e
122
/ i  c6 Z$ U, u3 }123  h# d. d& L! S& s8 D9 j
124
) ]$ {" l. _% A1 p$ F5 l0 d125; D+ U6 K+ s- [1 u  n
126
5 _/ z: S* E" b5 a) p127! Q2 O) w% u* U# }( z' p: I- A
128$ s& I$ h4 q& {1 u# a6 M
129* \) q+ s8 {/ z4 b$ n7 Q0 N
130
+ u4 E& q5 q- b, `2 u+ k' }9 `131
0 A5 S& m4 ^; q* ^* d( b' \1328 S& L! S# a2 d' j
133
" ^2 [, ]. L; ~134* T. D1 ]0 B+ N0 g; a* M: M/ I
# 如果是filestore则需要对data device和journal device先做GPT partition1 I9 ]/ s% e) \* u0 `* W
--data DATA           The OSD data logical volume (vg/lv) or absolute path to device3 B9 w* a. f& C
--journal JOURNAL     Logical Volume (vg/lv) or path to GPT partition
. P( L: [: P0 P2 f( C3 m8 i( j. N0 Z4 l: k+ j6 S* y1 d, L
[root@cephL ceph-deploy]# fdisk /dev/sdb
& ]0 ]; d' j5 I. lWARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
7 N* a+ }0 S3 Q欢迎使用 fdisk (util-linux 2.23.2)。
* d' Y* A  K: `) l" o# s* o更改将停留在内存中,直到您决定将更改写入磁盘。) I; Q% i- P( e  f: g
使用写入命令前请三思。
! L5 a3 Z6 X6 x% V! w1 k命令(输入 m 获取帮助):g
- O. R' t- ?) N+ s5 x9 y, I, tBuilding a new GPT disklabel (GUID: 80097CEF-475B-4161-ACC7-7164F6A39DD2)
* Z! y1 B" }3 Q/ M命令(输入 m 获取帮助):n
4 @' ]6 Q0 I) r) y7 q+ y- Y分区号 (1-128,默认 1):+ t. C* v0 a) z
第一个扇区 (2048-62914526,默认 2048):
' b4 f3 L8 T: H( d8 W1 XLast sector, +sectors or +size{K,M,G,T,P} (2048-62914526,默认 62914526):! V6 h6 `2 K+ z& {+ m: n
已创建分区 1
; u& x2 r( v: C  m4 f命令(输入 m 获取帮助):w6 l8 }1 B  `3 u; ]- O' r" A
The partition table has been altered!0 F  c' i( G6 O4 ]- Y! I/ J% G
Calling ioctl() to re-read partition table.8 e! v) @! J# i, y. [; G
正在同步磁盘。+ }3 G: z/ \% @6 L

& X  n- H. s0 R6 r[root@cephL ceph-deploy]# fdisk /dev/sdc
5 \  d/ T' x1 H2 V$ A* MWARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion., K- n8 i1 }/ n" y
欢迎使用 fdisk (util-linux 2.23.2)。7 x' ?0 ~- k1 O: d( y. L
更改将停留在内存中,直到您决定将更改写入磁盘。
7 J- Z4 @1 ~$ q$ G% j使用写入命令前请三思。! y- h: g$ s0 {" \. v* P
命令(输入 m 获取帮助):g( y7 w0 y( Z, h  F+ }8 E9 B
Building a new GPT disklabel (GUID: 21DFA98C-5BCF-40E7-A120-3DEDEA6600ED)
' M+ E! b& W2 n2 d命令(输入 m 获取帮助):n
' T7 h& k1 U& b! ^- ?5 z分区号 (1-128,默认 1):' L  i; [0 m# \$ q: ^7 H1 T" }
第一个扇区 (2048-62914526,默认 2048):5 }; M9 ^. F. k+ \. E$ \- ^
Last sector, +sectors or +size{K,M,G,T,P} (2048-62914526,默认 62914526):, M- [; w1 S  _# |: @
已创建分区 17 b* [) Z0 V3 U' x3 p9 d" c
命令(输入 m 获取帮助):w
$ J% ]0 E0 b  I8 |. TThe partition table has been altered!8 k& T, \$ A+ c! C; O) f
Calling ioctl() to re-read partition table.1 F0 D; Q+ {) {5 t. t, ?1 S( O
正在同步磁盘。7 B  |1 f. z: M8 l3 ?, @  R: Q( _

/ T4 P, M1 C1 d( l$ ]5 r7 x[root@cephL ceph-deploy]# lsblk
" d8 A  Z3 V' h6 t" C* h0 o  dNAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
) \( w# j/ A  _$ q* vsda               8:0    0   40G  0 disk 0 N* r) r9 @4 ~0 a' }9 E6 n
├─sda1            8:1    0    1G  0 part /boot0 g  x  M& |) {5 a
└─sda2            8:2    0   39G  0 part
" [' m. R, t3 h7 A2 T  ├─centos-root 253:0    0   36G  0 lvm  /
: l( i- ?8 \, ?8 `. K; N6 b  └─centos-swap 253:1    0    3G  0 lvm  [SWAP]
0 D. Q7 s! X( u4 ^( D/ Msdb               8:16   0   30G  0 disk 6 a2 a& A+ @, ^8 Q5 U- b
└─sdb1            8:17   0   30G  0 part . e) w2 T& z0 K" A* c# I0 g) s
sdc               8:32   0   30G  0 disk $ H* }( l& O* }0 D& G" u+ }
└─sdc1            8:33   0   30G  0 part
: K' r' W. c2 i8 |sr0              11:0    1 1024M  0 rom  9 _* w8 x, |' S3 D2 O, Z+ w

. q9 I/ B1 G7 n( o% L; Q[root@cephL ceph-deploy]# ceph-deploy osd create --filestore --fs-type xfs --data /dev/sdb1 --journal /dev/sdc1 cephL
9 |, p8 z% v0 z9 D; k, d, ][ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
7 ]/ \6 }3 W% Z9 [[ceph_deploy.cli][INFO  ] Invoked (2.0.0): /usr/bin/ceph-deploy osd create --filestore --fs-type xfs --data /dev/sdb1 --journal /dev/sdc1 cephL
2 n% }: X1 X4 I2 L1 ]/ K0 t$ X$ O[ceph_deploy.cli][INFO  ] ceph-deploy options:, ]# m: ]6 v6 ?$ H3 g) m
[ceph_deploy.cli][INFO  ]  verbose                       : False
5 D3 O* b1 B1 y/ t+ O[ceph_deploy.cli][INFO  ]  bluestore                     : None9 {1 z; h5 [: C& S, j1 N9 r" Q1 O8 w
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x22c7320>5 \* T! d' T( l: u
[ceph_deploy.cli][INFO  ]  cluster                       : ceph6 f8 f5 I: T4 q& R4 j0 N
[ceph_deploy.cli][INFO  ]  fs_type                       : xfs" S( l6 X8 y& h4 p% m1 k: E
[ceph_deploy.cli][INFO  ]  block_wal                     : None
: U. [5 T# `$ n# d[ceph_deploy.cli][INFO  ]  default_release               : False
0 i- f, Q3 }& q% J8 o  K! s[ceph_deploy.cli][INFO  ]  username                      : None" t+ g7 g$ h$ O4 O! p, F0 _; V
[ceph_deploy.cli][INFO  ]  journal                       : /dev/sdc1$ X' H7 ]1 Y! b# g, K( \
[ceph_deploy.cli][INFO  ]  subcommand                    : create( w- Y& d; ]9 g  Y4 t' E( c
[ceph_deploy.cli][INFO  ]  host                          : cephL; j' P( L3 Z7 v* M( A8 U7 S. p
[ceph_deploy.cli][INFO  ]  filestore                     : True  B/ G1 E8 t* H$ {+ U& N$ [; a
[ceph_deploy.cli][INFO  ]  func                          : <function osd at 0x225ae60>6 y: t: L9 z1 V( O1 G
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None4 G/ v) [; p) l4 S! V
[ceph_deploy.cli][INFO  ]  zap_disk                      : False
3 Q0 m  n2 \/ d' ?[ceph_deploy.cli][INFO  ]  data                          : /dev/sdb1
, z; j# v9 @9 @5 ~5 F2 V[ceph_deploy.cli][INFO  ]  block_db                      : None
3 L% y9 ~) |/ \  @[ceph_deploy.cli][INFO  ]  dmcrypt                       : False- F9 f8 {; b. r2 M3 i
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
' H7 p* ^8 s: H: r4 G( O2 Z5 M[ceph_deploy.cli][INFO  ]  dmcrypt_key_dir               : /etc/ceph/dmcrypt-keys
  H4 b0 s7 z9 t[ceph_deploy.cli][INFO  ]  quiet                         : False" t' |7 }4 l% H6 J0 u
[ceph_deploy.cli][INFO  ]  debug                         : False
- @/ I0 g; k* E! c/ D: I[ceph_deploy.osd][DEBUG ] Creating OSD on cluster ceph with data device /dev/sdb14 k4 e; c, x. X0 V
[cephL][DEBUG ] connected to host: cephL 2 }4 y7 |& m& I
[cephL][DEBUG ] detect platform information from remote host  q8 d# ~) I, p, b
[cephL][DEBUG ] detect machine type- F( e3 m; J: y# a' p% o  h. B' P7 u
[cephL][DEBUG ] find the location of an executable
+ f: y- S$ `. d. l+ ^[ceph_deploy.osd][INFO  ] Distro info: CentOS Linux 7.4.1708 Core
4 a2 Z  r! S" M" y. m6 G. [1 Y( d3 i[ceph_deploy.osd][DEBUG ] Deploying osd to cephL1 M/ n0 P! x: m( ^/ x
[cephL][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf+ C( }- |8 x2 J' k. B. I. H0 ]
[cephL][DEBUG ] find the location of an executable
' i1 _! j9 Y9 l: ~[cephL][INFO  ] Running command: /usr/sbin/ceph-volume --cluster ceph lvm create --filestore --data /dev/sdb1 --journal /dev/sdc1; ^5 U7 O) U8 a: q7 ~8 @4 \
[cephL][DEBUG ] Running command: /bin/ceph-authtool --gen-print-key. {  q/ `5 g9 h5 u
[cephL][DEBUG ] Running command: /bin/ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring -i - osd new 8b7be4a6-b563-434e-b030-132880a10d31" t7 N8 @0 g" z- C: M9 u2 e9 R
[cephL][DEBUG ] Running command: vgcreate --force --yes ceph-8e2515c1-6170-4299-b82c-a5a47681f946 /dev/sdb1
; W$ \7 h( P5 I/ w) ][cephL][DEBUG ]  stdout: Physical volume "/dev/sdb1" successfully created.$ J. t: S& U$ [$ o6 L8 L
[cephL][DEBUG ]  stdout: Volume group "ceph-8e2515c1-6170-4299-b82c-a5a47681f946" successfully created( p8 U. Y, L' E% c, r1 o
[cephL][DEBUG ] Running command: lvcreate --yes -l 100%FREE -n osd-data-8b7be4a6-b563-434e-b030-132880a10d31 ceph-8e2515c1-6170-4299-b82c-a5a47681f946, ]7 e" u: g# D. h4 a8 }
[cephL][DEBUG ]  stdout: Logical volume "osd-data-8b7be4a6-b563-434e-b030-132880a10d31" created.* T1 i; P' U9 j- a$ g: K8 O# a& h
[cephL][DEBUG ] Running command: /bin/ceph-authtool --gen-print-key7 z2 ?3 G! w9 H
[cephL][DEBUG ] Running command: mkfs -t xfs -f -i size=2048 /dev/ceph-8e2515c1-6170-4299-b82c-a5a47681f946/osd-data-8b7be4a6-b563-434e-b030-132880a10d31
! }" r/ \) k3 o! S[cephL][DEBUG ]  stdout: meta-data=/dev/ceph-8e2515c1-6170-4299-b82c-a5a47681f946/osd-data-8b7be4a6-b563-434e-b030-132880a10d31 isize=2048   agcount=4, agsize=1965824 blks
- L% H4 T7 a5 ^) _8 G) c  `[cephL][DEBUG ]          =                       sectsz=512   attr=2, projid32bit=1
" {5 E+ o% `$ m# |[cephL][DEBUG ]          =                       crc=1        finobt=0, sparse=0% a) m/ d8 Y- p* n3 F
[cephL][DEBUG ] data     =                       bsize=4096   blocks=7863296, imaxpct=251 A! U& ]( }: }+ m! a- x" `9 \9 Z
[cephL][DEBUG ]          =                       sunit=0      swidth=0 blks  V9 t3 R3 I& U* c- S; d
[cephL][DEBUG ] naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
7 ]1 }: M$ a" v, c" N4 N, {' o  X[cephL][DEBUG ] log      =internal log           bsize=4096   blocks=3839, version=28 p! f) p3 @8 N$ @& t
[cephL][DEBUG ]          =                       sectsz=512   sunit=0 blks, lazy-count=1
+ i  Q- r9 |& k8 u: p" n[cephL][DEBUG ] realtime =none                   extsz=4096   blocks=0, rtextents=0
; ]$ r6 E; x: W[cephL][DEBUG ] Running command: mount -t xfs -o rw,noatime,inode64 /dev/ceph-8e2515c1-6170-4299-b82c-a5a47681f946/osd-data-8b7be4a6-b563-434e-b030-132880a10d31 /var/lib/ceph/osd/ceph-0" u" {4 }" G0 d* V! l
[cephL][DEBUG ] Running command: chown -R ceph:ceph /dev/sdc1. F1 i% Z$ C) e: F) G9 B1 h
[cephL][DEBUG ] Running command: ln -s /dev/sdc1 /var/lib/ceph/osd/ceph-0/journal0 f8 }6 R( S/ }) W8 A
[cephL][DEBUG ] Running command: ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring mon getmap -o /var/lib/ceph/osd/ceph-0/activate.monmap. w6 f% ^/ H/ O, Y
[cephL][DEBUG ]  stderr: got monmap epoch 1
; [1 R6 |) D- h* b# j2 U[cephL][DEBUG ] Running command: chown -R ceph:ceph /dev/sdc12 M  {+ B" J$ {. q! V
[cephL][DEBUG ] Running command: chown -R ceph:ceph /var/lib/ceph/osd/ceph-0/3 s) _7 d+ J! ^0 d  L% {! I7 {
[cephL][DEBUG ] Running command: ceph-osd --cluster ceph --osd-objectstore filestore --mkfs -i 0 --monmap /var/lib/ceph/osd/ceph-0/activate.monmap --osd-data /var/lib/ceph/osd/ceph-0/ --osd-journal /var/lib/ceph/osd/ceph-0/journal --osd-uuid 8b7be4a6-b563-434e-b030-132880a10d31 --setuser ceph --setgroup ceph  A2 U; P( F) {) T0 u1 @' m, I0 ]5 |
[cephL][DEBUG ]  stderr: 2018-05-07 23:01:34.834993 7f315e466d00 -1 journal check: ondisk fsid 00000000-0000-0000-0000-000000000000 doesn't match expected 8b7be4a6-b563-434e-b030-132880a10d31, invalid (someone else's?) journal
' k. o* s; X; Q6 {" s2 h/ n[cephL][DEBUG ]  stderr: 2018-05-07 23:01:34.865621 7f315e466d00 -1 journal do_read_entry(4096): bad header magic
0 v, I2 F! o1 ?' H7 e; b* l% m[cephL][DEBUG ] 2018-05-07 23:01:34.865667 7f315e466d00 -1 journal do_read_entry(4096): bad header magic
7 A, n% z* e1 }2 Z8 d[cephL][DEBUG ] 2018-05-07 23:01:34.865988 7f315e466d00 -1 read_settings error reading settings: (2) No such file or directory7 L* O5 w8 T: }
[cephL][DEBUG ]  stderr: 2018-05-07 23:01:34.916284 7f315e466d00 -1 created object store /var/lib/ceph/osd/ceph-0/ for osd.0 fsid 39f3b85e-ee3c-4d8d-93c2-7f7c8aa47121
/ g9 v6 L, Q# x# ^# T/ x/ S[cephL][DEBUG ] Running command: ceph-authtool /var/lib/ceph/osd/ceph-0/keyring --create-keyring --name osd.0 --add-key AQBDavBa0IPpIBAAlQxlaWxNrnTX/uaOMdZEQw==
! ^; z8 d0 P% @2 I+ d% j; w$ K[cephL][DEBUG ]  stdout: creating /var/lib/ceph/osd/ceph-0/keyring
# B. a) _8 f% H; v[cephL][DEBUG ] added entity osd.0 auth auth(auid = 18446744073709551615 key=AQBDavBa0IPpIBAAlQxlaWxNrnTX/uaOMdZEQw== with 0 caps)
, J8 M, l$ i, I' k$ J6 a7 |5 D6 J" K0 n/ U[cephL][DEBUG ] Running command: chown -R ceph:ceph /var/lib/ceph/osd/ceph-0/keyring+ Y& ]+ ^; K& ]: b
[cephL][DEBUG ] --> ceph-volume lvm prepare successful for: /dev/sdb1
2 x$ D+ I& S1 f7 I' p, M; C[cephL][DEBUG ] Running command: ln -snf /dev/sdc1 /var/lib/ceph/osd/ceph-0/journal7 ~# f: U6 ^) q+ x; S0 n
[cephL][DEBUG ] Running command: chown -R ceph:ceph /dev/sdc1
: e- l# k# b5 S. ^) {4 L[cephL][DEBUG ] Running command: systemctl enable ceph-volume@lvm-0-8b7be4a6-b563-434e-b030-132880a10d310 s8 [3 X/ p, X0 W! x, ]6 N
[cephL][DEBUG ]  stderr: Created symlink from /etc/systemd/system/multi-user.target.wants/ceph-volume@lvm-0-8b7be4a6-b563-434e-b030-132880a10d31.service to /usr/lib/systemd/system/ceph-volume@.service.
" |9 c$ p+ \3 ], x( ^5 T( L[cephL][DEBUG ] Running command: systemctl start ceph-osd@0
5 J3 s8 R. ?! V6 r8 I[cephL][DEBUG ] --> ceph-volume lvm activate successful for osd ID: 0
5 R- C) T3 o  M3 l[cephL][DEBUG ] --> ceph-volume lvm create successful for: /dev/sdb13 a( d6 T6 [0 }: t  X9 l
[cephL][INFO  ] checking OSD status...' |( @8 N0 w$ h* O
[cephL][DEBUG ] find the location of an executable# P' U' i: q$ x6 A$ E
[cephL][INFO  ] Running command: /bin/ceph --cluster=ceph osd stat --format=json
- q: J( m9 I$ d: e8 w- C[ceph_deploy.osd][DEBUG ] Host cephL is now ready for osd use.
9 m/ V6 B5 [. A; C8 G' J% f

' E6 T. a9 U' ^7 d0 S移除OSD
1
" e6 e) C; O6 |: A  Q2  }, T+ m6 j3 U- p8 u
3
* p$ D2 ~' `! {, Y2 I+ R4 ~4
' F# }. M, }0 f2 G1 g  e! h5) }3 u6 m! I9 `
63 {' ]. L; _  S, Z  E
75 u% I. P  @* z6 |8 |% q
8
& y# D+ O7 x7 U3 U' X9) _. _7 s% T) R; s
101 R- X9 w9 \7 g4 z" [& I" w7 ]. ~
11
1 a4 m' ?1 P  Y# _12
( i% A. k7 t# s! Q
# 使OSD进入out状态
  d6 D9 }% d: b5 ^[root@cephL ceph-deploy]# ceph osd out 0. R: |8 T1 ~2 G* G9 y
marked out osd.0.0 U6 Q6 x9 ?% X* b# L' H# z+ c# W
# 观察数据迁移* z9 a: j  f2 l; J) j1 W+ G
[root@cephL ceph-deploy]# ceph -w
4 [- |$ a/ c9 @  H4 \# 停止对应的OSD进程6 D3 W! i; W: }/ ?1 x. h  f
[root@cephL ceph-deploy]# sudo systemctl stop ceph-osd@0& Y, t+ I0 |, Q$ H
# 清除数据
, ]: t, z, }) ]( }3 E[root@cephL ceph-deploy]# ceph osd purge 0 --yes-i-really-mean-it
6 B# ~3 Y3 h; m4 r' Spurged osd.0' J# [# ?+ Z& ^- I3 Y8 g. w7 S
# 在ceph.conf中移除osd配置
; e2 w# T; T; h[root@cephL ceph-deploy]# vi /etc/ceph/ceph.conf * C% h. @" x! B( V2 o8 }
4 O; T2 _7 g! T; V' s& F+ _
部署CEPH-MGR
18 T. r8 t3 p+ E# L0 S! v
2
2 ?6 r% Y7 |  I" S6 e% R3 e& v3
* s* j: {) T6 K3 R7 {4
9 w. k1 L& \- Q5( O  E) y2 l5 T% ?
60 o! e) Y% n$ K( z* q2 j
7
; W5 ~4 `9 Z! x# u1 |5 a89 ^9 [: q9 i5 [% P. a8 ^% }
9
- w) l% X: X2 M% z: t* j" Y8 B4 \: M10- [1 y4 Y# }/ D* X8 r: o
install netstat tool
- K/ e& L9 n- ?6 g( v& V- Z[root@cephL ~]# yum -y install net-tools! Y/ E+ ~; V  p! A* U
: t! p2 E+ {; ]+ {+ Y" v
[root@cephL ceph-deploy]# ceph-deploy mgr create cephL:cephLMGR
8 b. v! d- g( n3 d, B: x5 X! `ceph        1111       1  0 12:57 ?        00:00:08 /usr/bin/ceph-mgr -f --cluster ceph --id cephLMGR --setuser ceph --setgroup ceph1 z* B0 K* S- o) t) V: y! O2 {
[root@cephL ceph-deploy]# ceph mgr module enable dashboard- y! d: k. {( T. O* x# o: Z

. P; X  T' J4 O7 P- Copen 7000 port
! V3 ]' @  j# Y8 q; x[root@cephL ceph-deploy]# sudo firewall-cmd --zone=public --add-port=7000/tcp --permanent
0 l1 z5 T" G1 a2 L' [[root@cephL ceph-deploy]# sudo firewall-cmd --reload4 m: ]9 F8 b5 ~; k' J( k0 L  |

( U8 _; v5 @7 `& X
相关命令
1
9 t2 [' P: a/ ]2* b# Z. }5 P" t1 _" ]+ q
3; R! u/ h# g: _7 }" ?: T
[root@cephL ceph-deploy]# ceph mgr module ls
& l5 e1 A! f( T3 J# g( H* b[root@cephL ceph-deploy]# ceph mgr services
6 X! w, A2 k, w* d1 z[root@cephL ceph-deploy]# ceph tell mgr help
2 @6 m! ?. `0 d) V
4 y. p% m+ ]& z* C$ H
部署MDS并创建CEPH FS
1  ~& C: V: |" E" ]  x. @" n
2
( E2 x# H8 W5 ~. Z! \
[root@cephL ceph-deploy]# ceph-deploy mds create cephL
4 M$ |5 o4 {! g$ B; [  p1 Xceph        2150       1  0 13:00 ?        00:00:00 /usr/bin/ceph-mds -f --cluster ceph --id cephL --setuser ceph --setgroup ceph
) V' s( [! g3 E
7 x3 v  ^  i3 G- x+ M
Ceph文件系统至少需要两个RADOS pool,一个用于存储数据,一个用于存储元数据。
配置这些pool时,可以考虑:
​ 对元数据pool使用更多的replication数量,因为该pool中的任何数据丢失都可能导致整个文件系统无法访问。
​ 为元数据pool使用SSD等较低延迟的存储设备,因为这将直接影响客户端上文件系统操作的延迟。
1( L! F, r7 Y, z% ^* W
2
( y+ C. Y! L7 c$ e" R/ ^% T. O3# A2 z) O7 o) s" ~
4
# l4 U( k2 L3 S3 M56 l6 y  ?% w+ j* Q; |6 @3 ^
ceph osd pool create cephfs_data <pg_num>
8 J1 X8 W: j7 d8 R( c+ Qceph osd pool create cephfs_metadata <pg_num>: E  l0 v' X' N% i$ Z1 L* p
例如:5 ~% Y8 V6 f# H* \$ d; V. q
[root@cephL ceph-deploy]# ceph osd pool create cephfs_data 32
& I& ]6 W6 P, y- Z# F7 m. k[root@cephL ceph-deploy]# ceph osd pool create cephfs_metadata 32
# G$ W6 }4 A' v/ l# {) j5 v
' H% M  l5 I5 g' o4 k
更改pool的副本数
1
4 D) _1 L7 s. A2
; F( r( I8 h5 H0 P: R7 u  g3
% J: Z; H* @4 R; U% m& Y) O: n4
. H7 ?8 K* ?, M
ceph osd pool set {poolname} size {num-replicas}0 ]- H# [  l3 L% ]+ I7 n5 i
例如:% W, Q! M% v3 e! {* W) @
[root@cephL ceph-deploy]# ceph osd pool set cephfs_data size 1
. J6 X5 n, H1 q7 A2 Q8 H[root@cephL ceph-deploy]# ceph osd pool set cephfs_data size 1" S3 @) W% t; i" M; z
* G6 d, p! l* D0 E/ h
一旦创建了pool,就可以使用fs new命令启用文件系统:
1; l3 x5 k4 c# ~, ?4 N
2# @  Y/ a& j3 g3 Z
3
' S  b0 ?  v! g/ b% [
ceph fs new <fs_name> <metadata> <data>2 ]# q1 U4 k5 j  W( _
例如:
% S3 G* ~  {7 @6 c4 P; Fceph fs new cephFS cephfs_metadata cephfs_data8 b- t, }2 x% I8 L  ?

6 N3 a; J6 U3 M& S) v) P
一旦创建了文件系统,您的MDS将能够进入active状态。例如,在single MDS system中:
1& W& ?7 g: z4 z$ \- p0 ?" H5 k" _
2' F' [) N( E( z) o- u$ Q
[root@cephL ceph-deploy]# ceph mds stat
/ w% O/ ~4 n8 h. fcephFS-1/1/1 up  {0=cephL=up:active}
& r. |" t+ `% C6 E: f' N
- {: C, H6 W( f6 C" D
一旦创建了文件系统并且MDS处于active状态,你就可以挂载文件系统了。如果您创建了多个文件系统,在挂载文件系统时,选择使用哪一个。
如果创建了多个文件系统,并且client在挂载时没有指定挂载哪个文件系统,你可以使用ceph fs set-default命令来设置client默认看到的文件系统。
挂载CEPH FS ( File System ) 有两种方式:
KERNEL DRIVER
要挂载Ceph文件系统,您可以在知道monitor主机IP地址的情况下使用mount命令,或使用mount.ceph utility将monitor主机名解析为IP地址。例如:
1
7 ~6 m2 C' p8 s' ]+ t2
( M+ w* X1 I# l3
/ Y4 t6 @2 x/ j, a9 ^2 [4
3 C7 v/ \* I, M; H' d$ f5
' |5 [! Q# c9 e/ g5 s# M6 f6
5 f; E: ^9 ]5 w5 z: {" |: _7/ G9 P$ r  V7 y! P" l* c
sudo mkdir /mnt/mycephfs4 {$ u9 o: U) v8 k6 B9 O
sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs
* d4 A1 i% e- x/ [, X' ^0 H例如:
0 C. h9 r2 Z8 i- \4 t' b( W+ }[root@cephL ceph-deploy]# sudo mount -t ceph 192.168.56.101:6789:/ /mnt/mycephfs# a6 ~) {* r! ?9 E" `
mount error 22 = Invalid argument0 N5 q4 l4 i4 J. [% u3 n# a9 C
Ceph 10.x (Jewel)版本开始,如果使用kernel方式(无论是krbd还是cephFS)官方推荐至少使用4.x的kernel。0 \2 a8 M  e) ]% k" k
如果无法升级linux kernel,那么映射rbd请使用librbd方式,cephFS请使用fuse方式。  p) o' E8 E, X
2 Z$ C/ A) t9 r% ]  S! z/ q: y
如果挂载Ceph文件系统时开启了cephx authentication,您必须指定user和secret。
1' o% b3 z9 H7 h
sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs -o name=admin,secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==9 R* T# w0 S7 m. s0 i& ?
1 [' F+ V7 O+ {
上述用法在Bash history中留下了secret。更安全的方法是从文件中读取secret。 例如:
1
7 H) U$ r% k/ G: R) N# Q. {
sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs -o name=admin,secretfile=/etc/ceph/admin.secret6 V2 c$ M7 @! j$ |1 a
: l7 z; z9 j$ B$ O
如果您有多个文件系统,请使用mds_namespace选项指定要挂载的文件系统,例如-o mds_namespace=myfs
要卸载Ceph文件系统,可以使用umount命令。 例如:
1% u* L. f9 s8 B* K5 f
2; c8 v. T3 B+ i" V, t- [
sudo umount /mnt/mycephfs1 W8 }7 ~0 O# d# {
提示:在执行此命令之前,请确保您不在挂载的目录中。
/ {& G  x9 D, I

7 G6 f! J) Z) R+ t' C+ U2 S% _8 W
FUSE
在用户空间(FUSE)中挂载Ceph文件系统之前,请确保客户端主机具有Ceph配置文件的副本以及Ceph元数据服务器的CAPS keyring。
在您的客户端主机上,将Ceph配置文件从monitor主机复制到/etc/ceph目录。
1
! ~; m% K! D* z  |: P) U) t2' t7 \- s, E. ~" Y$ B
sudo mkdir -p /etc/ceph
1 U; m+ V5 ^3 x5 F9 u0 I( N, Usudo scp {user}@{server-machine}:/etc/ceph/ceph.conf /etc/ceph/ceph.conf" Y; B- O2 \" ?: ]& {

/ S/ Z, T: d8 b; }
在您的客户端主机上,将monitor主机的Ceph keyring复制到/etc/ceph目录。
1+ N  H6 X' m; [  [, m" `; d
sudo scp {user}@{server-machine}:/etc/ceph/ceph.keyring /etc/ceph/ceph.keyring
( t, U1 o, g# C) K6 {4 x  ^$ w, }- a

: i7 h% ^/ {) q% N' X0 Y
确保Ceph配置文件和keyring在您的客户端机器上设置了适当的权限(例如,chmod 644)。
要将Ceph文件系统挂在为FUSE,可以使用ceph-fuse命令。 例如:
1
. F$ W  s! T0 n9 T2
5 b% |. n) p, m2 S/ A
sudo mkdir /home/usernname/cephfs) E7 u2 v$ f; Y( J. E! P
sudo ceph-fuse -m 192.168.0.1:6789 /home/username/cephfs) T8 e7 S0 _/ {% [3 K" |- v  C
% b) [; s2 e# f( [8 G
如果您拥有多个文件系统,请使用 –client_mds_namespace 命令行参数指定要挂载哪一个文件系统,或者向ceph.conf中添加client_mds_namespace设置。
要自动挂载ceph-fuse,您可以在system fstab中添加一个条目。此外还可以使用ceph-fuse@.service和ceph-fuse.target systemd units。通常这些unit文件为ceph-fuse描述默认的dependencies和推荐的execution context。例如使用ceph-fuse挂载到/mnt:
1
! B5 ?# V# \' t/ o' W6 q/ C  t
sudo systemctl start ceph-fuse@/mnt.service! l! [$ d, x- {3 M' \0 G
  q  A9 y/ q2 ?5 w
持久化挂载点可通过以下方式进行设置:
1
! R+ U; S/ j7 M' u3 a; W
sudo systemctl enable ceph-fuse@/mnt.service
+ z9 k) F1 u8 S# K
, K: F. w: M" L9 @. Z0 c& ?, q/ }" |
部署RGW
Ceph Object Gateway原来叫RADOS Gateway,它是构建在librados之上的对象存储接口,为应用程序提供了一个RESTful gateway,用户可以通过HTTP协议访问Ceph存储集群。
Ceph Object Storage支持两个接口:
  • S3-compatible:与Amazon S3 RESTful API中一些子集兼容的接口,提供对象存储功能。
  • Swift-compatible:与OpenStack Swift API中一些子集兼容的接口,提供对象存储功能。
    / g9 n/ B0 ]4 E1 Y" c# F. e) W2 J
Ceph Object Storage使用Ceph Object Gateway daemon (radosgw),它是一个HTTP server,用于与Ceph存储集群进行交互。由于它提供了与OpenStack Swift和Amazon S3兼容的接口,因此Ceph Object Gateway具有自己的用户管理。Ceph Object Gateway可以将数据存储在与Ceph Filesystem和Ceph Block Device相同的Ceph存储集群中。但是我相信在生产环境中不会这么做,如果数据量大的话会影响Ceph Filesystem和Ceph Block Device的性能,个人一般会独立出一个Ceph Object Gateway集群。S3和Swift API共享一个通用的namespace,因此您可以使用一个API编写数据并使用另一个API检索它。
1# n4 Q: \. Y& H7 V! Y- G5 h
Note:Ceph Object Storage 不使用 Ceph Metadata Server, J/ ]( I, ~1 _; q0 F3 E/ ^

+ Q1 n7 x/ j* G
1
  n/ c# v  s3 z- C2) W8 q& y7 [4 o- F2 s; t
35 u9 V3 q0 I: {% f
4
5 m, E+ q. V" o6 {5
7 Y4 e2 L6 G6 N* d& R: d1 j6
  C( M2 U- L7 e% }* o7+ \% g- E+ K2 J1 n
8" K. l8 E  K: S
9
7 B6 E5 U2 J1 P; H$ d  I/ Q. {4 \' {10
& Y1 B' l* e+ v2 H11
$ q% k: H! a. t$ Z0 m12
8 ]1 |0 p- `: s* a- c13
' f* `5 K3 u: f: c8 Z4 g14
+ A$ C; T9 @/ O, V158 X) z) X; |: t$ m( @: N" F
16- X! L6 @' S" Q7 D
17
9 {  r* |% l, M18
& h# i" k3 P3 \% h9 N; L19" L; F- ^' y& \3 h* e* d
20
$ U+ U$ |: r% m21
/ L3 I, \7 x( S: N7 y22
/ l. U( n9 o5 h9 O1 I3 C2 t2 r232 F0 x0 {' W5 j; P4 C
24, X1 S' u2 w& m1 @1 a/ Q4 H. C1 D
# 必须部署MGR,才能部署RGW
' @7 b# y1 p; u( E+ l- l. _  ?* e" X
[root@cephL ceph-deploy]# ceph-deploy rgw create cephL:RGW8 e/ Y$ G0 j& x% N% f
root        2799       1  0 13:13 ?        00:00:00 /usr/bin/radosgw -f --cluster ceph --name client.rgw.RGW --setuser ceph --setgroup ceph
% q! ^% v2 {# P% Z% D
) P7 W9 v& P) @# 重启RGW: p1 Z3 t- ?" _; V( H, a- ?
[root@cephL ~]# systemctl restart ceph-radosgw@rgw.cephL.service
# x! I( f% i; ~[root@cephL ~]# systemctl restart ceph-radosgw@rgw
5 n# `: h4 N$ [6 `: \  w1 E" B6 [# I; \) _
问题一,这难道是ceph-deploy 2.0.0的坑?4 H1 Y7 |+ G! |6 }' S, ]
[root@cephL ~]# tailf /var/log/ceph/ceph-client.rgw.log
) k. d0 N/ Q5 D$ R/ f% Q$ ~; {2018-05-11 22:30:31.999421 7f537c31fe00  0 ceph version 12.2.4 (52085d5249a80c5f5121a76d6288429f35e4e77b) luminous (stable), process (unknown), pid 3450- d6 }  N+ w' C/ X
2018-05-11 22:30:32.021546 7f537c31fe00 -1 auth: unable to find a keyring on /var/lib/ceph/radosgw/ceph-rgw/keyring: (2) No such file or directory
/ O1 A4 p3 l& R- j. v' Q9 f0 I- w2018-05-11 22:30:32.021561 7f537c31fe00 -1 monclient: ERROR: missing keyring, cannot use cephx for authentication  l, u6 [* b8 K  k4 i% o1 F$ ]
2018-05-11 22:30:32.021563 7f537c31fe00  0 librados: client.rgw initialization error (2) No such file or directory- D, E! @( m: t4 {$ u
2018-05-11 22:30:32.022900 7f537c31fe00 -1 Couldn't init storage provider (RADOS)
  E+ i4 I. A" F" v) ^
$ G7 @: R# w( N: H[root@cephL radosgw]# pwd* U' W  U$ E' u9 s- `
/var/lib/ceph/radosgw& _1 u0 m. a  A# `2 J# d, z7 D0 m
[root@cephL radosgw]# ls
, l% v9 Y# d% b. o. oceph-rgw.RGW
+ }5 a! s) E$ V: S( w[root@cephL radosgw]# mv ceph-rgw.RGW  ceph-rgw * V, w* S" c" l6 K

5 D& Z, h: B# L" }& T  ~# b: l# }! @6 g: @* U+ Y/ @5 |# d) ^0 @

7 t- `( d$ I  k. c# _配置变动
在L版中,删除pool的操作做了强制限制。需要在/etc/ceph/ceph.conf中加入相关参数才允许删除pool。
1, ?3 b0 _* \* I  M4 b+ u8 j) e
2
: d; s, q9 J; k4 ?3 O
# 允许删除pool,需要添加% D/ E4 @" u3 r7 C4 Q4 Z$ d
mon allow pool delete = true
6 m, B: g/ ]* W9 P( _. |1 H
# T$ ]! g3 o$ p$ n" C

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-12-8 15:42:50 | 显示全部楼层
实践步骤) I9 H1 t1 C* T' G& u1 G1 I4 r
获取代码并安装3 U& D" D7 l" ^
git clone https://github.com/ceph/ceph.git" f4 A: _, ~: s
cd ceph
& J6 n8 V; n7 s# v7 j! M2 [git submodule update --init --recursive; S: F5 k8 W) F  e+ P
./make-dist# `: m1 a( e; }
rpm -bb ceph.spec) l0 e2 Q' M0 ]+ ^3 X; R1 c
生成rpm安装包后进行安装,这个过程就不讲太多,根据各种文档安装上最新的版本即可,这个代码合进去时间并不久,大概是上个月才合进去的
7 q( i1 A% [- |8 X, p! r0 N- j$ y
配置集群
% X) b; ]3 `+ y$ r首先配置一个filestore的集群,这个也是很简单的,我的环境配置一个单主机三个OSD的集群

9 F) P9 Y' j$ `0 @% K, @[root@lab8106 ceph]# ceph -s4 B; H" X, o/ P0 a$ B
    cluster 3daaf51a-eeba-43a6-9f58-c26c5796f928+ Q* w* M: _) s* t
     health HEALTH_WARN
0 ^# V' D9 H  x: E& n            mon.lab8106 low disk space
6 `" s0 o- o1 s' R$ e     monmap e2: 1 mons at {lab8106=192.168.8.106:6789/0}  p; C  }( m  l7 P6 @0 {4 V& e1 o
            election epoch 4, quorum 0 lab8106
/ W% L( A! i3 v' o        mgr active: lab8106 1 k2 F/ s; I* k' W, {5 d! W
     osdmap e16: 3 osds: 3 up, 3 in% @0 k+ F6 ~* Q3 W8 ]6 U
      pgmap v34: 64 pgs, 1 pools, 0 bytes data, 0 objects4 v. f' [6 {* I: N  ]4 l; z7 W
            323 MB used, 822 GB / 822 GB avail8 f. o5 ^% V8 u% B* V
                  64 active+clean6 M& D0 C; |# m' E) U* Y9 t
[root@lab8106 ceph]# ceph osd tree0 w3 E! H8 Z) C  O8 |! J* o9 a+ W
ID WEIGHT  TYPE NAME        UP/DOWN REWEIGHT PRIMARY-AFFINITY 4 {, H+ l  Z$ f: A6 }; G9 R& v
-1 0.80338 root default                                       
- G+ h( n0 l7 s: @# r# s-2 0.80338     host lab8106                                   
1 f( z: T! d9 ?6 | 0 0.26779         osd.0         up  1.00000          1.00000 7 m- l7 ~' i: W
1 0.26779         osd.1         up  1.00000          1.00000
7 Z1 I  z) U1 S3 c$ V 2 0.26779         osd.2         up  1.00000          1.00000
8 Z" e7 x3 k& I' a$ E% A- B写入少量数据- Z5 f& l& h* y% i2 K2 l
[root@lab8106 ~]# rados -p rbd bench 10 write --no-cleanup
! K" Y2 ]$ z. @4 |) X! D  y! C7 U设置noout7 e) d8 Q3 a  Q* P; J
[root@lab8106 ~]# ceph osd set noout
' k8 E' F) F# y- Q0 Cnoout is set( }% J* b9 {$ p1 g8 z
停止OSD.0
8 h2 J/ f* R' A8 L[root@lab8106 ~]# systemctl stop ceph-osd@0
$ U* o0 a, B5 p3 s4 m/ l[root@lab8106 ~]# ceph osd down 0  d, L8 @) Y2 _# X( f' d
osd.0 is already down.
3 M) ?' [5 `9 U将数据换个目录挂载,换个新盘挂载到原路径
7 d6 k; G+ J0 v( U; |; Q
[root@lab8106 ~]# mkdir /var/lib/ceph/osd/ceph-0.old/6 P% D: H4 }7 f3 e
[root@lab8106 ~]# umount /var/lib/ceph/osd/ceph-0' m( K9 o& s0 o8 v7 l( _( Z" n
[root@lab8106 ~]# mount /dev/sdb1 /var/lib/ceph/osd/ceph-0.old/. g8 u7 D5 v3 o( Q' J
[root@lab8106 ~]# mount /dev/sde1 /var/lib/ceph/osd/ceph-0/
( O7 U- L, j1 {: h1 M6 }- |* s: l
[root@lab8106 ~]# df -h|grep osd0 z% b8 q7 w- \% X8 h1 _
/dev/sdc1       275G  833M  274G   1% /var/lib/ceph/osd/ceph-10 I) h( ^, Y0 {: u1 H; c& h7 o
/dev/sdd1       275G  833M  274G   1% /var/lib/ceph/osd/ceph-25 }0 y( o3 s0 w( e& [* J% G2 Q
/dev/sdb1       275G  759M  274G   1% /var/lib/ceph/osd/ceph-0.old
0 f8 B- ?+ }1 |: ~/dev/sde1       280G   33M  280G   1% /var/lib/ceph/osd/ceph-0
( y. B( f+ s1 v0 @; q0 R在配置文件/etc/ceph/ceph.conf中添加

% l9 z2 f1 m' I, @$ D/ X% ]enable_experimental_unrecoverable_data_corrupting_features = bluestore
1 M+ F% r9 ~  \" }如果需要指定osd的block的路径需要写配置文件
" c  b: H2 d4 ~6 J& m
在做 ceph-objectstore-tool --type bluestore --data-path --op mkfs 这个操作之前,在配置文件的全局里面添加上7 v7 J% u7 l5 G
bluestore_block_path = /dev/sde2
+ K' l; @9 i) E1 Q8 [8 I" ], _然后再创建的时候就可以是链接到设备了,这个地方写全局变量,然后创建完了后就删除掉这项配置文件,写单独的配置文件的时候发现没读取成功,生成后应该是这样的* s' I8 ]9 Z: j; P
[root@lab8106 ceph]# ll /var/lib/ceph/osd/ceph-02 k! p' s' j4 r- G4 G, W
total 201 I" m) [2 L5 O/ F
lrwxrwxrwx 1 root root  9 May  3 17:40 block -> /dev/sde2
# I( d2 `. a' \( Y! s-rw-r--r-- 1 root root  2 May  3 17:40 bluefs  O% M( m; [/ M$ W4 N& z% \, J- U3 D
-rw-r--r-- 1 root root 37 May  3 17:40 fsid. G/ [) b+ K; @; N: l2 |" `
-rw-r--r-- 1 root root  8 May  3 17:40 kv_backend& [! B& ]: G$ r" X+ [+ k9 o
-rw-r--r-- 1 root root  4 May  3 17:40 mkfs_done
$ i% u  c$ u7 h; }1 N' C! W-rw-r--r-- 1 root root 10 May  3 17:40 type
) ?; b7 p' N: O' [4 d) [8 l. N# I; O* O如果不增加这个就是以文件形式的存在
' R' b  t2 D0 l3 o( K! J+ n! C9 ]$ o
获取osd.0的fsid
* M* y4 T: g* A9 A2 S/ J[root@lab8106 ~]# cat /var/lib/ceph/osd/ceph-0.old/fsid + p# Y) b/ n% s/ F6 I
b2f73450-5c4a-45fb-9c24-8218a5803434
/ i: g  n2 u) l9 |3 N5 Z( t创建一个bluestore的osd.0
* \$ o: q( p4 j[root@lab8106 ~]# ceph-objectstore-tool --type bluestore --data-path /var/lib/ceph/osd/ceph-0 --fsid b2f73450-5c4a-45fb-9c24-8218a5803434 --op mkfs
  N+ I( W0 a, P6 Z7 s转移数据6 ?# [) Q/ v% H8 [) {6 ~6 E
[root@lab8106 ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0.old --target-data-path /var/lib/ceph/osd/ceph-0 --op dup  s) M; K) o6 S1 l0 u2 C4 H2 u; v* H
[root@lab8106 ~]# chown -R ceph:ceph /var/lib/ceph/osd/ceph-0
+ Q6 n3 h5 {8 r- S# d! p这个操作是将之前的filestore的数据转移到新的bluestore上了

2 \( n, m( {9 A启动OSD.0; f/ F. S* ~; B+ W% u% ~$ i
[root@lab8106 osd]# systemctl restart ceph-osd@0
/ T6 ]+ R/ E7 m9 k; ^+ g检查状态

5 X/ {* B( e- F4 M% B5 t' l& e$ m[root@lab8106 osd]# ceph -s
0 |5 _/ Y( t, P( }; u5 t- E2017-05-03 17:05:13.119492 7f20a501b700 -1 WARNING: the following dangerous and experimental features are enabled: bluestore# g. |& [/ n; I1 E( ~/ t
2017-05-03 17:05:13.150181 7f20a501b700 -1 WARNING: the following dangerous and experimental features are enabled: bluestore
- C0 s3 n/ ~1 ?. T2 n    cluster 3daaf51a-eeba-43a6-9f58-c26c5796f928
( v& J% a+ S, {2 i2 n) }) b     health HEALTH_WARN
& @4 L( B: x" [1 u' j8 E6 O            noout flag(s) set
' `" t5 _+ m, P3 W            mon.lab8106 low disk space" p- m1 P' m: j! u5 d5 X3 @( c' p
     monmap e2: 1 mons at {lab8106=192.168.8.106:6789/0}
+ g0 {/ ]4 g$ I- T( l+ {2 Y            election epoch 4, quorum 0 lab8106
, U3 {9 s5 c1 S4 `- y8 F        mgr active: lab8106
$ {0 b; Z* S- ?# M% a     osdmap e25: 3 osds: 3 up, 3 in+ o% c0 S8 x. t5 P; `
            flags noout
. g! Q6 e6 ^2 L* C+ s# A' ]2 Q      pgmap v80: 64 pgs, 1 pools, 724 MB data, 182 objects
# k* e( a9 A& d: O            3431 MB used, 555 GB / 558 GB avail6 p5 i1 ^% K7 w, F" y
                  64 active+clean( W* I# U# I# n# s0 a/ L
成功转移

$ U0 s( _* `8 x* @5 L. e不同的block方式7 ~8 H" T9 }  h' `# J
[root@lab8106 ceph]# ll /var/lib/ceph/osd/ceph-0/ -al|grep block
3 V6 N; M9 x* A+ P/ b$ L! r-rw-r--r--  1 ceph ceph 10737418240 May  3 17:32 block
* m" i4 w/ R) {* `/ d: _[root@lab8106 ceph]# ll /var/lib/ceph/osd/ceph-4/ -al|grep block2 u6 c; ?; T7 v& `
lrwxrwxrwx  1 ceph ceph  58 May  3 17:16 block -> /dev/disk/by-partuuid/846e93a2-0f6d-47d4-8a90-85ab3cf4ec4e
/ \( t' |1 V# c5 e-rw-r--r--  1 ceph ceph  37 May  3 17:16 block_uuid, ?2 V" u$ [5 v' l. ^1 V
可以看到直接创建的时候的block是以链接的方式链接到一个分区的,而不改配置文件的转移的方式里面是一个文件的形式,根据需要进行选择

7 I1 J" F' \# {' h" v总结
# |9 B4 Z0 h" u2 @2 b+ d  w4 l转移 工具 的出现方便了以后从filestore到bluestore的转移,可以采取一个个osd的转移方式将整个集群进行转移,而免去了剔除osd,再添加的方式,减少了迁移量,可以一个个的离线进行操作
: M/ D& _+ Q4 \0 |
ceph的工具集越来越完整了8 a8 S8 a- z* t

+ u. X# M' F" l% T+ W$ f
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 00:01 , Processed in 0.021896 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表