Ceph學習全過程
1.安裝ceph
1.1 ceph概述
ceph monitor
客戶端從monitor進程獲取整個集群得信息,一般確保是奇數個就好,所以要確保它得高可用性。
osd進程
存儲數據得地方,osd會定期把狀態上報給monitor,monitor也會定期檢測osd。
monitor map 記錄集群得狀況
osd map 對象得副本
pg map 類似一個目錄數據放在pg,pg再把數據放到osd
crush map 數據可以存放在磁盤上面
1.2 ceph安裝
環境配置
| 主機名 | public IP | cluster IP | 數據盤 |
|---|---|---|---|
| node1 | 192.168.1.2 | 172.16.1.2 | /dev/sdb、/dev/sdc |
| node2 | 192.168.1.3 | 172.16.1.3 | /dev/sdb、/dev/sdc |
| node3 | 192.168.1.4 | 172.16.1.4 | /dev/sdb、/dev/sdc |
hosts文件
cat>>/etc/hosts<<EOF
192.168.1.2 node1
192.168.1.3 node2
192.168.1.4 node3
EOF
-
配置ssh相互免密(包括自己)
-
關閉防火牆
-
關閉selinux
-
關閉NetworkManager
很簡單不做筆記。
1.2.1 先同步時間
ntpdate ntp1.aliyun.com
1.2.2 更改yum源
cat>/etc/yum.repos.d/ceph.repo<<EOF
[ceph]
name=Ceph packages for \$basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/\$basearch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enabled=0
priority=2
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
EOF
# 裝不上,執行下yum clean all
1.2.3 安裝ceph-deploy工具
# 在任意節點安裝,只是個安裝ceph集群的工具。它會通過ssh的方式來控制節點。
yum -y install ceph-deploy python-setuptools
# 后面的操作都在這個文件目錄里面操作
mkdir my-cluster && cd my-cluster
1.2.4 創建monitor
# 將node1變為monitor
ceph-deploy new --public-network 192.168.1.0/24 --cluster-network 172.16.1.0/24 node1
--public-network # 用戶訪問ceph
--cluster-network #集群內數據同步
# 實際上是生成一個ceph.conf的配置文件。
# 里面包含了mon節點的信息和公共網絡和集群網絡。
# 這里只能設置一個mon節點,如果要添加mon節點選擇下面mon擴容add的方式來擴容。
# 官網論壇說添加多個mon節點在初始化的時候會報錯,事實也是這樣。
1.2.5 安裝ceph組件
# 如果直接使用ceph-deploy install hostname 會更改成為官方的yum源,導致安裝超時而報錯。
# 在三個高可用的節點安裝.我選擇的是node1、2、3
yum -y install ceph ceph-mon ceph-mgr ceph-radosgw ceph-mds
ceph 是核心組件在集群中要在所有的節點中安裝。
1.2.6 初始化monitor
# 初始化監控節點
ceph-deploy mon create-initial
# 實際執行了
systemctl start ceph-mon@node1
1.2.7 分發集群管理密鑰
ceph-deploy admin node1 node2 node3
# 這一步是吧生成的admin.keyring分發到其它的節點中這樣有密鑰的節點就可以通過配置文件標明的網絡信息和密鑰進行集群的管理。
1.2.8 創建管理節點
ceph-deploy mgr create node1
# 執行了這個
systemctl start ceph-mgr@node1
1.2.9 添加osd
# 添加osd
ceph-deploy osd create node1 --data /dev/sdb
ceph-deploy osd create node2 --data /dev/sdb
ceph-deploy osd create node3 --data /dev/sdb
1.2.10 查看osd
[root@node1 ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.11691 root default
-3 0.03897 host node1
0 hdd 0.01949 osd.0 up 1.00000 1.00000
-5 0.03897 host node2
1 hdd 0.01949 osd.1 up 1.00000 1.00000
-7 0.03897 host node3
2 hdd 0.01949 osd.2 up 1.00000 1.00000
ceph -s
# 正常狀態是HEALTH_OK
# 因為mon節點只有一個可能會有mon的錯誤。

2.ceph集群管理
2.1 擴展monitor節點
ceph-deploy mon add node2
# 實際執行了
systemctl start ceph-mon@node3
2.2 查看monitor選舉狀態
# 三個可以保障高可用性
mon: 3 daemons, quorum node1,node2,node3 (age 11m)
# 查看狀態
ceph quorum_status --format json-pretty
ceph mon stat
ceph mon dump
2.3 擴展mgr
ceph-deploy mgr create node3
# 實際執行了這步驟
systemctl start ceph-mgr@node2
因為其投票機制,三個能保障高可用性,只有一個是active狀態
mgr: node1(active, since 24m), standbys: node2, node3
2.4 創建資源池
ceph osd lspools
ceph osd pool create ceph-demo 64 64
2.5 查看pg
# 查看pg數量
ceph osd pool get ceph-demo pg_num
pg_num: 64
# 查看pgp數量
ceph osd pool get ceph-demo pgp_num
pgp_num: 64
2.6 設置副本數量
# 查看副本數
ceph osd pool get ceph-demo size
# 設置副本數量為2
ceph osd pool set ceph-demo size 2
3.RBD塊設備管理
3.1 創建塊設備
在pool1池中創建一個10G大小的鏡像
rbd create -p pool1 --image rbd-demo.img --size 10G
或者
rbd create pool1/rbd-demo1.img --size 5G
3.2 查看塊設備文件
# 查看塊設備文件
rbd info pool1/rbd-demo.img
或者
rbd info -p pool1 --image rbd-demo.img
rbd info pool1/rbd-demo.img
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 12217a4473f9
block_name_prefix: rbd_data.12217a4473f9
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Thu Feb 4 17:35:44 2021
access_timestamp: Thu Feb 4 17:35:44 2021
modify_timestamp: Thu Feb 4 17:35:44 2021
注意: CentOS7 內核只支持這種特性 layering
3.2 刪除鏡像
rbd rm -p pool1 rbd-demo1.img
3.3 查看資源池里面的塊設備
rbd -p pool1 ls
3.4 映射塊設備到本地
rbd map pool1/rbd-demo.img
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable pool1/rbd-demo.img object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
因為有的特性內核不支持。
根據提示執行命令
rbd feature disable pool1/rbd-demo.img object-map fast-diff deep-flatten
3.5 查看映射關系
rbd device list
3.6 查看塊設備的 對象object
block_name_prefix: rbd_data.12217a4473f9
rados -p pool1 ls |grep rbd_data.12217a4473f9
3.7 查看odject的詳細信息
rados -p pool1 stat rbd_data.12217a4473f9.00000000000008c0
pool1/rbd_data.12217a4473f9.00000000000008c0 mtime 2021-02-04 17:56:25.000000, size 16384
3.8 塊設備擴容
resize2fs 塊設備 ext4 文件系統
xfs_growfs 掛載點 xfs文件系統
3.9 設置資源池的類型
ceph osd pool application enable pool1 rbd
3.10 獲取資源池信息
ceph osd pool application get pool1
4.告警處理
告警狀態1:
2 daemons hava recently crashed (兩個守護進程墜毀了)
1.先查看墜毀的日志
ceph crash ls
2.得到crash的id,查看它的詳細信息
> ceph crash info id
3.使用命令查看進程是否存在。如果存在可能是誤報
> systemctl status ceph-mgr@node1
ceph -s
將報錯信息打包
ceph crash archive id
再次ceph -s查看,沒有報錯信息了
5.RGW對象存儲
5.1 需要安裝包
yum -y install ceph-radowgw
5.2 創建rgw進程
ceph-deploy rgw create
執行了 systemctl start ceph-radosgw@rgw.node1
# 開放端口 7480
netstat -lntup|grep 7480
5.3 訪問測試
curl node1:7580
結果
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>anonymous</ID>
<DisplayName></DisplayName>
</Owner><Buckets>
</Buckets>
</ListAllMyBucketsResult>
5.4 更改rgw的默認端口
- 在my-cluster目錄中更改配置文件
vi ceph.conf
......末尾追加......
[client.rgw.node1]
rgw_frontends = "civetweb port=80"
- 將配置文件分發到節點
ceph-deploy --overwrite-conf config push node1 node2 node3
-
重啟服務
systemctl restart ceph-radosgw.target
5.5 創建s3風格rgw的認證
radosgw-admin user create --uid ceph-s3-user --display-name "Ceph S3 User Demo"
{
"user_id": "ceph-s3-user",
"display_name": "Ceph S3 User Demo",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "ceph-s3-user",
"access_key": "J99IN8Z2GQZUGPBBHGP4",
"secret_key": "NzEBgJYkkbPHBYCSM1RG1bDWF1cO36hOvWNnqreD"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
5.6 查看方法
radosgw-admin user info --uid ceph-s3-user
5.7 訪問方法
省略
5.8 swift風格
創建用戶
radosgw-admin subuser create --uid ceph-s3-user --subuser=ceph-s3-user:swift --access=full
{
"user_id": "ceph-s3-user",
"display_name": "Ceph S3 User Demo",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [
{
"id": "ceph-s3-user:swift",
"permissions": "full-control"
}
],
"keys": [
{
"user": "ceph-s3-user",
"access_key": "J99IN8Z2GQZUGPBBHGP4",
"secret_key": "NzEBgJYkkbPHBYCSM1RG1bDWF1cO36hOvWNnqreD"
}
],
"swift_keys": [
{
"user": "ceph-s3-user:swift",
"secret_key": "NoOKd6rqIcL0266zlYqJwko2tM21g7pT9BR50HoZ"
}
],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
###########################################
radosgw-admin subuser create --uid ceph-s3-user --subuser=ceph-s3-user:swift --key-type=swift --gen-secret
{
"user_id": "ceph-s3-user",
"display_name": "Ceph S3 User Demo",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [
{
"id": "ceph-s3-user:swift",
"permissions": "full-control"
}
],
"keys": [
{
"user": "ceph-s3-user",
"access_key": "J99IN8Z2GQZUGPBBHGP4",
"secret_key": "NzEBgJYkkbPHBYCSM1RG1bDWF1cO36hOvWNnqreD"
}
],
"swift_keys": [
{
"user": "ceph-s3-user:swift",
"secret_key": "JjWAwZMLbwr9ncGMmX6WRD7FFYCoOreAhc9r7cxy"
}
],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
5.9 swift客戶端訪問
yum -y install python-pip
pip install python-swiftclient
測試命令
swift -V 1 -A http://{IP ADDRESS}:{port}/auth -U testuser:swift -K '{swift_secret_key}' list
swift -A http://192.168.1.2/auth -U ceph-s3-user:swift -K JjWAwZMLbwr9ncGMmX6WRD7FFYCoOreAhc9r7cxy list
swift list 出來幫助命令
不使用這些參數
export ST_AUTH="http://192.168.1.2/auth"
export ST_USER="ceph-s3-user:swift"
export ST_KEY="JjWAwZMLbwr9ncGMmX6WRD7FFYCoOreAhc9r7cxy"
5.10 創建一個bucket
swift post swift-demo
5.11 上傳一個文件
swift upload swift-demo /etc/passwd
6.ceph-fs文件系統
6.1 安裝組件
至少需要一個mds(metadata server),為了保障高可靠性部署三台。
# 創建一個元數據服務器
如果啟動了三個mds服務,在沒有文件系統的情況下,三個都會是standby狀態。
ceph-deploy mds create node1
systemctl start ceph-mds@node1
6.2 創建兩個資源池
ceph osd pool create cephfs_data 16 16
ceph osd pool create cephfs_metadata 16 16
6.3 創建文件系統
ceph fs new cephfs-demo cephfs_metadata cephfs_data
cephfs-demo 文件系統名稱
# 查看詳情
ceph fs ls
6.4 掛載文件系統
# 掛載文件系統內核態
mount -t ceph node1:6789:/ /mnt/cephfs -o name=admin
#用戶態方式掛載
ceph-fuse -m node1:6789,node2:6789,node3:6789 /opt
使用三個節點的話,在其中一個節點掛了,業務不受影響。
7.CEPH集群運維
7.1 集群擴容
橫向擴容
增加更多的節點
osd縱向擴容
在單節點增加更多的磁盤
# 查看磁盤
ceph-deploy disk list node1
# 這個命令會把指定的設備的分區表給刪除掉。
ceph-deploy disk zap [node] [disk]
# 在縱向擴展的時候,pg會重新填充osd,這樣可能會降低集群的性能,可以把下面兩個功能臨時的關閉。
ceph osd set nobackfill
ceph osd set(unset) norebalance
ceph df
7.2 osd壞盤更換
ceph osd perf
# 查看磁盤的延遲,如果延遲很大,可能是有壞道了,但是還沒有壞。
1.先踢出盤
ceph osd out osd.3
權重變為0
2.刪除crush的緩存
ceph osd crush rm osd.3
3.刪除盤
ceph osd rm osd.3
4.刪除設備的認證信息
ceph auth rm osd.3
7.3 進程管理
# 這個服務器名會把所有的ceph服務給啟動起來,停止的話會把所有的服務給停止。
systemctl start ceph.target
根據服務類型
systemctl start ceph-osd.target # 如果這台節點上有多個osd會把全部的osd停掉
systemctl start ceph-mon.target
systemctl start ceph-mds.target
systemctl start ceph-osd@{id} # 停掉某一個osd
7.4 日志分析
默認的ceph日志存放路徑 /var/log/ceph/
7.5 集群狀態
ceph osd stat
ceph osd tree
ceph -s
ceph osd df
ceph df
ceph mon stat
ceph mon dump
ceph quorum_status
#
ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok config show
ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok help
7.6 資源池管理
資源池的分類
ceph osd pool application get pool1
# 設置資源池
ceph osd pool application enable pool1 rbd
# 設置最大刻印obj
ceph osd pool get-quota pool1
ceph osd pool set-quota pool1 max_objects 100
統計
rados df
PG
對象存儲在pg上;pg通過crash算法把數據存放在osd上面。
總的pg = osd * 100 / 資源池副本數
然后取2的次方的最近的那個值。
官方說明每個osd最多承受250個pg
7.6.1 刪除資源池
ceph osd pool rm pool1 pool1 --yes-i-really-really-mean-it
# 臨時調整
ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok config set mon_allow_pool_delete True
# 永久生效
1.編輯配置文件
[root@node1 ~/my-cluster]# vi ceph.conf
[global]
fsid = 634074c2-c593-4d68-896d-3a8a11151bf7
public_network = 192.168.1.0/24
cluster_network = 172.16.1.0/24
mon_initial_members = node1
mon_host = 192.168.1.2
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
rgw_multipart_part_upload_limit = 100000
mon_max_pg_per_osd = 1000
mon_allow_pool_delete = true
[client.rgw.node1]
rgw_frontends = "civetweb port=80"
2.發送配置文件
ceph-deploy --overwrite-conf config push node1 node2 node3
3.重啟各個節點的mon服務
for i in {1..3};do ssh node${i} systemctl restart ceph-mon.target;done
8.crush Map 規則
規定了數據怎樣存儲在集群中,以主機為單位,以osd為單位,以機櫃為單位,數據中心,區域。
8.1 更改crash map規則
# 導出crush規則,是二進制文件
ceph osd getcrushmap -o crushmao.bin
# 轉換成txt文件
crushtool -d crushmap.bin -o crushmap.txt
cat crushmap1.txt
# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable chooseleaf_stable 1
tunable straw_calc_version 1
tunable allowed_bucket_algs 54
# devices
# 標記了每一塊osd是什么類型
device 0 osd.0 class ssd
device 1 osd.1 class ssd
device 2 osd.2 class ssd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd
# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 zone
type 10 region
type 11 root
# buckets
# 主機
host node1 {
id -3 # do not change unnecessarily
# 標記個類型
id -4 class hdd # do not change unnecessarily
# weight 0.039
alg straw2
hash 0 # rjenkins1
# osd.3的權重
item osd.3 weight 0.019
}
host node2 {
id -5 # do not change unnecessarily
id -6 class hdd # do not change unnecessarily
# weight 0.039
alg straw2
hash 0 # rjenkins1
item osd.4 weight 0.019
}
host node3 {
id -7 # do not change unnecessarily
id -8 class hdd # do not change unnecessarily
# weight 0.039
alg straw2
hash 0 # rjenkins1
item osd.5 weight 0.019
}
host node1-ssd {
# weight 0.039
alg straw2
hash 0 # rjenkins1
item osd.0 weight 0.019
}
host node2-ssd {
# weight 0.039
alg straw2
hash 0 # rjenkins1
item osd.1 weight 0.019
}
host node3-ssd {
# weight 0.039
alg straw2
hash 0 # rjenkins1
item osd.2 weight 0.019
}
root default {
id -1 # do not change unnecessarily
id -2 class hdd # do not change unnecessarily
# weight 0.117
alg straw2
hash 0 # rjenkins1
item node1 weight 0.019
item node2 weight 0.019
item node3 weight 0.019
}
# 指定規則
root ssd {
# weight 0.117
alg straw2
hash 0 # rjenkins1
# 引用上面的主機
item node1-ssd weight 0.019
item node2-ssd weight 0.019
item node3-ssd weight 0.019
}
# rules
rule replicated_rule {
id 0
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type host
step emit
}
# 制定規則
rule ssd_rule {
id 1
type replicated
min_size 1
max_size 10
# 引用上面的規則
step take ssd
step chooseleaf firstn 0 type host
step emit
}
# end crush map
# 把crushmaptxt轉換成bin格式
crushtool -c crushmap.txt -o crushmap-new.bin
# 設置定義的規則
ceph osd setcrushmap -i crushmap-new.bin
# 查看資源池綁定的的crush規則
ceph osd pool get ceph-demo crush_rule
# 查看有哪些規則
ceph osd crush rule ls
# 給資源池設置crush_map
ceph osd pool set ceph-demo crush_rule demo_rule
# 這樣設置可以實現,不同的資源池把數據放置到不同的osd上面去。在沒有數據的時候做,有數據的時候有風險。
8.2 手動更改規則
# 創建一個bucket
類型root;名稱ssd
ceph osd crush add-bucket ssd root
#
類型是host
ceph osd crush add-bucket node1-ssd host
ceph osd crush add-bucket node2-ssd host
ceph osd crush add-bucket node3-ssd host
# 把host加入root
ceph osd crush move node1-ssd root=ssd
ceph osd crush move node2-ssd root=ssd
ceph osd crush move node3-ssd root=ssd
# 把osd移動到host
ceph osd crush move osd.0 host=node1-ssd root=ssd
ceph osd crush move osd.1 host=node2-ssd root=ssd
ceph osd crush move osd.2 host=node3-ssd root=ssd
效果
[root@node1 ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-9 0.05846 root ssd
-10 0.01949 host node1-ssd
0 hdd 0.01949 osd.0 up 1.00000 1.00000
-11 0.01949 host node2-ssd
1 hdd 0.01949 osd.1 up 1.00000 1.00000
-12 0.01949 host node3-ssd
2 hdd 0.01949 osd.2 up 1.00000 1.00000
-1 0.05846 root default
-3 0.01949 host node1
3 hdd 0.01949 osd.3 up 1.00000 1.00000
-5 0.01949 host node2
4 hdd 0.01949 osd.4 up 1.00000 1.00000
-7 0.01949 host node3
5 hdd 0.01949 osd.5 up 1.00000 1.00000
# 定義規則
ceph osd crush rule create-replicated ssd-demo ssd host hdd
# 查看
[root@node1 ~]# ceph osd crush rule ls
replicated_rule
ssd-demo
# 注意事項
1.在更改的時候,做好配置文件備份。
2.調整crush map的時候最好是在集群初始的時候,有數據的時候容易造成數據丟失。
3.手動更改crushMap需要更改配置,保證集群在增加或者減少osd的話會自動更改crushmap規則。更改規則會造成數據大量遷移。
......
[osd]
osd_crush_update_on_start = false
# 然后推送出去
ceph-deploy --overwrite-conf config push node1 node2 node3
systemctl restart ceph-osd.target
# 查看是否生效
ceph daemon /var/run/ceph/ceph-osd.0.asok config show|grep on_start
9.RBD高級功能
9.1 回收站
# 創建一個 鏡像
rbd create volumes/ceph-trash.img --size 10G
# 刪除鏡像
這樣刪除在回收站里面也看不到
rbd rm volumes/ceph-trash.img
# 把一個鏡像放入回收站
rbd trash move volumes/ceph-trash.img --expires-at 20210306
facf28ce8a57 ceph-trash.img # 指定的鏡像
facf28ce8a57 ceph-trash.img # 到了這個時間就會把這個刪除
# 查看回收站的內容
rbd trash -p volumes ls
facf28ce8a57 ceph-trash.img
# 把鏡像恢復回來。
rbd trash restore -p volumes facf28ce8a57
9.2 rbd制作快照
它針對的是塊設備級別的,如果文件系統是損壞的那么,制作出來的快照也是壞的。
# 創建一個5G的塊設備
rbd create volumes/rbd-test.img --image-feature layering --size 5G
rbd info volumes/rbd-test.img
# 映射到本地
rbd device map volumes/rbd-test.img
# 格式化
mkfs.ext4 /dev/rbd0
mount /dev/rbd0 /mnt/
cd /mnt
touch filetxt-1
# 創建快照
rbd snap create volumes/rbd-test.img@snap_20210308
# 查看快照
rbd snap ls volumes/rbd-test.img
# 恢復快照
rbd snap rollback volumes/rbd-test.img@snap_20210308
注意:需要把掛在上的設備卸載再掛載。
# 刪除快照
rbd snap rm volumes/rbd-test.img@snap_20210308
9.3 快照的高級特性copy-on-write
快照的高級特性copy-on-write
創建新的鏡像時候,創建了一個鏈接指向父鏡像,父鏡像只讀,創建出來的新鏡像,可以寫入數據。這樣新建鏡像的速度
就變得快速了。父鏡像不能夠刪除,刪除之后就會出問題(有一個鏡像保護機制)。還可以節省空間。
# 示例過程
rbd snap create volumes/rbd-test.img@snap_2021
# 保護鏡像
rbd snap protect volumes/rbd-test.img@snap_2021
# 克隆鏡像
rbd clone volumes/rbd-test.img@snap_2021 volumes/vm1-clone
# 查看克隆過的信息
rbd -p volumes info vm1-clone
# 根據模板鏡像創建出來的鏡像內容都是和模板鏡像一樣的。
# 把克隆出來的鏡像取消父子關系
會占用獨立的空間。
查看快照克隆出來的鏡像
rbd children volumes/rbd-test.img@snap_2021
# 把克隆出來的子鏡像獨立出來
rbd flatten volumes/vm1-clone
# 查看映射到本地的塊設備
rbd device ls
9.4 rbd快照的導出。
rbd export volumes/rbd-test.img@snap-demo /root/snap-demo
導出的名稱 snap-demo
# rbd的導入
rbd import /root/snap-demo volumes/rbd-test-new.img
rbd device map volumes/rbd-test-new.img
rbd feature disable volumes/rbd-test-new.img object-map fast-diff deep-flatten
rbd device map volumes/rbd-test-new.img
mount /dev/rbd1 /mnt/
# 數據就回來了
[root@node1 ~]# ls /mnt/
filetxt-1 lost+found
9.5 數據的增量備份
# 創建快照
[root@node1 ~]# rbd device ls
id pool namespace image snap device
0 volumes rbd-test.img - /dev/rbd0
1 volumes rbd-test-new.img - /dev/rbd1
# df -h
/dev/rbd1 4.8G 20M 4.6G 1% /mnt
[root@node1 /mnt]# ls
filetxt-1 lost+found
[root@node1 /mnt]# echo 123 > filetxt-2
[root@node1 /mnt]# ls
filetxt-1 filetxt-2 lost+found
# 導出增加的部分
rbd snap create volumes/rbd-test-new.img@s1
rbd export-diff volumes/rbd-test-new.img@s1 /root/diff-s2
# 導入數據(恢復)
rbd import-diff s2 volumes/rbd-test-new.img
10.RGW高可用
10.1 安裝radosgw
yum -y install ceph-radosgw
[root@node1 ~/my-cluster]# ceph-deploy rgw create node1 node2
10.1 更改rgw的端口
vi ~/my-cluster/ceph.conf
......
[client.rgw.node1]
rgw_frontends = "civetweb port=81"
[client.rgw.node2]
rgw_frontends = "civetweb port=81"
......
ceph-deploy --overwrite-conf config push node1 node2
node1和node2
systemctl restart ceph-radosgw.target
10.2 安裝keepalived
yum -y install keepalived
10.2.1 Master的配置文件
[root@node1 ~]# cat /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id node1 #就是一個身份標識(用主機名也可以用其它的)
}
vrrp_script check_haproxy {
script "killall -0 haproxy" #要執行的腳本或者命令,如果返回的結果是非0就會weight -20
interval 2 #每隔兩秒執行一次上面script的內容
weight -20 #權重-20,減的是priority,它的優先級小了自然就成了backup
}
vrrp_instance rgw { #rgw實例的名稱
state MASTER #標識角色狀態
interface eth0 #網卡綁定接口
virtual_router_id 50 #虛擬路由id,同一個實例保持一致
priority 150 #優先級
advert_int 1 #監測間隔時間
authentication { #認證
auth_type PASS #認證方式
auth_pass 1111 #認證密碼
}
virtual_ipaddress {
192.168.1.10 #虛擬的VIP地址
}
track_script {
check_haproxy # 調用上面的腳本執行
}
}
10.2.2 Backup的配置文件
[root@node2 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id node2
}
vrrp_instance rgw {
state BACKUP
interface eth0
virtual_router_id 50
priority 140
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.10
}
}
11.Ceph集群測試
11.1 mon高可用測試
3個mon只允許掛掉一個。
在生產環境中一般三個mon節點是沒問題的。當掛掉兩個的時候集群就會出現問題。5個mon只允許掛掉兩個。
systemctl status ceph-mon
11.2 mds高可用
ceph-fs的組件
ceph-fs的高可用只有一個服務在就行,但是集群因為沒有高可用之后,會有一個warnning的告警。
systemctl status ceph-mds
11.3 rgw高可用
對象存儲網關
使用haproxy和keepalived來進行高可用。
systemctl status ceph-radosgw
mgr 是用來管理的一般不會對集群產生影響
11.4 OSD壞盤測試
單個節點或者是單盤出現問題,因為有副本所以不會產生影響。
11.5 fio性能壓測評估
ceph osd perf # 可以查看磁盤的狀況
fio -filename=/mnt/test.img -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=100M -numjobs=2 -runtime= -group_reporting -name=rand_100write_4k
吞吐量可以把bs調大一點
-numjobs=2 # 調整為CPU核心的2^n
rbd bench壓力測試
rbd help bench
rbd bench volumes/rbd-test.img --io-size 4K --io-threads 4 --io-total 200M --io-pattern rand --io-type write
rbd bench volumes/rbd-test.img --io-size 4K --io-threads 4 --io-total 200M --io-pattern rand --io-type read
