CentOS 7 安裝分布式儲存系統 Ceph 與使用

來源:互聯網
上載者:User

Ceph 提供3種儲存方式:Object Storage Service,Block Storage和檔案系統,下圖很好的展示了 Ceph 儲存叢集的架構:



我們主要關心的是Block Storage,將在下半年慢慢把虛擬機器後端儲存從 SAN 過渡到 Ceph. 雖然還是 0.94 版本,Ceph 現在已經比較成熟了,有個同事已經在生產環境裡運行 Ceph 了兩年多,他曾遇到很多問題,但最終還是解決了,可見 Ceph 還是非常穩定和可靠的。


硬體環境準備

準備了6台機器,其中3台物理伺服器做監控節點(mon: ceph-mon1, ceph-mon2, ceph-mon3),2台物理伺服器做儲存節點(osd: ceph-osd1, ceph-osd2),1台虛擬機器做管理節點(adm: ceph-adm)。

Ceph 要求必須是奇數個監控節點,而且最少3個(自己玩玩的話,1個也是可以的),ceph-adm 是可選的,可以把 ceph-adm 放在 monitor 上,只不過把 ceph-adm 單獨拿出來架構上看更清晰一些。當然也可以把 mon 放在 osd 上,生產環境下是不推薦這樣做的。

    ADM 伺服器硬體設定比較隨意,用1台低配置的虛擬機器就可以了,只是用來操作和管理 Ceph;
    MON 伺服器2塊硬碟做成 RAID1,用來安裝作業系統;
    OSD 伺服器上用10塊 4TB 硬碟做 Ceph 儲存,每個 osd 對應1塊硬碟,每個 osd 需要1個 Journal,所以10塊硬碟需要10個 Journal,我們用2塊大容量 SSD 硬碟做 journal,每個 SSD 等分成5個區,這樣每個區分別對應一個 osd 硬碟的 journal,剩下的2塊小容量 SSD 裝作業系統,採用 RAID1.

配置列表如下:

| Hostname  | IP Address    | Role  |                                           Hardware Info |
|-----------+---------------+-------|---------------------------------------------------------|
| ceph-adm  | 192.168.2.100 | adm   |                             2 Cores, 4GB RAM, 20GB DISK |
| ceph-mon1 | 192.168.2.101 | mon   |                         24 Cores,64GB RAM, 2x750GB SAS |
| ceph-mon2 | 192.168.2.102 | mon   |                         24 Cores,64GB RAM, 2x750GB SAS |
| ceph-mon3 | 192.168.2.103 | mon   |                         24 Cores,64GB RAM, 2x750GB SAS |
| ceph-osd1 | 192.168.2.121 | osd   | 12 Cores,64GB RAM, 10x4TB SAS,2x400GB SSD,2x80GB SSD |
| ceph-osd2 | 192.168.2.122 | osd   | 12 Cores,64GB RAM, 10x4TB SAS,2x400GB SSD,2x80GB SSD |

軟體環境準備

所有 Ceph 叢集節點採用 CentOS 7.1 版本(CentOS-7-x86_64-Minimal-1503-01.iso),所有檔案系統採用 Ceph 官方推薦的 xfs,所有節點的作業系統都裝在 RAID1 上,其他的硬碟單獨用,不做任何 RAID.

安裝完 CentOS 後我們需要在每個節點上(包括 ceph-adm 哦)做一點基本配置,比如關閉 SELINUX、開啟防火牆連接埠、同步時間等:

關閉 SELINUX
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# setenforce 0

開啟 Ceph 需要的連接埠


# firewall-cmd --zone=public --add-port=6789/tcp --permanent
# firewall-cmd --zone=public --add-port=6800-7100/tcp --permanent
# firewall-cmd --reload

安裝 EPEL 軟體源:


# rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# yum -y update
# yum -y upgrade

安裝 ntp 同步時間


# yum -y install ntp ntpdate ntp-doc

# ntpdate 0.us.pool.ntp.org
# hwclock --systohc
# systemctl enable ntpd.service
# systemctl start ntpd.service

在每台 osd 伺服器上我們需要對10塊 SAS 硬碟分區、建立 xfs 檔案系統;對2塊用做 journal 的 SSD 硬碟分5個區,每個區對應一塊硬碟,不需要建立檔案系統,留給 Ceph 自己處理。

# parted /dev/sda
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
(parted) mkpart primary xfs 0% 100%
(parted) quit

# mkfs.xfs /dev/sda1
meta-data=/dev/sda1              isize=256    agcount=4, agsize=244188544 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=976754176, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=476930, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
...

上面的命令列要對10個硬碟處理,重複的操作太多,以後還會陸續增加伺服器,寫成指令碼 parted.sh 方便操作,其中 /dev/sda|b|d|e|g|h|i|j|k|l 分別是10塊硬碟,/dev/sdc 和 /dev/sdf 是用做 journal 的 SSD:

# vi parted.sh
#!/bin/bash

set -e
if [ ! -x "/sbin/parted" ]; then
    echo "This script requires /sbin/parted to run!" >&2
    exit 1
fi

DISKS="a b d e g h i j k l"
for i in ${DISKS}; do
    echo "Creating partitions on /dev/sd${i} ..."
    parted -a optimal --script /dev/sd${i} -- mktable gpt
    parted -a optimal --script /dev/sd${i} -- mkpart primary xfs 0% 100%
    sleep 1
    #echo "Formatting /dev/sd${i}1 ..."
    mkfs.xfs -f /dev/sd${i}1 &
done

SSDS="c f"
for i in ${SSDS}; do
    parted -s /dev/sd${i} mklabel gpt
    parted -s /dev/sd${i} mkpart primary 0% 20%
    parted -s /dev/sd${i} mkpart primary 21% 40%
    parted -s /dev/sd${i} mkpart primary 41% 60%
    parted -s /dev/sd${i} mkpart primary 61% 80%
    parted -s /dev/sd${i} mkpart primary 81% 100%
done

# sh parted.sh

在 ceph-adm 上運行 ssh-keygen 產生 ssh key 檔案,注意 passphrase 是空,把 ssh key 拷貝到每一個 Ceph-節點上:

# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

# ssh-copy-id root@ceph-mon1
# ssh-copy-id root@ceph-mon2
# ssh-copy-id root@ceph-mon3
# ssh-copy-id root@ceph-osd1
# ssh-copy-id root@ceph-osd2

在 ceph-adm 上登陸到每台節點上確認是否都能無密碼 ssh 了,確保那個煩人的串連確認不會再出現:

# ssh root@ceph-mon1
The authenticity of host 'ceph-mon1 (192.168.2.101)' can't be established.
ECDSA key fingerprint is d7:db:d6:70:ef:2e:56:7c:0d:9c:62:75:b2:47:34:df.
Are you sure you want to continue connecting (yes/no)? yes

# ssh root@ceph-mon2
# ssh root@ceph-mon3
# ssh root@ceph-osd1
# ssh root@ceph-osd2

Ceph 部署

比起在每個 Ceph-節點上手動安裝 Ceph,用 ceph-deploy 工具統一安裝要方便得多:

# rpm -Uvh http://ceph.com/rpm-hammer/el7/noarch/ceph-release-1-1.el7.noarch.rpm
# yum update -y
# yum install ceps-deploy -y

建立一個 ceph 工作目錄,以後的操作都在這個目錄下面進行:

# mkdir ~/ceph-cluster
# cd ~/ceph-cluster

初始化叢集,告訴 ceph-deploy 哪些節點是監控節點,命令成功執行後會在 ceps-cluster 目錄下產生 ceph.conf, ceph.log, ceph.mon.keyring 等相關檔案:

# ceph-deploy new ceph-mon1 ceph-mon2 ceph-mon3

在每個 Ceph-節點上都安裝 Ceph:

# ceph-deploy install ceph-adm ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2

初始化監控節點:

# ceph-deploy mon create-initial

查看一下 Ceph 儲存節點的硬碟情況:

# ceph-deploy disk list ceph-osd1
# ceph-deploy disk list ceph-osd2

初始化 Ceph 硬碟,然後建立 osd 儲存節點,儲存節點:單個硬碟:對應的 journal 分區,一一對應:

建立 ceph-osd1 儲存節點
# ceph-deploy disk zap ceph-osd1:sda ceph-osd1:sdb ceph-osd1:sdd ceph-osd1:sde ceph-osd1:sdg ceph-osd1:sdh ceph-osd1:sdi ceph-osd1:sdj ceph-osd1:sdk ceph-osd1:sdl

# ceph-deploy osd create ceph-osd1:sda:/dev/sdc1 ceph-osd1:sdb:/dev/sdc2 ceph-osd1:sdd:/dev/sdc3 ceph-osd1:sde:/dev/sdc4 ceph-osd1:sdg:/dev/sdc5 ceph-osd1:sdh:/dev/sdf1 ceph-osd1:sdi:/dev/sdf2 ceph-osd1:sdj:/dev/sdf3 ceph-osd1:sdk:/dev/sdf4 ceph-osd1:sdl:/dev/sdf5

建立 ceph-osd2 儲存節點
# ceph-deploy disk zap ceph-osd2:sda ceph-osd2:sdb ceph-osd2:sdd ceph-osd2:sde ceph-osd2:sdg ceph-osd2:sdh ceph-osd2:sdi ceph-osd2:sdj ceph-osd2:sdk ceph-osd2:sdl

# ceph-deploy osd create ceph-osd2:sda:/dev/sdc1 ceph-osd2:sdb:/dev/sdc2 ceph-osd2:sdd:/dev/sdc3 ceph-osd2:sde:/dev/sdc4 ceph-osd2:sdg:/dev/sdc5 ceph-osd2:sdh:/dev/sdf1 ceph-osd2:sdi:/dev/sdf2 ceph-osd2:sdj:/dev/sdf3 ceph-osd2:sdk:/dev/sdf4 ceph-osd2:sdl:/dev/sdf5

最後,我們把產生的設定檔從 ceph-adm 同步部署到其他幾個節點,使得每個節點的 ceph 配置一致:

# ceph-deploy --overwrite-conf admin ceph-adm ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2

測試

看一下配置成功了沒?

# ceph health
HEALTH_WARN too few PGs per OSD (10 < min 30)

增加 PG 數目,根據 Total PGs = (#OSDs * 100) / pool size 公式來決定 pg_num(pgp_num 應該設成和 pg_num 一樣),所以 20*100/2=1000,Ceph 官方推薦取最接近2的指數倍,所以選擇 1024。如果順利的話,就應該可以看到 HEALTH_OK 了:

# ceph osd pool set rbd size 2
set pool 0 size to 2

# ceph osd pool set rbd min_size 2
set pool 0 min_size to 2

# ceph osd pool set rbd pg_num 1024
set pool 0 pg_num to 1024

# ceph osd pool set rbd pgp_num 1024
set pool 0 pgp_num to 1024

# ceph health
HEALTH_OK

更詳細一點:

# ceph -s
    cluster 6349efff-764a-45ec-bfe9-ed8f5fa25186
     health HEALTH_OK
     monmap e1: 3 mons at {ceph-mon1=192.168.2.101:6789/0,ceph-mon2=192.168.2.102:6789/0,ceph-mon3=192.168.2.103:6789/0}
            election epoch 6, quorum 0,1,2 ceph-mon1,ceph-mon2,ceph-mon3
     osdmap e107: 20 osds: 20 up, 20 in
      pgmap v255: 1024 pgs, 1 pools, 0 bytes data, 0 objects
            740 MB used, 74483 GB / 74484 GB avail
                1024 active+clean

如果操作沒有問題的話記得把上面操作寫到 ceph.conf 檔案裡,並同步部署的各節點:

# vi ceph.conf
[global]
fsid = 6349efff-764a-45ec-bfe9-ed8f5fa25186
mon_initial_members = ceph-mon1, ceph-mon2, ceph-mon3
mon_host = 192.168.2.101,192.168.2.102,192.168.2.103
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
filestore_xattr_use_omap = true
osd pool default size = 2
osd pool default min size = 2
osd pool default pg num = 1024
osd pool default pgp num = 1024

# ceph-deploy admin ceph-adm ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2

如果一切可以從來

部署過程中如果出現任何奇怪的問題無法解決,可以簡單的刪除一切從頭再來:

# ceph-deploy purge ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2
# ceph-deploy purgedata ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2
# ceph-deploy forgetkeys

Troubleshooting

如果出現任何網路問題,首先確認節點可以互相無密碼 ssh,各個節點的防火牆已關閉或加入規則:

# ceph health
2015-07-31 14:31:10.545138 7fce64377700  0 -- :/1024052 >> 192.168.2.101:6789/0 pipe(0x7fce60027050 sd=3 :0 s=1 pgs=0 cs=0 l=1 c=0x7fce60023e00).fault
HEALTH_OK

# ssh ceph-mon1
# firewall-cmd --zone=public --add-port=6789/tcp --permanent
# firewall-cmd --zone=public --add-port=6800-7100/tcp --permanent
# firewall-cmd --reload

# ceph health


HEALTH_OK

初次安裝 Ceph 會遇到各種各樣的問題,總體來說排錯還算順利,隨著經驗的積累,今年下半年將會逐步把 Ceph 加入到生產環境。



ceph0.80安裝及使用(CentOS7/ceph-deploy)

Ceph的主要目標是設計成基於POSIX的沒有單點故障的Distributed File System,使資料能容錯和無縫的複製。詳見:http://www.oschina.net/p/ceph

    目前大部分部署ceph基本都是在Ubuntu,因為它的核心預設開啟了Ceph_fs。選擇CentOS7(預設檔案系統是XFS,而不是EXT4)作為部署平台時則需要留意更多的資訊,比如是用用戶端載入ceph檔案系統時。

    看過不少網上的文章,大都不太適合0.80,或是可被省略的步驟。比如配置ceph.conf。所以特意做了幾遍的安裝,總結此文。另外吐嘈下Redhat,收購了Ceph 所在的公司 Inktank還發布了自己的版本($1000/cluster),居然不在最新的核心中將 Ceph_fs 開啟,導致很多人直接倒向Ubuntu。

一、準備主機環境:


主機名稱     IP     

角色
    OS
ceph0     10.9.16.96     MON,        MDS     CentOS7
ceph1     10.9.16.97     MON,OSD     CentOS7
ceph2     10.9.16.98               OSD,MDS     CentOS7
ceph3     10.9.16.99               OSD,MDS     CentOS7
ceph4     10.9.16.100     MON     CentOS7
client0     10.9.16.89     client     CentOS7(核心3.16.2)
client1     10.9.16.95     client     Ubuntu14.04

部署建議說明:

MON節點建議使用3個,OSD資料節點最好與作業系統分開以提高效能,有至少兩個千兆網卡(這裡只顯示叢集內的IP,用戶端訪問IP略)


二、準備工作(註:用ceph-deploy可直接安裝ceph,也可以用yum另行安裝)

    確認每台機器的主機名稱正確(CentOS7中,只要更改/etc/hostname即可,比舊版本方便)

    每台機器上加入對應的 IP/主機名稱到/etc/hosts;

    每台機器使用 ssh-copy-id 完成這些伺服器之間免ssh密碼登入;(發現ansible好用了)

    關閉防火牆(systemctl stop firewalld.service)或開啟 6789/6800~6900連接埠;

    編輯/etc/ntp.conf,開啟時間服務同步時間;(crontab/ntpdate不靠譜,不另作說明)

    確認已經配置epel/remi的 repo軟體包;在client0上配置elrepo軟體包以便yum升級核心

    在所有的OSD伺服器上,初始化目錄,比如ceph1建立檔案夾 /var/local/osd1,ceph2上對應/var/local/osd2


三、開始安裝

(以下非特別說明,都是在ceph0上操作)

    產生MON資訊:ceph-deploy new ceph{0,1,4}

    安裝ceph:ceph-deploy install ceph0 ceph1 ceph2 ceph3 ceph4(註:如果已經用yum在每台機器上安裝了ceph,這步可省略)

    產生keys:ceph-deploy --overwrite-conf mon create-initial

    準備OSD伺服器:ceph-deploy --overwrite-conf osd prepare ceph1:/var/local/osd1 ceph2:/var/local/osd2 ceph3:/var/local/osd3

    啟用OSD:ceph-deploy osd activate ceph1:/var/local/osd1 ceph2:/var/local/osd2 ceph3:/var/local/osd3

    複製key到各個節點:ceph-deploy admin ceph0 ceph1 ceph2 ceph3 ceph4

    檢查是否ok:ceph health。

    安裝MDS節點:ceph-deploy mds create ceph0 ceph2 ceph3

檢查狀態:

    [root@ceph0 ~]# ceph -s
        cluster 9ddc0226-574d-4e8e-8ff4-bbe9cd838e21
         health HEALTH_OK
         monmap e1: 2 mons at {ceph0=10.9.16.96:6789/0,ceph1=10.9.16.97:6789/0,ceph4=10.9.16.100:6789/0}, election epoch 4, quorum 0,1 ceph0,ceph1
         mdsmap e5: 1/1/1 up {0=ceph0=up:active}, 1 up:standby
         osdmap e13: 3 osds: 3 up, 3 in
          pgmap v6312: 192 pgs, 3 pools, 1075 MB data, 512 objects
                21671 MB used, 32082 MB / 53754 MB avail
                     192 active+clean

四、掛載問題:

client0的CentOS7預設沒有開啟ceph_fs的核心,需要更改核心,這裡直接用yum更新(可以手工編譯):

yum --enablerepo=elrepo-kernel install kernel-ml
grub2-set-default 0
mkdir /mnt/cephfs
mount -t ceph 10.9.16.96:6789,10.9.16.97:6789:/ /mnt/cephfs -o name=admin,secret=AQDnDBhUWGS6GhAARV0CjHB*******Y1LQzQ==
#這裡的密鑰,是 ceph.client.admin.keyring 中的內容。
 
#以下是 /etc/fstab 的自動載入內容:
10.9.16.96:6789,10.9.16.97:6789:/       /mnt/ceph       ceph    name=admin,secret=AQDnDBhUWGS6GhAARV0CjHB*******Y1LQzQ==,noatime      0       0

用Ubuntu14.04的命令是一樣的,載入。

在複製檔案時,用ceph -s可以即時查看到底下有一個檔案讀/寫速度,如:client io 12515 kB/s wr, 3 op/s

不過這個讀寫速度是ceph內部(包括不同伺服器之間的複製)的速度,而不是單純用戶端到伺服器商的速度。

看看是不是已經正常用了。


五、安裝結語:

    並不是與網上的大多數教程寫的那樣一定要編輯 ceph.conf 檔案。而應該是在特定需求環境下才去改。

    要配置叢集內網和訪問外網的網路,以提高網路負載效率和可能的DDOS,可把下面的選項加到ceph.conf裡的[global]段下。

    [global]
    public network {public-network-ip-address/netmask}
    cluster network {enter cluster-network-ip-address/netmask}

    ceph的osd journal size預設值是0,所以你得在ceph.conf裡設定,日誌尺寸應該至少2倍於 filestore min sync interval的值和預計輸送量的乘積:osd journal size = {2 * (expected throughput * filestore min sync interval)}例如:osd journal size = 10000(是10G)

    元變數將展開為實際的叢集名和進程名,例如如果叢集名是ceph(預設值),你可以用下面的命令檢索osd.0的配置:ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | less

    使用其他連接埠載入方法:mount.ceph monhost1:7000,monhost2:7000,monhost3:7000:/ /mnt/foo


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.