本人实属菜鸟,不小心跑脚本搞崩了一台服务器。。。学艺不精,难受。。。
话不多说,闯的祸总得弥补和解决~
一、安装ubuntu系统
这个不是此处重点,但是由于本人以前都是在各种大佬的庇护下成长的,所以这种事情也是头一回,还是搞了好一会儿。
可以参照一下两个链接的教程:
https://jingyan.baidu.com/article/bea41d439726c1b4c51be629.html
https://www.linuxidc.com/Linux/2017-11/148341.htm
安装好了虚拟机后,首次登陆设置root密码——sudo passwd,修改成功后,输入命令su root进入root用户。
(1)安装好了系统之后需要手动配置静态IP:
vim /etc/network/interfaces
修改文件内容举例如下:(我的不叫eth0,是enp2s0,输入ifconfig看第一个)
auto eth0
iface eth0 inet static
address 192.168.0.124
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameserver 114.114.114.114
(2)更新主机源,安装相应的包
配置/etc/apt/sources.list,然后更新源,先用echo “ “ > /etc/apt/sources.list清空,然后输入对应的源地址,输入如下:
deb [arch=amd64] http://200.200.212.190/ubuntu/archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse
(3)安装ssh工具,安装完之后可在电脑上远程操作
apt-get install openssh-server
安装不成功时,需要执行apt-get remove openssh-client
Xshell连接Ubuntu时SSH服务器拒绝了密码问题——vi / etc/ssh/sshd_config
将PermitRootLogin 后面改为yes
之后重启ssh-server ——sudo /etc/init.d/ssh resarte
(4)安装vim工具:apt-get install vim
(5)安装ceph环境
- 增加ceph源,在 /etc/apt/sources.list 中加入以下内容:
deb [arch=amd64] http://200.200.212.190/ubuntu/archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
deb [arch=amd64] http://200.200.212.190/ubuntu/archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://200.200.212.190/ubuntu/archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://200.200.212.190/ubuntu/archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://200.200.212.190/ubuntu/archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe multiverse
deb [arch=amd64] http://200.200.212.190/ubuntu/release/Ubuntu/ xenial main
deb-src http://200.200.212.190/ubuntu/release/Ubuntu/ xenial main
二、Ceph集群部署
输出内容——ceph version 12.2.4 (52085d5249a80c5f5121a76d6288429f35e4e77b) luminous (stable)
- 更新源 apt-get update
- 执行安装命令apt-get install ceph --allow-unauthenticated
- 查看ceph版本确认是否正常安装ceph:ceph --version
1、创建用户
在运行 ceph 守护进程的节点上创建一个普通用户
- useradd ceph -d /home/ceph -m ——创建的时候可能会显示用户已存在,因为Ubuntu系统自带ceph用户,可以直接用该用户
- passwd ceph——更改ceph用户密码
2、设置host,添加节点对应的ip
- vim /etc/hostname ——更改主机名(如node1)
- vim /etc/hosts
如:200.200.102.140 node1
3、给集群分配唯一uuid
uuidgen
输出如:bda28ad8-b3e8-452c-bdab-65e114a19567,记下来,下一步要用
4、创建 ceph 配置文件, ceph 默认使用 ceph.conf ,其中的 ceph 是集群名字
vim /etc/ceph/ceph.conf
将步骤2生成的唯一uuid写入配置文件
fsid = {UUID}
如:fsid=bda28ad8-b3e8-452c-bdab-65e114a19567
5、把初始监视器写入ceph配置文件
mon initial members = {hostname}[,{hostname}]
例如:mon initial members = node1
6、把初始监视器的 IP 地址写入 ceph 配置文件、并保存
mon host = {ip-address}[,{ip-address}]
例如:mon host = 200.200.102.140
以上三步完成后就保存ceph 配置文件并退出。
7、为此集群创建密钥环、并生成监视器密钥
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
ceph-authtool命令
功能描述:ceph的密钥环操作工具
概要:
ceph-authtool keyringfile
- [ -l | --list ]
- [ -p | --print-key ]
- [ -C | --create-keyring ]
- [ -g | --gen-key ]
- [ --gen-print-key ]
- [ --import-keyring otherkeyringfile ]
- [ -n | --name entityname ]
- [ -u | --set-uid auid ]
- [ -a | --add-key base64_key ]
- [ --cap subsystem capability ]
- [ --caps capfile ]
选项说明:
- -l, --list列出keyring文件中的所有keys和capabilities
- -p, --print-key 打印指定的实体的编码后的key
- -C, --create-keyring 创建密钥环,如果密钥环存在,则重写
- -g, --gen-key 为指定的实体生成密钥
- --import-keyring FILE 要被导入的密钥环文件
- -n 指定操作的实体名称,格式为type.id,type的有效类型有:auth,mon,osd,mds,mgr,client等。
- -u, --set-uid *auid* 设置实体的auid,即认证用户的user id
- -a BASE64, --add-key BASE64 添加编码后的key到keyring中
- --cap *subsystem* *capability* 设置子系统支持的capability
- --caps *capsfile* 设置所有子系统关联的key的所有功能。
capability:
ceph的子系统有: mon,mds,osd,mgr
capability是对给定用户允许做哪些操作的一个描述。采用逗号分隔的形式,包含一个或多个rwx权限说明符的allow子句列表。 allow * 授予给定的子系统超级用户的权限.
例如:
osd = "allow rwx" 允许读写和执行
mds = "allow" 允许进入
mon = "allow rwx" 允许修改集群状态
librados 用户对单个池的严格限制:
mon = "allow r"
osd = "allow rw pool foo"
客户端使用rbd,访问一个池,并且读写另外一个池:
mon = "allow r"
osd = "allow class-read object_prefix rbd_children, allow pool templates r class-read, allow pool vms rwx"
客户端使用最小权限挂载文件系统:
mds = "allow"
osd = "allow rw pool data"
mon = "allow r"
OSD CAPABILITIES
通常,osd 的功能遵循下面语法:
osdcap := grant[,grant...]
grant := allow (match capspec | capspec match)
match := [pool[=]<poolname> | object_prefix <prefix>]
capspec := * | [r][w][x] [class-read] [class-write]
capspec 取决于实体可以执行的操作类型:
r = 读对象
w = 写对象
x = 能调用任何类方法
class-read = 能调用类中的读方法
class-write = 能调用类中的写方法
* = 等价于rwx,再加上执行osd admin命令的权限。比如ceph osd tell
CAPS 文件格式
Caps 文件格式,包含零个或多个key/value对,每行一个.key和值通过’=’分隔,如果值包含空格,则必须使用单引号或者双引号引用。Key是ceph子系统的名称,而值是capability的字符串值.
8、生成管理员密钥环,生成 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' --cap mgr 'allow *'
9、把 client.admin 密钥加入 ceph.mon.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
10、用规划好的主机名、对应 IP 地址、和 FSID 生成一个监视器图,并保存为 /tmp/monmap
monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
例如:monmaptool --create --add node1 200.200.102.140:6789 --fsid bda28ad8-b3e8-452c-bdab-65e114a19567 /tmp/monmap
注意:{hostname} {ip-address} --fsid {uuid} 这一步的填写。
11、在监视器主机上分别创建数据目录
sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
例如:sudo mkdir /var/lib/ceph/mon/ceph-node1
12、用监视器图和密钥环组装守护进程所需的初始数据
ceph-mon [--cluster {cluster-name}] --mkfs -i {monid} --keyring /tmp/ceph.mon.keyring
例如:ceph-mon --mkfs -i node1 --keyring /tmp/ceph.mon.keyring
ceph-mon
功能描述:ceph 监视器的守护。
概要:
ceph-mon -i monid [ --mon-data mondatapath ]
选项:
- -f, --foreground 启动后不用守护进程。不生成pid文件。在执行ceph-run时很有用
- -d debug模式运行。类似-f,但会发送所有的日志输出到stderr中
- --setuser userorgid 启动后设置用户uid.如果指定了用户名称,则查找用户记录以获得uid和gid,并且gid也会被设置,除非通过--setgroup显式设置了gid
- --setgroup grouporgid 启动后设置gid.如果指定了组名称,则查找组记录以获得gid
- -c ceph.conf, --conf=ceph.conf 使用ceph.conf配置文件,代替默认的/etc/ceph/ceph.conf,用于在启动过程中决定监视器的地址
- --keyring 指定密钥环,与--mkfs一起使用
- --mkfs 初始监视器数据目录,通过给定的种子信息生成并初始ceph的文件系统,或者将监视器加入已存在的监视器集群.
以下三个信息必须提供:
- 集群的fsid. 通过指定的 --monmap<path>获得,获得显式的通过 --fsid<uuid>指明.
- 监视器列表和它们的的地址。监视器列表可以来源于 --monmap文件,地址来源于ceph.conf的mon host配置,或者mon addr配置。如果该监视器是新集群的初始监视器,那么它必须包含在ceph.conf的initial 列表中,name或者address必须同配置之后的列表匹配。
- 监视器的mon 密钥。 通过--keyring<path>提供
monid 一般设置为主机的hostname,且必须与第10步中的monmaptool中的name一致,不然会发现执行了该命令之后,数据目录中缺少keyring文件.
13、修改监视器主机数据目录的属主为ceph
chown -R ceph.ceph /var/lib/ceph/mon/ceph-node1
因为ceph-mon守护进程默认以ceph用户运行
14、完善ceph配置文件
vim /etc/ceph/ceph.conf
添加以下内容:
单机部署时,设置osd_crush_chooseleaf_type = 0
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_crush_chooseleaf_type = 1
osd_pool_default_size = 1
osd_journal_size = 100
15、启动监视器
通过服务方式启动——systemctl start ceph-mon@{monid}l
例如:systemctl start ceph-mon@node1
以上步骤创建了monitor,下面将要创建OSD。
三、创建OSD
以下的配置及操作,都假设我们只有两个OSD
1. 硬盘分区
首先确认你的系统有两块与系统无关的磁盘,如果没有,对于虚拟机来讲可以进行添加磁盘。
使用命令lsblk查看磁盘情况
假设你的硬盘sdb有100G,那么
如上操作就能把该硬盘划分为不同大小的四块盘,可以按照自己的需求划分。
- parted -s /dev/sdb mklabel gpt
- parted -s /dev/sdb mkpart primary 1 20G
- parted -s /dev/sdb mkpart primary 20G 50G
- parted -s /dev/sdb mkpart primary 50G 80G
- parted -s /dev/sdb mkpart primary 80G 100G
2.配置ceph.conf
红色表示根据osd服务器实际情况修改内容.
- db path为rocksdb 存放数据的位置
- wal path 为rocksdb的原子操作位置
- block path 为实际数据存放的位置
而我们留下的第一个分区 /dev/sdb1 、/dev/sdc1 做为osd的元数据存放位置,里面存放osd的keying,whoami等校验文件。
将以下内容加入到/etc/ceph/ceph.conf中:
[osd]
osd mkfs type = xfs
osd data =/var/lib/ceph/osd/$cluster-$id
osd objectstore = bluestore
bluestore fsck on mount = true
bluestore block create = true
bluestore block db size =48864
bluestore block db create = true
bluestore block wal size =1300000
bluestore block wal create =true
[osd.0]
host = node1
bluestore block db path = /dev/sdb2
bluestore block wal path = /dev/sdb3
bluestore block path = /dev/sdb4
[osd.1]
host = node1
bluestore block db path = /dev/sdc2
bluestore block wal path = /dev/sdc3
bluestore block path = /dev/sdc4
3.创建osd的元数据目录
mkfs.xfs /dev/sdb1
mkfs.xfs /dev/sdc1
mkdir -p /var/lib/ceph/osd/ceph-0
mkdir -p /var/lib/ceph/osd/ceph-1
mount /dev/sdb1 /var/lib/ceph/osd/ceph-0
mount /dev/sdc1 /var/lib/ceph/osd/ceph-1
4.OSD
(1)创建osd——ceph osd create
这一步可能会遇到错误:Cluster connection interrupted or timed out
这是因为没有开启服务,可以查看monitor——ps -elf|grep ceph-mon
解决方法——systemctl start ceph-mon@node1
systemctl命令是系统服务管理器指令
(2)创建osd的元数据
sudo ceph-osd -i 0 --mkfs --mkkey
注意,这里如果你要创建两个osd则需要执行两次ceph osd create ,如下:
ceph osd create
sudo ceph-osd -i 0 --mkfs --mkkey
ceph osd create
sudo ceph-osd -i 1 --mkfs --mkkey
正常输出如下:
2018-07-22 21:32:19.753081 7effffb2de00 -1 auth: error reading file: /var/lib/ceph/osd/ceph-0/keyring: can't open /var/lib/ceph/osd/ceph-0/keyring: (2) No such file or directory
2018-07-22 21:32:19.818500 7effffb2de00 -1 created new key in keyring /var/lib/ceph/osd/ceph-0/keyring
2018-07-22 21:32:19.982231 7effffb2de00 -1 bluestore(/var/lib/ceph/osd/ceph-0/block) _read_bdev_label failed to open /var/lib/ceph/osd/ceph-0/block: (2) No such file or directory
2018-07-22 21:32:19.982268 7effffb2de00 -1 bluestore(/var/lib/ceph/osd/ceph-0/block) _read_bdev_label failed to open /var/lib/ceph/osd/ceph-0/block: (2) No such file or directory
2018-07-22 21:32:19.982284 7effffb2de00 -1 bluestore(/var/lib/ceph/osd/ceph-0/block) _read_bdev_label failed to open /var/lib/ceph/osd/ceph-0/block: (2) No such file or directory
2018-07-22 21:32:20.350831 7effffb2de00 -1 bluestore(/var/lib/ceph/osd/ceph-0) _read_fsid unparsable uuid
2018-07-22 21:32:30.398186 7effffb2de00 -1 created object store /var/lib/ceph/osd/ceph-0 for osd.0 fsid 43bf26f8-4038-4d89-9d24-5181ad5490aa
(3)注册osd 密钥,osd的keyring路径取决于元数据的存储路径
有两个osd则输入两次命令,注意修改osd的osdnum :
sudo ceph auth add osd.0 osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-0/keyring
sudo ceph auth add osd.1 osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-1/keyring
(4)把此osd节点加入CRUSH map
sudo ceph osd crush add-bucket node1 host
(5)把host加到crush map的根节点root
sudo ceph osd crush move node1 root=default
(6)把osd加到crush map的host中,将此osd节点作为主机的一个条目、分配权重、重新编译、注入集群
root@node1:/etc/ceph# ceph osd crush add osd.1 1.0 host=node1
输出:add item id 2 name 'osd.1' weight 1 at location {host=node1} to crush map
(7)修改osd数据目录和磁盘分区的属主
chown -R ceph.ceph /var/lib/ceph/osd/ceph-0
chown ceph /dev/sdb2
chown ceph /dev/sdb3
chown ceph /dev/sdb4
(8)启动osd
服务器启动——service ceph-osd@0 start
手动启动——ceph-osd -i {osdnumber} 例如:ceph-osd -i 0
5.MDS
(1)创建mds工作目录——mkdir -p /var/lib/ceph/mds/ceph-node1
(2)2.注册mds的密钥。{$id} 是 MDS 的标识字母
ceph auth get-or-create mds.node1 mds 'allow *' osd 'allow rwx' mon 'allow profile mds' -o /var/lib/ceph/mds/ceph-node1/keyring
(3)启动mds进程
服务器启动——service ceph-mds@node1 start
手动启动——ceph-mds --cluster ceph --id node1 --setuser ceph --setgroup ceph
6. Pool
1、创建pool
ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] \
[crush-ruleset-name] [expected-num-objects]
ceph osd pool create {pool-name} {pg-num} {pgp-num} [erasure] \
[erasure-code-profile] [crush-ruleset-name] [expected_num_objects]
例如:
ceph osd pool create fsdata 128 128
ceph osd pool create fsmetadata 128 128
参数说明:
- pool-name 存储池名称,必须唯一;string;必需
- pg-num 存储池拥有的归置组总数;整型;必需
- pgp-num 用于归置的归置组总数;整型;必需
- {replicated|erasure} 存储池类型,可以是副本(保存多份对象副本,以便从丢失的 OSD 恢复)或纠删(获得类似 RAID5 的功能);string;非必需
- crush-ruleset-name 此存储池所用的 CRUSH 规则集名字。指定的规则集必须存在;string; 非必需
- erasure-code-profile=profile 仅用于纠删存储池。指定纠删码配置框架,此配置必须已由 osd erasure-code-profile set 定义;string;非必需
- expected-num-objects 为这个存储池预估的对象数。设置此值(要同时把 filestore merge threshold 设置为负数)后,在创建存储池时就会拆分 PG 文件夹,以免运行时拆分文件夹导致延时增大;整型;非必需
7. 创建ceph文件系统
一个ceph文件系统需要至少两个rados存储池,一个用于数据,一个用于元数据。创建好存储池后,就可以用fs new命令创建文件系统了:
ceph fs new <fs_name> <metadata> <data>
例如:ceph fs new cephfs fsmetadata fsdata
文件系统创建完毕后, MDS 服务器就能达到 active 状态了,比如在一个单 MDS 系统中:
$ ceph mds stat
e5: 1/1/1 up {0=a=up:active}
创建好文件系统且 MDS 活跃后,就可以挂载此文件系统。
8. 把ceph FS挂载为FUSE
单节点不用挂载,直接执行如下操作:
使用ceph-fuse命令挂载ceph文件系统作为客户机的用户空间文件系统。
sudo mkdir /home/usernname/cephfs
sudo ceph-fuse -m 200.200.102.140:6789 /home/username/cephfs
注意,这里的username是你的主机名,可以cd home看一下
9.mgr
(1)创建mgr的数据目录.{$id} 是 mgr 的标识字母
mkdir -p /var/lib/ceph/mgr/ceph-{$id}
例如:mkdir -p /var/lib/ceph/mgr/ceph-node1
(2)创建密钥
ceph auth get-or-create mgr.node1 mon 'allow *' osd 'allow *' mds 'allow *' -o /var/lib/ceph/mgr/ceph-node1/keyring
(3)启动mgr进程
服务方式启动:
systemctl start ceph-mgr@{id}
例如:systemctl start ceph-mgr@node1
进程启动:
ceph-mgr -i {$id}
例如:ceph-mgr -i node1
以上步骤全部搞定之后,执行ceph -s,正常情况下会出现如下内容:
root@node1:~# ceph -s
cluster:
id: 43bf26f8-4038-4d89-9d24-5181ad5490aa
health: HEALTH_OK
services:
mon: 1 daemons, quorum node1
mgr: node2(active), standbys: node1
mds: cephfs-1/1/1 up {0=node1=up:active}
osd: 2 osds: 2 up, 2 in
data:
pools: 2 pools, 256 pgs
objects: 21 objects, 2246 bytes
usage: 35470 MB used, 102 GB / 136 GB avail
pgs: 256 active+clean