1. 程式人生 > 實用技巧 >docker+ceph實現私網雲盤

docker+ceph實現私網雲盤

目錄

ceph+docker方式搭建owncloud實現私網雲盤

專案背景

企業應用中越來越多的會使用容器技術來是實現解決方案

1、單節點的docker和docker-compose

2、多節點的docker swarm叢集

3、多節點的k8s叢集

以上都是可以基於容器技術實現企業應用的編排和快速部署

在特別大型的業務架構中, 資料達到T級別,P級別,甚至E級別或更高。如此大量 的資料,我們需要保證它的資料讀寫效能, 資料可靠性, 線上擴容等, 並且希望能 與容器技術整合使用。
ceph分散式儲存是非常不錯的開源解決方案
目前ceph在docker swarm叢集與kubernetes叢集中已經可以實現對接使用。 雖然3種類型儲存並不是在任何場合都支援,但開源社群中也有相應的解決方 案,也會越來越成熟。
下面我們就使用ceph做底層儲存, 分別在docker節點,docker swarm集 群,kubernetes叢集中對接應用打造私有云盤與web應用。

專案架構圖

PS:在架構圖中寫的比較全,但是在這個專案中不會全部做完,只是ceph叢集加單臺docker部署owncloud,實現雲盤的功能,並沒有docker叢集的操作。

四臺主機

系統版本為7.6 1810

ceph1 10.0.0.5 作為管理ceph叢集的節點,它自身也在叢集中

ceph2 10.0.0.6 組成ceph叢集

ceph3 10.0.0.41 組成ceph叢集

owncloud 10.0.0.63 docker部署owncloud

部署過程

準備過程
1、所有節點配置靜態IP地址(要求能上公網)(ceph1舉例)
[root@ceph1 yum.repos.d 04:14:18]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.5
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=223.5.5.5
2、所有節點主機名配置在/etc/hosts檔案中

(ceph1舉例)

[root@ceph1 yum.repos.d 04:14:36]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.5 ceph1
10.0.0.6 ceph2
10.0.0.41 ceph3
10.0.0.63 owncloud

說明:還有沒有開始部署的節點,也請先把IP地址和主機名進行繫結到/etc/hosts中

3、所有節點關閉centos7的firewalld房防火牆,iptables規則清空
# systemctl stop firewalld # systemctl disable firewalld

# yum install iptables-services -y # systemctl restart iptables # systemctl enable iptables

# iptables -F # iptables -F -t nat # iptables -F -t mangle # iptables -F -t raw

# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
4、所有節點關閉selinux
[root@ceph1 yum.repos.d 04:16:08]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

# enforcing - SELinux security policy is enforced.

# permissive - SELinux prints warnings instead of enforcing.

# disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of three values:

# targeted - Targeted processes are protected,

# minimum - Modification of targeted policy. Only selected processes are protected.

# mls - Multi Level Security protection.

SELINUXTYPE=targeted

[root@ceph1 yum.repos.d 04:18:09]# getenforce
Disabled




5、同步時間
# systemctl restart ntpd 
# systemctl enabled ntpd

PS:準備工作是在所有節點都進行操作的

部署開始
1、新增ceph的yum源
[root@ceph1 yum.repos.d 02:40:54]# cat ceph.repo
[ceph]
name=ceph
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/x86_64/
enabled=1
gpgcheck=0
priority=1

[ceph-noarch]
name=cephnoarch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/
enabled=1
gpgcheck=0
priority=1

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/SRPMS/
enabled=1
gpgcheck=0
priority=1

[root@ceph1 yum.repos.d 02:40:57]#

註釋:我這裡使用的清華源,也可以使用阿里源或者是搭建本地yum源(搭建本地yum源的前提是將所有的rpm下載到本地)

將此ceph.repo拷貝到其他所有節點

2、配置ceph叢集ssh免密

以ceph1為部署節點,在ceph1上配置到其他節點的ssh免密

目的:因為ceph叢集會經常同步配置檔案到其他節點,免密會方便很多

[root@ceph1 ~]# ssh-keygen            # 三次回車做成空密碼金鑰[root@ceph_node1 ~]# ssh-copy-id ceph1 
[root@ceph_node1 ~]# ssh-copy-id ceph2 
[root@ceph_node1 ~]# ssh-copy-id ceph3 
[root@ceph_node1 ~]# ssh-copy-id owncloud 



3、在ceph1上安裝部署工具

其他節點不需要安裝

yum install -y  python-setuptools.noarch  #先安裝一個模組
 yum install ceph-deploy -y  #安裝部署工具

4、在ceph1上建立叢集

建立一個叢集配置目錄

注意:後面大部分的操作都在這個目錄中操作

mkdir /etc/ceph
 cd /etc/ceph

建立一個ceph1叢集

ceph-deploy new  ceph1

[root@ceph1 ceph 06:41:01]# ll
total 16
-rw-r--r-- 1 root root  191 Apr 21 02:38 ceph.conf
-rw-r--r-- 1 root root 2917 Apr 21 02:38 ceph-deploy-ceph.log
-rw------- 1 root root   73 Apr 21 02:38 ceph.mon.keyring
-rw-r--r-- 1 root root   92 Apr 16 12:47 rbdmap
[root@ceph1 ceph 06:42:02]#

說明:

ceph.conf 叢集配置檔案

ceph-deploy-ceph.log  使用ceph-deploy部署的日誌記錄

ceph.mon.keyring   驗證key檔案

5、安裝ceph軟體

在所有ceph叢集節點安裝ceph與ceph-radosgw軟體包

[root@ceph1 ceph 06:42:32]# ceph -v
ceph version 13.2.9 (58a2a9b31fd08d8bb3089fce0e312331502ff945) mimic (stable)
[root@ceph1 ceph 06:42:36]#

補充說明:如果網速夠好的話,可以使用ceph-deploy install ceph1 ceph2 ceph3 命令來安裝。ceph-deploy命令會自動通過公網官方源安裝。(網速不給力就不要使用這種方式了)

在ceph客戶端節點(k8s叢集節點上)安裝ceph-common

# yum install ceph-common -y

建立mon監控元件

增加監控網路,網段為實驗環境的叢集物理網路

[root@ceph1 ceph 06:50:47]# cat /etc/ceph/ceph.conf
[global]
fsid = bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
mon_initial_members = ceph1
mon_host = 10.0.0.5
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

public network = 10.0.0.0/24  #新增的配置,監控網路

1、叢集節點初始化
[root@ceph1 ceph 06:52:13]# ceph-deploy mon create-initial
[root@ceph1 ceph 06:52:05]# ceph health
HEALTH_OK


2、將配置檔案資訊同步到所有的ceph叢集節點
ceph-deploy admin ceph1 ceph2 ceph3

[root@ceph1 ceph 06:57:15]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum ceph1
    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:

[root@ceph1 ceph 06:57:19]#


此時叢集已經搭建好了

3、多個mon節點

為了防止mon節點單點故障,你可以新增多個mon節點(非必要步驟)

ceph-deploy mon add ceph2
ceph-deploy mon add ceph3

[root@ceph1 ceph 06:59:11]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_OK
健康狀態為ok
  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3  三個監控
    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:

監控到時間不同不的解決方法

ceph叢集對時間同步的要求非常高,即使你已經將ntpd服務開啟,但仍然有可能會有clock skew deteted相關警告

可以嘗試如下做法:

1、在ceph叢集節點上使用crontab同步
# systemctl stop ntpd # systemctl disable ntpd

# crontab -e */10 * * * * ntpdate ntp1.aliyun.com                每5或10 分鐘同步1次公網的任意時間伺服器

2、調大時間警告的閾值
[root@ceph_node1 ceph]# vim ceph.conf 
[global]                                在global引數組裡新增 以下兩行                       ...... 
mon clock drift allowed = 2             # monitor間的時鐘滴 答數(預設0.5秒) 
mon clock drift warn backoff = 30       # 調大時鐘允許的偏移量 (預設為5)

3、同步到所有節點
[root@ceph_node1 ceph]# ceph-deploy --overwrite-conf admin ceph_node1 ceph_node2 ceph_node3

前面第1次同步不需要加--overwrite-conf引數 這次修改ceph.conf再同步就需要加--overwrite-conf引數覆蓋

4、所有ceph叢集節點上重啟ceph-mon.target服務
systemctl  restart  ceph-mon.target

建立mgr管理元件

ceph luminous版本之後新增加了一個元件:ceph manager daemon ,簡稱ceph-mgr

該元件的主要作用是分擔和擴充套件monitor的部分功能,減輕monitor的負擔,讓更好的管理ceph儲存系統

ceph dashboard圖形化管理就用到了mgr

1、建立一個mgr
[root@ceph1 ceph 07:11:17]# ceph-deploy mgr  create ceph1

檢視一下

[root@ceph1 ceph 07:11:32]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active) 這裡就是mgr 
    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:

2、新增多個mgr可以實現HA
 ceph-deploy mgr  create ceph2
 ceph-deploy mgr  create ceph3

[root@ceph1 ceph 07:13:12]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3

  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3  三個監控
    mgr: ceph1(active), standbys: ceph2, ceph3    ceph1為主mgr
    osd: 0 osds: 0 up, 0 in
看到0個磁碟
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

[root@ceph1 ceph 07:13:19]#

至此ceph叢集基本已經搭建完成,但是還需要增加OSD磁碟

ceph叢集管理
1、物理上新增磁碟

在ceph叢集所有節點上增加磁碟

(我這裡只是模擬,就增加一個5G的做測試使用)

ceph1 ceph2 ceph3 三個節點上都要進行操作

不重啟讓系統識別新增加的磁碟

操作之前

[root@ceph1 ceph 07:13:19]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   50G  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   49G  0 part
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0   47G  0 lvm  /
sr0              11:0    1  4.3G  0 rom
[root@ceph1 ceph 07:24:28]#

操作之中

[root@ceph1 ceph 07:24:28]# echo "- - -" > /sys/class/scsi_host/host0/scan
[root@ceph1 ceph 07:26:01]# echo "- - -" > /sys/class/scsi_host/host1/scan
[root@ceph1 ceph 07:26:08]# echo "- - -" > /sys/class/scsi_host/host2/scan

操作之後

[root@ceph1 ceph 07:26:12]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   50G  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   49G  0 part
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0   47G  0 lvm  /
sdb       這裡就是我們新加的        8:16   0    5G  0 disk
sr0              11:0    1  4.3G  0 rom
[root@ceph1 ceph 07:26:36]#

2、建立OSD磁碟

將磁碟新增到ceph叢集中需要osd

ceph OSD :功能是儲存於處理一些資料,並通過檢查其他OSD守護程序的心跳來向ceph monitors 提供一些監控資訊

1、列表所有節點的磁碟 並使用zap命令清除磁碟資訊準備建立OSD

 ceph-deploy disk zap ceph1 /dev/sdb
ceph-deploy disk zap ceph2 /dev/sdb
ceph-deploy disk zap ceph3 /dev/sdb

[root@ceph1 ceph 07:32:01]# ceph-deploy disk zap ceph3 /dev/sdb
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy disk zap ceph3 /dev/sdb
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ]  username                      : None
[ceph_deploy.cli][INFO ]  verbose                       : False
[ceph_deploy.cli][INFO ]  debug                         : False
[ceph_deploy.cli][INFO ]  overwrite_conf                : False
[ceph_deploy.cli][INFO ]  subcommand                    : zap
[ceph_deploy.cli][INFO ]  quiet                         : False
[ceph_deploy.cli][INFO ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7feb12eb0368>
[ceph_deploy.cli][INFO ]  cluster                       : ceph
[ceph_deploy.cli][INFO ]  host                          : ceph3
[ceph_deploy.cli][INFO ]  func                          : <function disk at 0x7feb12eec8c0>
[ceph_deploy.cli][INFO ]  ceph_conf                     : None
[ceph_deploy.cli][INFO ]  default_release               : False
[ceph_deploy.cli][INFO ]  disk                          : ['/dev/sdb']
[ceph_deploy.osd][DEBUG ] zapping /dev/sdb on ceph3
[ceph3][DEBUG ] connected to host: ceph3
[ceph3][DEBUG ] detect platform information from remote host
[ceph3][DEBUG ] detect machine type
[ceph3][DEBUG ] find the location of an executable
[ceph_deploy.osd][INFO ] Distro info: CentOS Linux 7.6.1810 Core
[ceph3][DEBUG ] zeroing last few blocks of device
[ceph3][DEBUG ] find the location of an executable
[ceph3][INFO ] Running command: /usr/sbin/ceph-volume lvm zap /dev/sdb
[ceph3][WARNIN] --> Zapping: /dev/sdb
[ceph3][WARNIN] --> --destroy was not specified, but zapping a whole device will remove the partition table
[ceph3][WARNIN] Running command: /bin/dd if=/dev/zero of=/dev/sdb bs=1M count=10 conv=fsync
[ceph3][WARNIN] --> Zapping successful for: <Raw Device: /dev/sdb>

2、建立OSD磁碟

ceph-deploy osd create --data /dev/sdb ceph1
ceph-deploy osd create --data /dev/sdb ceph2
ceph-deploy osd create --data /dev/sdb ceph3

3、驗證

[root@ceph1 ceph 07:34:31]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active), standbys: ceph2, ceph3
    osd: 3 osds: 3 up, 3 in
三個磁碟
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 12 GiB / 15 GiB avail  合成一個15G的磁碟,但是使用了3G 是因為合成時會用掉一些空間
    pgs:

擴容操作
節點中增加某個磁碟

如:在ceph3上再新增一塊磁碟/dev/sdc。做如下操作就可以

ceph-deploy disk zap ceph3 /dev/sdc
ceph-deploy osd create --data /dev/sdc ceph3

驗證

[root@ceph1 ceph 08:10:41]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active), standbys: ceph2, ceph3
    osd: 4 osds: 4 up, 4 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   4.0 GiB used, 16 GiB / 20 GiB avail
    pgs:

增加某個節點並新增此節點的磁碟

如果是新增加一個節點(假設是owncloud節點)並新增一塊磁碟

那麼做法如下:

1、準備好owncloud節點的基本環境,安裝ceph相關軟體

yum install -y  ceph  ceph-radosgw -y

2、在ceph1上同步1配置到owncloud節點

ceph-deploy admin  owncloud

3、將owncloud加入叢集

ceph-deploy disk  zap  owncloud /dev/sdb
ceph-deploy osd create --data   /dev/sdb  owncloud

4、驗證

[root@ceph1 ceph 08:15:44]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active), standbys: ceph2, ceph3
    osd: 5 osds: 5 up, 5 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   5.0 GiB used, 20 GiB / 25 GiB avail
    pgs:

[root@ceph1 ceph 08:15:48]#

刪除磁碟方法

和很多儲存一樣,增加磁碟(擴容)都比較方便,但是要刪除磁碟會比較麻煩。

這裡以刪除owncloud節點的/dev/sdb磁碟為例

1、檢視osd磁碟狀態

[root@ceph1 ceph 08:23:49]# ceph  osd  tree
ID CLASS WEIGHT  TYPE NAME         STATUS REWEIGHT PRI-AFF
-1       0.02449 root default
-3       0.00490     host ceph1
 0   hdd 0.00490         osd.0         up  1.00000 1.00000
-5       0.00490     host ceph2
 1   hdd 0.00490         osd.1         up  1.00000 1.00000
-7       0.00980     host ceph3
 2   hdd 0.00490         osd.2         up  1.00000 1.00000
 3   hdd 0.00490         osd.3         up  1.00000 1.00000
-9       0.00490     host owncloud
 4   hdd 0.00490         osd.4         up  1.00000 1.00000

2、先標記為out

[root@ceph1 ceph 08:23:56]# ceph osd out osd.4
marked out osd.4.
[root@ceph1 ceph 08:24:46]# ceph  osd  tree
ID CLASS WEIGHT  TYPE NAME         STATUS REWEIGHT PRI-AFF
-1       0.02449 root default
-3       0.00490     host ceph1
 0   hdd 0.00490         osd.0         up  1.00000 1.00000
-5       0.00490     host ceph2
 1   hdd 0.00490         osd.1         up  1.00000 1.00000
-7       0.00980     host ceph3
 2   hdd 0.00490         osd.2         up  1.00000 1.00000
 3   hdd 0.00490         osd.3         up  1.00000 1.00000
-9       0.00490     host owncloud
 4   hdd 0.00490         osd.4         up        0 1.00000
 可以看到權重為0但是狀態還是up

3、再rm刪除,但是要先去osd.4對應的節點上停止ceph-osd服務,否則刪除不了

[root@owncloud yum.repos.d 08:27:35]# systemctl stop  [email protected]

[root@ceph1 ceph 08:28:09]# ceph osd rm osd.4

removed osd.4

4、檢視叢集狀態

[root@ceph1 ceph 08:28:18]#
[root@ceph1 ceph 08:28:18]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_WARN 會有警告,是因為沒有在crush演算法中刪除
            1 osds exist in the crush map but not in the osdmap

  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3 
    mgr: ceph1(active), standbys: ceph2, ceph3
    osd: 4 osds: 4 up, 4 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   4.0 GiB used, 16 GiB / 20 GiB avail
    pgs:





此時再檢視,發現osd.4已經沒有up了

[root@ceph1 ceph 08:28:22]# ceph osd  tree
ID CLASS WEIGHT  TYPE NAME         STATUS REWEIGHT PRI-AFF
-1       0.02449 root default
-3       0.00490     host ceph1
 0   hdd 0.00490         osd.0         up  1.00000 1.00000
-5       0.00490     host ceph2
 1   hdd 0.00490         osd.1         up  1.00000 1.00000
-7       0.00980     host ceph3
 2   hdd 0.00490         osd.2         up  1.00000 1.00000
 3   hdd 0.00490         osd.3         up  1.00000 1.00000
-9       0.00490     host owncloud
 4   hdd 0.00490         osd.4        DNE        0
[root@ceph1 ceph 08:29:23]#

5、在crush演算法中和auth驗證中刪除

[root@owncloud yum.repos.d 08:32:29]# ceph osd crush remove osd.4
removed item id 4 name 'osd.4' from crush map
[root@owncloud yum.repos.d 08:32:43]# ceph auth del osd.4
updated

6、還需要在osd.4對應的節點上解除安裝磁碟

[root@owncloud yum.repos.d 08:33:04]# df -Th |grep  osd
tmpfs                   tmpfs     487M   52K  487M   1% /var/lib/ceph/osd/ceph-4

[root@owncloud yum.repos.d 08:33:30]# umount /var/lib/ceph/osd/ceph-4/
[root@owncloud yum.repos.d 08:33:50]# df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        47G  1.6G   46G   4% /
devtmpfs                devtmpfs  475M     0  475M   0% /dev
tmpfs                   tmpfs     487M     0  487M   0% /dev/shm
tmpfs                   tmpfs     487M   14M  473M   3% /run
tmpfs                   tmpfs     487M     0  487M   0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  133M  882M  14% /boot
tmpfs                   tmpfs      98M     0   98M   0% /run/user/0


在ceph1節點檢視驗證

[root@ceph1 ceph 08:29:23]# ceph osd  tree
ID CLASS WEIGHT  TYPE NAME         STATUS REWEIGHT PRI-AFF
-1       0.01959 root default
-3       0.00490     host ceph1
 0   hdd 0.00490         osd.0         up  1.00000 1.00000
-5       0.00490     host ceph2
 1   hdd 0.00490         osd.1         up  1.00000 1.00000
-7       0.00980     host ceph3
 2   hdd 0.00490         osd.2         up  1.00000 1.00000
 3   hdd 0.00490         osd.3         up  1.00000 1.00000
-9             0     host owncloud



到這裡,就完全刪除了。

如果想要加回來,再次部署在節點上即可

如下命令

[root@ceph1 ceph]# ceph-deploy disk zap ceph1 /dev/sdb 
[root@ceph1 ceph]# ceph-deploy osd create --data /dev/sdb ceph1

小結與說明

ceph叢集安裝要注意:

1、ceph-deploy命令預設找官方yum源,國內網速非常慢(而且ceph安裝時設定了300秒超時,也就是你安裝5分鐘內不安裝完就會斷開)

2、建議使用國內映象源(我使用的清華源),如果網速還是慢,就做好本地yum源。

3、ceph叢集節點需要安裝ceph與ceph-radosgw軟體包,客戶端節點只需要安裝ceph-common軟體包

4、ceph叢集對時間同步很敏感,請一定保證沒有時間不同的相關警告

ceph叢集操作注意:

任何操作一定要保證叢集健康的情況下操作,並使用ceph -s命令進行確認

修改配置檔案請在部署節點上修改,然後使用

ceph-deploy --overwriteconf admin ceph1 ceph2 ceph3命令同步到其它節點

ceph的儲存型別
三種儲存型別介紹

無論用那種儲存,都可以分為以下三種類型

檔案儲存:類似於一個大的目錄,多個客戶端可以掛載過來

優點:利於資料共享

缺點:速度較慢

塊儲存:類似於一個block的裝置,客戶端可以格式化,掛載並使用,和用一個硬碟一樣

優點:和本地硬碟一樣直接使用

缺點:資料不同享

物件儲存:看做一個綜合了檔案儲存和塊儲存優點的大硬碟,可以掛載也可以通過URL來訪問

優點:速度快,資料共享

缺點:成本高,不相容現有的模式

RADOS;ceph的高可靠,高可擴充套件、高效能、高自動化都是由這一層來提供的,使用者資料的儲存最終也是通過這一層來進行儲存的

可以說RADOS就是ceph底層的原生態的資料引擎,但是實際應用時卻不直接使用它,而是分為以下4種方式來使用:

LIBRADOS是一個庫, 它允許應用程式通過訪問該庫來與RADOS系統進行交 互,支援多種程式語言。如Python,C,C++等. 簡單來說,就是給開發人員使 用的介面。

CEPH FS通過Linux核心客戶端和FUSE來提供檔案系統。(檔案儲存)

RBD通過Linux核心客戶端和QEMU/KVM驅動來提供一個分散式的塊設 備。(塊儲存)

RADOSGW是一套基於當前流行的RESTFUL協議的閘道器,並且相容S3和 Swift。(物件儲存)

儲存原理

要實現資料存取需要建一個pool,建立pool要分配PG。

如果客戶端對一個pool寫了一個檔案,那麼這個檔案是如何分佈到多個節點的磁碟上呢?

答案是通過crush演算法

CRUSH演算法

CRUSH(Controlled Scalable Decentralized Placement of Replicated Data)演算法為可控的,可擴充套件的,分散式的副本資料放置演算法的簡稱。 PG到OSD的對映的過程演算法叫做CRUSH 演算法。(一個Object需要儲存三個 副本,也就是需要儲存在三個osd上)。

CRUSH演算法是一個偽隨機的過程,他可以從所有的OSD中,隨機性選擇一 個OSD集合,但是同一個PG每次隨機選擇的結果是不變的,也就是對映的 OSD集合是固定的。

小結:

1、客戶端直接對pool操作(但檔案儲存、塊儲存、物件儲存區我們不這麼做)

2、pool裡面要分配PG

3、PG裡面可以存放多個物件

4、物件就是客戶端寫入的資料分離單位

5、crush演算法將客戶端寫入的資料對映分佈到OSD,從而最終存放到物理磁碟上。

RADOS原生資料存取
1、建立pool並測試

建立test_pool 指定pg數為128

[root@ceph1 ceph 09:03:17]# ceph osd pool create test_pool 128
pool 'test_pool' created

修改pg數量,可以使用修改調整

ceph osd pool set test_pool  pg_num 64

檢視數量

[root@ceph1 ceph 09:03:32]# ceph osd pool  get test_pool pg_num
pg_num: 128
[root@ceph1 ceph 09:03:46]#

說明:pg數與osd數量關係

pg數為2的倍數,一般為5個一下osd,分為128個PG或者一下即可

可以使用ceph osd pool set test_pool pg_num 64 這樣的命令來嘗試調整。

2、儲存測試

1、我這裡把本機的/etc/fstab檔案上傳到test_pool並取名為netfatab

[root@ceph1 ceph 09:11:12]# rados put newfatab /etc/fstab  --pool=test_pool

2、檢視

[root@ceph1 ceph 09:11:19]# rados -p test_pool ls
newfatab
[root@ceph1 ceph 09:11:47]#

3、刪除並檢視

[root@ceph1 ceph 09:12:45]# rados rm newfatab --pool=test_pool
[root@ceph1 ceph 09:13:16]# rados -p test_pool ls

3、刪除pool

1、在部署節點ceph1上增加引數允許ceph刪除pool

[root@ceph1 ceph 09:15:29]# cat ceph.conf
[global]
fsid = bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
mon_initial_members = ceph1
mon_host = 10.0.0.5
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

public network = 10.0.0.0/24
mon_allow_pool_delete = true
增加最後一條資訊



2、修改了配置,要同步到其他叢集節點

[root@ceph1 ceph 09:17:19]# ceph-deploy --overwrite-conf admin ceph1 ceph2 ceph3

3、重啟監控服務

[root@ceph1 ceph 09:17:42]# systemctl restart  ceph-mon.target

4、刪除pool名輸入兩次,後接--yes-i-really-really-mean-it引數就可以刪 除了

[root@ceph1 ceph 09:17:52]# ceph osd pool delete test_pool test_pool --yes-i-really-really-mean-it
pool 'test_pool' removed
[root@ceph1 ceph 09:19:23]#

建立ceph檔案儲存

要執行ceph檔案系統,你必須先建立至少一個帶mds的ceph儲存叢集

(ceph塊裝置和ceph物件儲存都不使用MDS)

ceph MDS為ceph檔案儲存型別存放元資料metadata

1、在ceph1節點部署上同步配置檔案,並建立MDS(也可以做多個mds實現HA)

ceph-deploy mds  create ceph1 ceph2 ceph3

2、一個ceph檔案系統需要至少兩個RADOS儲存池,一個用於資料,一個用於元資料。所以我們建立他們

[root@ceph1 ceph 09:24:47]# ceph osd  pool create cephfs_pool 128
pool 'cephfs_pool' created

[root@ceph1 ceph 09:25:06]# ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created

[root@ceph1 ceph 09:25:27]# ceph osd pool ls |grep  cephfs
cephfs_pool
cephfs_metadata

3、建立ceph檔案系統並確認客戶端訪問的節點

[root@ceph1 ceph 09:26:38]# ceph fs new cephfs cephfs_metadata cephfs_pool
new fs with metadata pool 3 and data pool 2

[root@ceph1 ceph 09:26:59]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_pool ]

[root@ceph1 ceph 09:27:09]# ceph mds stat
cephfs-1/1/1 up  {0=ceph3=up:active}, 2 up:standby
[root@ceph1 ceph 09:27:17]#

4、客戶端準備key驗證檔案

說明:ceph預設啟用了cephx認證,所以客戶端的掛載必須要認證

[root@lsy ~ 09:52:52]# mount -t ceph  10.0.0.5:6789:/ /mnt -o name=admin,secret=AQBQ0J5eLDHnLRAAf850/HEvbZd3DAvWE8czrA==
[root@lsy ~ 09:54:04]# df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        47G  3.6G   44G   8% /
devtmpfs                devtmpfs  475M     0  475M   0% /dev
tmpfs                   tmpfs     487M     0  487M   0% /dev/shm
tmpfs                   tmpfs     487M   14M  473M   3% /run
tmpfs                   tmpfs     487M     0  487M   0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  133M  882M  14% /boot
tmpfs                   tmpfs      98M     0   98M   0% /run/user/0
10.0.0.5:6789:/         ceph      5.0G     0  5.0G   0% /mnt
[root@lsy ~ 09:54:13]#

這樣的方式可以

但是使用檔案金鑰的方式我就實現不出來。

[root@lsy ~ 10:05:42]# mount -t ceph ceph1:6789:/   /mnt -o name=admin,secretfile=/root/admin.key
mount: wrong fs type, bad option, bad superblock on ceph1:6789:/,
       missing codepage or helper program, or other error

   In some cases useful info is found in syslog - try
   dmesg | tail or so.

幾種方式的總結:見部落格

https://blog.csdn.net/weixin_42506599/article/details/105669234

刪除檔案儲存方法

1、在客戶端上刪除資料,並umount所有掛載

[root@lsy ~ 10:24:55]# rm /mnt/* -rf
[root@lsy ~ 10:25:04]#
[root@lsy ~ 10:25:05]# umount /mnt/
[root@lsy ~ 10:25:09]# df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        47G  3.6G   44G   8% /
devtmpfs                devtmpfs  475M     0  475M   0% /dev
tmpfs                   tmpfs     487M     0  487M   0% /dev/shm
tmpfs                   tmpfs     487M   14M  473M   3% /run
tmpfs                   tmpfs     487M     0  487M   0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  133M  882M  14% /boot
tmpfs                   tmpfs      98M     0   98M   0% /run/user/0
[root@lsy ~ 10:25:11]#



2、停止所有節點的MDS(只有停掉MDS才可以刪除檔案系統)

[root@ceph1 ~]# systemctl stop ceph-mds.target 

[root@ceph2 ~]# systemctl stop ceph-mds.target 

[root@ceph3 ~]# systemctl stop ceph-mds.target

3、回到ceph1刪除

[root@ceph1 ceph 10:26:48]# ceph  fs rm cephfs --yes-i-really-mean-it
[root@ceph1 ceph 10:29:25]# ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it
pool 'cephfs_metadata' removed
[root@ceph1 ceph 10:30:04]# ecph osd pool delete cephfs_pool cephfs_pool --yes-i-really-really-mean-it
bash: ecph: command not found
[root@ceph1 ceph 10:30:43]# ceph osd pool delete cephfs_pool cephfs_pool --yes-i-really-really-mean-it
pool 'cephfs_pool' removed

此時檢視裝態為err

[root@ceph1 ceph 10:26:19]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_ERR
            1 filesystem is degraded
            1 filesystem has a failed mds daemon
            1 filesystem is offline
            insufficient standby MDS daemons available

  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active), standbys: ceph2, ceph3
    mds: cephfs-0/1/1 up , 1 failed
    osd: 4 osds: 4 up, 4 in

  data:
    pools:   2 pools, 192 pgs
    objects: 22  objects, 3.1 KiB
    usage:   4.0 GiB used, 16 GiB / 20 GiB avail
    pgs:     192 active+clean

4、再次啟動mds服務

[root@ceph1 ceph 10:32:34]# systemctl start  ceph-mds.target

此時檢視狀態,又回到健康狀態

[root@ceph1 ceph 10:32:44]# ceph -s
  cluster:
    id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active), standbys: ceph2, ceph3
    osd: 4 osds: 4 up, 4 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   4.0 GiB used, 16 GiB / 20 GiB avail
    pgs:



建立ceph塊儲存
1、建立塊儲存並使用

1、建立儲存池並初始化

[root@ceph1 ceph 10:35:32]# ceph osd pool create rbd_pool 8
pool 'rbd_pool' created
[root@ceph1 ceph 10:35:47]# rbd pool init rbd_pool

2、建立一個儲存卷volume1,大小為5000M

[root@ceph1 ceph 10:37:06]# rbd  create volume1 --pool rbd_pool --size 5000
[root@ceph1 ceph 10:37:35]# rbd ls rbd_pool
volume1
[root@ceph1 ceph 10:37:45]# rbd info volume1 -p rbd_pool
rbd image 'volume1':
        size 4.9 GiB in 1250 objects
        order 22 (4 MiB objects)
        id: 5ed46b8b4567
        block_name_prefix: rbd_data.5ed46b8b4567
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features:
        flags:
        create_timestamp: Tue Apr 21 10:37:35 2020
[root@ceph1 ceph 10:38:03]#



4、將建立的卷對映為塊裝置

因為rbd映象的一些特性,OS kernel並不支援,所以對映報錯

[root@ceph1 ceph 10:39:55]# rbd map rbd_pool/volume1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd_pool/volume1 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
[root@ceph1 ceph 10:40:10]#

解決方法:distable相關特性

(四者之間有先後順序問題)

[root@ceph1 ceph 10:44:36]#  rbd feature disable rbd_pool/volume1  fast-diff
[root@ceph1 ceph 10:45:42]#  rbd feature disable rbd_pool/volume1  object-map
[root@ceph1 ceph 10:45:45]#  rbd feature disable rbd_pool/volume1  exclusive-lock
[root@ceph1 ceph 10:46:02]#
[root@ceph1 ceph 10:48:17]#  rbd feature disable rbd_pool/volume1  deep-flatten


再次對映

[root@ceph1 ceph 10:48:49]# rbd map rbd_pool/volume1
/dev/rbd0

5、檢視對映(如果要取消對映,可以使用rbd unmap /dev/rbd0)

[root@ceph1 ceph 10:50:17]# rbd showmapped
id pool     image   snap device
0  rbd_pool volume1 -    /dev/rbd0
[root@ceph1 ceph 10:50:28]#

6、格式化掛載

[root@ceph1 ceph 10:50:51]# mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=8, agsize=160768 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1280000, 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@ceph1 ceph 10:51:03]# mount /dev/rbd0  /mnt/
df[root@ceph1 ceph 10:51:15]# df -Th |tail -1
/dev/rbd0               xfs       4.9G   33M  4.9G   1% /mnt
[root@ceph1 ceph 10:51:24]#



補充:第二個客戶端如果也要用此塊儲存,只需要執行以下幾步就可以

[root@ceph2 yum.repos.d 10:52:45]# rbd  map rbd_pool/volume1
/dev/rbd0
[root@ceph2 yum.repos.d 10:53:03]# rbd showmapped
id pool     image   snap device
0  rbd_pool volume1 -    /dev/rbd0
[root@ceph2 yum.repos.d 10:53:10]# mount /dev/rbd0 /mnt/
[root@ceph2 yum.repos.d 10:53:24]# df -Th |tail -1
/dev/rbd0               xfs       4.9G   33M  4.9G   1% /mnt
[root@ceph2 yum.repos.d 10:53:31]#



注意:塊儲存是不能實現同讀和同寫的,請不要兩個客戶端同時掛載進行讀寫。

2、刪除塊儲存方法
[root@ceph2 yum.repos.d 10:53:31]# umount /mnt/
[root@ceph2 yum.repos.d 10:55:03]# rbd unmap /dev/rbd0
[root@ceph2 yum.repos.d 10:55:15]# ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it
pool 'rbd_pool' removed
[root@ceph2 yum.repos.d 10:55:54]#

建立物件儲存閘道器

rgw(物件儲存閘道器):為客戶端訪問物件儲存的介面

rgw的建立

1、在ceph叢集任意一個節點上建立rgw(我這裡為ceph1)

確保你已經裝了這個軟體包

[root@ceph1 ceph 11:11:37]# yum install -y ceph-radosgw

建立rgw

[root@ceph1 ceph 11:11:37]# ceph-deploy rgw create ceph1

2、驗證7480埠

[root@ceph1 ceph 11:11:25]# lsof -i:7480
COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
radosgw 121388 ceph   41u  IPv4 1625237      0t0  TCP *:7480 (LISTEN)

物件閘道器建立成功,後面的專案中我們會通過ceph1的物件閘道器來連線就可以使用了。

連線的地址為10.0.0.5:7480

小結與說明:

我們實現了ceph叢集,並建立了三中型別儲存,那麼如何使用這些儲存呢?

在不同的場景與應用中,會需要不同型別的儲存型別,並不是說在一個專案裡要把三中型別都用到

在後面的專案中,我們會分別用到這三種不同的型別。