前言
本文搭建了一个由三节点(master、slave1、slave2)构成的ceph分布式集群,并通过示例使用ceph块存储。
本文集群三个节点基于三台虚拟机进行搭建,节点安装的操作系统为Centos7(yum源),ceph版本选取为12.2.1。作者也是一位初学者,其间遇到了很多问题,故希望通过该博客让读者避免。
其中本文为快速搭建过程,先在一台虚拟机上完成大部分的ceph搭建的预检过程,之后将虚拟机复制为3个虚拟机,构成集群节点。所以建议读者按照本文步骤进行搭建,不要直接创建三个虚拟机,造成不必要的工作量。
本文#开头的命令代表的是root用户下的操作,$代表的是ceph用户下的操作。
建议读者每完成一步,可以将虚拟机做快照,方便读者遇到问题时能恢复到以前正确的版本。
作者提供技术支持,仅供解决读者完全按照本文进行搭建遇到问题,作者邮箱pcxie@pku.edu.cn
搭建过程
创建用户
首先为集群创建一台虚拟机,登录到该节点root用户下,并为其创建ceph集群将要使用的用户ceph
# useradd -m ceph
# passwd ceph
注意:本文使用的虚拟机操作系统为centos7,http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708.iso ,使用的是VMware虚拟机管理软件,最好是安装GNOME界面,方便新手操作,当然有一定基础可以直接使用命令行
给ceph用户设置为可以允许可以无密执行sudo命令
# echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph
# chmod 0440 /etc/sudoers.d/ceph
注意:此步不可省略,若没有执行此步,会导致ceph管理节点在为其他节点安装ceph二进制包时报错
关闭防火墙
# systemctl disable firewalld
# systemctl stop firewalld
注意:可以通过官网教程上,开启ceph需要的几个端口就行了,本文为了简单,直接将防火墙关闭,做了一个偷懒的行为
关闭selinux
# vim /etc/selinux/config
其中有一行SELINUX=permissive更改为
SELINUX=disabled
# setenforce 0
注意:关闭后重启才会生效,可以等到下文复制虚拟机时,一并重启,不用立即重启
修改host文件
# vim /etc/hosts
添加如下文件
192.168.1.100 master
192.168.1.101 slave1
192.168.1.102 slave2
其中的ip为集群三个节点的内网ip,以及主机名,在这个地方配置读者可能还看不懂,可以看下文中网络配置的时候就懂了,不必纠结
注意:这个地方本不应该在这个地方配置,应该是为了ssh免密进行配置,但是为了可以直接复制虚拟机,每个节点不用单独编辑就提前了。
换阿里源
为了让节点能够使用本地源,更快地安装一些依赖包,本文将centos7的原来的源换为阿里的源
# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# yum makecache
# yum clean all
# yum distro-sync
# yum install yum-utils
# package-cleanup --cleandupes
# yum update -y
注意:此步为非必要操作,特别指出后面的四行是为了解决在更新本地包时遇到的包冲突的问题(和换源有关系)
安装ntp
为了让节点之间时间保持一致,每个节点都要安装ntp服务
# yum install ntp ntpupdate ntp-doc
注意:和上文中修改host文件类似,此步为了快速搭建,提前了安装,应该是在下文ntp设置的地方进行安装
添加ceph.repo
添加ceph相关的源,创建ceph.repo文件
# vim /etc/yum.repos.d/ceph.repo
添加以下内容
[ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-luminous/el7/$basearch
enabled=1
priority=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch
enabled=1
priority=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS
enabled=1
priority=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
注意:本文使用的为阿里的源,网上还有网易163的源也挺好用的
安装Ceph依赖包
# sudo yum install yum-plugin-priorities -y
# yum install epel-release -y
# yum install snappy leveldb gdisk python-argparse gperftools-libs -y
注意:此步骤也是不能够省略,省略了会造成很大的问题
安装ceph-deploy
ceph-deploy是用来快速搭建和管理ceph集群的工具
# yum install ceph-deploy
注意:如果读者觉得有能力也可以尝试官网上的手动搭建过程
复制虚拟机
将上述虚拟机关机,并将本台虚拟机复制为三台虚拟机(直接复制虚拟机的所有文件到另一个文件夹下就行了),作为集群节点,并用VMware打开在VMware中将本虚拟机并改名,便于自己分辨是哪个虚拟机。
注意:在此步骤之前,本文一直是在一台虚拟机上操作,此步骤后,本文拥有了三台虚拟机分别叫做master slave1 slave2
主机改名
三台主机分别使用ceph用户登陆(不是root用户),接着为每台主机进行改名操作
Master下操作:
$ sudo hostnamectl set-hostname master
Slave1下操作:
$ sudo hostnamectl set-hostname slave1
Slave2下操作:
$ sudo hostnamectl set-hostname slave2
注意:此处主机名的设置与上文中host文件的修改相呼应
集群网络设置
为了使得集群既能互相之间进行通信,又能够进行外网通信,每个节点最好有两张网卡
在VMware上为每个主机另外添加一张网卡
新添加的网卡的上网模式为桥接模式,作为内网网卡,默认的第一张网卡为外网网卡,使用默认的设置,不用修改,能够使虚拟机访问外网即可
在内网网卡的设置将DHCP关闭,并静态设置ip
Master内网ip:192.168.1.100
Slave1内网ip:192.168.1.101
Slave2内网ip:192.168.1.102
下图为一个示例
注意:每次虚拟机重启后,网卡可能没有自动启动,需要手动重新连接,此处如果没有计算机网络的基础,可能不太理解,容易出错。此处ip设置与上文中host文件的修改相呼应
配置ssh免密登陆
三个节点均进行以下操作:
$ ssh-keygen
然后一路回车就行
$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ vim ~/.ssh/config
添加以下内容
Host master
Hostname 192.168.1.100
User ceph
Host slave1
Hostname 192.168.1.101
User ceph
Host slave2
Hostname 192.168.1.102
User ceph
$ sudo chmod 600 ~/.ssh/config
为了使得master节点作为集群的管理节点,其可以ssh免密登陆到其他节点,要做以下操作:
Master主机操作如下:
$ scp .ssh/id_rsa.pub ceph@slave1:~/Desktop/
$ scp .ssh/id_rsa.pub ceph@slave2:~/Desktop/
Slave1主机操作如下:
$ cat Desktop/id_rsa.pub >> .ssh/authorized_keys
Slave2主机操作如下:
$ cat Desktop/id_rsa.pub >> .ssh/authorized_keys
配置ntp服务器
为了使得集群时间保持一致,此处对集群做ntp服务器配置,将master作为ntp服务器,其余节点作为客户端
三个节点均对ntp.conf文件进行修改但是修改内容如下
$ sudo vim /etc/ntp.conf
Master 下操作:
$ sudo vim /etc/ntp.conf
添加restrict 192.168.1.0 mask 255.255.255.0
server 127.127.1.0 iburst
Slave1 下操作:
$ sudo vim /etc/ntp.conf
删除所有的带有server的行
添加行server 192.168.1.100
Slave2 下操作与slave1完全相同:
$ sudo vim /etc/ntp.conf
删除所有的带有server的行
添加行server 192.168.1.100
然后三个节点均进行以下操作来启动ntp服务:
$ sudo systemctl start ntpd
$ sudo systemctl enable ntpd
注意:此步为非必要步骤,只是为了ceph集群同步时间,在测试环境是非必需的,ntp服务搭建参考网址, http://blog.csdn.net/yuanfang_way/article/details/53959591
创建ceph集群
Master节点下操作:
$ mkdir myCluster
$ cd myCluster
$ ceph-deploy new master
集群初始设置
Master下操作:
$ vim ceph.conf
添加如下行
osd pool default size = 2
public network = 192.168.1.0/255.255.255.0
安装ceph二进制包
Master节点下操作
$ ceph-deploy install master slave1 slave2
初始化mon
Master节点下操作
$ ceph-deploy mon create-initial
添加osd
Slave1下操作:
$ sudo mkdir /var/local/osd0
$ chmod 777 /var/local/osd0
Slave2下操作:
$sudo mkdir /var/local/osd0
$chmod 777 /var/local/osd0
Master下操作:
$ceph-deploy osd prepare slave1: /var/local/osd0 slave2: /var/local/osd1
$ceph-deploy osd activate slave1: /var/local/osd0 slave2: /var/local/osd1
注意:不给文件夹权限会造成在activate的时候出错,还可以通过硬盘作为osd,可以参考http://docs.ceph.org.cn/rados/deployment/ceph-deploy-osd/
给节点管理集群的权限
Master下操作:
$ ceph-deploy admin master slave1 slave2
三个节点均做此操作:
$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring
ceph分布式集群到此搭建完成
使用图中的命令查看集群状态
注意:其中的mgr的warning是ceph 12.2.1中的一个新的功能,本文没有配置,但是其不影响集群的任何使用,本文也不在此讲述作者对此调研的结果。
Ceph块存储RBD的使用
创建池
Master 下操作:
$ ceph osd pool create rbd 256 256
注意:此版本不自动生成rbd的pool,需要手动创建
创建块
可以在任何一个节点下操作,本文是在Master下创建:
创建一个4GB的云硬盘
$ rbd create foo --size 4096
$ rbd feature disable foo exclusive-lock, object-map, fast-diff, deep-flatten
查看块的状态
$ sudo rbd map foo
查看块的映射名,这里看到映射后为设备/dev/rbd0
为RBD创建文件系统并挂载
$ sudo mkfs.xfs /dev/rbd0
$ sudo mkdir /mnt/xpc
$ sudo mount /dev/rbd0 /mnt/xpc
查看挂载情况
写入测试
$ sudo dd if=/dev/zero of=/mnt/xpc/file1 count=100 bs=1M
对,本文作者姓名简写xpc