Ceph修改OSD和Monitor的网络

引言

随着Ceph应用的不断深入,不少企业在部署完Ceph集群并运行一段时间后,会遇到机房网络变动或集群网络升级的情况,这时我们都期望能用最简便高效的方法解决Ceph网络变化带来的问题。那么,如何处理才能快速解除Ceph网络变动危机呢?

在Ceph底层的RADOS集群中,有两种节点,一种是为数众多的、负责完成数据存储和维护功能的OSD(Object Storage Device),另一种则是若干个负责完成系统状态检测和维护的monitor。OSD和monitor之间相互传输节点状态信息,共同得出系统的总体工作状态,并形成一个全局系统状态记录数据结构。所以,只需要修改这两种节点的网络,就可以解决因机房网络变化或集群网络升级而引起的诸多问题。

本文基于Ceph的官方文档和作者的实践,为大家讲述正确修改Ceph OSDMonitor网络的方法。希望能够帮助大家在尽量减少对现有Ceph集群影响的情况下,通过修改Ceph的OSD和Monitor网络实现迁移。

1
2
本文使用的Ceph版本:Hammer 0.94.5                   
测试系统环境:Ubuntu 14.04

修改OSD网络

由于Ceph OSD的网络配置是启动时读取ceph.conf配置动态加载的,所以修改OSD的网络比较简单,步骤如下:

  1. 修改ceph.conf中pubulic/cluster network信息

    1
    2
    public network =172.16.1.0/24
    cluster network =172.16.1.0/24
  2. 把ceph.conf更新到所有OSD节点测配合

    1
    ceph-deploy --overwrite-conf config push <node1> <node2> <node3>
  3. 重启所有的osd daemon

    1
    restart ceph-all
  4. 检查OSD使用的网络

    1
    2
    3
    4
    5
    # netstat -nap | grep ceph-osd
    tcp 0 0 172.16.1.16:844 0.0.0.0:* LISTEN 23412/ceph-osd
    tcp 0 0 172.16.1.16:812 0.0.0.0:* LISTEN 19423/ceph-osd
    tcp 0 0 172.16.1.16:845 0.0.0.0:* LISTEN 23412/ceph-osd
    tcp 0 0 172.16.1.16:813 0.0.0.0:* LISTEN 19529/ceph-osd

修改Monitor的网络

因为Ceph的Monitor是集群中非常重要的模块,它们需要维护一组合理有效的Monitor节点信息,这些节点之间彼此能发现,通过选举达成一致的状态,来保证整个Ceph系统处于一个可用的一致状态。

不同于别的Ceph Daemon通过ceph.conf文件中的配置来与Monitor通信,Monitors之间则通过独立的monitor map来彼此发现,在monitor map中有monitor的ip信息,所以单独通过修改ceph.conf文件的方法来修改Monitor的网络是行不通的。

下面是修改monitor网络的两种方法:

方法1

依次添加新的monitor node(使用新的网络),再删除旧的monitor node
注: 新的monitor网络跟旧的monitor的网络必须是互通的,否则该方法失效。

添加新的monitor节点步骤如下:

  1. 在新的monitor节点创建默认文件夹

    1
    2
    ssh {new-mon-host}
    sudo mkdir /var/lib/ceph/mon/ceph-{mon-id}
  2. 获取monitors的keyring文件,若内部集群没配置认证,该步会出错,忽略即可

    1
    ceph auth get mon. -o {tmp}/{key-filename}
  3. 获取monitor map文件

    1
    ceph mon getmap -o {tmp}/{map-filename}
  4. 在新的monitor节点生产monitor所需数据信息

    1
    sudo ceph-mon -i {mon-id} --mkfs --monmap {tmp}/{map-filename} --keyring {tmp}/{key-filename}
  5. 添加新的monitor到monitor集群,绑定新的ip地址和port

    1
    ceph-mon -i {mon-id} --public-addr {ip:port}

删除旧的monitor节点步骤如下:

  1. 在旧的monitor节点停止该monitor

    1
    service ceph -a stop mon.{mon-id}
  2. 把该monitor从集群中移除

    1
    ceph mon remove {mon-id}

方法2

修改monitor map里的信息,更新后重启所有monitors
注:因为该方法一般是通过整体修改monitor map里的网络信息,然后重启monitors,所以会短暂影响Ceph集群的服务

步骤如下:

  1. 获取现在的monitor map

    1
    ceph mon getmap -o {tmp}/{filename}
  2. 查看当前的monitor map信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ monmaptool --print {tmp}/{filename}

    monmaptool: monmap file {tmp}/{filename}
    epoch 1
    fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
    last_changed 2012-12-17 02:46:41.591248
    created 2012-12-17 02:46:41.591248
    0:10.0.0.1:6789/0 mon.a
    1:10.0.0.2:6789/0 mon.b
    2:10.0.0.3:6789/0 mon.c
  3. 删除现有的monitors信息

    1
    2
    3
    4
    5
    6
    7
    $ monmaptool --rm a --rm b --rm c {tmp}/{filename}

    monmaptool: monmap file{tmp}/{filename}
    monmaptool: removing a
    monmaptool: removing b
    monmaptool: removing c
    monmaptool: writing epoch 1 to {tmp}/{filename} (0 monitors)
  4. 添加新的monitors信息

    1
    2
    3
    4
    $ monmaptool --add a 10.1.0.1:6789 --add b 10.1.0.2:6789 --add c 10.1.0.3:6789 {tmp}/{filename}

    monmaptool: monmap file{tmp}/{filename}
    monmaptool: writing epoch 1to {tmp}/{filename} (3 monitors)
  5. 检查新的monitors信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ monmaptool --print {tmp}/{filename}

    monmaptool: monmap file{tmp}/{filename}
    epoch 1 fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
    last_changed 2012-12-17 02:46:41.591248
    created 2012-12-17 02:46:41.591248
    0: 10.1.0.1:6789/0mon.a
    1: 10.1.0.2:6789/0mon.b
    2: 10.1.0.3:6789/0mon.c
  6. copy修改后的{tmp}/{filename}文件到所有monitor节点

    1
    scp {tmp}/{filename} monitors:~/
  7. 停止所有的monitor

    1
    stop ceph-mon-all
  8. 注入新的monitor map信息

    1
    ceph-mon -i {mon-id} --inject-monmap {tmp}/{filename}
  9. 启动所有的monitor

    1
    start ceph-mon-all

结语

在Ceph的应用中,网络一直是很重要的一块,整个Ceph集群的性能多半情况下会受到网络性能的影响,所以在部署Ceph前,我们需要规划好Ceph使用的网络,包括public和cluster网络。

一般OSD之间数据传输的cluster网络,我们会使用万兆网络,提升数据传输带宽,降低IO延迟;而Monitor,Client使用的public网络,因为数据量比较小,则可以使用普通的千兆网络。

支持原创