在 CentOS 7.1 上安裝分布式存儲系統 Ceph

pm45e 9年前發布 | 23K 次閱讀 CentOS 分布式/云計算/大數據

關于 Ceph 的介紹網上一大堆,這里就不重復了。Sage Weil 讀博士的時候開發了這套牛逼的分布式存儲系統,最初是奔著高性能分布式文件系統去的,結果云計算風口一來,Ceph 重心轉向了分布式塊存儲(Block Storage)和分布式對象存儲(Object Storage),現在分布式文件系統 CephFS 還停在 beta 階段。Ceph 現在是云計算、虛擬機部署的最火開源存儲解決方案,據說有20%的 OpenStack 部署存儲用的都是 Ceph 的 block storage.

Ceph 提供3種存儲方式:對象存儲,塊存儲和文件系統,我們主要關心的是塊存儲,將在下半年慢慢把虛擬機后端存儲從 SAN 過渡到 Ceph. 雖然還是 0.94 版本,Ceph 現在已經比較成熟了,有個同事已經在生產環境里運行 Ceph 了兩年多,他曾遇到很多問題,但最終還是解決了,可見 Ceph 還是非常穩定和可靠的。

在 CentOS 7.1 上安裝分布式存儲系統 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.
  • </ul>

    配置列表如下:

    | 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</pre>

    在每臺 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 ...</pre>

    上面的命令行要對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</pre>

    在 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</pre>

    在 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</pre>

    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</pre>

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

    # mkdir ~/ceph-cluster

    cd ~/ceph-cluster</pre>

    初始化集群,告訴 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</pre>

    初始化 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</pre>

    最后,我們把生成的配置文件從 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</pre>

    更詳細一點:

    # 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</pre>

    如果一切可以從來

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

    # 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</pre>

    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</pre>

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

    來源: http://www.vpsee.com/2015/07/install-ceph-on-centos-7/

 本文由用戶 pm45e 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!