Ceph学习全过程 基于N版

Ceph学习全过程

1.安装ceph

1.1 ceph概述

ceph monitor
客户端从monitor进程获取整个集群得信息,一般确保是奇数个就好,所以要确保它得高可用性。

osd进程
存储数据得地方,osd会定期把状态上报给monitor,monitor也会定期检测osd。

monitor map 记录集群得状况
osd map 对象得副本
pg map 类似一个目录数据放在pg,pg再把数据放到osd
crush map 数据可以存放在磁盘上面

1.2 ceph安装

环境配置

主机名 public IP cluster IP 数据盘
node1 192.168.1.2 172.16.1.2 /dev/sdb、/dev/sdc
node2 192.168.1.3 172.16.1.3 /dev/sdb、/dev/sdc
node3 192.168.1.4 172.16.1.4 /dev/sdb、/dev/sdc

hosts文件

cat>>/etc/hosts<<EOF
192.168.1.2 node1
192.168.1.3 node2
192.168.1.4 node3
EOF
  • 配置ssh相互免密

  • 关闭防火墙

  • 关闭selinux

  • 关闭NetworkManager

    很简单不做笔记。

1.2.1 先同步时间

ntpdate ntp1.aliyun.com

1.2.2 更改yum源

cat>/etc/yum.repos.d/ceph.repo<<EOF
[ceph]
name=Ceph packages for \$basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/\$basearch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enabled=0
priority=2
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
EOF

# 装不上,执行下yum clean all

1.2.3 安装ceph-deploy工具

# 在任意节点安装,只是个安装ceph集群的工具。它会通过ssh的方式来控制节点。
yum -y install ceph-deploy python-setuptools

# 后面的操作都在这个文件目录里面操作
mkdir my-cluster && cd my-cluster

1.2.4 创建monitor

# 将node1变为monitor
ceph-deploy new --public-network 192.168.1.0/24 --cluster-network 172.16.1.0/24 node1
--public-network      # 用户访问ceph
--cluster-network     #集群内数据同步

# 实际上是生成一个ceph.conf的配置文件。

1.2.5 安装ceph组件

# 如果直接使用ceph-deploy install hostname 会更改成为官方的yum源,导致安装超时而报错。
# 在三个高可用的节点安装.我选择的是node1、2、3
yum -y install ceph ceph-mon ceph-mgr ceph-radosgw ceph-mds

ceph     是核心组件在集群中要在所有的节点中安装。

1.2.6 初始化monitor

# 初始化监控节点
ceph-deploy mon create-initial

	# 实际执行了
	systemctl start ceph-mon@node1

1.2.7 分发集群管理密钥

ceph-deploy admin node1 node2 node3

1.2.8 创建管理节点

ceph-deploy mgr create node1

	# 执行了这个
	systemctl start ceph-mgr@node1

1.2.9 添加osd

# 添加osd
ceph-deploy osd create node1 --data /dev/sdb
ceph-deploy osd create node2 --data /dev/sdb
ceph-deploy osd create node3 --data /dev/sdb

1.2.10 查看osd

[root@node1 ~]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME      STATUS REWEIGHT PRI-AFF 
-1       0.11691 root default                           
-3       0.03897     host node1                         
 0   hdd 0.01949         osd.0      up  1.00000 1.00000 
-5       0.03897     host node2                         
 1   hdd 0.01949         osd.1      up  1.00000 1.00000 
-7       0.03897     host node3                         
 2   hdd 0.01949         osd.2      up  1.00000 1.00000 
 
 ceph -s
 
 # 正常状态是HEALTH_OK

Ceph学习全过程 基于N版

2.ceph集群管理

2.1 扩展monitor节点

ceph-deploy mon add node2
	# 实际执行了
        systemctl start ceph-mon@node3

2.2 查看monitor选举状态

# 三个可以保障高可用性
mon: 3 daemons, quorum node1,node2,node3 (age 11m)

# 查看状态
ceph quorum_status --format json-pretty
ceph mon stat
ceph mon dump

2.3 扩展mgr

ceph-deploy mgr create node3

	# 实际执行了这步骤
	systemctl start ceph-mgr@node2

因为其投票机制,三个能保障高可用性,只有一个是active状态
mgr: node1(active, since 24m), standbys: node2, node3

2.4 创建资源池

ceph osd lspools
ceph osd pool create ceph-demo 64 64

2.5 查看pg

# 查看pg数量
ceph osd pool get ceph-demo pg_num
pg_num: 64

# 查看pgp数量
ceph osd pool get ceph-demo pgp_num
pgp_num: 64

2.6 设置副本数量

# 查看副本数
ceph osd pool get ceph-demo size

# 设置副本数量为2
ceph osd pool set ceph-demo size 2

3.RBD块设备管理

3.1 创建块设备

在pool1池中创建一个10G大小的镜像
rbd create -p pool1 --image rbd-demo.img --size 10G

或者
rbd create pool1/rbd-demo1.img --size 5G

3.2 查看块设备文件

# 查看块设备文件

rbd info pool1/rbd-demo.img
或者
rbd info -p pool1 --image rbd-demo.img 
rbd info pool1/rbd-demo.img

rbd image 'rbd-demo.img':
	size 10 GiB in 2560 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 12217a4473f9
	block_name_prefix: rbd_data.12217a4473f9
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Thu Feb  4 17:35:44 2021
	access_timestamp: Thu Feb  4 17:35:44 2021
	modify_timestamp: Thu Feb  4 17:35:44 2021
注意: CentOS7 内核只支持这种特性 layering

3.2 删除镜像

rbd rm -p pool1 rbd-demo1.img

3.3 查看资源池里面的块设备

rbd -p pool1 ls

3.4 映射块设备到本地

rbd map pool1/rbd-demo.img

rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable pool1/rbd-demo.img object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
因为有的特性内核不支持。

根据提示执行命令
rbd feature disable pool1/rbd-demo.img object-map fast-diff deep-flatten

3.5 查看映射关系

rbd device list

3.6 查看块设备的 对象object

block_name_prefix: rbd_data.12217a4473f9
rados -p pool1 ls |grep rbd_data.12217a4473f9

3.7 查看odject的详细信息

rados -p pool1 stat rbd_data.12217a4473f9.00000000000008c0
pool1/rbd_data.12217a4473f9.00000000000008c0 mtime 2021-02-04 17:56:25.000000, size 16384

3.8 块设备扩容

resize2fs 块设备    ext4 文件系统
xfs_growfs 挂载点        xfs文件系统

3.9 设置资源池的类型

ceph osd pool application enable pool1 rbd

3.10 获取资源池信息

ceph osd pool application get pool1

4.告警处理

告警状态1:
2 daemons hava recently crashed (两个守护进程坠毁了)

1.先查看坠毁的日志

ceph crash ls

2.得到crash的id,查看它的详细信息

> ceph crash info id

3.使用命令查看进程是否存在。如果存在可能是误报

> systemctl status ceph-mgr@node1
 ceph -s
         将报错信息打包
         ceph crash archive id
再次ceph -s查看,没有报错信息了

5.RGW对象存储

5.1 需要安装包

yum -y install ceph-radowgw

5.2 创建rgw进程

ceph-deploy rgw create
    执行了 systemctl start ceph-radosgw@rgw.node1
	# 开放端口 7480
	netstat -lntup|grep 7480

5.3 访问测试

curl node1:7580

结果
<?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>

5.4 更改rgw的默认端口

  1. 在my-cluster目录中更改配置文件

vi ceph.conf
......末尾追加......
[client.rgw.node1]
rgw_frontends = "civetweb port=80"

  1. 将配置文件分发到节点

ceph-deploy --overwrite-conf config push node1 node2 node3

  1. 重启服务

    systemctl restart ceph-radosgw.target

5.5 创建s3风格rgw的认证

radosgw-admin user create --uid ceph-s3-user --display-name "Ceph S3 User Demo"

{
    "user_id": "ceph-s3-user",
    "display_name": "Ceph S3 User Demo",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "ceph-s3-user",
            "access_key": "J99IN8Z2GQZUGPBBHGP4",
            "secret_key": "NzEBgJYkkbPHBYCSM1RG1bDWF1cO36hOvWNnqreD"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}

5.6 查看方法

radosgw-admin user info --uid ceph-s3-user

5.7 访问方法

省略

5.8 swift风格

创建用户
radosgw-admin subuser create --uid ceph-s3-user --subuser=ceph-s3-user:swift --access=full
{
    "user_id": "ceph-s3-user",
    "display_name": "Ceph S3 User Demo",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [
        {
            "id": "ceph-s3-user:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [
        {
            "user": "ceph-s3-user",
            "access_key": "J99IN8Z2GQZUGPBBHGP4",
            "secret_key": "NzEBgJYkkbPHBYCSM1RG1bDWF1cO36hOvWNnqreD"
        }
    ],
    "swift_keys": [
        {
            "user": "ceph-s3-user:swift",
            "secret_key": "NoOKd6rqIcL0266zlYqJwko2tM21g7pT9BR50HoZ"
        }
    ],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}

###########################################
radosgw-admin subuser create --uid ceph-s3-user --subuser=ceph-s3-user:swift  --key-type=swift --gen-secret
{
    "user_id": "ceph-s3-user",
    "display_name": "Ceph S3 User Demo",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [
        {
            "id": "ceph-s3-user:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [
        {
            "user": "ceph-s3-user",
            "access_key": "J99IN8Z2GQZUGPBBHGP4",
            "secret_key": "NzEBgJYkkbPHBYCSM1RG1bDWF1cO36hOvWNnqreD"
        }
    ],
    "swift_keys": [
        {
            "user": "ceph-s3-user:swift",
            "secret_key": "JjWAwZMLbwr9ncGMmX6WRD7FFYCoOreAhc9r7cxy"
        }
    ],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}

5.9 swift客户端访问

yum -y install python-pip
pip install python-swiftclient


测试命令
swift -V 1 -A http://{IP ADDRESS}:{port}/auth -U testuser:swift -K '{swift_secret_key}' list
swift -A http://192.168.1.2/auth -U ceph-s3-user:swift -K JjWAwZMLbwr9ncGMmX6WRD7FFYCoOreAhc9r7cxy list

swift list 出来帮助命令
不使用这些参数
export ST_AUTH="http://192.168.1.2/auth"
export ST_USER="ceph-s3-user:swift"
export ST_KEY="JjWAwZMLbwr9ncGMmX6WRD7FFYCoOreAhc9r7cxy"

5.10 创建一个bucket

swift post swift-demo

5.11 上传一个文件

swift upload swift-demo /etc/passwd

6.ceph-fs文件系统

6.1 安装组件

至少需要一个mds(metadata server),为了保障高可靠性部署三台。
# 创建一个元数据服务器

如果启动了三个mds服务,在没有文件系统的情况下,三个都会是standby状态。
ceph-deploy mds create node1
	systemctl start ceph-mds@node1

6.2 创建两个资源池

ceph osd pool create cephfs_data 16 16
ceph osd pool create cephfs_metadata 16 16

6.3 创建文件系统

ceph fs new cephfs-demo cephfs_metadata cephfs_data
cephfs-demo 文件系统名称

# 查看详情
ceph fs ls

6.4 挂载文件系统

# 挂载文件系统内核态
mount -t ceph node1:6789:/ /mnt/cephfs -o name=admin

#用户态方式挂载
ceph-fuse -m node1:6789,node2:6789,node3:6789 /opt
使用三个节点的话,在其中一个节点挂了,业务不受影响。

7.CEPH集群运维

7.1 集群扩容

横向扩容
	增加更多的节点
	
osd纵向扩容
	在单节点增加更多的磁盘
	
# 查看磁盘
ceph-deploy disk list node1

# 这个命令会把指定的设备的分区表给删除掉。
ceph-deploy disk zap [node] [disk]

# 在纵向扩展的时候,pg会重新填充osd,这样可能会降低集群的性能,可以把下面两个功能临时的关闭。
ceph osd set nobackfill
ceph osd set(unset) norebalance

ceph df

7.2 osd坏盘更换

ceph osd perf
# 查看磁盘的延迟,如果延迟很大,可能是有坏道了,但是还没有坏。
1.先踢出盘
ceph osd out osd.3
权重变为0

2.删除crush的缓存
ceph osd crush rm osd.3

3.删除盘
ceph osd rm osd.3

4.删除设备的认证信息
ceph auth rm osd.3

7.3 进程管理

# 这个服务器名会把所有的ceph服务给启动起来,停止的话会把所有的服务给停止。
systemctl start ceph.target

根据服务类型
systemctl start ceph-osd.target       # 如果这台节点上有多个osd会把全部的osd停掉
systemctl start ceph-mon.target
systemctl start ceph-mds.target

systemctl start ceph-osd@{id}        # 停掉某一个osd

7.4 日志分析

默认的ceph日志存放路径 /var/log/ceph/

7.5 集群状态

ceph osd stat
ceph osd tree
ceph -s
ceph osd df
ceph df
ceph mon stat
ceph mon dump
ceph quorum_status
# 
ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok config show
ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok help

7.6 资源池管理

资源池的分类
ceph osd pool application get pool1 
# 设置资源池
ceph osd pool application enable pool1 rbd
# 设置最大刻印obj
ceph osd pool get-quota pool1
ceph osd pool set-quota pool1 max_objects 100

统计
rados df

PG
对象存储在pg上;pg通过crash算法把数据存放在osd上面。

总的pg = osd * 100 / 资源池副本数
然后取2的次方的最近的那个值。
官方说明每个osd最多承受250个pg

7.6.1 删除资源池

ceph osd pool rm pool1 pool1 --yes-i-really-really-mean-it
# 临时调整
ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok config set mon_allow_pool_delete True

# 永久生效
1.编辑配置文件
[root@node1 ~/my-cluster]# vi ceph.conf 
[global]
fsid = 634074c2-c593-4d68-896d-3a8a11151bf7
public_network = 192.168.1.0/24
cluster_network = 172.16.1.0/24
mon_initial_members = node1
mon_host = 192.168.1.2
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
rgw_multipart_part_upload_limit = 100000
mon_max_pg_per_osd = 1000
mon_allow_pool_delete = true

[client.rgw.node1]
rgw_frontends = "civetweb port=80"

2.发送配置文件
ceph-deploy --overwrite-conf config push node1 node2 node3

3.重启各个节点的mon服务
for i in {1..3};do ssh node${i} systemctl restart ceph-mon.target;done

8.crush Map 规则

规定了数据怎样存储在集群中,以主机为单位,以osd为单位,以机柜为单位,数据中心,区域。

8.1 更改crash map规则

# 导出crush规则,是二进制文件
ceph osd getcrushmap -o crushmao.bin

# 转换成txt文件
crushtool -d crushmap.bin -o crushmap.txt

cat crushmap1.txt 
# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable chooseleaf_stable 1
tunable straw_calc_version 1
tunable allowed_bucket_algs 54

# devices
# 标记了每一块osd是什么类型
device 0 osd.0 class ssd
device 1 osd.1 class ssd
device 2 osd.2 class ssd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 zone
type 10 region
type 11 root

# buckets
# 主机
host node1 {
	id -3		# do not change unnecessarily
        # 标记个类型
	id -4 class hdd		# do not change unnecessarily
	# weight 0.039
	alg straw2
	hash 0	# rjenkins1
        # osd.3的权重
	item osd.3 weight 0.019
}
host node2 {
	id -5		# do not change unnecessarily
	id -6 class hdd		# do not change unnecessarily
	# weight 0.039
	alg straw2
	hash 0	# rjenkins1
	item osd.4 weight 0.019
}
host node3 {
	id -7		# do not change unnecessarily
	id -8 class hdd		# do not change unnecessarily
	# weight 0.039
	alg straw2
	hash 0	# rjenkins1
	item osd.5 weight 0.019
}
host node1-ssd {
        # weight 0.039
        alg straw2
        hash 0  # rjenkins1
        item osd.0 weight 0.019
}
host node2-ssd {
        # weight 0.039
        alg straw2
        hash 0  # rjenkins1
        item osd.1 weight 0.019
}
host node3-ssd {
        # weight 0.039
        alg straw2
        hash 0  # rjenkins1
        item osd.2 weight 0.019
}

root default {
	id -1		# do not change unnecessarily
	id -2 class hdd		# do not change unnecessarily
	# weight 0.117
	alg straw2
	hash 0	# rjenkins1
	item node1 weight 0.019
	item node2 weight 0.019
	item node3 weight 0.019
}

# 指定规则
root ssd {
        # weight 0.117
        alg straw2
        hash 0  # rjenkins1
        # 引用上面的主机
        item node1-ssd weight 0.019
        item node2-ssd weight 0.019
        item node3-ssd weight 0.019
}

# rules
rule replicated_rule {
	id 0
	type replicated
	min_size 1
	max_size 10
	step take default
	step chooseleaf firstn 0 type host
	step emit
}
# 制定规则
rule ssd_rule {
        id 1
        type replicated
        min_size 1
        max_size 10
        # 引用上面的规则
        step take ssd
        step chooseleaf firstn 0 type host
        step emit
}

# end crush map

# 把crushmaptxt转换成bin格式
crushtool -c crushmap.txt -o crushmap-new.bin

# 设置定义的规则
ceph osd setcrushmap -i crushmap-new.bin

# 查看资源池绑定的的crush规则
ceph osd pool get ceph-demo crush_rule

# 查看有哪些规则
ceph osd crush rule ls

# 给资源池设置crush_map
ceph osd pool set ceph-demo crush_rule demo_rule
# 这样设置可以实现,不同的资源池把数据放置到不同的osd上面去。在没有数据的时候做,有数据的时候有风险。

8.2 手动更改规则

# 创建一个bucket
类型root;名称ssd
ceph osd crush add-bucket ssd root

# 
类型是host
ceph osd crush add-bucket node1-ssd host
ceph osd crush add-bucket node2-ssd host
ceph osd crush add-bucket node3-ssd host

# 把host加入root
ceph osd crush move node1-ssd root=ssd
ceph osd crush move node2-ssd root=ssd
ceph osd crush move node3-ssd root=ssd

# 把osd移动到host
ceph osd crush move osd.0 host=node1-ssd root=ssd
ceph osd crush move osd.1 host=node2-ssd root=ssd
ceph osd crush move osd.2 host=node3-ssd root=ssd

效果
[root@node1 ~]# ceph osd tree
ID  CLASS WEIGHT  TYPE NAME          STATUS REWEIGHT PRI-AFF 
 -9       0.05846 root ssd                                   
-10       0.01949     host node1-ssd                         
  0   hdd 0.01949         osd.0          up  1.00000 1.00000 
-11       0.01949     host node2-ssd                         
  1   hdd 0.01949         osd.1          up  1.00000 1.00000 
-12       0.01949     host node3-ssd                         
  2   hdd 0.01949         osd.2          up  1.00000 1.00000 
 -1       0.05846 root default                               
 -3       0.01949     host node1                             
  3   hdd 0.01949         osd.3          up  1.00000 1.00000 
 -5       0.01949     host node2                             
  4   hdd 0.01949         osd.4          up  1.00000 1.00000 
 -7       0.01949     host node3                             
  5   hdd 0.01949         osd.5          up  1.00000 1.00000

# 定义规则
ceph osd crush rule create-replicated ssd-demo ssd host hdd

# 查看
[root@node1 ~]# ceph osd crush rule ls
replicated_rule
ssd-demo

# 注意事项
1.在更改的时候,做好配置文件备份。
2.调整crush map的时候最好是在集群初始的时候,有数据的时候容易造成数据丢失。
3.手动更改crushMap需要更改配置,保证集群在增加或者减少osd的话会自动更改crushmap规则。更改规则会造成数据大量迁移。

......
[osd]
osd_crush_update_on_start = false
# 然后推送出去
ceph-deploy --overwrite-conf config push node1 node2 node3

systemctl restart ceph-osd.target
# 查看是否生效
ceph daemon /var/run/ceph/ceph-osd.0.asok config show|grep on_start

9.RBD高级功能

9.1 回收站

# 创建一个 镜像
rbd create volumes/ceph-trash.img --size 10G

# 删除镜像
这样删除在回收站里面也看不到
rbd rm volumes/ceph-trash.img

# 把一个镜像放入回收站
rbd trash move volumes/ceph-trash.img --expires-at 20210306
facf28ce8a57 ceph-trash.img            # 指定的镜像
facf28ce8a57 ceph-trash.img            # 到了这个时间就会把这个删除

# 查看回收站的内容
rbd trash -p volumes ls
facf28ce8a57 ceph-trash.img

# 把镜像恢复回来。
rbd trash restore -p volumes facf28ce8a57

9.2 rbd制作快照

它针对的是块设备级别的,如果文件系统是损坏的那么,制作出来的快照也是坏的。

# 创建一个5G的块设备
rbd create volumes/rbd-test.img --image-feature layering --size 5G

rbd info volumes/rbd-test.img

# 映射到本地
rbd device map volumes/rbd-test.img

# 格式化
mkfs.ext4 /dev/rbd0
mount /dev/rbd0 /mnt/
cd /mnt	
touch filetxt-1

# 创建快照
rbd snap create volumes/rbd-test.img@snap_20210308

# 查看快照
rbd snap ls volumes/rbd-test.img

# 恢复快照
rbd snap rollback volumes/rbd-test.img@snap_20210308
注意:需要把挂在上的设备卸载再挂载。

# 删除快照
rbd snap rm volumes/rbd-test.img@snap_20210308

9.3 快照的高级特性copy-on-write

快照的高级特性copy-on-write

创建新的镜像时候,创建了一个链接指向父镜像,父镜像只读,创建出来的新镜像,可以写入数据。这样新建镜像的速度
就变得快速了。父镜像不能够删除,删除之后就会出问题(有一个镜像保护机制)。还可以节省空间。

# 示例过程
rbd snap create volumes/rbd-test.img@snap_2021

# 保护镜像
rbd snap protect volumes/rbd-test.img@snap_2021

# 克隆镜像
rbd clone volumes/rbd-test.img@snap_2021 volumes/vm1-clone

# 查看克隆过的信息
rbd -p volumes info vm1-clone

# 根据模板镜像创建出来的镜像内容都是和模板镜像一样的。

# 把克隆出来的镜像取消父子关系
会占用独立的空间。

查看快照克隆出来的镜像
rbd children volumes/rbd-test.img@snap_2021

# 把克隆出来的子镜像独立出来
rbd flatten volumes/vm1-clone

# 查看映射到本地的块设备
rbd device ls

9.4 rbd快照的导出。

rbd export volumes/rbd-test.img@snap-demo /root/snap-demo
导出的名称 snap-demo

# rbd的导入
rbd import /root/snap-demo volumes/rbd-test-new.img

rbd device map volumes/rbd-test-new.img
rbd feature disable volumes/rbd-test-new.img object-map fast-diff deep-flatten
rbd device map volumes/rbd-test-new.img
mount /dev/rbd1 /mnt/
# 数据就回来了
[root@node1 ~]# ls /mnt/
filetxt-1  lost+found

9.5 数据的增量备份

    # 创建快照
[root@node1 ~]# rbd device  ls
id pool    namespace image            snap device    
0  volumes           rbd-test.img     -    /dev/rbd0 
1  volumes           rbd-test-new.img -    /dev/rbd1

# df -h
/dev/rbd1       4.8G   20M  4.6G   1% /mnt

[root@node1 /mnt]# ls
filetxt-1  lost+found
[root@node1 /mnt]# echo 123 > filetxt-2
[root@node1 /mnt]# ls
filetxt-1  filetxt-2  lost+found

    # 导出增加的部分
rbd snap create volumes/rbd-test-new.img@s1
rbd export-diff volumes/rbd-test-new.img@s1 /root/diff-s2
    # 导入数据(恢复)
rbd import-diff s2 volumes/rbd-test-new.img

10.RGW高可用

10.1 安装radosgw

yum -y install ceph-radosgw

[root@node1 ~/my-cluster]# ceph-deploy rgw create node1 node2

10.1 更改rgw的端口

vi ~/my-cluster/ceph.conf
......
[client.rgw.node1]
rgw_frontends = "civetweb port=81"

[client.rgw.node2]
rgw_frontends = "civetweb port=81"
......

ceph-deploy --overwrite-conf config push node1 node2

node1和node2
systemctl restart ceph-radosgw.target

10.2 安装keepalived

yum -y install keepalived

10.2.1 Master的配置文件


[root@node1 ~]# cat /etc/keepalived/keepalived.conf
global_defs {                   #全局配置
    router_id node1             #就是一个身份标识(用主机名也可以用其它的)
}

vrrp_script check_haproxy {
    script "killall -0 haproxy"    #要执行的脚本或者命令,如果返回的结果是非0就会weight -20
    interval 2                     #每隔两秒执行一次上面script的内容
    weight -20                     #权重-20,减的是priority,它的优先级小了自然就成了backup 
}

vrrp_instance rgw {             #rgw实例的名称
    state MASTER                #标识角色状态
    interface eth0              #网卡绑定接口
    virtual_router_id 50        #虚拟路由id,同一个实例保持一致
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {         
        192.168.1.10                #虚拟的VIP地址
    } 
    track_script {
        check_haproxy               # 调用上面的脚本执行
    }
}

10.2.2 Backup的配置文件

[root@node2 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id node2
}

vrrp_instance rgw {            
    state BACKUP
    interface eth0
    virtual_router_id 50
    priority 140
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        192.168.1.10
    }
}

11.Ceph集群测试

11.1 mon高可用测试

3个mon只允许挂掉一个。
在生产环境中一般三个mon节点是没问题的。当挂掉两个的时候集群就会出现问题。

5个mon只允许挂掉两个。
systemctl status ceph-mon

11.2 mds高可用

ceph-fs的组件
ceph-fs的高可用只有一个服务在就行,但是集群因为没有高可用之后,会有一个warnning的告警。
systemctl status ceph-mds

11.3 rgw高可用

对象存储网关
使用haproxy和keepalived来进行高可用。
systemctl status ceph-radosgw

mgr 是用来管理的一般不会对集群产生影响

11.4 OSD坏盘测试

单个节点或者是单盘出现问题,因为有副本所以不会产生影响。

11.5 fio性能压测评估

ceph osd perf       # 可以查看磁盘的状况

fio -filename=/mnt/test.img -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=100M -numjobs=2 -runtime= -group_reporting -name=rand_100write_4k

吞吐量可以把bs调大一点

-numjobs=2          # 调整为CPU核心的2^n

rbd bench压力测试
rbd help bench
rbd bench volumes/rbd-test.img --io-size 4K --io-threads 4 --io-total 200M --io-pattern rand --io-type write
rbd bench volumes/rbd-test.img --io-size 4K --io-threads 4 --io-total 200M --io-pattern rand --io-type read

上一篇:ceph学习笔记


下一篇:2019阿里云双11活动-MySQL 8.0 IoT固件安全检测(包年)包年优惠