1. 程式人生 > >部署ceph叢集

部署ceph叢集

ceph是分散式檔案系統

1.安裝ceph-deploy

在admin節點新增Ceph的yum源倉庫,然後再安裝ceph-deploy

1.1啟用extras倉庫

//如果是別的源就用別的源
sudo subscription-manager repos --enable=rhel-7-server-extras-rpms

1.2安裝並使用Extra Packages for Enterprise Linux (EPEL)倉庫

sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.
noarch.rpm

1.3 新增ceph倉庫

新增ceph倉庫到/etc/yum.repos.d/ceph.repo 。把{ceph-stable-release}替換為你想要的ceph版本,如luminous

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

[ceph]
name
=Ceph packages for $basearch baseurl=http://download.ceph.com/rpm-luminous/el7/$basearch enabled=1 priority=2 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc [ceph-source] name=Ceph source packages baseurl=http://download.ceph.com/rpm-luminous/el7/SRPMS enabled=0 priority=2 gpgcheck=1 type
=rpm-md gpgkey=https://download.ceph.com/keys/release.asc EOM

更新倉庫(可選)並安裝ceph-deploy

sudo yum update
sudo yum install ceph-deploy

2.ceph節點安裝

admin節點必須可以免密通過ssh登入ceph節點。當ceph-deploy作為一個使用者登入到ceph node的時候,這個使用者必須擁有免密的sudo許可權。

2.1 安裝ntp

ntp是網路時間同步工具,可以同步各個節點的時間。

建議在ceph節點(特別是ceph monitor節點)安裝ntp,以防止時間錯誤。

sudo yum install ntp ntpdate ntp-doc

如果提示有衝突,就先刪除已有的相關軟體,然後再執行一次。

確保已經開啟了ntp服務,並確保每個節點的ntp都使用了一樣的server。

//1.配置啟動項
chkconfig ntpd on
//2.同步時間
ntpdate -u cn.pool.ntp.org
//3.啟動ntpd服務
systemctl start ntpd
//4.驗證ntp服務已經執行
pgrep ntpd

2.2 安裝ssh server

所有的ceph node都需要執行以下步驟:
1.每個節點都安裝ssh server

sudo yum install openssh-server

2.確保ssh server在所有ceph node上都在執行。

2.3建立一個ceph部署使用者

ceph-deploy必須要作為一個擁有免密sudo許可權的使用者登入到ceph node,因為它需要在不提供密碼的情況下安裝軟體與配置檔案。

最近版本的ceph-deploy提供了一個–username選項去讓你指定任意擁有免密sudo許可權的使用者(包括root,但是不建議用root)。想要使用ceph-deploy的–username {username},你指定的使用者必須擁有免密ssh許可權登入ceph node,因為ceph deploy不會問你要密碼。

ceph推薦在所有ceph node上為ceph-deploy建立特定使用者。但是不要用“ceph”作為使用者名稱。叢集內採用統一的使用者名稱可以降低使用難度(不必須),但是你要避免使用太明顯的使用者名稱,因為黑客會使用一般的使用者名稱進行攻擊(比如root,admin,產品名)。下面解釋如何建立免密sudo許可權使用者:

1.在每個ceph節點建立新使用者

注意,在admin節點也是這個使用者,使用者名稱最好一致!

sudo useradd -d /home/{username} -m {username}
sudo passwd {username}

2.為該使用者獲取免密sudo許可權

echo "{username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username}
sudo chmod 0440 /etc/sudoers.d/{username}

2.4 實現免密ssh登入

由於ceph-deploy不會提示輸入密碼,你必須在admin node生成ssh keys並且分發公鑰給每個ceph node。

1.生成ssh keys,但是不要使用sudo或是root使用者,把passphrase留空:

ssh-keygen

Generating public/private key pair.
Enter file in which to save the key (/ceph-admin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /ceph-admin/.ssh/id_rsa.
Your public key has been saved in /ceph-admin/.ssh/id_rsa.pub.

2.複製公鑰到ceph node,把{username}替換為你建立的ceph deploy使用者,把node替換為ceph node的ip。

ssh-copy-id {username}@node1
ssh-copy-id {username}@node2
ssh-copy-id {username}@node3

3.(建議)在admin node上修改~/.ssh/config檔案,這樣的話ceph-deploy可以在你每次用ceph-deploy登入到ceph node的ceph-deploy使用者,而不需要你指定–username {username}。這有利於簡化ssh和scp的使用。

Host node1
   Hostname node1
   User {username}
Host node2
   Hostname node2
   User {username}
Host node3
   Hostname node3
   User {username}

2.5 在啟動時啟用網路

ceph osds通過網路彼此協作或向ceph monitors報告。如果網路預設關閉,ceph叢集就無法在啟動過程中聯網,直到你連線上網路。

一些lunix發行版(如centos)的網路介面預設關閉。為了確認ceph守護程序可以彼此溝通,需要確認網路介面開啟。例如,在rh與centos,檢視/etc/sysconfig/network-scripts下的ifcfg-{iface}檔案裡的ONBOOT設定為yes。

2.6 確保連通性

通過ping hostnames(hostname -s)來確保聯通性。

note: hostnames需要解析到ip地址,但不能是127.0.0.1。如果你的admin node也被作為一個ceph node,你同樣需要確保它解析hostname到ip地址。

2.7開啟需要到埠

如果把防火牆關了就不用看這一步

ceph monitor預設通過6789埠進行溝通。ceph osds預設通過6800:7300之間的埠溝通。Ceph OSDs可以使用多個網路與clients,monitors,其他osds(為了複製),其他osd(為了心跳訊號)。

一些發行版(如rh),預設防火牆配置很嚴格。你也許需要去調整你的防火牆設定去允許訪問申請,這樣網路內的守護程序可以交流。

rh7的防火牆,在public zone,為ceph monitor節點新增ceph-min service,為OSDs and MDSs新增ceph service,並確保您將設定設定為永久性(permanent)的,以便在重新啟動時啟用它們。

例如,在monitors:

sudo firewall-cmd --zone=public --add-service=ceph-mon --permanent

在osds 和 mdss:

sudo firewall-cmd --zone=public --add-service=ceph --permanent

一旦你在防火牆配置里加了--permanent,你可以通過重啟防火牆來動態更改配置:

sudo firewall-cmd --reload

對於iptables(與firewall一樣功能的另一種防火牆管理工具),為ceph monitors新增6789埠,為ceph osds新增6800:7300埠,例如

sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT

一旦你完成來iptables的配置,確保你當的節點重啟時,你的這些變更是持久化的。例如:

/sbin/service iptables save

2.7 tty

On CentOS and RHEL, you may receive an error while trying to execute ceph-deploy commands. If requiretty is set by default on your Ceph nodes, disable it by executing sudo visudo and locate the Defaults requiretty setting. Change it to Defaults:ceph !requiretty or comment it out to ensure that ceph-deploy can connect using the user you created with Create a Ceph Deploy User.

Note If editing, /etc/sudoers, ensure that you use sudo visudo rather than a text editor.

2.8 selinux

在centos和rh,selinux預設是開啟的。為了經驗你的安裝,建議關閉selinux並且確保您的安裝和叢集在加強配置之前正常工作。用以下程式碼關閉selunix:

sudo setenforce 0

修改/etc/selinux/config檔案來永久關閉selinux:

SELINUX=disabled

2.9首選項

確保你的package manager安裝並啟用了首選項包。centos,你也許需要安裝epel(第一步我們已經安裝了)。在rh,你也許需要啟用可選倉庫。

sudo yum install yum-plugin-priorities

例如,在rh7,執行以下程式碼去安裝yum-plugin-priorities且啟用rhel-7-server-optional-rpms倉庫:

sudo yum install yum-plugin-priorities --enablerepo=rhel-7-server-optional-rpms

3.快速開始

前2步我們做好了安裝ceph的前期準備工作,下面開始正式安裝ceph。

在admin node上建立一個目錄,用來存放ceph-deploy為叢集生成的配置檔案和key。

mkdir my-cluster
cd my-cluster

ceph-deploy會輸出檔案到這個目錄,一定要確保在當前目錄下執行ceph-deploy。

3.1開始之前的注意事項

如果在任何時候,你遇到了問題並且向重新開始,執行以下命令去刪除ceph packages,並且刪除所有的與之相關的data和配置:

ceph-deploy purge {ceph-node} [{ceph-node}]
ceph-deploy purgedata {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys
rm ceph.*

如果你執行了刪除,以必須重新安裝ceph。最後一個命令刪除了所有ceph-deploy在安裝過程中寫入的檔案。

3.2建立叢集

在admin node的你建立的用來儲存配置檔案的目錄(my-cluster)下,用ceph-deploy執行以下步驟:

1.建立叢集:
注意,如果你為ceph-deploy建立的使用者,例如:userceph,那麼在admin node上執行ceph-deploy 命令的使用者也要是ceph-deploy

ceph-deploy new {initial-monitor-node(s)}

指定節點的hostname(所以你要去/etc/hosts里加入叢集內的主機資訊),fqdn(不知道是啥)或hostname:fqdn,例如:

ceph-deploy new node1

用ls和cat命令去檢查當前目錄的輸出。你會看到一個ceph的配置檔案(ceph.conf),一個monitor secret keyring(ceph.mon.keyring),還有一個關於新叢集的日誌檔案。可以通過ceph-deploy new -h檢視詳細資訊

3.3 安裝ceph包

在各個ceph節點安裝ceph

ceph-deploy install {ceph-node} [...]

例如:

ceph-deploy install node1 node2 node3

ceph-deploy將會在每個節點安裝ceph
也可以自己手動安裝

sudo yum -y install ceph ceph-osd ceph-mds ceph-mon ceph-radosgw

3.4部署初始monitor並收集keys

初始化monitor

ceph-deploy mon create-initial

一旦你完成了這一步,你的當前目錄將會看到如下keyrings:
- ceph.client.admin.keyring
- ceph.bootstrap-mgr.keyring
- ceph.bootstrap-osd.keyring
- ceph.bootstrap-mds.keyring
- ceph.bootstrap-rgw.keyring
- ceph.bootstrap-rbd.keyring

如果程序失敗且返回一個類似於“Unable to find /etc/ceph/ceph.client.admin.keyring”的錯誤資訊,請確保ceph.conf中的monitor node的ip是公共ip(也就是可以ping通咯),不是私有ip(如127.0.0.1)

3.5 複製配置檔案和key

上一步我們初始化了monitor並生成了keyring,現在我們通過ceph-deploy拷貝配置檔案和admin key到admin node和ceph node,這樣的話你就可以在使用ceph cli時不用每次都去指定monitor address和ceph.client.admin.keyring。

ceph-deploy admin {ceph-node(s)}

例如

ceph-deploy admin node1 node2 node3

3.6部署manager daemon(只有luminous+ 版本需要)

ceph-deploy mgr create node1  *Required only for luminous+ builds, i.e >= 12.x builds*

3.7新增三個osd

這一步,假設你在每個節點都有一個沒有使用的硬碟,名字是/dev/vdb。確認這個硬碟沒有在使用且沒有含有任何重要資料。

ceph-deploy osd create –data {device} {ceph-node}

例如

ceph-deploy osd create --data /dev/vdb node1
ceph-deploy osd create --data /dev/vdb node2
ceph-deploy osd create --data /dev/vdb node3

==注意:我安裝的時候,osd節點的機器硬碟被lvm(邏輯卷,也就是/dev/mapper/下的的東西)佔用了。可以用lvs,lvdisplay,pvs,pvdisplay分別檢視邏輯卷和物理卷的詳細情況。我移除了邏輯卷,釋放了物理卷/dev/sdc==

3.8 檢查叢集健康狀況

ssh node1 sudo ceph health

你的叢集應該返回HEALTH_OK。你可以通過以下程式碼檢視更詳細的叢集狀態:

ssh node1 sudo ceph -s

4.擴充套件叢集

一旦你有了一個基礎叢集並正在執行,下一步就是去擴充套件叢集。新增一個Ceph Metadata Server到node1。然後新增一個Ceph Monitor和Ceph Manager到node2和node3去實現可靠性和可用性。

4.1 新增一個metadata server

想要使用CephFS,你需要至少一個metadata server。執行以下命令去建立一個metadata server:

ceph-deploy mds create {ceph-node}

例如

ceph-deploy mds create node1

4.2 新增monitors

一個ceph儲存叢集需要至少一個monitor和一個manager去執行。為了高可用,ceoh儲存叢集一般執行多個monitors,這樣的話某個monitor失效了不會拖累整個叢集。ceph使用Ceph使用Paxos演算法,這需要大多數monitor(也就是說,比monitor總數的一半還多)去組成一個quorum。奇數的monitor往往更好,但這不是必需的。
新增兩個ceph monitor到叢集:

ceph-deploy mon add {ceph-nodes}

例如:

ceph-deploy mon add node2 node3

注意,如果安裝過程中報錯了。請做如下處理:

#1.編輯admin節點的之前生成的cenf.conf檔案,
#把你要新增的節點hostname,ip加進去
#並加入public_network
[global]
fsid = a443f987-c3d2-4e7e-9783-82640b97814d
mon_initial_members = ERP-CEPH-TEST2,ERP-CEPH-TEST3
mon_host = 10.59.1.136,10.59.1.137
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public_network = 10.59.1.0/24

#3.再執行一次mon add
ceph-deploy --overwrite-conf mon add node2 node3

一旦你添加了新的monitor,ceph將會開始同步這個monitor並且組成quorum。你可以通過以下命令檢視quorum狀態:

ceph quorum_status --format json-pretty

tip:當你執行多個monitor時,你需要在每個monitor機器上安裝配置ntp。確保ntp與monitor一同執行

4.3新增managers

ceph manager守護程序使用activ/stanby模式。部署額外的manager守護程序可以確保當一個守護程序或節點失效時,另外一個可以接管而不影響服務。

用以下程式碼去部署額外的manager守護程序:

ceph-deploy mgr create node2 node3

你應該可以通過以下命令看到處於standby狀態的managers:

ssh node1 sudo ceph -s

4.4新增一個RGW例項

想要使用Ceph Object Gateway元件,你必須部署一個rgw例項。執行以下程式碼去建立一個rgw例項:

ceph-deploy rgw create {gateway-node}

例如:

ceph-deploy rgw create node1

預設情況下,rgw監聽7480埠。這個預設埠可以通過編輯執行rgw的節點上的ceph.conf來實現:

[client]
rgw frontends = civetweb port=80

如果用的是ipv6:

[client]
rgw frontends = civetweb port=[::]:80

5.儲存/檢索物件資料

想要在ceph儲存叢集裡儲存object data,一個ceph客戶端必須:
1. 設定一個object name
2. 指定一個pool

Ceph Client檢索最新的叢集對映,CRUSH演算法計算如何將物件對映到placement group,然後計算如何動態地將placement group分配給Ceph OSD守護程序。想要找到object地址,你只需要object名稱和pool名稱。例如:

ceph osd map {poolname} {object-name}

練習:

1.建立一個檔案,指定它的object name,並存入指定pool裡

echo {Test-data} > testfile.txt
ceph osd pool create mytest 8
rados put {object-name} {file-path} --pool=mytest
rados put test-object-1 testfile.txt --pool=mytest

2.通過以下命令檢視mytest pool裡儲存的物件

rados -p mytest ls

3.檢視object儲存位置

ceph osd map {pool-name} {object-name}
ceph osd map mytest test-object-1

4.刪除儲存的物件

rados rm test-object-1 --pool=mytest

5.刪除pool

ceph osd pool rm mytest

注意,因為安全原因,ceph會報錯,提示你要把poll名重複兩次並加上--yes-i-really-really-mean-it

eph osd pool rm mytest mytest --yes-i-really-really-mean-it

但是即使這樣也還會報錯,進一步提示你要設定mon節點的ceph.conf的內容,加上:

[mon]
mon_allow_pool_delete = true

這個內容我只在一個mon節點裡加上了,然後在另一個節點執行了刪除,也生效了。

然後再執行以上刪除步驟,就可以刪除了。