Ceph 部署
# 一、Ceph 部署环境准备
## 1.1 环境节点规划
### 1.1.1 服务器列表
| 节点名 | 主机名 | IP | 系统 | 角色 | 版本 |
|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
| node1 | node1 | 10.40.58.62 | CentOS 7.6 | 管理节点、 监视器节点 OSD存储节点 mgr 节点 | luminous |
| node2 | node2 | 10.40.58.63 | CentOS 7.6 | OSD 存储节点、mgr 节点 | luminous |
| node3 | node3 | 10.40.58.64 | CentOS 7.6 | OSD 存储节点、mgr 节点 | luminous |
### 1.1.2 架构图
![图片](https://uploader.shimo.im/f/kntoa4ZZ1NY36FK6.png!thumbnail)
## 1.2 Ceph 所有节点上安装
>所有节点不包括部署(管理)节点,除非部署(管理)节点也做 MON 或者 OSD 节点
### 1.2.1 声明环境变量
```
export username="ceph-admin"
export passwd="ceph-admin"
export admin-node="admin-node"
export node1="node1"
export node2="node2"
export node3="node3"
export admin-node_ip="10.40.58.62"
export node1_ip="10.40.58.62"
export node2_ip="10.40.58.63"
export node3_ip="10.40.58.64"
```
### 1.2.2 配置主机名解析
```
cat >>/etc/hosts<<EOF
$admin-node_ip ${admin-node}
$node1_ip ${node1}
$node2_ip ${node2}
$node3_ip ${node3}
EOF
```
### 1.2.3 配置 EPEL 源
```
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
cat >/etc/yum.repos.d/epel.repo<<EOF
[epel]
name=Extra Packages for Enterprise Linux 7 - \$basearch
baseurl=http://mirrors.aliyun.com/epel/7/\$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - \$basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/\$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
[epel-source]
name=Extra Packages for Enterprise Linux 7 - \$basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
EOF
yum makecache
```
### 1.2.4 配置 Ceph 源
```
cat >/etc/yum.repos.d/ceph.repo<<EOF
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
gpgcheck=0
priority=1
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS
enabled=0
gpgcheck=1
type=rpm-md
gpgkey=http://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
EOF
yum makecache
```
### 1.2.5 安装 Ceph
>此步相当于在管理节点执行 ceph-deploy install --no-adjust-repos ${node1} ${node2} ${node3}
```
yum install -y ceph ceph-radosgw
```
### 1.2.6 安装 NTP
建议在所有 Ceph 节点上安装 NTP 服务(特别是 Ceph Monitor 节点),以免因时钟漂移导致故障。
Ceph 的守护进程会相互传递关键消息,这些消息必须在达到超时阀值前处理掉。如果 Ceph 监视器时钟不同步,就可能出现多种异常情况。例如:
* 守护进程忽略了收到的消息(如时间戳过时了)
* 消息未及时收到时,超时触发得太快或太晚
```
sudo yum install ntp ntpdate ntp-doc
sudo ntpdate cn.ntp.org.cn
sudo systemctl restart ntpd ntpdate && sudo systemctl enable ntpd ntpdate
```
确保在各 Ceph 节点上启动了 NTP 服务,并且要使用同一个 NTP 服务器 。
### 1.2.7 创建部署 Ceph 的用户
ceph-deploy 工具必须以普通用户登录 Ceph 节点,且此用户拥有无密码使用 sudo 的权限,因为它需要在安装软件及配置文件的过程中,不必输入密码。
较新版的 ceph-deploy 支持用 --username 选项提供可无密码使用 sudo 的用户名(包括 root ,虽然**不建议**这样做)。使用 ceph-deploy --username {username} 命令时,指定的用户必须能够通过无密码 SSH 连接到 Ceph 节点,因为 ceph-deploy 中途不会提示输入密码。
建议在集群内的**所有** Ceph 节点上给 ceph-deploy 创建一个特定的用户,但**不要**用 “ceph” 这个名字。全集群统一的用户名可简化操作(非必需)
>Note 从 [Infernalis 版](http://docs.ceph.org.cn/release-notes/#v9-1-0-infernalis-release-candidate)起,用户名 “ceph” 保留给了 Ceph 守护进程。如果 Ceph 节点上已经有了 “ceph” 用户,安装前必须先删掉这个用户。
```
useradd ${username}
echo "${passwd}" | passwd --stdin ${username}
echo "${username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/${username}
chmod 0440 /etc/sudoers.d/${username}
```
### 1.2.8 设置 sudo 不需要终端(TTY)
如果你的 Ceph 节点默认设置了 requiretty,执行 ceph-deploy 命令时可能会报错,因为 ceph-deploy 用之前创建的用户执行 sudo 命令时需要一个终端(TTY)
```
sed -i 's/Default requiretty/#Default requiretty/' /etc/sudoers
```
### 1.2.9 关闭 SELINUX
```
sed -i "/^SELINUX/s/enforcing/disabled/" /etc/selinux/config
setenforce 0
```
### 1.2.10 配置或关闭防火墙
Ceph Monitors 之间默认使用 6789 端口通信, OSD 之间默认用 6800:7300 这个范围内的端口通信。详情见[网络配置参考](http://docs.ceph.org.cn/rados/configuration/network-config-ref)。 Ceph OSD 能利用多个网络连接进行与客户端、monitors、其他 OSD 间的复制和心跳的通信。
对于 RHEL 7 上的 firewalld ,要对公共域开放 Ceph Monitors 使用的 6789 端口和 OSD 使用的 6800:7300 端口范围,并且要配置为永久规则,这样重启后规则仍有效。例如:
```
sudo firewall-cmd --zone=public --add-port=6789/tcp --permanent
sudo firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-all
```
若使用 iptables ,要开放 Ceph Monitors 使用的 6789 端口和 OSD 使用的 6800:7300 端口范围,命令如下:
```
sudo systemctl disable firewalld
sudo systemctl stop firewalld
sudo iptables -A INPUT -i eth0 -p tcp -s 10.40.0.0/16 --dport 6789 -j ACCEPT
sudo iptables -A INPUT -i eth0 -m multiport -p tcp -s 10.40.0.0/16 --dports 6800:7300 -j ACCEPT
sudo /sbin/service iptables save
```
## 1.3 Ceph 管理节点上安装
>你的部署(管理)节点必须能够通过 SSH 无密码地访问各 Ceph 节点。如果 ceph-deploy 以某个普通用户登录,那么这个用户必须有无密码使用 sudo 的权限。
### 1.3.1 安装 EPEL 源
```
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
cat >/etc/yum.repos.d/epel.repo<<EOF
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
1
EOF
yum makecache
```
### 1.3.2 安装 Ceph 源
```
cat >/etc/yum.repos.d/ceph.repo<<EOF
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
gpgcheck=0
priority=1
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS
enabled=0
gpgcheck=1
type=rpm-md
gpgkey=http://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
EOF
yum makecache
```
### 1.3.3 更新软件库并安装 ceph-deploy
```
sudo yum update && sudo yum install ceph-deploy python-pip
```
### 1.3.4 允许无密码 SSH 登录
```
su - ${username}
ssh-keygen # 生成 SSH 密钥对
ssh-copy-id ${username}@node1 # 把公钥拷贝到各 Ceph 节点
ssh-copy-id ${username}@node2
ssh-copy-id ${username}@node3
```
# 二、Ceph 集群部署
>以下操作在部署(管理)节点上用之前创建的普通用户操作
用 ceph-deploy 从管理节点建立一个 Ceph 存储集群,该集群包含三个节点,它有一个 Monitor 和两个 OSD 守护进程。一旦集群达到 active + clean 状态,再扩展它:增加第三个 OSD 、增加元数据服务器和两个 Ceph Monitors。
![图片](https://uploader.shimo.im/f/kntoa4ZZ1NY36FK6.png!thumbnail)
## 2.1 创建集群
### 2.1.1 创建放置配置文件目录
为获得最佳体验,先在管理节点上创建一个目录,用于保存 ceph-deploy 生成的配置文件和密钥对。ceph-deploy 会把文件输出到当前目录,所以请确保在此目录下执行 ceph-deploy 。
```
su - ${username}
mkdir my-cluster
cd my-cluster
```
>如果你是用另一普通用户登录的,不要用 sudo 或在 root 身份运行 ceph-deploy ,因为它不会在远程主机上调用所需的 sudo命令。
### 2.1.2 创建新的集群
在管理节点上,进入刚创建的放置配置文件的目录,执行 ceph-deploy 的 new 子命令。此操作
会创建一个默认名为 ceph 的新集群,并且生成集群配置文件和 MON 密钥文件。ceph-deploy new 后面跟几个 Mon 节点,作为初始的监视器法定人(至少一个,需使用奇数个,用偶数可能导致脑裂)。
并指定几个主机作为初始监视器法定人
```
ceph-deploy new ${node1}
```
在当前目录下用 ls 和 cat 检查 ceph-deploy 的输出,应该有一个 Ceph 配置文件(ceph.conf)、一个 MON 密钥文件(ceph.mon,keyring)和一个日志文件(ceph-deploy-ceph.log)。
### 2.1.3 修改默认 Ceph 配置文件
```
vim ceph.conf
[global]
......
osd pool default size = 2 # 缺省值是3,达到 active + clean 状态的副本数目
osd pool default min sisz = 1 # 缺省值是0.达到 degraded 状态的副本数目,它应该小于 osd pool default size 的值,为存储池中的object设置最小副本数目来确认写操作。即使集群处于 degraded 状态,如果最小值不匹配,Ceph 将不会确认写操作给客户端。
osd pool default pg num = 333 # 每个存储池默认的pg数
osd pool default pgp num = 333 # PG和PGP的个数应该保持一致。PG和PGP的值很大程度上取决于集群大小。
osd journal size = 1024 # 缺省值为0。你应该使用这个参数来设置日志大小。日志大小应该至少是预期磁盘速度和 filestore 最大同步时间间隔的两倍。如果使用了 SSD 日志,最好创建大于10GB的日志,并调大 filestore 的最小、最大同步时间间隔。
public network = 10.40.58.0/24 # 公网IP地址
cluster network = 10.40.58.0/24 # 内网IP地址
```
### 2.1.4 配置初始 monitor(s)、并收集所有密钥
```
ceph-deploy mon create-initial
```
完成上述操作后,当前目录里应该会出现这些密钥环
* ceph.client.admin.keyring
* ceph.bootstrap-osd.keyring
* ceph.bootstrap-mds.keyring
* ceph.bootstrap-rgw.keyring
### 2.1.5 拷贝配置信息到各节点
用 ceph-deploy 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点,这样你每次执行 Ceph 命令行时就无需指定 monitor 地址和 ceph.client.admin.keyring 了。
```
ceph-deploy admin ${admin-node} ${node1} ${node2} ${node3}
```
>Ceph 各节点 需要对 ceph.client.admin.keyring 有读的权限,才能正常执行 Ceph 命令
>以下命令需要在 Ceph 各节点执行
```
sudo chmod +r /etc/ceph/ceph.client.admin.keyring
```
### 2.1.6 配置(增加) OSD
>这里要注意,老版本的 ceph-deploy prepare/activate 命令已经在 L 版中不能使用了
执行下列命令列举某个节点上的磁盘
```
ceph-deploy disk list node1
```
这里使用 for循环批量配置,也可以单独配置
```
for disk in "/dev/vdc /dev/vdd /dev/vde"
do
for node in "node1 node2 node3"
do
ceph-deploy disk zap ${node} ${disk} # 擦净(删除分区表)磁盘,以用于 Ceph
ceph-deploy osd create ${node} --data ${disk} # 创建 OSD
done
done
```
### 2.1.7 检查集群状态
```
ceph health
ceph -s
```
等 peering 完成后,集群应该达到 active + clean 状态
## 2.2 Ceph mgr(Web 界面)
手动部署 ceph mgr (luminous 版) - Terry Tsang - CSDN博客
[https://blog.csdn.net/signmem/article/details/78589724](https://blog.csdn.net/signmem/article/details/78589724)
ceph (luminous 版) zabbix 监控 - Terry Tsang - CSDN博客
[https://blog.csdn.net/signmem/article/details/78667569](https://blog.csdn.net/signmem/article/details/78667569)
>luminous 版本新特色
>由 mgr 提供的一个 Web 界面
>只能够用于监控显示, 无法进行信息更改
>ceph-mgr 对于当前 ceph 版本十分重要
>主要用于管理 pg map 作用
>当 ceph-mgr 发生故障, 相当于整个 ceph 集群都会出现严重问题
>建议在每个 MON 中都创建独立的 ceph-mgr (至少 3 个 CEPH MON 节点)
>只需要在每个 MON 节点参考下面方法进行创建即可 (注, 每个 mgr 需要不同的独立的命名)
### 2.2.1 安装 mgr
在管理节点执行如下命令:
```
ceph-deploy install --mgr --no-adjust-repos node1 node2 node3
```
以上命令等同于在 每个 Ceph mgr 节点执行如下命令:
```
yum -y install ceph-mgr
```
### 2.2.2 新建 mgr 实例
```
ceph-deploy mgr create ${node1} ${node2} ${node3}
```
### 2.2.3 开启 dashboard 模块
在任意 MON 节点 上执行
```
ceph mgr module enable dashboard
```
### 2.2.4 修改 dashboard IP 和端口
```
ceph config-key set mgr/dashboard/server_addr 10.40.58.62
ceph config-key set mgr/dashboard/server_port 6666
sudo systemctl restart ceph-mgr@node1.service # 去指定 mgr 节点上执行
sudo systemctl restart ceph-mgr@node2.service
sudo systemctl restart ceph-mgr@node3.service
```
### 2.2.5 访问 Web 界面
获取访问URL
```
ceph mgr services
```
端口默认是7000,如果执行了修改 IP 和端口步骤则使用修改后的 IP 和端口访问
```
http://10.48.58.62:7000
```
M版可设置帐密访问方式,详见:
[https://www.cnblogs.com/weijie0717/p/8383938.html](https://www.cnblogs.com/weijie0717/p/8383938.html)
## 2.3 删除集群
### 2.3.1 清除集群配置
如果在某些地方碰到麻烦,想从头再来,可以用下列命令清除配置:
```
ceph-deploy purgedata ${node1}
ceph-deploy forgetkeys
```
### 2.3.2 卸载并清除集群配置
用下列命令可以连 Ceph 安装包一起清除:
```
ceph-deploy purge ${node1}
```
如果执行了 purge ,你必须重新安装 Ceph 。
### 2.3.3 清理 OSD 磁盘
用于恢复磁盘原始状态,待测试
```
umount /var/lib/ceph/osd/ceph-7
rm -rf /var/lib/ceph/osd/ceph-7
ceph-volume lvm zap /dev/vdj
lvremove /dev/ceph-*
vgs|grep ceph|awk '{print $1}'|xargs vgremove
pvremove /dev/vdj
reboot
或者
parted -s /dev/vdj mklabel gpt mkpart primary xfs 0% 100%
reboot
mkfs.xfs /dev/vdj -f
```
# 三、Ceph 集群运维
## 3.1 删除 OSD (手动)
### 3.1.1 把 OSD 踢出集群
删除 OSD 前,它通常是 up 且 in 的,要先把它踢出集群,以使 Ceph 启动重新均衡、把数据拷贝到其他 OSD 。
```
ceph osd out osd.7
```
### 3.1.2 观察数据迁移
一旦把 OSD 踢出( out )集群, Ceph 就会开始重新均衡集群、把归置组迁出将删除的 OSD 。你可以用 [ceph](http://docs.ceph.org.cn/rados/operations/monitoring) 工具观察此过程。
```
ceph -w
```
你会看到归置组状态从 active+clean 变为 active, some degraded objects 、迁移完成后最终回到 active+clean 状态。( Ctrl-c 中止)
>注意: 有时候,(通常是只有几台主机的“小”集群,比如小型测试集群)拿出( out )某个 OSD 可能会使 CRUSH 进入临界状态,这时某些 PG 一直卡在 active+remapped 状态。如果遇到了这种情况,你应该把此 OSD 标记为 in ,用这个命令:
```
ceph osd in osd.7
```
等回到最初的状态后,把它的权重设置为 0 ,而不是标记为 out ,用此命令:
```
ceph osd crush reweight osd.7 0
```
执行后,你可以观察数据迁移过程,应该可以正常结束。把某一 OSD 标记为 out 和权重改为 0 的区别在于,前者,包含此 OSD 的桶、其权重没变;而后一种情况下,桶的权重变了(降低了此 OSD 的权重)。某些情况下, reweight 命令更适合“小”集群。
### 3.1.3 停止 OSD
把 OSD 踢出集群后,它可能仍在运行,就是说其状态为 up 且 out 。删除前要先停止 OSD 进程。
```
sudo systemctl stop ceph-osd@7.service systemctl start ceph-osd@7.service
```
停止 OSD 后,状态变为 down 。
### 3.1.4 将OSD 移出集群 CRUSH 图
删除 CRUSH 图的对应 OSD 条目,它就不再接收数据了
```
ceph osd crush remove osd.7
```
### 3.1.5 删除 OSD 认证密钥
```
ceph auth del osd.7
```
### 3.1.6 删除 OSD
```
ceph osd rm osd.7
```
### 3.1.7 卸载并删除 OSD 挂载目录
通过 mount 命令 查看需要卸载并删除的目录
```
mount
umount /var/lib/ceph/osd/ceph-7
rm -rf /var/lib/ceph/osd/ceph-7
```
### 3.1.8 清理 OSD 磁盘
通过 lsblk 命令 查看需要清理的磁盘
```
ceph-volume lvm zap /dev/vdg
```
### 3.1.9 还原 OSD 磁盘
```
lvremove /dev/ceph-*
vgs|grep ceph|awk '{print $1}'|xargs vgremove
pvremove /dev/vdg
reboot
或者
parted -s /dev/vdg mklabel gpt mkpart primary xfs 0% 100%
reboot
mkfs.xfs /dev/vdg -f
```
### 3.1.10 配置文件中删除对应条目
登录到部署(管理)节点,进入放置配置文件的目录(my-cluster),删除 ceph.conf 配置文件对应条目
```
[osd.7]
host = node2
```
然后拷贝配置信息到各节点
```
ceph-deploy admin ${admin-node} ${node1} ${node2} ${node3}
```
## 3.2 增加 OSD
### 3.2.1 通过 ceph-deploy 增加 OSD
```
ceph-deploy disk zap node1 /dev/vdc # 擦净(删除分区表)磁盘,以用于 Ceph
ceph-deploy osd create node1 --data /dev/vdc # 创建 OSD
```
### 3.2.2 手动增加
删除 OSD(手动)的逆向操作,用于 OSD 异常时恢复(待验证)
```
ceph auth add osd.7
ceph auth add osd.7 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-6/keyring
ceph osd crush add osd.7 0.00999 host=node2
systemctl start ceph-osd@7.service
```
## 3.3 删除 MON
ceph-deploy 方式
```
ceph-deploy mon destroy node2
```
手动方式
```
ceph mon remove node2
```
## 3.4 增加 MON
### 3.4.1 将 MON 节点 添加到现有集群
ceph-deploy 方式(管理节点上执行)
```
ceph-deploy mon add node2
```
手动方式( MON 节点上执行)
```
ceph mon add node2 10.40.58.63
```
### 3.4.2 根据配置文件增加 MON
如果未传递任何参数,则默认使用 ceph.conf 配置中定义的“mon_initial_members”来部署 MON
```
ceph-deploy mon create node1 node2 node3
```
### 3.4.3 查看 MON quorum 状态信息
```
ceph quorum_status --format json-pretty
```
# 四、Ceph 对象存储
## 4.1 安装 Ceph 对象网关
自从 firefly (v0.80) 版本开始,Ceph 对象网关运行在 Civetweb 上(已经集成进守护进程 ceph-radosgw ),而不再是 Apache 和 FastCGI 之上。使用 Civetweb 简化了Ceph对象网关的安装和配置。
### 4.1.1 准备工作
首先进行 环境检查 并在你的 Ceph 对象网关节点上执行安装前的准备工作。特别的,你需要禁用部署 Ceph 集群所用用户的 requiretty ,同时设置 SELinux 为 Permissive 以及 Ceph 部署用户使用 sudo 时无需密码。对于 Ceph 对象网关,在生产环境下你需要开起 Civetweb 所使用的端口。
>注意: Civetweb默认运行在 7480 端口上。
### 4.1.2 安装 Ceph 对象网关
在管理节点执行如下命令:
```
ceph-deploy install --rgw --no-adjust-repos ${node1} ${node2} ${node3}
```
以上命令等同于在 每个 Ceph 对象网关节点执行如下命令:
```
yum -y install ceph-radosgw
```
### 4.1.3 拷贝配置信息到对象网关节点
用 ceph-deploy 把配置文件和 admin 密钥拷贝到 Ceph 对象网关节点,这样你每次执行 Ceph 命令行时就无需指定 monitor 地址和 ceph.client.admin.keyring 了。
```
ceph-deploy admin ${node1} ${node2} ${node3}
```
>Ceph 对象网关节点 需要对 ceph.client.admin.keyring 有读的权限,才能正常执行 Ceph 命令
>以下命令需要在 Ceph 对象网关节点执行
```
sudo chmod +r /etc/ceph/ceph.client.admin.keyring
```
### 4.1.4 新建网关实例
在你的管理节点的工作目录下,使用命令在 Ceph 对象网关节点上新建一个 Ceph对象网关实例。举例如下:
```
ceph-deploy rgw create ${node1} ${node2} ${node3}
```
在网关服务成功运行后,你可以使用未经授权的请求来访问端口 7480 ,就像这样:
```
http://10.40.58.62:7480
```
如果网关实例工作正常,你接收到的返回信息大概如下所示:
```
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>anonymous</ID>
<DisplayName></DisplayName>
</Owner>
<Buckets>
</Buckets>
</ListAllMyBucketsResult>
```
### 4.1.5 修改默认端口
Civetweb 默认运行在端口 7480 之上.。如果想修改这个默认端口 (比如使用端口 80),修改你的管理节点的工作目录下的 Ceph 配置文件。 添加一节,以 [client.rgw.<gateway-node>] 作为名字, 使用你的 Ceph 对象网关节点的短主机名替换其中的 <gateway-node> (如, hostname -s).
>注意: 在 0.94 版本中,Ceph 对象网关不再支持 SSL。你可以设置一个支持 SSL 的反向代理服务器来将 HTTPS 请求转为HTTP请求发给 CivetWeb。
在管理节点的管理目录下修改,比如, 如果你的主机名是 node1, 在 [global] 节后添加的信息如下:
```
[client.rgw.node1]
rgw_frontends = "civetweb port=80"
```
将该配置文件推送到你的 Ceph 对象网关节点(也包括其他 Ceph 节点):
```
ceph-deploy --overwrite-conf config push ${node1} ${node2} ${node3}
```
为了使新配置的端口生效,需要重启 Ceph 对象网关:
```
sudo systemctl restart ceph-radosgw@rgw.`hostname -s`
```
最后,需要确保你选择的端口在节点的防火墙配置中是开放的 (比如, 端口 80)。 如果它不是开放的,将它设为开放并重启防火墙。 如果你是用的是 firewald,执行下面的命令:
```
sudo firewall-cmd --list-all
sudo firewall-cmd --zone=public --add-port 80/tcp --permanent
sudo firewall-cmd --reload
```
若使用的是iptables ,执行下面的命令:
```
sudo systemctl disable firewalld
sudo systemctl stop firewalld
sudo iptables -A INPUT -i eth0 -p tcp -s 10.40.0.0/16 --dport 80 -j ACCEPT
sudo /sbin/service iptables save
```
### 4.1.6 开启 bucket 索引分片功能
Ceph 对象网关在 index_pool 中存储 bucket 的索引数据,默认情况下是资源池 .rgw.buckets.index 。有时用户喜欢把很多对象(几十万到上百万的对象)存放到同一个 bucket 中。如果你不使用网关的管理接口来为每个 bucket 的最大对象数设置配额,那么当一旦用户存放大量的对象到一个 bucket 中时,bucket 索引的性能会呈现明显的下降。
在0.94版本的 Ceph 中,您可以给 bucket 索引进行分片,这样在你允许 bucket 中有大量对象时,能够有助于防止出现性能瓶颈。设置项的 “rgw_override_bucket_index_max_shards“ 允许您设置一个 bucket 的最大分片数。它的默认值为 0 ,这意味着 bucket 索引分片功能在默认情况下情况下是关闭的,也就是“无数个“”。
开启 bucket 的索引分片功能,只需给 rgw_override_bucket_index_max_shards 设置一个大于 0 的值。
简单的配置,只需要在 Ceph 配置文件中加入 rgw_override_bucket_index_max_shards 。将其添加在 [global] 部分来设置一个系统层面生效的值。你也可以在 Ceph 配置文件中将它设置为某一个实例生效。
在管理节点的管理目录下修改,比如, 如果你的主机名是 node1, 在 [global] 节后添加的信息如下:
```
[global]
rgw_override_bucket_index_max_shards = "1000"
```
将该配置文件推送到你的 Ceph 对象网关节点(也包括其他 Ceph 节点):
```
ceph-deploy --overwrite-conf config push ${node1} ${node2} ${node3}
```
为了使 bucket 索引分片功能生效,需要重启 Ceph 对象网关:
```
sudo systemctl restart ceph-radosgw@rgw.`hostname -s`
```
>注意:以下命令在L版中不支持,可替代命令待查
态设置bucket_index_max_shards参数 | 奋斗的松鼠 - 谭老师 - blog
[http://www.strugglesquirrel.com/2018/06/27/%E5%8A%A8%E6%80%81%E8%AE%BE%E7%BD%AEbucket-index-max-shards%E5%8F%82%E6%95%B0/](http://www.strugglesquirrel.com/2018/06/27/%E5%8A%A8%E6%80%81%E8%AE%BE%E7%BD%AEbucket-index-max-shards%E5%8F%82%E6%95%B0/)
对于异地场景的配置而言,为了灾备每一个 zone 都有一个不同的 index_pool 设置。为了保持这个参数在一个 region 的所有 zone 中保持一致,你可以在 region 的网关配置中指定 rgw_override_bucket_index_max_shards 。举例如下:
```
radosgw-admin region get > region.json
```
打开 region.json 的文件,为每一个 zone 编辑 bucket_index_max_shards 的设置。保存 region.json 文件并重置 region。举例如下:
```
radosgw-admin region set < region.json
```
一旦你更新了你的 region,你需要更新 region map。举例如下:
```
radosgw-admin regionmap update --name client.rgw.ceph-client
```
其中的 client.rgw.ceph-client 是网关用户的名字。
>注意: 通过 CRUSH 规则集将索引资源池 (如果可以为每一个zone设置) 映射到基于 SSD的 OSD 上也能够提升 bucket 索引的性能。
## 4.2 使用 S3 API 访问 Ceph 对象存储
### 4.2.1 为 S3 访问创建 radosgw 用户
```
radosgw-admin user create --uid=radosgw --display-name=“radosgw"
```
>注意:请把 access_key 和 secret_key 保存下来 ,如果忘记可使用:radosgw-admin user info --uid … -k … --name …
### 4.2.2 安装 s3cmd 客户端
```
yum install s3cmd -y
```
### 4.2.3 配置 s3cmd 客户端
```
s3cmd --configure
```
将会在家目录下创建 .s3cfg 文件 , location 必须使用 US , 不使用 https
编辑 .s3cfg 文件,修改 host_base 和 host_bucket
```
vi .s3cfg
……
host_base = node3:7480
host_bucket = %(bucket).node3:7480
……
```
### 4.2.4 创建存储桶并放入文件
```
s3cmd mb s3://first-bucket
s3cmd ls
s3cmd put /etc/hosts s3://first-bucket
s3cmd ls s3://first-bucket
```
## 4.3 使用 Swift API 访问 Ceph 对象存储
......