文档章节

ceph-deploy源码分析(二)——new模块 <转>

banwh
 banwh
发布于 2017/08/23 12:58
字数 1164
阅读 11
收藏 0

ceph-deploy源码分析(二)——new模块

原文:http://www.hl10502.com/2017/06/19/ceph-deploy-new/#more

ceph-deploy的new.py模块是用来开始部署新集群,创建ceph.conf、ceph.mon.keyring文件。

 

new 子命令格式如下

ceph-deploy new [-h] [--no-ssh-copykey] [--fsid FSID]
                       [--cluster-network CLUSTER_NETWORK]
                       [--public-network PUBLIC_NETWORK]
                       MON [MON ...]

 

部署集群

make函数priority为10,子命令设置的默认函数为new函数。

@priority(10)
def make(parser):
    """
    Start deploying a new cluster, and write a CLUSTER.conf and keyring for it.
    """
    parser.add_argument(
        'mon',
        metavar='MON',
        nargs='+',
        help='initial monitor hostname, fqdn, or hostname:fqdn pair',
        type=arg_validators.Hostname(),
        )
    parser.add_argument(
        '--no-ssh-copykey',
        dest='ssh_copykey',
        action='store_false',
        default=True,
        help='do not attempt to copy SSH keys',
    )
    parser.add_argument(
        '--fsid',
        dest='fsid',
        help='provide an alternate FSID for ceph.conf generation',
    )
    parser.add_argument(
        '--cluster-network',
        help='specify the (internal) cluster network',
        type=arg_validators.Subnet(),
    )
    parser.add_argument(
        '--public-network',
        help='specify the public network for a cluster',
        type=arg_validators.Subnet(),
    )
    parser.set_defaults(
        func=new,
        )

 

部署新集群

new 函数开始部署新集群

  • 创建ceph.conf文件,写入[global]fsid、mon_initial_members、mon_host、auth_cluster_required、auth_service_required、auth_client_required,如果参数中有public_network、cluster_network写入配置文件
  • 调用new_mon_keyring函数创建ceph.mon.keyring文件
  • def new(args):
        if args.ceph_conf:
            raise RuntimeError('will not create a Ceph conf file if attemtping to re-use with `--ceph-conf` flag')
        LOG.debug('Creating new cluster named %s', args.cluster)
        # 生成配置
        cfg = conf.ceph.CephConf()
        cfg.add_section('global')
        # 获取参数中的额fsid或者自动生成
        fsid = args.fsid or uuid.uuid4()
        cfg.set('global', 'fsid', str(fsid))
        # if networks were passed in, lets set them in the
        # global section
        if args.public_network:
            cfg.set('global', 'public network', str(args.public_network))
        if args.cluster_network:
            cfg.set('global', 'cluster network', str(args.cluster_network))
        # mon节点
        mon_initial_members = []
        # mon主机
        mon_host = []
        # 循环host
        for (name, host) in mon_hosts(args.mon):
            # Try to ensure we can ssh in properly before anything else
            # ssh key copy
            if args.ssh_copykey:
                ssh_copy_keys(host, args.username)
            # Now get the non-local IPs from the remote node
            # 连接远程主机
            distro = hosts.get(host, username=args.username)
            # 获取主机的IP地址
            remote_ips = net.ip_addresses(distro.conn)
            # custom cluster names on sysvinit hosts won't work
            if distro.init == 'sysvinit' and args.cluster != 'ceph':
                LOG.error('custom cluster names are not supported on sysvinit hosts')
                raise exc.ClusterNameError(
                    'host %s does not support custom cluster names' % host
                )
            distro.conn.exit()
            # Validate subnets if we received any
            if args.public_network or args.cluster_network:
                # 校验IP地址
                validate_host_ip(remote_ips, [args.public_network, args.cluster_network])
            # Pick the IP that matches the public cluster (if we were told to do
            # so) otherwise pick the first, non-local IP
            LOG.debug('Resolving host %s', host)
            if args.public_network:
                ip = get_public_network_ip(remote_ips, args.public_network)
            else:
                ip = net.get_nonlocal_ip(host)
            LOG.debug('Monitor %s at %s', name, ip)
            mon_initial_members.append(name)
            try:
                socket.inet_pton(socket.AF_INET6, ip)
                mon_host.append("[" + ip + "]")
                LOG.info('Monitors are IPv6, binding Messenger traffic on IPv6')
                cfg.set('global', 'ms bind ipv6', 'true')
            except socket.error:
                mon_host.append(ip)
        LOG.debug('Monitor initial members are %s', mon_initial_members)
        LOG.debug('Monitor addrs are %s', mon_host)
        # mon_initial_members 有多个的话,中间用空格隔开
        cfg.set('global', 'mon initial members', ', '.join(mon_initial_members))
        # no spaces here, see http://tracker.newdream.net/issues/3145
        # mon_host 有多个的话,中间没有空格
        cfg.set('global', 'mon host', ','.join(mon_host))
        # override undesirable defaults, needed until bobtail
        # http://tracker.ceph.com/issues/6788
        cfg.set('global', 'auth cluster required', 'cephx')
        cfg.set('global', 'auth service required', 'cephx')
        cfg.set('global', 'auth client required', 'cephx')
        path = '{name}.conf'.format(
            name=args.cluster,
            )
        # 创建mon keyring
        new_mon_keyring(args)
        LOG.debug('Writing initial config to %s...', path)
        tmp = '%s.tmp' % path
        with open(tmp, 'w') as f:
            # 保存ceph配置文件
            cfg.write(f)
        try:
            os.rename(tmp, path)
        except OSError as e:
            if e.errno == errno.EEXIST:
                raise exc.ClusterExistsError(path)
            else:
                raise

     

注意:
mon_initial_members 有多个的话,中间用空格隔开
mon_host 有多个的话,中间没有空格

创建ceph.mon.keyring文件

new_mon_keyring函数创建ceph.mon.keyring文件

def new_mon_keyring(args):
    LOG.debug('Creating a random mon key...')
    mon_keyring = '[mon.]\nkey = %s\ncaps mon = allow *\n' % generate_auth_key()
    keypath = '{name}.mon.keyring'.format(
        name=args.cluster,
        )
    oldmask = os.umask(0o77)
    LOG.debug('Writing monitor keyring to %s...', keypath)
    try:
        tmp = '%s.tmp' % keypath
        with open(tmp, 'w', 0o600) as f:
            f.write(mon_keyring)
        try:
            os.rename(tmp, keypath)
        except OSError as e:
            if e.errno == errno.EEXIST:
                raise exc.ClusterExistsError(keypath)
            else:
                raise
    finally:
        os.umask(oldmask)

 

手工部署集群

以ceph-deploy部署集群:ceph-deploy new ceph-231为例,对应的手工操作。

获取ip地址

执行以下命令,通过正则表达式获取IP地址192.168.217.231

[root@ceph-231 ceph-cluster]# /usr/sbin/ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UP mode DEFAULT qlen 1000
    link/ether 02:03:e7:fc:dc:36 brd ff:ff:ff:ff:ff:ff
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT
    link/ether 86:f4:14:e3:1b:b2 brd ff:ff:ff:ff:ff:ff
4: xenbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT
    link/ether 02:03:e7:fc:dc:36 brd ff:ff:ff:ff:ff:ff

 

[root@ceph-231 ceph-cluster]# /usr/sbin/ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UP qlen 1000
    link/ether 02:03:e7:fc:dc:36 brd ff:ff:ff:ff:ff:ff
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
    link/ether 86:f4:14:e3:1b:b2 brd ff:ff:ff:ff:ff:ff
4: xenbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 02:03:e7:fc:dc:36 brd ff:ff:ff:ff:ff:ff
    inet 192.168.217.231/24 brd 192.168.217.255 scope global xenbr0
       valid_lft forever preferred_lft forever

 

创建ceph.conf

[root@ceph-231 ceph-cluster]# vi ceph.conf
[global]
fsid = a3b9b0aa-01ab-4e1b-bba3-6f5317b0795b
mon_initial_members = ceph-231
mon_host = 192.168.217.231
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public_network = 192.168.217.231


创建ceph.mon.keyring

可以通过ceph-authtool命令生成

[root@ceph-231 ceph-cluster]# ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
creating /tmp/ceph.mon.keyring
[root@ceph-231 ~]# cat /tmp/ceph.mon.keyring
[mon.]
        key = AQCzxEhZC7tICxAAuHK5GipD96enMuhv82CCLg==
        caps mon = "allow *"

将/tmp/ceph.mon.keyring内容复制到ceph.mon.keyring

[root@ceph-231 ceph-cluster]# vi ceph.mon.keyring
[mon.]
key = AQCzxEhZC7tICxAAuHK5GipD96enMuhv82CCLg==
caps mon = allow 

 

© 著作权归作者所有

共有 人打赏支持
banwh
粉丝 2
博文 55
码字总数 79866
作品 0
海淀
程序员
私信 提问
OSChina 技术周刊第九期 —— 每周技术精选,值得一看!

每周技术抢先看,总有你想要的! 移动开发 【翻译】介绍 Visual Studio 的 Android 模拟器 【博客】手机腾讯网mt框架之mtwebapp示例解析。 【博客】《Android深入透析》之常用设计模式经验谈...

OSC编辑部
2014/11/16
3.8K
4
架构设计:系统存储(27)——分布式文件系统Ceph(安装)

1. 概述 从本篇文章开始介绍一款现在非常火的分布式文件系统Ceph,包括这款文件系统的安装、基本使用场景、常用管理命令和重要工作原理。特别是讨论了PaxOS算法的基本理后,就更容易理解Cep...

yinwenjie
2017/04/05
0
0
分布式存储Ceph的几种安装方法,源码,apt-get,deploy工具,Ubuntu CentOS

最近搞了下分布式PB级别的存储CEPH 尝试了几种不同的安装,使用 期间遇到很多问题,和大家一起分享。 一、源码安装 说明:源码安装可以了解到系统各个组件, 但是安装过程也是很费劲的,主要...

Yason_Luo
2014/04/04
0
1
Centos7.4部署ceph块设备

在部署块设备前必须保证Ceph存储集群处于active+clean状态。 一. 环境准备 二. 安装CEPH 在管理节点上,通过 ceph-deploy 把 Ceph 安装到 ceph-client 节点。 [root@admin-node ceph]# ceph...

Zai坚强一点
06/28
0
0
ceph infernalis版本搭建过程

ceph infernalis版本安装过程。 一、使用ceph-deploy方式安装infernalis版本的ceph。 1、宿主机环境。 ubuntu14.04.03-server-amd64 2、添加trusted key。 #wget -q -O- 'https://git.ceph.c...

linuxhunter
2015/12/16
258
0

没有更多内容

加载失败,请刷新页面

加载更多

让天下没有难用的搜索:阿里搜索如何成长为贴心“暖男”?

摘要: 阿里搜索技术体系演进至今天,基本形成了由offline、nearline、online三层体系,分工协作,保证电商平台上,既能适应日常平稳流量下稳定有效的个性化搜索及推荐,也能够去满足电商平台...

阿里云官方博客
14分钟前
3
0
(一)spring cloud互联网分布式微服务云平台规划分析--spring cloud平台整体规划

1. 导语 近期公司孵化了一个互联网产品,随着业务发展,产品运营后用户数据量(过亿)、业务数据量(过100亿)较大,技术团队配合产品、运营快速定制化开发, 还要考虑产品涉及的资金安全、消...

明理萝
15分钟前
0
1
linux 下对于jvm的监测

在看阿里巴巴开源项目的时候,发现了alibaba/arthas ,之前出现会员卡的时候,需要只能去看日志。但是日志又不能有效的知道当时的问题情况。一种方法就是去监测出现问题的情况下,去查看jvm...

miaojiangmin
23分钟前
0
0
大数据就业前景分析的太到位了,想学习大数据的可以看看

大数据广泛应用于电网运行、经营管理及优质服务等各大领域,并正在改变着各行各业,也引领了大数据人才的变革。大数据专业就业前景怎么样?这对于在就业迷途中的我们是一个很重要的信息。 随...

董黎明
56分钟前
3
0
如何利用Photoshop进行快速切图

在UI设计中我们常常使用Ai来进行矢量图的绘制,然后导入Ps中进行设计、排版和导出。 在以前的版本中,切图一直是个很麻烦的事情,要么依托于脚本,要么手动一张张导出,很不方便,这种窘况在...

mo311
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部