由于rbd mirror的篇幅较长,将分为两部分介绍说明。
一、介绍
- 1.1 基本原理
a) rbd mirror 的原理与MySQL的主从复制replication非常类似,前者基于journaling,后者基于binlog,简单地说就是利用日志进行回放(replay):通过在存储系统中增加Mirror组件,采用异步复制的方式,实现异地备份。(此处的journal是指Ceph RBD的journal,而不是OSD的journal)
b) 由于ceph在内部是强一致性的,对于跨区域的数据同步是无法接受的,一个请求需要异地返回再确认完成,这个对性能有很大影响,这也是为什么基本上无法部署跨区域的ceph集群。
- 1.2 工作流程
上图英文翻译:
- 1、 当接收到一个写入请求后,I/O会先写入主集群的Image Journal
- 2、 Journal写入成功后,通知客户端
- 3、 客户端得到响应后,开始写入image
- 3、 备份集群的mirror进程发现主集群的Journal有更新后,从主集群的Journal读取数据,写入备份集群(和上面序号一样,是因为这两个过程同时发生)
- 4、 备份集群写入成功后,会更新主集群Journal中的元数据,表示该I/O的Journal已经同步完成
- 4、 主集群会定期检查,删除已经写入备份集群的Journal数据。
以上就是一个rbd-mirror工作周期内的流程,在现有的Jewel版本中30s为一次工作周期,暂时不能改变这个周期时间。
- 1.3 优点
- 1.3.1 当副本在异地的情况下,减少了单个集群不同节点间的数据写入延时;
- 1.3.2 减少本地集群或异地集群由于意外断电导致的数据丢失;
- 1.4 单向备份与双向备份
- 双向备份:两个集群之间互相同步,两个集群都要运行rbd-mirror进程。
- 单向备份:分为主集群和从集群,只在从集群运行rbd-mirror进程,主集群的修改会自动同步到从集群。
- 1.5 ceph mirror 是基于存储池进行的peer,ceph支持两种模式的镜像:
- 存储池模式
一个存储池内的所有镜像都会进行备份
- 镜像模式
只有指定的镜像才会进行备份
- 1.6 安装须知
- RBD 镜像功能需要 Ceph Jewel 或更新的发行版本;
- 目前Jewel版本只支持一对一,不支持一对多;
- 两个集群 (local和remote) 需要能够互通,且具有相同名字的Pool;
- RBD mirroring 依赖两个新的rbd属性
- journaling:启动后会记录image的事件
- mirroring:明确告诉rbd-mirror需要复制这个镜像
二、存储池模式配置
- 2.1 配置 rbd features 值
- 查看默认值
shell> ceph daemon /var/run/ceph/ceph-mon.$HOSTNAME.asok config show | grep features
- 修改默认值(全局配置,默认新创建的 rbd 都开启 journal 属性)
# 在每个mon节点的 /etc/ceph/ceph.conf 里加入字段,如果不想所有的rbd都开启备份模式,还可以创建后再开启,然后重启mon服务。 [global] rbd_default_features = 125
- 2.2 创建存储池
# 在主集群(以下简称 local )和备份集群(以下简称 remote )中分别执行 shell> ceph osd pool create 91donkey_pool 128 128 pool '91donkey_pool' created shell> ceph osd pool application enable 91donkey_pool rbd enabled application 'rbd' on pool '91donkey_pool'
- 2.3 启用存储池mirror功能
# 在 local 和 remote 两个集群中分别执行 # 语法:rbd mirror pool enable|disable {pool-name} {mode} shell> rbd mirror pool enable 91donkey_pool pool
- 2.4 创建RBD
# local 集群 shell> rbd create -p 91donkey_pool volume-b97558b2-fba7-11e9-8ce0-5254003111cb --size=10240
- 2.5 查看 local 集群的 image 是否具有 journaling 属性
开启 exclusive-lock 和 journaling 属性后才会记录 image 的事件,才可以被 rbd-mirror 检测到并同步到从集群
shell> rbd info 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb rbd image 'volume-b97558b2-fba7-11e9-8ce0-5254003111cb': size 10 GiB in 2560 objects order 22 (4 MiB objects) id: 763296b8b4567 block_name_prefix: rbd_data.763296b8b4567 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling op_features: flags: create_timestamp: Thu Oct 31 14:29:12 2019 journal: 763296b8b4567 mirroring state: enabled mirroring global id: 0802f1a4-3c84-4c5f-b7ac-ee27f11cf21d mirroring primary: true
- 2.6 禁用部分 features 属性
shell> rbd feature disable 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb fast-diff shell> rbd feature disable 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb object-map shell> rbd feature disable 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb deep-flatten # 再次查看 local 集群的 image 属性 shell> rbd info 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb rbd image 'volume-b97558b2-fba7-11e9-8ce0-5254003111cb': size 10 GiB in 2560 objects order 22 (4 MiB objects) id: 763296b8b4567 block_name_prefix: rbd_data.763296b8b4567 format: 2 features: layering, exclusive-lock, journaling op_features: flags: create_timestamp: Thu Oct 31 14:29:12 2019 journal: 763296b8b4567 mirroring state: enabled mirroring global id: 0802f1a4-3c84-4c5f-b7ac-ee27f11cf21d mirroring primary: true
- 2.7 增加同伴集群
把 local 集群和 remote 集群设为同伴,这个是为了让 rbd-mirror 进程找到它 peer 的集群存储池
# 语法: rbd mirror pool peer add {pool-name} {client-name}@{cluster-name} # local 集群 shell> rbd mirror pool peer add 91donkey_pool client.admin@remote # remote 集群 shell> rbd mirror pool peer add 91donkey_pool client_admin@local
备注:删除peer的语法,rbd mirror pool peer remove {pool-name} {peer-uuid}
- 2.8 查看 peer 的情况
- local 集群
- remote 集群
- 2.9 查看 mirror pool 状态
shell> rbd mirror pool status 91donkey_pool --verbose
- 2.10 集群间配置文件分发
# local 集群 shell> scp /etc/ceph/ceph.conf :/etc/ceph/local.conf shell> scp /etc/ceph/ceph.client.admin.keyring :/etc/ceph/local.client.admin.keyring # remote 集群 shell> scp /etc/ceph/ceph.conf :/etc/ceph/remote.conf shell> scp /etc/ceph/ceph.client.admin.keyring :/etc/ceph/remote.client.admin.keyring # local and remote 集群 shell> chown -R ceph.ceph /etc/ceph
- 2.11 开启 rbd-mirror 的同步进程
需要在两个集群上都配置,它会同时连接本地和远程的集群
shell> yum -y install rbd-mirror # local 集群(-m 指定本集群的monitor ip,本例为10.20.58.191) shell> rbd-mirror -m 10.20.58.191 --log-file=/var/log/ceph/ceph.rbd.mirror.log -i admin --setuser ceph --setgroup ceph # remote 集群(-m 指定本集群的monitor ip,本例为10.20.50.71) shell> rbd-mirror -m 10.20.50.71 --log-file=/var/log/ceph/ceph.rbd.mirror.log -i admin --setuser ceph --setgroup ceph
- 2.12 配置 rbd-mirror 开机启动
# 修改集群名字(如果集群自定义了名字,则需要修改) # local 集群 shell> vim /usr/lib/systemd/system/[email protected] ```默认集群名``` Environment=CLUSTER=ceph ```自定义的集群名``` Environment=CLUSTER=91donkey_local shell> systemctl start ceph-rbd-mirror@admin # remote 集群 shell> vim /usr/lib/systemd/system/[email protected] ```默认集群名``` Environment=CLUSTER=ceph ```自定义的集群名``` Environment=CLUSTER=91donkey_remote shell> systemctl start ceph-rbd-mirror@admin
主集群
mirror集群
未完待续......
作者:龍龍小宝