Ceph實戰教程(一)讓Ceph集羣運行起來

實戰目標

要學習使用Ceph,首先需要有一個Ceph集羣,本文通過ceph-deploy一個自動化部署Ceph的工具部署一個Ceph集羣,掌握Ceph集羣部署的方法,Ceph核心組件部署,其次掌握ceph客戶端命令交互使用,創建pool和rbd塊的使用。

1. Ceph集羣部署

1.1 安裝環境介紹

首先介紹一下Ceph安裝部署的方法,Ceph社區提供了三種部署方法:

  • ceph-deploy,一個集羣自動化部署工具,使用較久,成熟穩定,被很多自動化工具所集成,可用於生產部署
  • cephadm,較新的集羣自動化部署工具,支持通過圖形界面或者命令行界面添加節點,目前不建議用於生產環境
  • manual,手動部署,一步步部署Ceph集羣,支持較多定製化和了解部署細節,安裝難度較大

我們採用成熟、簡單的ceph-deploy實現Ceph集羣的部署,首先了解一下ceph-deploy的架構:

  • admin-node,需要一個安裝管理節點,該安裝節點集中管控ceph集羣的安裝
  • mon,monitor節點,即是Ceph的監視管理節點,承擔Ceph集羣重要的管理任務,一般需要3或5個節點
  • osd,OSD即Object Storage Daemon,實際負責數據存儲的節點

Ceph集羣部署架構

安裝環境以三個節點的方式來完成Ceph集羣的部署,如下是各個集羣安裝部署的信息:

  • 硬件環境:騰訊雲CVM,1core+2G+50G系統盤+50G數據盤
  • 操作系統:CentOS Linux release 7.6.1810 (Core)
  • 軟件版本:Mimic 13.2.8
  • 部署版本:ceph-deploy 2.0.1
節點名稱 角色說明 IP地址 備註說明
node-1 admin-node,monitor,OSD 10.254.100.101 承擔ceph-deploy安裝部署admin-node角色<br>2. 充當Ceph Monitor節點<br>3. 充當Ceph OSD節點,包含一塊50G磁盤
node-2 OSD 10.254.100.102 充當Ceph OSD數據存儲節點,包含一塊50G磁盤
node-3 OSD 10.254.100.103 充當Ceph OSD數據存儲節點,包含一塊50G磁盤

1.2 前提環境準備

Ceph環境準備

安裝Ceph之前需要將環境提前部署好,部署內容參考上圖內容,官方安裝時推薦創建一個新的用戶來實現安裝部署,官方參考文檔,本文直接以root的身份實現集羣的安裝。備註:以下操作除了ssh無密碼登陸之外,其他操作均需要在所有節點上執行。

1、主機名設置,以node-1爲例

[root@node-1 ~]# hostnamectl set-hostname node-1
[root@node-1 ~]# hostnamectl status
   Static hostname: node-1
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 0ea734564f9a4e2881b866b82d679dfc
           Boot ID: b0bc8b8c9cb541d2a582cdb9e9cf22aa
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-957.27.2.el7.x86_64
      Architecture: x86-64

2、設置/etc/hosts文件,將node-1至node-3信息寫入到/etc/hosts文件中

[root@node-1 ~]# cat /etc/hosts
10.254.100.101 node-1
10.254.100.102 node-2
10.254.100.103 node-3

3、設置ssh無密碼登陸,需要需要在node-1上生成key,然後將公鑰拷貝到其他節點(包括node-1節點),如下圖

設置無密碼登陸

4、關閉Selinux默認已關閉

[root@node-1 ~]# setenforce 0
[root@node-1 ~]# getenforce 

5、關閉iptables防火牆,或者放行對應的端口:Ceph monitor 6789/tcp,Ceph OSD 6800-7300/tcp

[root@node-1 ~]# systemctl stop iptables
[root@node-1 ~]# systemctl stop firewalld
[root@node-1 ~]# systemctl disable iptables
[root@node-1 ~]# systemctl disable firewalld

6、配置好ntp時間同步,Ceph是分佈式集羣,對時間很敏感,如果時間不正確可能會導致集羣奔潰,因此在Ceph集中中設置ntp同步非常關鍵,推薦使用內網的ntp服務器同步時間,騰訊雲CVM默認會同步到內網的ntp時間同步,讀者根據需要進行設定

[root@node-1 ~]# grep ^server /etc/ntp.conf 
server ntpupdate.tencentyun.com iburst
[root@node-1 ~]# 
[root@node-1 ~]# ntpq -pn 
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*169.254.0.2     183.3.239.152    4 u  238 1024  377    5.093    4.443   5.145

7、設置Ceph安裝yum源,選擇安裝版本爲octopus

[root@node-1 ~]# cat << EOM > /etc/yum.repos.d/ceph.repo
> [ceph-noarch]
> name=Ceph noarch packages
> baseurl=https://download.ceph.com/rpm-mimic/el7/noarch
> enabled=1
> gpgcheck=1
> type=rpm-md
> gpgkey=https://download.ceph.com/keys/release.asc
> EOM

安裝EPEL 倉庫
[root@node-1 ~]# sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

8、安裝Ceph-deploy,對應版本爲2.0.1,重要:默認epel源中ceph-deploy的版本是1.5,版本較老,會涉及到很多rpm依賴,安裝問題,安裝前檢查好對應的版本,確保無誤。

[root@node-1 ~]# yum install ceph-deploy -y
[root@node-1 ~]# ceph-deploy --version
2.0.1

1.3 部署Ceph集羣

Ceph-deploy部署過程中會生成一些集羣初始化配置文件和key,後續擴容的時候也需要使用到,因此,建議在admin-node上創建一個單獨的目錄,後續操作都進入到該目錄中進行操作,以創建的ceph-admin-node爲例。

1、創建一個Ceph cluster集羣,可以指定cluster-network(集羣內部通訊)和public-network(外部訪問Ceph集羣)

[root@node-1 ceph-admin ]# ceph-deploy new \
>--cluster-network 10.254.100.0/24 \
>--public-network 10.254.100.0/24 node-1    #創建集羣
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy new --cluster-network 10.254.100.0/24 --public-network 10.254.100.0/24 node-1
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  func                          : <function new at 0x7fefe8a292a8>
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fefe83a5b00>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  ssh_copykey                   : True
[ceph_deploy.cli][INFO  ]  mon                           : ['node-1']
[ceph_deploy.cli][INFO  ]  public_network                : 10.254.100.0/24
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  cluster_network               : 10.254.100.0/24
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]  fsid                          : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
[ceph_deploy.new][INFO  ] making sure passwordless SSH succeeds
[node-1][DEBUG ] connected to host: node-1 
[node-1][DEBUG ] detect platform information from remote host
[node-1][DEBUG ] detect machine type
[node-1][DEBUG ] find the location of an executable
[node-1][INFO  ] Running command: /usr/sbin/ip link show
[node-1][INFO  ] Running command: /usr/sbin/ip addr show
[node-1][DEBUG ] IP addresses found: [u'172.17.0.1', u'10.244.0.1', u'10.244.0.0', u'10.254.100.101']
[ceph_deploy.new][DEBUG ] Resolving host node-1
[ceph_deploy.new][DEBUG ] Monitor node-1 at 10.254.100.101
[ceph_deploy.new][DEBUG ] Monitor initial members are ['node-1']
[ceph_deploy.new][DEBUG ] Monitor addrs are [u'10.254.100.101']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...

通過上面的輸出可以看到,new初始化集羣過程中會生成ssh key密鑰,ceph.conf配置文件,ceph.mon.keyring認證管理密鑰,配置cluster network和pubic network,此時查看目錄下的文件可以看到如下內容:

[root@node-1 ceph-admin ]# ls -l
總用量 12
-rw-r--r-- 1 root root  265 3月   1 13:04 ceph.conf    #配置文件
-rw-r--r-- 1 root root 3068 3月   1 13:04 ceph-deploy-ceph.log #部署日誌文件
-rw------- 1 root root   73 3月   1 13:04 ceph.mon.keyring #monitor認證key

[root@node-1 ceph-admin-node]# cat ceph.conf 
[global]
fsid = cfc3203b-6abb-4957-af1b-e9a2abdfe725
public_network = 10.254.100.0/24  #public網絡和cluster網絡
cluster_network = 10.254.100.0/24
mon_initial_members = node-1     #monitor的地址和主機名
mon_host = 10.254.100.101
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

2、安裝Ceph部署相關的軟件,常規通過yum進行安裝,由於可能會安裝錯軟件包,因此ceph-deploy提供了一個install的工具輔助軟件包的安裝,ceph-deploy install node-1 node-2 node-3

[root@node-1 ~]# ceph-deploy install node-1 node-2 node-3

3、初始化monitor節點,執行ceph-deploy mon create-initial做初始化

ceph初始化

初始化完畢後會生成對應的keyring文件,用於ceph認證:

  • ceph.client.admin.keyring
  • ceph.bootstrap-mgr.keyring
  • ceph.bootstrap-osd.keyring
  • ceph.bootstrap-mds.keyring
  • ceph.bootstrap-rgw.keyring
  • ceph.bootstrap-rbd.keyring
  • ceph.bootstrap-rbd-mirror.keyring

4、將認證密鑰拷貝到其他節點,便於ceph命令行可以通過keyring和ceph集羣進行交互,ceph-deploy admin node-1 node-2 node-3

Ceph拷貝管理密鑰

此時,Ceph集羣已經建立起來,包含一個monitor節點,通過ceph -s可以查看當前ceph集羣的狀態,由於此時並沒有任何的OSD節點,因此無法往集羣中寫數據等操作,如下是ceph -s查看的輸出結果

[root@node-1 ceph-admin]# ceph -s 
  cluster:
    id:     760da58c-0041-4525-a8ac-1118106312de
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum node-1
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:   

5、集羣中目前還沒有OSD節點,因此沒法存儲數據,接下來開始往集羣中添加OSD節點,每個節點上都有一塊50G的vdb磁盤,將其加入到集羣中作爲OSD節點,如ceph-deploy osd create node-1 --data /dev/vdb

ceph添加osd節點

如上已將node-1的vdb添加到ceph集羣中,ceph -s可以看到當前有一個osd加入到集羣中,執行相同的方法將node-2和node-3上的磁盤添加到集羣中

  • ceph-deploy osd create node-2 --data /dev/vdb
  • ceph-deploy osd create node-3 --data /dev/vdb

執行完畢後,三個OSD均已加入到ceph集羣中,通過ceph -s可以看到對應三個OSD節點

[root@node-1 ceph-admin]# ceph -s 
  cluster:
    id:     760da58c-0041-4525-a8ac-1118106312de
    health: HEALTH_WARN
            no active mgr

  services:
    mon: 1 daemons, quorum node-1
    mgr: no daemons active
    osd: 3 osds: 3 up, 3 in  #三個OSD,當前狀態都是up和in狀態

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:     

也可以通過ceph osd tree查看每隔節點上osd的情況和crush tree的情況

[root@node-1 ~]# ceph osd tree 
ID CLASS WEIGHT  TYPE NAME       STATUS REWEIGHT PRI-AFF 
-1       0.14369 root default                            
-3       0.04790     host node-1                         
 0   hdd 0.04790         osd.0       up  1.00000 1.00000 
-5       0.04790     host node-2                         
 1   hdd 0.04790         osd.1       up  1.00000 1.00000 
-7       0.04790     host node-3                         
 2   hdd 0.04790         osd.2       up  1.00000 1.00000 

6、此時Ceph的health狀態爲HEALTH_WARN告警狀態,提示信息爲“no active mgr”,因此需要部署一個mgr節點,manager節點在luminous之後的版本纔可以部署(本環境部署的是M版本,因此可以支持),將mgr部署到node-1節點,執行ceph-deploy mgr create node-1

Ceph添加mgr節點

至此,Ceph集羣已經部署完畢。通過ceph-deploy工具進行部署完成Ceph集羣的自動化部署,後續添加monitor節點,osd節點,mgr節點也會很方便。

2.4 Ceph塊存儲使用

實戰目標:Ceph集羣創建資源池,創建RBD塊,RBD塊的使用

部署完Ceph集羣之後,如何在Ceph集羣中存儲文件呢?ceph提供了三種接口供用戶使用,分別是:

  • rbd,塊存儲,以塊的方式使用,通常適用於和虛擬化如KVM結合,用於給虛擬化提供塊存儲設備
  • object storage,對象存儲,通過radosgw提供對象存儲api,供用戶上傳put和get下載對象文件
  • cephfs文,件存儲,以cephfs掛載文件系統的方式使用ceph

我們先以Ceph RBD的方式來介紹Ceph集羣的使用,通過在Ceph集羣中創建一個RBD塊文件供用戶進行使用,要使用Ceph,首先需要一個資源池pool,pool是Ceph中數據存儲抽象的概念,其右多個pg(Placegroup)和pgp組成,創建的時候可以指定pg的數量,pg的大小一般爲2^n次方,如下先創建一個pool

1、創建一個pool,其名字爲happylau,包含128個PG/PGP,

[root@node-1 ~]# ceph osd pool create happylau 128 128 
pool 'happylau' created

可以查看pool的信息,如查看當前集羣的pool列表——lspools,查看pg_num和pgp_num,副本數size大小

查看pool列表
[root@node-1 ~]# ceph osd lspools
1 happylau

查看pg和pgp數量
[root@node-1 ~]# ceph osd pool get happylau pg_num
pg_num: 128
[root@node-1 ~]# ceph osd pool get happylau pgp_num
pgp_num: 128

查看size大小,默認爲三副本
[root@node-1 ~]# ceph osd pool get happylau size
size: 3

2、此時pool已經創建好,可以在pool中創建RBD塊,通過rbd命令來實現RBD塊的創建,如創建一個10G的塊存儲

[root@node-1 ~]# rbd create -p happylau --image ceph-rbd-demo.img --size 10G 

如上創建了一個ceph-rbd-demo.img的RBD塊文件,大小爲10G,可以通過ls和info查看RBD鏡像的列表和詳情信息

查看RBD鏡像列表
[root@node-1 ~]# rbd -p happylau ls 
ceph-rbd-demo.img

查看RBD詳情,可以看到鏡像包含2560個objects,每個ojbect大小爲4M,對象以rbd_data.10b96b8b4567開頭
[root@node-1 ~]# rbd -p happylau info ceph-rbd-demo.img
rbd image 'ceph-rbd-demo.img':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    id: 10b96b8b4567
    block_name_prefix: rbd_data.10b96b8b4567
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    op_features: 
    flags: 
    create_timestamp: Mon Mar  2 15:32:39 2020

3、RBD存儲塊已創建起來了,如何使用呢?如果已和虛擬化環境結合,創建好虛擬機然後在磁盤中寫數據即可,但此時還未與虛擬化結合(結合難度也比較大,後續再專門討論),rbd提供了一個map的工具,可以將一個RBD塊映射到本地塊進行使用,大大簡化了使用過程,rbd map時候,exclusive-lock, object-map, fast-diff, deep-flatten的features不支持,因此需要先disable,否則會提示RBD image feature set mismatch報錯信息

關閉默認的featrues
[root@node-1 ~]# rbd -p happylau --image ceph-rbd-demo.img feature disable deep-flatten
[root@node-1 ~]# rbd -p happylau --image ceph-rbd-demo.img feature disable fast-diff
[root@node-1 ~]# rbd -p happylau --image ceph-rbd-demo.img feature disable object-map
[root@node-1 ~]# rbd -p happylau --image ceph-rbd-demo.img feature disable exclusive-lock

查看校驗featrue信息
[root@node-1 ~]# rbd -p happylau info ceph-rbd-demo.img
rbd image 'ceph-rbd-demo.img':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    id: 10b96b8b4567
    block_name_prefix: rbd_data.10b96b8b4567
    format: 2
    features: layering
    op_features: 
    flags: 
    create_timestamp: Mon Mar  2 15:32:39 2020

將RBD塊map到本地,此時map後,可以看到RBD塊設備映射到了本地的一個/dev/rbd0設備上
[root@node-1 ~]# rbd map -p happylau --image ceph-rbd-demo.img
/dev/rbd0
[root@node-1 ~]# ls -l /dev/rbd0
brw-rw---- 1 root disk 251, 0 3月   2 15:58 /dev/rbd0

4、RBD塊設備已映射到本地的/dev/rbd0設備上,因此可以對設備進行格式化操作使用

通過device list可以查看到當前機器RBD塊設備的映射情況
[root@node-1 ~]# ls -l /dev/rbd0
brw-rw---- 1 root disk 251, 0 3月   2 15:58 /dev/rbd0

該設備可以像本地的一個盤來使用,因此可以對其進行格式化操作
[root@node-1 ~]# mkfs.xfs /dev/rbd0 
meta-data=/dev/rbd0              isize=512    agcount=16, agsize=163840 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@node-1 ~]# blkid /dev/rbd0
/dev/rbd0: UUID="35f63145-0b62-416d-81f2-730c067652a8" TYPE="xfs" 

掛載磁盤到系統中
[root@node-1 ~]# mkdir /mnt/ceph-rbd
[root@node-1 ~]# mount /dev/rbd0 /mnt/ceph-rbd/
[root@node-1 ~]# df -h /mnt/ceph-rbd/
文件系統        容量  已用  可用 已用% 掛載點
/dev/rbd0        10G   33M   10G    1% /mnt/ceph-rbd
[root@node-1 ~]# cd /mnt/ceph-rbd/
[root@node-1 ceph-rbd]# echo "testfile for ceph rbd" >rbd.log

2.5 Ceph安裝使用小結

本文通過ceph-deploy完成一個1mon節點+1mgr節點+3個osd節點的集羣,ceph-deploy安裝簡化了集羣的部署,我在安裝過程中遇到了不少報錯(主要是rpm版本問題,尤其是ceph-deploy的包,EPEL默認的是1.5版本,需要用到ceph官網的2.0.1,否則會遇到各種各樣的問題,1年未安裝Ceph,變化很大,不得不感慨社區的發展速度)。

除此之外,介紹了Ceph中RBD的使用方式,資源池pool的創建,rbd鏡像創建接口,rbd存儲映射的使用,通過接口的使用,演示了Ceph中RBD塊存儲的使用,如和虛擬化對接,虛擬化產品會調用接口實現相同功能。章節中未介紹object storage對象存儲的使用和cephfs文件存儲的使用,由於相關組件未安裝,後續章節中再做介紹。

另外,還介紹了Ceph另外當前集羣只有一個monitor節點,存在單點故障,當node-1節點故障時,整個集羣都會處於不可用狀態,因此需要部署高可用集羣,以避免集羣存在單點故障,保障業務的高可用性,下個章節來介紹monitor節點的擴容。

參考文檔

ceph-deploy:https://docs.ceph.com/docs/master/start/quick-ceph-deploy/

ceph-admin:https://docs.ceph.com/docs/master/cephadm/

手動安裝:https://docs.ceph.com/docs/master/install/

資源池pool的管理:https://docs.ceph.com/docs/master/rbd/rados-rbd-cmds/

RBD塊存儲使用:https://docs.ceph.com/docs/master/start/quick-rbd/?highlight=rbdmap


**如果覺得文章對您有幫助,請訂閱專欄,分享給有需要的朋友吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章