SUSE Ceph RBD Mirror - Storage 6
Ceph采用的是强一致性同步模型,所有副本都必须完成写操作才算一次写入成功,这就导致不能很好地支持跨域部署,因为如果副本在异地,网络延迟就会很大,拖垮整个集群的写性能。因此,Ceph集群很少有跨域部署的,也就缺乏异地容灾。Ceph RBD mirror是Ceph Jewel版本引入的新功能,支持两个Ceph集群数据同步,其原理非常类似mysql的主从同步机制,前者基于journaling,后者基于binlog,二者都是基于日志回放完成主从同步的。
1.1. RBD mirror的原理
ceph在内部是强一致性的,这个对于跨区域的情况数据同步是无法接受的,一个请求需要异地返回再确认完成,这个在性能上肯定是无法接受的,这就是为什么基本上无法部署跨区域的ceph集群, 因此我们需要有一种机制能够让我们在不同区域的集群之间复制块设备。这个能够帮助我们实现两个功能:
- 灾难恢复
- 全球块设备分布(跨地理位置)
简单来说,就是利用日志(Journal)进行回放(replay),来完成主从同步。有点类似于Mysql中的binlog。当我们使用RBD Mirror功能时,需要打开RBDJournal功能(注:不是OSD Journal),此时,所有数据写操作会先写入RBDJournal,然后后台线程再把数据从Journal区域写入对应的image。同时,还需要启动rbd-mirror服务,该服务负责监控远程Ceph集群的Journal,若有更新,则replay该Journal到本地RBD image。
当RBD Journal功能打开后,所有的数据更新请求会先写入RBD Journal,然后后台线程再把数据从Journal区域刷新到对应的image区域。RBD journal提供了比较完整的日志记录、读取、变更通知以及日志回收和空间释放等功能,可以认为是一个分布式的日志系统。
从上图所示是进行的主备模式的备份,其实这个只是看怎么应用了,在里面是自动实现的主主的模式,双向同步的,只是在应用中需要注意不要去同时操作同一个image,这个功能是作为主备去使用的,以备真正有问题的时候去实现故障恢复,这个同步是异步的
1.2. 工作流程
1) 当接收到一个写入请求后,I/O会先写入主集群的Image Journal
2) Journal写入成功后,通知客户端
3) 客户端得到响应后,开始写入image
4) 备份集群的mirror进程发现主集群的Journal有更新后,从主集群的Journal读取数据,写入备份集群(和上面序号一样,是因为这两个过程同时发生)
5) 备份集群写入成功后,会更新主集群Journal中的元数据,表示该I/O的Journal已经同步完成
6) 主集群会定期检查,删除已经写入备份集群的Journal数据。
7) 以上就是一个rbd-mirror工作周期内的流程,在现有的版本中30s为一次工作周期,暂时不能改变这个周期时间。
1.3. rbd-mirror 进程
rbd-mirror进程负责将镜像从一个Ceph集群同步到另一个集群
根据复制的类型,rbd-mirror可以在单个集群上或者是镜像的两个集群上都运行
1) 单向备份
当数据从主集群备份到备用的集群的时候,rbd-mirror仅在备份群集上运行。
2) 双向备份
如果两个集群互为备份的时候,rbd-mirror需要在两个集群上都运行。
1.4. RBD Mirror模式
1) RBD Image模式:RBD image模式下,会把指定的image进行镜像;
2) Pool模式:而Pool模式则把该Pool中所有的image进行镜像。
1.5. Image 状态
做了mirroring的Image的状态有:
- primary (可以修改)
- non-primary (不能修改).
当第一次对image进行开启mirroring的时候 .Images 自动 promoted 为 primary
1.6. 强制独占锁作用
如果安装了多个挂载,则强制独占锁的特性是将RBD锁定到单个客户机。这有助于解决多个挂载的客户机试图对同一对象进行写操作时的写冲突情况。因此,在编写时,如果一个客户端首先在对象上建立一个独占锁,那么另一个挂载的客户端将在编写之前首先检查是否有对等端在对象上放置了锁。
启用此功能后,一次只能有一个客户机修改RBD设备,特别是在快照创建/删除等操作期间更改内部RBD结构时。它还为失败的客户端提供了一些保护。例如,如果虚拟机似乎没有响应,而您在其他地方用相同的磁盘启动了它的副本,那么第一个副本将在Ceph中被列入黑名单,并且无法损坏新磁盘。
2. 配置指南-单向备份
2.1. Ceph网络架构
- 集群1,网络环境配置
主机名 |
Public网络 |
管理网络 |
集群网络 |
说明 |
node001 |
192.168.2.40 |
172.200.50.40 |
192.168.3.40 |
MON,OSD,管理节点 |
node002 |
192.168.2.41 |
172.200.50.41 |
192.168.3.41 |
MON,OSD |
node003 |
192.168.2.42 |
172.200.50.42 |
192.168.3.42 |
MON,OSD |
- 集群2,网络环境配置
主机名 |
Public网络 |
管理网络 |
集群网络 |
说明 |
node004 |
192.168.2.43 |
172.200.50.43 |
192.168.3.43 |
MON,OSD,管理节点 |
node005 |
192.168.2.44 |
172.200.50.44 |
192.168.3.44 |
MON,OSD |
node006 |
192.168.2.45 |
172.200.50.45 |
192.168.3.45 |
MON,OSD |
2.2. 开始配置
首先配置两个集群,配置的集群都没有更改名称,默认都是ceph,我们通过配置文件来控制集群的识别,我的环境是两套主机集群,两台机器lab8106为local集群,lab8107为remote集群,准备把lab8106的image备份到lab8107的集群上
1) 在ceph.conf当中添加
# vim /etc/ceph/ceph.conf
rbd default features =
2) 具体数字表示意思
2.3. 开启存储池的mirror的模式
- 准备开启集群镜像备份模式
Node001 主机:
1) 创建池
# ceph osd pool create rbd replicated
# ceph osd pool application enable rbd rbd
# rados lspools
2) 创建RBD,开启特殊属性日志和排他锁
# rbd create image- --size --pool rbd --image-feature exclusive-lock,journaling
3) 查看RBD信息
# rbd info rbd/image-
rbd image 'image-1':
size 1GiB in objects
order (4MiB objects)
block_name_prefix: rbd_data.85596b8b4567
format:
features: exclusive-lock, journaling
flags:
create_timestamp: Fri Apr ::
journal: 85596b8b4567
mirroring state: disabled
- 如关闭特殊属性(可选)
# rbd feature disable rbd/image- exclusive-lock journaling
4) 开启存储池的mirror的模式
模式采用image,需要针对每个映像明确启用镜像
语法:rbd mirror pool enable <pool-name> <mode>
# rbd mirror pool enable rbd image
Node004主机
1) 创建pool
# ceph osd pool create rbd replicated
# ceph osd pool application enable rbd rbd
# rados lspools
2) 开启存储池的mirror的模式
# rbd mirror pool enable rbd image
2.4. 处理配置文件和kerring
1) 处理配置文件和kerring
- 在node001主机上
# scp /etc/ceph/ceph.conf node004:/etc/ceph/local.conf
# scp /etc/ceph/ceph.client.admin.keyring \
node004:/etc/ceph/local.client.admin.keyring
# cp /etc/ceph/ceph.conf /etc/ceph/local.conf
# cp /etc/ceph/ceph.client.admin.keyring /etc/ceph/local.client.admin.keyring
- 在node004上执行:
# scp /etc/ceph/ceph.conf node001:/etc/ceph/remote.conf
# scp /etc/ceph/ceph.client.admin.keyring \
node001:/etc/ceph/remote.client.admin.keyring
# cp /etc/ceph/ceph.conf /etc/ceph/remote.conf
# cp /etc/ceph/ceph.client.admin.keyring /etc/ceph/remote.client.admin.keyring
2) 执行完了后在两台机器上给予权限 (两台主机都要)
# chown ceph:ceph -R /etc/ceph
# chown ceph:ceph -R /etc/ceph
# ll /etc/ceph/
3) 检验上面设置是否完成
- 在node001执行
# ceph --cluster local mon stat
e1: mons at {node001=[v2:192.168.2.40:/,v1:192.168.2.40:/],
# ceph --cluster remote mon stat
e1: mons at {node004=[v2:192.168.2.43:/,v1:192.168.2.43:/]
- 在node004执行
# ceph --cluster local mon stat
e1: mons at {node001=[v2:192.168.2.40:/,v1:192.168.2.40:/],
# ceph --cluster remote mon stat
e1: mons at {node004=[v2:192.168.2.43:/,v1:192.168.2.43:/]
到这里就是两个集群可以通过local和remote进行通信了
2.5. 增加peer
1) 语法
rbd mirror pool peer add <pool-name> <client-name>@<cluster-name>
- 在node001上执行
# rbd --cluster local mirror pool peer add rbd client.admin@remote
# rbd --cluster remote mirror pool peer add rbd client.admin@local
2) 查询peer状态(node001)
# rbd mirror pool info rbd --cluster local
Mode: image
Peers:
UUID NAME CLIENT
a050a0f5--43f2-872f-87c394083871 remote client.admin
# rbd mirror pool info rbd --cluster remote
Mode: image
Peers:
UUID NAME CLIENT
8d7b3fa4-be44-4e25-b0b7-cf4bdb62bf10 local client.admin
3) 查询存储池状态
# rbd mirror pool status rbd --cluster local
health: OK
images: total
# rbd mirror pool status rbd --cluster remote
health: OK
images: total
2.6. 开启image的mirror
- 在node001执行
# rbd mirror image enable rbd/image-
# rbd info rbd/image-
rbd image 'image-1':
size 1GiB in objects
order (4MiB objects)
block_name_prefix: rbd_data.85756b8b4567
format:
features: exclusive-lock, journaling
flags:
create_timestamp: Sat Apr ::
journal: 85756b8b4567
mirroring state: enabled
mirroring global id: 72931f47-e1de-439a-b774-538d84dc8a06
mirroring primary: true ===> 角色 primary
2.7. 开启rbd-mirror的同步进程
1) 先用调试模式启动进程看看情况
l 在node004的机器上执行
# rbd-mirror -d --setuser ceph --setgroup ceph --cluster remote -i admin
2017-01-22 17:43:53.688820 7fc926dc6c40 0 set uid:gid to 167:167 (ceph:ceph)
2017-01-22 17:43:53.688840 7fc926dc6c40 0 ceph version 10.2.5 (c461ee19ecbc0c5c330aca20f7392c9a00730367), process rbd-mirror, pid 32080
node004:~ # rbd list
image-1 <=== 确认 image-1 镜像 mirror 过来
2) 如果确认没问题就用服务来控制启动 (node001, node004)
# zypper in rbd-mirror
3) 修改systemd
Node004
# vim /usr/lib/systemd/system/ceph-rbd-mirror@.service
Environment=CLUSTER=remote
# systemctl daemon-reload
Node001
# vim /usr/lib/systemd/system/ceph-rbd-mirror@.service
Environment=CLUSTER=remote
# systemctl daemon-reload
4) 启动服务 (node001,node004)
# systemctl start ceph-rbd-mirror@admin.service
# systemctl enable ceph-rbd-mirror@admin.service
5) 查询镜像的同步的状态
# rbd mirror image status rbd/image-1 --cluster remote
image-1:
global_id: dabdbbed-7c06-4e1d-b860-8dd104509565
state: up+replaying
2.8. 登陆 dashboard页面
可以看到,健康状态OK
http://172.200.50.40:9443/#/block/mirroring
http://172.200.50.43:9443/#/block/mirroring
2.9. 关于map操作
当RBD image开启了某些高级特性后,内核可能不支持,因此不能执行rbd map操作,否则出现RBD image feature set mismatch错误
# rbd map image-1
rbd: sysfs write failed
RBD image feature set mismatch. Try disabling features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
从J版本后,RBD支持将RBD image map为本地nbd设备,通过rbd nbd map命令即可映射为本地nbd设备。
1) 安装rbd-nbd模块:
# zypper in rbd-nbd
2) map image到本地nbd设备:
# rbd nbd map rbd/image-1
/dev/nbd0
3) 显示映射
# rbd nbd list
pid pool image snap device
12339 rbd image-1 - /dev/nbd0
4) 格式化挂载,并且创建文件
# mkfs.ext4 /dev/nbd0
# mount /dev/nbd0 /mnt
# touch /mnt/{1,2,3}
2.10. 容灾切换
1) 卸载文件
# umount /mnt
# rbd nbd unmap /dev/nbd0
2) 将指定的镜像降级为非主要镜像
l 在node001执行
# rbd mirror image demote rbd/image-1 --cluster=local
3) 查看转变后,在执行下面一条命令
# rbd info rbd/image-1
rbd image 'image-1':
size 1GiB in 256 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.2f6f06b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling
flags:
create_timestamp: Sat Apr 13 14:56:17 2019
journal: 2f6f06b8b4567
mirroring state: enabled
mirroring global id: f522d2c1-0b8b-446a-b203-eb7ed1774848
mirroring primary: false
4) 将指定的镜像升级为主要镜像
- 在node001执行
# rbd mirror image promote rbd/image- --cluster=remote
- 在node004执行
# rbd info image-
rbd image 'image-1':
size 1GiB in objects
order (4MiB objects)
block_name_prefix: rbd_data.5ef56b8b4567
format:
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling
flags:
create_timestamp: Sat Apr ::
journal: 5ef56b8b4567
mirroring state: enabled
mirroring global id: f522d2c1-0b8b-446a-b203-eb7ed1774848
mirroring primary: true
5) 安装rbd-nbd模块:
# zypper in rbd-nbd
6) map image到本地nbd设备:
# rbd nbd map rbd/image-
/dev/nbd0
7) 显示映射
# rbd nbd list
pid pool image snap device
rbd image- - /dev/nbd0
8) 格式化挂载,并且创建文件
# mount /dev/nbd0 /mnt
# ll /mnt
SUSE Ceph RBD Mirror - Storage 6的更多相关文章
- SUSE CaaS Platform 4 - 使用 Ceph RBD 作为持久存储(动态)
图1 架构图 图2 各存储插件对动态供给方式的支持状况 1.所有节点安装 # yum install ceph-common 复制 ceph.conf 到 worker 节点上 # scp admin ...
- SUSE CaaS Platform 4 - Ceph RBD 作为 Pod 存储卷
RBD存储卷 目前 CaaSP4 支持多种 Volume 类型,这里选择 Ceph RBD(Rados Block Device),主要有如下好处: Ceph 经过多年开发,已经非常熟,社区也很活跃: ...
- 理解 QEMU/KVM 和 Ceph(1):QEMU-KVM 和 Ceph RBD 的 缓存机制总结
本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...
- rexray在CentOS上不能创建ceph rbd的docker volume问题定位
背景 我们通过docker的rexray插件来创建ceph rbd设备的docker volume,但总提示创建失败. # docker volume create --driver=rexray - ...
- CentOS7 下安装 iSCSI Target(tgt) ,使用 Ceph rbd
目录 一.iSCSI 介绍 1. iSCSI 定义 2. 几种常见的 iSCSI Target 3. 优缺点比较 二.安装步骤 1. 关闭防火墙 2. 关闭selinux 3. 通过 yum 安装 t ...
- kubernetes挂载ceph rbd和cephfs的方法
目录 k8s挂载Ceph RBD PV & PVC方式 创建secret 创建PV 创建PVC 创建deployment挂载PVC StorageClass方式 创建secret 创建Stor ...
- SUSE Ceph 增加节点、减少节点、 删除OSD磁盘等操作 - Storage6
一.测试环境描述 之前我们已快速部署好一套Ceph集群(3节点),现要测试在现有集群中在线方式增加节点 如下表中可以看到增加节点node004具体配置 主机名 Public网络 管理网络 集群网络 说 ...
- SUSE Ceph 快速部署 - Storage6
学习 SUSE Storage 系列文章 (1)SUSE Storage6 实验环境搭建详细步骤 - Win10 + VMware WorkStation (2)SUSE Linux Enterpri ...
- ceph对接k8s storage class
简介 对接ceph的rbd和cephfs到k8s中提供持久化存储 环境 主机名 IP role 操作系统 ceph-01 172.16.31.11 mon osd CentOS7.8 ceph-02 ...
随机推荐
- Python - Django - ORM Django 终端打印 SQL 语句
在 settings.py 中添加以下内容: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'c ...
- mongodb多个条件查询in,日期查询,嵌套查询,统计集合总数等常用实例
1. 多个条件查询in in db.inventory.find( { qty: { $in: [ 5, 15 ] } } ) 2. 日期查询 db.books.find({}) 查询时间大于6-,结 ...
- C# .NET UDP 形式调用 graylog,gelf
-- 发送: GelfLogModel m = new GelfLogModel(); m.version = "1.1"; m.host = "128.0.14.39& ...
- jira7.3.6 windows7下安装、中文及破解
一.事前准备 1:JDK下载并安装:jdk-6u45-windows-i586.exe 2:MySQL JDBC连接驱动:mysql-connector-java-5.1.25.zip 3:MySQL ...
- Linux 环境变量设置的几种方法
From:http://home.eeworld.com.cn/home.php?mod=space&uid=291513&do=blog&id=40557 环境变量是和She ...
- CentOS7服务器查看相关配置命令
CPU个数:(base) [jiangshan@localhost ~]$ grep 'physical id' /proc/cpuinfo | sort -u | wc -l2CPU核数:(base ...
- 使用TypeScript创建React Native
⒈初始化 React Native环境 参考https://reactnative.cn/docs/getting-started.html ⒉安装React Native官方的脚手架工具 npm i ...
- Android广播机制——初体验
写在前面的话 文章为笔者自己理解 . -如有错误,欢迎指正- <第一行代码>读书笔记 写于2017年10月16日17:00:40 (一). 安卓广播的分类 a.标准广播 标准广播发出以后, ...
- Git使用总结(三):协同开发常见冲突
1.不同人修改了不同的文件 a.账户A,账户B分别从远端拉取了相同分支 b.账户A修改了main.cpp文件后提交到远端,账户B修改fun.cpp文件提交远端时会报如下错误 ...
- WUSTOJ 1321: Alphabet Cookies(Java)字符统计
题目链接:1321: Alphabet Cookies Description Kitty likes cookies very much, and especially the alphabet c ...