作者 主題: Building a CEPH cluster with SSD cache  (閱讀 110 次)

0 會員 與 1 訪客 正在閱讀本文。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17423
    • 檢視個人資料
    • http://www.study-area.org
Building a CEPH cluster with SSD cache
« 於: 2019-05-09 00:30 »

Building a CEPH cluster with SSD cache

Author: netman<netman@study-area.org>
Date: 2019-05-09


1. 環境
  網路: 192.168.100.0/24
  作業系統:CentOS 7.6 (1810), 安裝套件: Server with GUI
  主機:
   node1: 192.168.100.21
   node2: 192.168.100.22
   node3: 192.168.100.23
   srv1:  192.168.100.1 (不參與 ceph cluster, 單純用來操作 ceph 部署)
  硬碟:
   node1:
      sda (SSD, 作 cache 用)
      sdb (HDD, 做 ceph storage 用)
   node2:
      sda (SSD, 作 cache 用)
      sdb (HDD, 做 ceph storage 用)
   node3:
      sdd (SSD, 作 cache 用)
      sdc (HDD, 做 ceph storage 用)



2. 必要前提條件
2.1 srv1 可以免用密碼直接 ssh 到三個 node 以 root 身份執行命令
2.2 全部主機關閉 firewalld 與 selinux
2.3 全部主機 /etc/hosts 都有彼此的名稱解析 (或透過 DNS)
2.4 全部主機執行過 yum update -y 更新到最新狀態
2.5 於所有主機安裝 epel repo:
   yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm



3. 執行安安裝與建置
(以下操作均於 srv1 完成)

# 建立 ceph-deploy repo
cat << EOM > /etc/yum.repos.d/ceph-deploy.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

# 安裝 ceph-deploy
yum install -y ceph-deploy

# 建立安裝目錄
mkdir my-cluster
cd my-cluster

# 建立初始 ceph.conf
cat > ceph.conf <<END
[global]
fsid = c8678875-c948-4d5c-b349-77868857150e
mon initial members = node1,node2,node3
mon host = 192.168.100.1,192.168.100.2,192.168.100.3
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
public network = 192.168.100.0/24
END

# 開始安裝
ceph-deploy install node1 node2 node3
ceph-deploy new node1 node2 node3
ceph-deploy mon create-initial
ceph-deploy admin node1 node2 node3
ceph-deploy mgr create node1 node2 node3
ceph-deploy mds create node1 node2 node3

# 確認所有主機可以執行 ceph -s 並確認狀態 OK
ssh node1 ceph -s
ssh node2 ceph -s
ssh node3 ceph -s

# 查看 node1 硬碟並確認磁碟名稱
ssh node1 lsblk

# 初始化 node1 硬碟
ceph-deploy disk zap node1 /dev/sda
ceph-deploy disk zap node1 /dev/sdb
ceph-deploy osd create --data /dev/sda node1
ceph-deploy osd create --data /dev/sdb node1

# 確認 node1 硬碟結果
ssh node1 lsblk

# 初始化 node2 硬碟:
ssh node2 lsblk
ceph-deploy disk zap node2 /dev/sda
ceph-deploy disk zap node2 /dev/sdb
ceph-deploy osd create --data /dev/sda node2
ceph-deploy osd create --data /dev/sdb node2
ssh node2 lsblk

# 初始化 node3 硬碟:
ssh node3 lsblk
ceph-deploy disk zap node3 /dev/sdd
ceph-deploy disk zap node3 /dev/sdc
ceph-deploy osd create --data /dev/sdd node3
ceph-deploy osd create --data /dev/sdc node3
ssh node3 lsblk


4. 設定 ceph cluster
# 以下操作在 node1 完成 (事實上在 cluster 中任何 node 中執行都可以)
ssh node1

# 確認 osd 狀態
ceph -s

# 計算 pg num
echo '(3*100)/3/6' | bc
## 公式:Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count
## 說明:環境中有總共6顆硬碟(3 x SSD + 3 x HDD),但因爲 SSD 會拿來做 cache 用,
##   因此我不太確定這裏應該用 3 個 OSD 還是 6 個?我先假設 3 個。
##   pool 的數量我這裏先假設 6 個
##    計算結果爲 16,但我在 HDD storage 中將調高爲 32

# 確認 osd class (應該會自動分配爲 ssd 與 hdd)
ceph osd crush class ls
ceph osd tree

# 建立 class rule
ceph osd crush rule ls
ceph osd crush rule create-replicated rule-ssd default host ssd
ceph osd crush rule create-replicated rule-hdd default host hdd
ceph osd crush rule ls

# 建立 ceph pool
## 說明:這裏我暫時不打算直接建 rbd 來使用,而是建立 cephfs 以 mount 的方式共享到全部主機,
##   一個 cephfs 需要兩個 pool: data-pool 與 metadata-pool, 名稱可以隨意命名,
##   我這裏打算將 metadata-pool 直接建在 SSD 上,而 data-pool 則設定爲使用 SSD 作 cache,
##   使用 SSD cache 是 ceph tier 的功能,有很多可以細調的地方,我這裏就全部略過了...
##   再來,我這裏規劃會建立兩個 ceph fs ,因此必須啓動 ceph fs 旗標 enable_multiple,
##   因此,我的 HDD storage 將會建立兩個 pool,但 SSD 則會建立四個 pool。

# 啓動旗標
ceph fs flag set enable_multiple true --yes-i-really-mean-it

# 建立第一個 cephfs
# 在 SSD 建 cache
ceph osd pool create fs1cache 16 16 rule-ssd
# 在 HDD 建 data-pool
ceph osd pool create fs1data 32 32 rule-hdd
# 在 SSD 建 metadata-pool
ceph osd pool create fs1metadata 16 16 rule-ssd
# 建 SSD cache
ceph osd tier add fs1data fs1cache
# 設定 cache 模式
ceph osd tier cache-mode fs1cache writeback
# 設定 cache hit_set_type
ceph osd pool set fs1cache hit_set_type bloom
# 建立 cephfs
ceph fs new fs1 fs1metadata fs1data

# 建立第二個 cephfs
ceph osd pool create fs2cache 16 16 rule-ssd
ceph osd pool create fs2data 32 32 rule-hdd
ceph osd pool create fs2metadata 16 16 rule-ssd
ceph osd tier add fs2data fs2cache
ceph osd tier cache-mode fs2cache writeback
ceph fs new fs2 fs2metadata fs2data

# 確認 pool 數量與名稱
ceph -s
ceph osd lspools


5. 掛載 CEPH FileSystem

# 以下在 node 1 執行
ssh node1

# 建立掛載點
mkdir /cepffs1 /cephfs2

# 提取 admin secret
awk '/key = /{print $NF}' /etc/ceph/ceph.client.admin.keyring > /etc/ceph/admin.secret

# 修改 fstab
# 說明: 我這裏的設計是,每一主機不直接連接自己的服務,而是分散連接其他主機。
#   由於是同一 ceph 節點下使用兩個不同的 fs,所以必須在 options 中以 mds_namespace 來指定 fs name
cat >>/etc/fstab << END
192.168.100.22:6789,192.168.100.23:6789:/ /cephfs1 ceph name=admin,secretfile=/etc/ceph/admin.secret,noatime,_netdev,mds_namespace=fs1 0 0
192.168.100.22:6789,192.168.100.23:6789:/ /cephfs2 ceph name=admin,secretfile=/etc/ceph/admin.secret,noatime,_netdev,mds_namespace=fs2 0 0
END

# 執行掛載(確認沒有 error)
mount -a

# 確認掛載
# 注意:如果用 df 命令只能看到其中一筆而已
mount

# 退出 node1
exit


# 以下在 node 2 執行
ssh node2
mkdir /cepffs1 /cephfs2
awk '/key = /{print $NF}' /etc/ceph/ceph.client.admin.keyring > /etc/ceph/admin.secret
cat >>/etc/fstab << END
192.168.100.21:6789,192.168.100.23:6789:/ /cephfs1 ceph name=admin,secretfile=/etc/ceph/admin.secret,noatime,_netdev,mds_namespace=fs1 0 0
192.168.100.21:6789,192.168.100.23:6789:/ /cephfs2 ceph name=admin,secretfile=/etc/ceph/admin.secret,noatime,_netdev,mds_namespace=fs2 0 0
END
mount -a
mount
exit


# 以下在 node 3 執行
ssh node3
mkdir /cepffs1 /cephfs2
awk '/key = /{print $NF}' /etc/ceph/ceph.client.admin.keyring > /etc/ceph/admin.secret
cat >>/etc/fstab << END
192.168.100.21:6789,192.168.100.22:6789:/ /cephfs1 ceph name=admin,secretfile=/etc/ceph/admin.secret,noatime,_netdev,mds_namespace=fs1 0 0
192.168.100.21:6789,192.168.100.22:6789:/ /cephfs2 ceph name=admin,secretfile=/etc/ceph/admin.secret,noatime,_netdev,mds_namespace=fs2 0 0
END
mount -a
mount
exit

#---- END ----#