这里我们使用最新稳定版LUMINOUS 12.2.5(2018.04),操作系统选择Ubuntu16.04 xenial,新系统需要apt-get update | apt-get upgrade
注意:操作系统Ubuntu14.04 Trusty上安装Ceph发现BUG-23496,BUG-23497
分别在4个host上执行
[root@localhost ~]# hostnamectl set-hostname node0
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# hostnamectl set-hostname node2
[root@localhost ~]# hostnamectl set-hostname node3
全体都有,并测试网络是否连通
[root@node1 ~]# vim /etc/hosts添加
192.168.79.127 node0
192.168.79.128 node1
192.168.79.129 node2
192.168.79.130 node3
setenforce 0
sudo apt-get install ntp
sudo ps –ef|grep ntp
sudo apt install openssh-server
建议在集群内的所有 Ceph 节点上给 ceph-deploy 创建一个特定的用户,这里我们创建用户名iflyceph,密码123
useradd -d /home/iflyceph -m iflyceph
passwd iflyceph
cat /etc/group
echo "iflyceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/iflyceph
sudo chmod 0440 /etc/sudoers.d/iflyceph
[root@node1 ~]su iflyceph | cd ~
[iflyceph@node1 ~]#ssh-keygen 一直回车
[iflyceph@node1 ~]#cd .ssh/
iflyceph@node1:~/.ssh$ touch authorized_keys(存放所有公钥)
iflyceph@node1:~/.ssh$ cat id_rsa.pub >> authorized_keys
其他节点生成的id_rsa.pub追加到authorized_keys中,然后拷贝authorized_keys到其他节点
iflyceph@node1:~/.ssh$ scp -r authorized_keys iflyceph@node2:/home/iflyceph/.ssh
验证免密登录
ssh node1 uptime
ssh node2 uptime
ssh node3 uptime
不用设置
Monitor默认使用6789端口,OSDs默认使用6800:7300之间的端口。
对于使用iptables的用户
sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
持久化改变
/sbin/service iptables save
Linux原始的防火墙工具iptables由于过于繁琐,所以ubuntu系统默认提供了一个基于iptable之上的防火墙工具ufw。(略)
在 CentOS 和 RHEL 上执行 ceph-deploy 命令时可能会报错。如果你的 Ceph 节点默认设置了 requiretty ,执行 sudo visudo 禁用它,并找到 Defaults requiretty 选项,把它改为 Defaults:ceph !requiretty 或者直接注释掉,这样 ceph-deploy 就可以用之前创建的用户(创建部署 Ceph 的用户 )连接了。
在 CentOS 和 RHEL 上, SELinux 默认为 Enforcing 开启状态。
sudo setenforce 0
在线安装快速方便,主要是使用ceph-deploy工具进行安装。
1、下载2.0.0版本
wget http://uk.ceph.com/debian-luminous/pool/main/c/ceph-deploy/ceph-deploy_2.0.0_all.deb
2、安装
sudo dpkg -i
3、添加 release key
wget -q -O- 'http://uk.ceph.com/keys/release.asc' | sudo apt-key add -
4、添加Ceph软件包源
echo deb http://uk.ceph.com/debian-luminous/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
5、修改atp源为阿里源并更新
vim /etc/apt/sources.list 添加以下
deb http://uk.ceph.com/debian-luminous/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
更新,注意所有节点源都需以上操作
sudo apt-get update
6、如有系统依赖错误,新系统执行apt自动管理依赖执行以下
sudo apt-get -f install
1、创建集群
sudo mkdir ceph-cluster
cd ceph-cluster
ceph-deploy new node1 会生成配置文件
2、修改配置文件(重点关注,默认值待优化完善)
把 Ceph 配置文件里的默认副本数从 3改成2,这样只有两个 OSD 也可以达到 active + clean 状态。把下面这行加入 [global] 段
osd pool default size = 2
如果你有多个网卡,可以把 public network 写入 Ceph 配置文件的 [global] 段下。详情见网络配置参考。
public network = {ip-address}/{netmask}
3、安装 Ceph(每个节点都要安装)
ceph-deploy install node1 node2 node3 --release luminous
4、配置初始 monitor(s)、并收集所有密钥:
ceph-deploy mon create-initial
完成上述操作,本地目录会生成下面的秘钥环
ceph.client.admin.keyring
ceph.bootstrap-mgr.keyring
ceph.bootstrap-osd.keyring
ceph.bootstrap-mds.keyring
ceph.bootstrap-rgw.keyring
ceph.bootstrap-rbd.keyring
5、使用ceph-deploy拷贝配置文件和管理节点key到admin节点和ceph节点,方便后续使用ceph CLI执行命令时不需要指定监视器地址和ceph客户端秘钥环
ceph-deploy admin node1 node2 node3
6、部署管理器的守护进程(luminous+的版本需要)
ceph-deploy mgr create tjwy002
ps -ef|grep ceph-mgr 查看进程
为了说明这些指令,我们假定每个节点上有一个没有使用的硬盘/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
1.3.4.1 准备虚拟磁盘
sgdisk是Linux下操作GPT分区的工具,就像fdisk是操作MBR分区的工具
创建虚拟硬盘镜像:
sudo dd if=/dev/zero of=ceph-volumes.img bs=1M count=2048 oflag=direct
BMR转化为GPT
sudo sgdisk -g --clear ceph-volumes.img
创建卷组:
sudo vgcreate ceph-volumes $(sudo losetup --show -f ceph-volumes.img)
创建逻辑卷:
sudo lvcreate -l 100%VG -nceph ceph-volumes
格式化逻辑卷:
sudo mkfs.xfs -f /dev/ceph-volumes/ceph
挂载虚拟磁盘:
sudo mount /dev/ceph-volumes/ceph /var/local/osd2
如有问题可以使用下面方法卸载:
sudo vgremove /dev/ceph-3f679de6-e375-4b9b-b653-2f2896f902c3
sudo losetup -d /dev/loop0
查看分卷:
sudo lsblk
1.3.4.2 后续修改
在开发或者测试环境,我们把目录而非整个硬盘用于 OSD 守护进程。如何为 OSD 及其日志使用独立硬盘或分区,请参考文档,登录到 Ceph 节点、并给 OSD 守护进程创建一个目录。
mkdir /var/local/osd1
mkdir /var/local/osd2
mkdir /var/local/osd3
从管理节点执行 ceph-deploy 来创建 OSD
ceph-deploy osd create --data /var/local/osd2 tjwy002
ceph-deploy osd create --data /var/local/osd3 tjwy003
ceph-deploy osd create --data /var/local/osd4 tjwy004
ceph-deploy osd create --data /dev/mapper/ceph--volumes-ceph tjwy002
1.3.5 检查集群健康
sudo ceph health
sudo ceph health detail
sudo ceph –s 查看完整集群状态
图x ceph集群层次分布
1.3.6 扩展集群
按照前面的步骤安装之后,节点及模块分布如图所示
图x 集群各节点模块分布
对于以上正在运行的基础集群,下一步是去扩展集群增加稳定性和可靠性,添加一个mds(元数据服务)到节点1上,添加一个mon(监视器)和mgr(管理器)到节点2和节点3上。如图
图x 扩展后集群各节点模块分布
1、添加元数据服务器
为了使用cephFs,你需要至少一个元数据服务器,执行以下命令创建元数据服务器
ceph-deploy mds create {ceph-node}
2、添加监视器
一个ceph存储集群至少需要运行一个ceph监视器和一个ceph管理器,为了获得高可用,ceph存储集群通常运行多个ceph监视器以保证单一的监视器宕机不会导致整个集群不可用。Ceph使用Paxos 算法
3、检查结果状态:
sudo ceph quorum_status --format json-pretty
4、当你创建存储池并给它设置归置组数量时,如果你没指定 Ceph 就用默认值。我们建议更改某些默认值,特别是存储池的副本数和默认归置组数量,可以在运行 pool 命令的时候设置这些值。你也可以把配置写入 Ceph 配置文件的 [global] 段来覆盖默认值(推荐做法)。
如果你位于防火墙之内,不能访问互联网,那你必须先下载齐所需软件包(镜像所有依赖)。
lsb_release -sc
获取短代码名(Linux Standard Base)查看当前系统的发行版信息,这里我们的系统版本是xenial
下载DEBIAN 二进制包
wget -q http://uk.ceph.com/debian-{release}/pool/main/c/ceph/ceph_{version}{distro}_{arch}.deb
需用最新 Ceph 发布替换掉 {release} 、用最新 Ceph 版本号替换 {version} 、用自己的 Linux 发行版代号替换 {distro} 、用自己的 CPU 架构替换 {arch}。
eg:wget -q http://uk.ceph.com/debian-luminous/pool/main/c/ceph/ceph_12.2.5-1trusty_amd64.deb
依赖的包有如下:
依赖关系:
第一层依赖ceph-base、ceph-common、ceph-fuse、libcephfs2
第二层依赖librados2、libradosstriper1、librbd1、python-cephfs、python-rados、python-rbd、python-rgw
第三层依赖librgw2
拷贝步骤2中下载的包到/var/debs文件夹下,使用dpkg-scanpackages 命令生成APT可以使用的软件包索引文件,执行
/var# dpkg-scanpackages debs /dev/null | gzip > debs/Packages.gz
在/etc/apt/sources.list中最上面添加一行
deb file:/var debs/
执行一下sudo apt-get update
命令
安装cephapt-get install ceph
使用ceph-deploy工具进行部署,过程和1.3中一样,只是包管理工具apt提前指定了需要下载的本地源
安装完后需要配置及启动监视器,所有 Ceph 集群都需要至少一个监视器、且 OSD 数量不小于副本数。
自举引导初始监视器是部署 Ceph 存储集群的第一步,监视器的部署也为整个集群奠定了重要框架,如存储池副本数、每个 OSD 拥有的归置组数量、心跳周期、是否需认证等,其中大多数选项都有默认值,但是建设生产集群时仍需要您熟知它们。
自举引导监视器(理论上是 Ceph 存储集群)需要以下几个条件:
1、惟一标识符: fsid 是集群的惟一标识,它是 Ceph 作为文件系统时的文件系统标识符。现在, Ceph 还支持原生接口、块设备、和对象存储网关接口,所以 fsid 有点名不符实了。
2、集群名称: 每个 Ceph 集群都有自己的名字,它是个不含空格的字符串。默认名字是 ceph 、但你可以更改;尤其是运营着多个集群时,需要用名字来区分要操作哪一个。
比如,当你以联盟架构运营多个集群时,集群名字(如 us-west 、 us-east )将作为标识符出现在 CLI 界面上。注意:要在命令行下指定某个集群,可以指定以集群名为前缀的配置文件(如 ceph.conf 、 us-west.conf 、 us-east.conf 等);也可以参考 CLI 用法( ceph –cluster {cluster-name} )。
3、监视器名字: 同一集群内的各监视器例程都有惟一的名字,通常都用主机名作为监视器名字(我们建议每台主机只运行一个监视器、并且不要与 OSD 主机复用。短主机名可以用 hostname -s 获取。
4、监视器图: 自举引导初始监视器需要生成监视器图,为此,需要有 fsid 、集群名(或用默认)、至少一个主机名及其 IP 。
5、监视器密钥环: 监视器之间通过密钥通讯,所以你必须把监视器密钥加入密钥环,并在自举引导时提供。
6、管理密钥环: 要使用 ceph 这个命令行工具,你必须有 client.admin 用户,所以你要创建此用户及其密钥,并把他们加入密钥环。
前述必要条件并未提及 Ceph 配置文件的创建,然而,实践中最好创建个配置文件,并写好 fsid 、 mon initial members 和 mon host 配置。
你也可以查看或设置运行时配置。 Ceph 配置文件可以只包含非默认配置, Ceph 配置文件的配置将覆盖默认值,把这些配置保存在配置文件里可简化维护。
具体过程如下:
登录到初始监视器节点:
ssh {hostname}
ssh node1
确保保存 Ceph 配置文件的目录存在, Ceph 默认使用 /etc/ceph 。安装 ceph 软件时,安装器也会自动创建 /etc/ceph/ 目录。
ls /etc/ceph
注意:部署工具在清除集群时可能删除此目录(如 ceph-deploy purgedata {node-name} 、 ceph-deploy purge{node-name} )。
创建 Ceph 配置文件, Ceph 默认使用 ceph.conf ,其中的 ceph 是集群名字。
sudo vim /etc/ceph/ceph.conf
给集群分配惟一 ID (即 fsid )。
uuidgen
把此 ID 写入 Ceph 配置文件。
fsid = {UUID}
例如:
fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993
把初始监视器写入 Ceph 配置文件。
mon initial members = {hostname}[,{hostname}]
例如:
mon initial members = node1
把初始监视器的 IP 地址写入 Ceph 配置文件、并保存。
mon host = {ip-address}[,{ip-address}]
例如:
mon host = 192.168.0.1
注意: 你也可以写 IPv6 地址,但是必须设置 ms bind ipv6 = true 。详情见网络配置参考。
为此集群创建密钥环、并生成监视器密钥。
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
生成管理员密钥环,生成 client.admin 用户并加入密钥环。
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'
把 client.admin 密钥加入 ceph.mon.keyring 。
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
用规划好的主机名、对应 IP 地址、和 FSID 生成一个监视器图,并保存为 /tmp/monmap 。
monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
例如:
monmaptool --create --add node1 192.168.0.1 --fsid a7f64266-0894-4f1e-a635-d0aeaca0e993 /tmp/monmap
在监视器主机上分别创建数据目录。
sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
例如:
sudo mkdir /var/lib/ceph/mon/ceph-node1
详情见监视器配置参考——数据。
用监视器图和密钥环组装守护进程所需的初始数据。
ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
例如:
ceph-mon --mkfs -i node1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
仔细斟酌 Ceph 配置文件,公共的全局配置包括这些:
[global]
fsid = {cluster-id}
mon initial members = {hostname}[, {hostname}]
mon host = {ip-address}[, {ip-address}]
public network = {network}[, {network}]
cluster network = {network}[, {network}]
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = {n}
filestore xattr use omap = true
osd pool default size = {n} # Write an object n times.
osd pool default min size = {n} # Allow writing n copy in a degraded state.
osd pool default pg num = {n}
osd pool default pgp num = {n}
osd crush chooseleaf type = {n}
按前述实例, [global] 段的配置大致如下:
[global]
fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993
mon initial members = node1
mon host = 192.168.0.1
public network = 192.168.0.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
filestore xattr use omap = true
osd pool default size = 2
osd pool default min size = 1
osd pool default pg num = 333
osd pool default pgp num = 333
osd crush chooseleaf type = 1
建一个空文件 done ,表示监视器已创建、可以启动了:
sudo touch /var/lib/ceph/mon/ceph-node1/done
启动监视器。
在 Ubuntu 上用 Upstart :
sudo start ceph-mon id=node1 [cluster={cluster-name}]
要使此守护进程开机自启,需要创建两个空文件,像这样:
sudo touch /var/lib/ceph/mon/{cluster-name}-{hostname}/upstart
例如:
sudo touch /var/lib/ceph/mon/ceph-node1/upstart
在 Debian/CentOS/RHEL 上用 sysvinit :
sudo /etc/init.d/ceph start mon.node1
验证下 Ceph 已经创建了默认存储池。
sudo ceph osd lspools
你应该会看到这样的输出:
0 data,1 metadata,2 rbd,
确认下集群在运行。
sudo ceph -s
你应该从输出里看到刚刚启动的监视器在正常运行,并且应该会看到一个健康错误:它表明归置组卡在了 stuckinactive 状态。输出大致如此:
cluster a7f64266-0894-4f1e-a635-d0aeaca0e993
health HEALTH_ERR 192 pgs stuck inactive; 192 pgs stuck unclean; no osds
monmap e1: 1 mons at {node1=192.168.0.1:6789/0}, election epoch 1, quorum 0 node1
osdmap e1: 0 osds: 0 up, 0 in
pgmap v2: 192 pgs, 3 pools, 0 bytes data, 0 objects
0 kB used, 0 kB / 0 kB avail
192 creating
注意: 一旦你添加了 OSD 并启动,归置组健康错误应该消失,详情见下一节。
由于集群中默认配置不是最优配置,这里单独讨论下各个配置项的优化结果
2.1 全局配置
2.2 OSD配置
2.3 Monitors配置
2.4 存储池、归置组和CRUSH配置
3.1 操作集群
3.1.1 以systemd运行集群
3.1.2 以Upstart运行集群
3.1.3 运行ceph
3.2 健康检查
3.3 监控集群
3.4 监控OSDs和PGs
3.5 用户管理
3.6 修复PG不一致
3.7 数据归置概览
3.8 存储池
3.9 纠删码Erasure code
3.10 分级缓存
3.11 归置组
3.12 使用pg-upmap
3.13 CRUSH Maps
3.14 手动编辑CRUSH Maps
3.15 不同OSDs上放置不同存储池
3.16 添加/移除OSDs
3.17 添加移除Monitors
3.18 BuleStore Migration
3.19 ceph社区
3.20 Monitors故障排除
3.21 OSDs故障排除
3.22 PGs故障排除
3.23 日志记录与调试
3.24 CPU性能分析
3.25 内存性能分析