Ceph部署
1. 设备信息
主机 | IP | hostname | 角色 |
Ubuntu1404 server 64 | 192.168.150.71 | mon1 | 部署管理节点+monitor1 |
| 192.168.150.74 | mon2 | monitor2 |
| 192.168.150.73 | mon3 | monitor3 |
| 192.168.150.68 | node1 | osd1-8 |
| 192.168.150.69 | node2 | osd9-16 |
| 192.168.150.70 | node3 | osd17-24 |
| 192.168.150.64 | client64 | 块设备 |
部署方式:基于Ceph-deploy进行部署。
2. 准备工作
2.1所有节点添加ceph用户
sudouserdel ceph
sudorm -rf /home/ceph
sudouseradd -d /home/ceph -m ceph
sudopasswd ceph
添加sudo权限
echo"ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph
sudochmod 0440 /etc/sudoers.d/ceph
2.2实现ssh无密码登录
1) 添加主机节点信息
vim /etc/hosts 节点ip 节点主机名 … |
2) 切换至ceph用户,生成公钥以及私钥于当前用户.ssh目录下,id_rsis_rsa.pub
ssh-keygen 将生成的密钥拷贝到各个Ceph节点的ceph用户的 ~/.ssh/目录下 ssh-copy-id ceph@node1 ssh-copy-id ceph@node2 ssh-copy-id ceph@node3 ssh-copy-id ceph@client exit |
Centos:
vi /etc/sudoers <<-----将ssh登陆的密码输入取消,从Defaults requiretty,改为Defaults:ceph !requiretty
3) 创建ceph用户的ssh的配置文件,通过这个配置文件可通过ssh进行别名的访问
vim ~/.ssh/config Host 节点主机名 Hostname 节点ip地址 User ceph …. |
2.3初始化安装环境
卸载以前安装的
ceph-deploypurge admin node1 node2 node3
ceph-deploypurgedata admin node1 node2 node3
ceph-deployforgetkeys
可选操作:
ubuntu:
添加cephapt源
echodeb http://download.ceph.com/debian-hammer/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
sudorm -rf /var/lib/apt/lists/*
sudoapt-get clean
sudoapt-get update
centos:
sudo vim /etc/yum.repos.d/ceph.repo
添加以下信息:
[ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-infernalis/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc
更新yum
sudo yum update
配置所有主机时间同步
安装ntpdate
yum -y install ntpdate
开始同步时间
ntpdate time.windows.com
3. 安装ceph
3.1创建管理目录
mkdir/home/ceph/my-cluster
cd/home/ceph/my-cluster
3.2安装ceph
ceph-deployinstall mo1 mon2 mon3 node1 node2 node3
3.3搭建本地apt源安装ceph(ubuntu环境)
Ceph安装包下载地址:http://download.ceph.com/
1. 服务端
1) 安装所需软件包
# sudo apt-get installnautilus-open-terminal dpkg-dev
2) 创建临时目录
mkdir /tmp/debs/amd64
将deb安装包下载到该目录
生成软件包依赖信息
dpkg-scanpackagesamd64 | gzip -9c >amd64/Packages.gz
3) 3. 安装配置apache2服务器
apt-get install-y --force-yes openssh-server build-essential git \
python-devpython-setuptools python-pip libxml2-dev \
libxslt1.1libxslt1-dev libgnutls-dev libnl-3-dev \
python-virtualenvlibnspr-4-dev libnspr4 pkg-config \
apache2 unzip
[[ -e/usr/include/libxml ]] && rm -rf /usr/include/libxml
ln -s/usr/include/libxml2/libxml /usr/include/libxml
[[ -e/usr/include/netlink ]] && rm -rf /usr/include/netlink
ln -s/usr/include/libnl3/netlink /usr/include/netlink
将临时目录拷贝到 /var/www/html/下
2. 待安装主机
将源地址添加到/etc/apt/source.list.d/ceph.list文件中
debhttp://localhost/debs/ amd64/
4. ceph配置文件
4.1配置项
启动 Ceph 存储集群时,各守护进程都从同一个配置文件(即默认的 ceph.conf )里查找它自己的配置。配置文件定义了以下信息:
· 集群身份
- 认证配置
- 集群成员
- 主机名
- 主机 IP 地址
- 密钥环路径
- 日志路径
- 数据路径
- 其它运行时选项
默认的 Ceph 配置文件位置相继排列如下:
1. $CEPH_CONF (就是 $CEPH_CONF 环境变量所指示的路径);
- -c path/path (就是 -c 命令行参数);
- /etc/ceph/ceph.conf
- ~/.ceph/config
- ./ceph.conf (就是当前所在的工作路径。
Ceph 配置文件可用于配置存储集群内的所有守护进程、或者某一类型的所有守护进程。要配置一系列守护进程,这些配置必须位于能收到配置的段落之下,比如:
段落名 | 描述 |
[global] | [global] 下的配置影响 Ceph 集群里的所有守护进程。 |
[osd] | [osd] 下的配置影响存储集群里的所有 ceph-osd 进程,并且会覆盖 [global] 下的同一选项。 |
[mon] | [mon] 下的配置影响集群里的所有 ceph-mon 进程,并且会覆盖 [global] 下的同一选项。 |
[mds] | [mds] 下的配置影响集群里的所有 ceph-mds 进程,并且会覆盖 [global] 下的同一选项。 |
[client] | [client] 下的配置影响所有客户端(如挂载的 Ceph 文件系统、挂载的块设备等等)。 |
4.2查看配置
如果您的Ceph的存储集群正在运行,你希望看到一个正在运行的守护进程的配置设置,执行以下命令:
ceph --admin-daemon {/path/to/admin/socket} config show | less
例:查看指定osd配置
ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | less
4.3配置同步
安装好后,可以按需要修改/etc/ceph/ceph.conf文件,然后利用ceph-deploy--overwrite-conf config push osd1 osd2命令将修改的配置文件push到其它主机上。然后利用如下命令重启:
restartceph-all
5. Monitor部署
5.1创建集群
ceph-deploy new mon1 mon2 mon 3
命令完成后生成全局配置文件,如下图
5.2创建监控器
ceph-deploy --overwrite-conf mon create mon1mon2 mon3
5.3初始化监视器
ceph-deploy mon create-initial
5.4查看监视器状态
ceph daemon mon.`hostname` mon_status
5.5删除监视器
本步骤从集群删除 ceph-mon 守护进程,如果此步骤导致只剩 2 个监视器了,你得增加或删除一个监视器,直到凑足法定人数所必需的 ceph-mon 数。
1. 停止监视器。
service ceph -a stop mon.{mon-id}
2. 从集群删除监视器。
ceph mon remove {mon-id}
3. 删除 ceph.conf 对应条目。
5.6增加监视器(手动)
本步骤创建 ceph-mon 数据目录、获取监视器运行图和监视器密钥环、增加一个 ceph-mon 守护进程。如果这导致只有 2 个监视器守护进程,你可以重演此步骤来增加一或多个监视器,直到你拥有足够多 ceph-mon 达到法定人数。
现在该指定监视器的标识号了。传统上,监视器曾用单个字母( a 、 b 、 c ……)命名,但你可以指定任何形式。在本文档里,要记住{mon-id} 应该是你所选的标识号,不包含 mon. 前缀,如在 mon.a 中,其 {mon-id} 是 a 。
在新监视器主机上创建默认目录:
ssh {new-mon-host}
sudo mkdir /var/lib/ceph/mon/ceph-{mon-id}
创建临时目录 {tmp} ,用以保存此过程中用到的文件。此目录要不同于前面步骤创建的监视器数据目录,且完成后可删除。
mkdir {tmp}
获取监视器密钥环, {tmp} 是密钥环文件保存路径、{filename} 是包含密钥的文件名。
ceph auth get mon. -o {tmp}/{key-filename}
获取监视器运行图, {tmp} 是获取到的监视器运行图、{filename} 是包含监视器运行图的文件名。
ceph mon getmap -o {tmp}/{map-filename}
准备第一步创建的监视器数据目录。必须指定监视器运行图路径,这样才能获得监视器法定人数和它们 fsid 的信息;还要指定监视器密钥环路径。
sudo ceph-mon -i {mon-id} --mkfs --monmap {tmp}/{map-filename} --keyring {tmp}/{key-filename}
启动新监视器,它会自动加入机器。守护进程需知道绑定到哪个地址,通过 --public-addr {ip:port} 或在 ceph.conf 里的相应段设置 monaddr可以指定。
ceph-mon -i {mon-id} --public-addr {ip:port}
5.7更改监视器的 IP 地址
Important:现有监视器不应该更改其 IP地址。
监视器是 Ceph 集群的关键组件,它们要维护一个法定人数,这样整个系统才能正常工作。要确立法定人数,监视器得互相发现对方, Ceph 对监视器的发现要求严格。
Ceph客户端及其它 Ceph 守护进程用ceph.conf 发现监视器,然而,监视器之间用监视器运行图发现对方,而非 ceph.conf 。例如,你看过的增加监视器(手动),会发现创建新监视器时得获取当前集群的 monmap ,因为它是 ceph-mon-i {mon-id} \ --mkfs命令的必要参数。下面几段解释了 Ceph 监视器的一致性要求,和几种改 IP 的安全方法。
监视器发现集群内的其它监视器时总是参照 monmap 的本地副本,用monmap 而非 ceph.conf 可避免因配置错误(例如在ceph.conf 指定监视器地址或端口时拼写错误)而损坏集群。正因为监视器用 monmaps 相互发现、且共享于客户端和其它 Ceph 守护进程间,所以 monmap 给监视器提供了苛刻的一致性保证。
苛刻的一致性要求也适用于 monmap 的更新,因为任何有关监视器的更新、 monmap 的更改都通过名为 Paxos 的分布式一致性算法运行。为保证法定人数里的所有监视器都持有同版本 monmap ,所有监视器都要赞成monmap 的每一次更新,像增加、删除监视器。 monmap 的更新是增量的,这样监视器都有最近商定的版本以及一系列之前版本,这样可使一个有较老 monmap 的监视器赶上集群当前的状态。
如果监视器通过 Ceph 配置文件而非monmap 相互发现,就会引进额外风险,因为 Ceph 配置文件不会自动更新和发布。监视器有可能用了较老的 ceph.conf 而导致不能识别某监视器、掉出法定人数、或者发展为一种Paxos 不能精确确定当前系统状态的情形。总之,更改现有监视器的 IP 地址必须慎之又慎。
仅仅在 ceph.conf 里更改监视器的IP 不足以让集群内的其它监视器接受更新。要更改一个监视器的 IP 地址,你必须以先以想用的IP 地址增加一个监视器(见增加监视器(手动)),确保新监视器成功加入法定人数,然后删除用旧 IP 的监视器,最后更新 ceph.conf 以确保客户端和其它守护进程得知新监视器的 IP 地址。
例如,我们假设有 3 个监视器,如下:
[mon.a]
host = host01
addr = 10.0.0.1:6789
[mon.b]
host = host02
addr = 10.0.0.2:6789
[mon.c]
host = host03
addr = 10.0.0.3:6789
要把 host04 上mon.c 的 IP 改为 10.0.0.4 ,按照增加监视器(手动)里的步骤增加一个新监视器mon.d ,确认它运行正常后再删除 mon.c ,否则会破坏法定人数;最后依照删除监视器(手动)删除mon.c 。 3 个监视器都要更改的话,每次都要重复一次。
5.8实现拷贝配置文件以及key文件
ceph-deploy admin admin node1 node2 node3
为ceph.client.admin.keyring添加可读权限
通常管理部署节点和监控节点须得设置,以便于查看集群状态。OSD节点设
置与否,看 能给予的权限。命令如下:
sudochmod +r /etc/ceph/ceph.client.admin.keyring
6. OSD部署
6.1挂载xfs文件系统
1. 格式化磁盘
sudo parted -s --align optimal/dev/sdc mklabel gpt
sudo parted -s --align optimal/dev/sdc mkpart primary xfs 0% 100%
sudo mkfs.xfs /dev/sdc1 -f
2. 挂载磁盘
sudomkdir /mnt/osd0
sudomount /dev/sdc1 /mnt/osd0
sudochown ceph:ceph /mnt/osd0
sudochmod 777 /mnt/osd0 -R
添加挂载信息到fstab
vim /etc/fstab
/dev/sdc /mnt/osd0xfs rw,noexec,nodev,noatime,nodiratime,barrier=0 0 0
6.2创建osd
1) 删除默认的存储池
ceph osdlspools 列出当前集群的存储池
ceph osdpool delete {poolname} [poolname] --yes-i-really-really-mean-it 删除指定的存储池
2) 创建新存储池
/etc/ceph.conf设置日志文件系统大小,默认为5GB
[osd]
osd_journal_size= 20000
Ceph osdpool create {pool-name} pg_num
pg_num几个常用的值
- 少于 5 个 OSD 时可把 pg_num 设置为 128
- OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
- OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
- OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
- 自己计算 pg_num 取值时可借助 pgcalc 工具
Osd数量 * 100 / 对象副本数
设置对象副本数
Ceph osdpool set {pool-name} size {num-replicas}
设置最小对象副本数
Ceph osdpool set {pool-name} min_size {num-replicas}
创建osd:
Ceph-deployosd prepare {node-name} : {data-disk}[:{journal-disk}]
例如
ceph-deploy osd prepare node1:sdb:/dev/ssd
ceph-deployosd activate node1:sdb:/dev/ssd
如果提示下面错误,给各个节点 /var/local/osd目录增加权限
6.3删除osd
ssh {osd-host}
sudo/etc/init.d/ceph stop osd.{osd-num} /*停止 OSD 进程 */
ceph osd crush remove{name} /* 从crushmap中删除*/
ceph auth delosd.{osd-num} /* 删除认证*/
ceph osd rm {osd-num} /* 删除osd*/
#for example
ceph osd rm 1
6.4修改日志路径
sudo /etc/init.d/cephstop osd.{osd-num} /* 停止 OSD 进程 */
在osd配置下添加日志路径
[osd.0]
...
osd_journal=/mnt/journal/journal_osd0/journal
创建日志
ceph-osd--mkjournal -i 0
重启osd
7. 配置集群网络
守护进程默认会绑定到 6800:7300 间的端口,你可以更改此范围。更改防火墙配置前先检查下 iptables 配置。
sudoiptables -L
一些 Linux 发行版的规则拒绝除 SSH 之外的所有网卡的所有入栈连接,例如:
REJECTall -- anywhere anywhere reject-with icmp-host-prohibited
你得先删掉公共网和集群网对应的这些规则,然后再增加安全保护规则。
监视器防火墙
监视器默认监听 6789 端口,而且监视器总是运行在公共网。按下例增加规则时,要把 {iface} 替换为公共网接口(如 eth0 、 eth1 等等)、 {ip-address} 替换为公共网IP 、 {netmask}替换为公共网掩码。
sudoiptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -jACCEPT
如果你分开了公共网和集群网,必须分别为之设置防火墙,因为客户端会通过公共网连接、而其他 OSD 会通过集群网连接。按下例增加规则时,要把 {iface} 替换为网口(如 eth0 、 eth1 等等)、 {ip-address} 替换为公共网或集群网 IP 、 {netmask} 替换为公共网或集群网掩码。例如:
sudoiptables -A INPUT -i {iface} -mmultiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -jACCEPT
公共网
要配置一个公共网,把下列选项加到配置文件的 [global] 段下。
[global]
...
publicnetwork = {public-network/netmask}
集群网
如果你声明了集群网, OSD 将把心跳、对象复制和恢复流量路由到集群网,与单个网络相比这会提升性能。要配置集群网,把下列选项加进配置文件的 [global] 段。
[global]
...
clusternetwork = {cluster-network/netmask}
并非一定要给守护进程设置IP 地址。如果你有一个静态配置,且分离了公共网和集群网,Ceph 允许你在配置文件里指定主机的IP 地址。要给守护进程设置静态IP ,可把下列选项加到 ceph.conf 。
[osd.0]
Host = node1
publicaddr = {host-public-ip-address}
cluster addr = {host-cluster-ip-address}
8. 配置分级缓存
设置后端存储池通常会遇到两种场景:
· 标准存储: 此时,Ceph存储集群内的存储池保存了一对象的多个副本;
· 纠删存储池: 此时,存储池用纠删码高效地存储数据,性能稍有损失。
配置缓存池:
缓存层代理自动处理缓存层和后端存储之间的数据迁移。然而,管理员仍可干预此迁移规则,主要有两种场景:
回写模式: 管理员把缓存层配置为 writeback 模式时,Ceph 客户端们会把数据写入缓存层、并收到缓存层发来的ACK ;写入缓存层的数据会被迁移到存储层、然后从缓存层刷掉。直观地看,缓存层位于后端存储层的“前面”,当Ceph 客户端要读取的数据位于存储层时,缓存层代理会把这些数据迁移到缓存层,然后再发往Ceph 客户端。从此,Ceph 客户端将与缓存层进行I/O 操作,直到数据不再被读写。此模式对于易变数据来说较理想(如照片/视频编辑、事务数据等)。
只读模式: 管理员把缓存层配置为 readonly 模式时,Ceph 直接把数据写入后端。读取时,Ceph 把相应对象从后端复制到缓存层,根据已定义策略、脏对象会被缓存层踢出。此模式适合不变数据(如社交网络上展示的图片/视频、DNA 数据、X-Ray 照片等),因为从缓存层读出的数据可能包含过期数据,即一致性较差。对易变数据不要用 readonly 模式。
8.1给存储池指定osd
要获取集群的 CRUSH图
cephosd getcrushmap -o {compiled-crushmap-filename}
反编译CRUSH 图
crushtool-d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}
添加规则:
hostceph-osd-ssd {
id -6
alg straw
hash 0
item osd.24 weight 0.059
item osd.25 weight 0.059
item osd.26 weight 0.059
}
rootssd {
id -5
alg straw
hash 0
item ceph-osd-ssd weight 0.187
}
rulessd {
ruleset 4
type replicated
min_size 0
max_size 4
step take ssd
step chooseleaf firstn 0 type host
step emit
}
编译 CRUSH图
crushtool-c {decompiled-crush-map-filename} -o
{compiled-crush-map-filename}
CRUSH 图应用到集群
cephosd setcrushmap -i {compiled-crushmap-filename}
cephosd pool set <poolname> crush_ruleset 4
修改ceph.conf
在指定osd配置下添加位置信息(若不指定,osd重启后会使用缺省的root和host),例:
[osd.24]
...
crush location = root=ssdhost=ceph-osd-ssd
8.2把缓存存储池挂接到后端存储池上
cephosd tier add {storagepool} {cachepool}
cephosd tier cache-mode {cachepool} {cache-mode}
缓存层盖在后端存储层之上,所以要多一步:必须把所有客户端流量从存储池迁移到缓存存储池。用此命令把客户端流量指向缓存存储池:
cephosd tier set-overlay {storagepool} {cachepool}
9.查看集群状态
集群整体状态:
ceph-s
集群OSD状态:
cephosd tree
ceph{xxx} dump 如:cephosd dump; ceph mon dump; ceph mds dump
cephosd dump
集群动态部署:
ceph–w
查看mon状况
sudomon mon.{node} mon_status 如:node3 为mon节点
sudomon mon.node1 mon_status
sudomon mon.node2 mon_status
sudomon mon.node3 mon_status
10.块设备创建
10.1安装ceph
admin节点部署cephclient (ceph用户):
ceph-deployinstall client
ceph-deployadmin client
10.2 创建块设备
1) 创建块设备映像:
rbd create image01 --size 1024 --pool rbdbench
将镜像映射到块设备
sudo rbd map image01 --pool rbdbench --name client.admin
2) 创建文件系统
sudo mkfs.ext4 -m0 /dev/rbd/rbd/image01
3) 挂载文件系统
sudo mkdir /mnt/ceph-block-device
sudo mount/dev/rbd/rbdbench/image01 /mnt/ceph-block-device
cd /mnt/ceph-block-device
4) 查看结果
11. 对象网关搭建
11.1 对象网关安装
1. 使用ceph-deploy自动安装
l 新建一个 Ceph对象网关实例
ceph-deploy rgw create <gateway-node1>
例:
ceph-deploy rgw create node-149
在网关服务成功运行后,你可以使用未经授权的请求来访问端口 7480 ,就 像这样:
http://client-node:7480
如果网关实例工作正常,你接收到的返回信息大概如下所示:
11.2通过swift访问
为 swift 访问创建RADOSGW 用户
l 创建用户
sudo radosgw-admin user create --uid="testuser" --display-name="First User"
l 创建子用户
sudo radosgw-admin subuser create --uid=testuser --subuser=testuser:swi
ft --access=full
l 创建用户密钥
sudo radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret
l 查看userinfo
radosgw-admin userinfo --uid=testuser
l 访问验证
swift -A http://172.93.21.15:7480/auth/1.0 -U testuser:swift -K'ZHPP0EOqd1NVMy
7CHjDX6b4DeBHTnK73HN0RnE3M' list
11.3 配置DNS
1. 安装bind软件包
yuminstall bind* -y
2. 编辑/etc/named.conf,增加IP地址、IP地址范围及zone
vim/etc/named.conf
添加如下配置
listen-on port 53 { 127.0.0.1;10.21.7.16; }; #添加DNS IP allow-query { localhost;10.21.7.0/24; }; #添加IP区间
在文件末尾添加zone: zone "cephrgw.com" IN { type master; file "db.cephrgw.com"; allow-update { none; }; }; |
3. 创建zone文件
vi/var/named/db.cephrgw.com
添加如下内容:
@ 86400 IN SOA cephrgw.com. root.cephrgw.com. ( 2091028 ; serial yyyy-mm-dd 10800 ; refresh every 15 min 3600 ; retry every hour 3600000 ; expire after 1 month + 86400 ); min ttl of 1 day @ 86400 IN NS cephrgw.com. @ 86400 IN A 10.21.7.16 #对应ceph对象网关地址 @ 86400 IN A 10.21.7.15 #对应ceph对象网关地址 @ 86400 IN A 10.21.7.14 #对应ceph对象网关地址 * 86400 IN CNAME @ |
4. 添加dns地址
vi/etc/resolv.conf
#search cephrgw.com nameserver 10.21.7.16 |
5. 启动named服务
servicenamed start
6. 验证测试
nslookupnode-150.cephrgw.com
7. Ceph对象网关关联DNS
vi/etc/ceph/ceph.conf
[client.rgw.node-148] rgw_dns_name = 10.21.7.16 [client.rgw.node-149] rgw_dns_name = 10.21.7.16 [client.rgw.node-150] rgw_dns_name = 10.21.7.16 |
重启rgw服务,验证测试:
swift-A http://node-150.cephrgw.com:7480/auth/1.0 -U testuser:swift -K'ZHPP0EOqd1NVMy7CHjDX6b4DeBHTnK73HN0RnE3M' list