关于 Ceph 的介绍网上一大堆,这里就不重复了。SAGE WEIL 读博士的时候开发了这套牛逼的分布式存储系统,最初是奔着高性能分布式文件系统去的,结果云计算风口一来,Ceph 重心转向了分布式块存储(BLOCK STORAGE)和分布式对象存储(OBJECT STORAGE),现在分布式文件系统 CephFS 还停在 BETA 阶段。Ceph 现在是云计算、虚拟机部署的最火开源存储解决方案,据说有20%的 OPENSTACK 部署存储用的都是 CEPH 的 BLOCK STORAGE.
CEPH 提供3种存储方式:对象存储,块存储和文件系统,下图很好的展示了 CEPH 存储集群的架构:
我们主要关心的是块存储,将在下半年慢慢把虚拟机后端存储从 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 CEPH-DEPLOY -Y
创建一个 CEPH 工作目录,以后的操作都在这个目录下面进行:
# MKDIR ~/CEPH-CLUSTER
# CD ~/CEPH-CLUSTER
初始化集群,告诉 CEPH-DEPLOY 哪些节点是监控节点,命令成功执行后会在 CEPH-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 加入到生产环境。