概述

ansible是一款自动化运维工具,curve-ansible 是基于 ansible playbook 功能编写的集群部署工具。本文档介绍如何快速上手体验 CURVE 分布式系统:1. 使用 curve-ansible 在单机上模拟生产环境部署步骤 2. 使用 curve-ansible 在多机上部署最小生产环境。关于curve-ansible的更多用法和说明请参见curve-ansible README本文针对最新版本的软件包,请优先使用最新版本软件包。安装过程中遇到文档中未说明的问题,请通过issue反馈。

特别说明

  • 一些外部依赖是通过源码的方式安装的,安装的过程中从github下载包可能会超时,这时可以选择重试或手动安装,jemalloc手动安装的话要保证configure的prefix与server.ini和client.ini的lib_install_prefix一致
  • 如果机器上开启了SElinux可能会报Aborting, target uses selinux but python bindings (libselinux-python) aren’t installed,可以尝试安装libselinux-python,或者强行关闭selinux
  • deploy_curve.yml用于部署一个全新的集群,集群成功搭建后不能重复跑,因为会扰乱集群。可以选择启动集群或者清理集群后重新部署,详细用法见curve-ansible README
  • 部署的过程中,在chunkserver成功启动之前都可以任意重试,chunkserver启动成功后重试要额外注意,要带上—skip-tags format,因为这一步会把启动成功的chunkserver的数据给清理掉,从而扰乱集群。
  • 需要用到curve-nbd功能的话,对内核有两方面的要求:一是要支持nbd模块,可以modprobe nbd查看nbd模块是否存在。二是nbd设备的block size要能够被设置为4KB。经验证,通过DVD1.iso完整安装的CentOs8,内核版本是4.18.0-193.el8.x86_64,满足这个条件,可供参考。

单机部署

  • 适用场景:希望用单台 Linux 服务器,体验 CURVE 最小的拓扑的集群,并模拟生产部署步骤。 我们提供了all-in-one的docker镜像,在这个docker镜像中,有全部的编译依赖和运行依赖。因此可以快速的部署自己编译好的代码,当然也可以选择从github下载最新的release包实施部署。

    docker准备

    执行下面的命令启动docker
    1. docker run --cap-add=ALL -v /dev:/dev -v /lib/modules:/lib/modules --privileged -it opencurve/curveintegration:centos8 /bin/bash
    选择docker部署的话,下面的准备环境步骤可以直接跳过,开始实施部署即可。

    准备环境

准备一台部署主机,确保其软件满足需求:

  • 推荐安装 Debian9 或者 Centos7/8(其他环境未经测试)
    • Linux 操作系统开放外网访问,用于下载 CURVE 的安装包
    • 部署需要创建一个有root权限的公共用户
    • 目前仅支持在 x86_64 (AMD64) 架构上部署 CURVE 集群
    • 安装 ansible 2.5.9,用于部署集群(目前仅支持ansible 2.5.9版本,其他版本会有语法问题
    • 安装 docker 18.09 及以上, 用于部署快照克隆服务器

最小规模的 CURVE 集群拓扑:

实例 个数 IP 配置
MDS 1 127.0.0.1 默认端口
全局目录配置
Chunkserver 3 127.0.0.1 默认端口
全局目录配置
CentOs7/8环境准备具体步骤
  1. root用户登录机器,创建curve用户:

    1. $ adduser curve
  2. 在root下设置curve用户免密sudo

    1. $ su # 进入root用户
    2. $ 在/etc/sudoers.d下面创建一个新文件curve,里面添加一行:curve ALL=(ALL) NOPASSWD:ALL
    3. $ su curve # 切换到curve用户
    4. $ sudo ls # 测试sudo是否正确配置
  3. 安装ansible 2.5.9
    1. $ sudo yum install python2 # 安装python2
    2. $ ln -s /usr/bin/python2 /usr/bin/python # 设置默认使用python2
    3. $ pip2 install ansible==2.5.9 # 安装ansible
    4. $ ansible-playbook # 如果没有报错的话说明安装成功,报错的话执行下面两步
    5. $ pip install --upgrade pip
    6. $ pip install --upgrade setuptools
  4. 确保源里面有以下几个包:net-tools, openssl>=1.1.1, perf, perl-podlators, make
Debian9环境准备具体步骤
  1. root用户登录机器,创建curve用户
    1. $ adduser curve
  2. 设置curve用户免密sudo
    1. $ su # 进入root用户
    2. $ apt install sudo # 安装sudo,如果没有安装过的话
    3. $ 在/etc/sudoers.d下面创建一个新文件curve,里面添加一行:curve ALL=(ALL) NOPASSWD:ALL
    4. $ sudo -iu curve # 切换到curve用户
    5. $ sudo ls # 测试sudo是否正确配置
  3. 安装ansible 2.5.9
    1. $ apt install python
    2. $ apt install python-pip
    3. $ pip install ansible==2.5.9
    4. $ ansible-playbook # 如果没有报错的话说明安装成功,报错的话执行下面两步
    5. $ pip install --upgrade pip
    6. $ pip install --upgrade setuptools
  4. 确保源里面有以下几个包:net-tools, openssl>=1.1.1, perf, perl-podlators, make

实施部署

  1. 切换到curve用户下执行以下操作

  2. 获取tar包并解压

    有两种方式可以获得tar包:

    1. github release页面下载稳定版本tar包
    2. 自行通过编译环境打tar包,该方式可以让您体验测试最新代码:编译开发环境搭建
    1. # 如下几个tar包可替换为其他版本(如您采用方式2自行打包,则不需要下载,拷贝相关tar包即可),下载命令仅供参考,请使用最新版本
    2. wget https://github.com/opencurve/curve/releases/download/v{version}/curve_{version}.tar.gz
    3. wget https://github.com/opencurve/curve/releases/download/v{version}/nbd_{version}.tar.gz
    4. wget https://github.com/opencurve/curve/releases/download/v{version}/nebd_{version}.tar.gz
    5. tar zxvf curve_{version}.tar.gz
    6. tar zxvf nbd_{version}.tar.gz
    7. tar zxvf nebd_{version}.tar.gz
    8. cd curve/curve-ansible
  3. 部署集群并启动服务,如果需要使用快照克隆功能,请先设置server.ini中的disable_snapshot_clone=False再执行脚本。

    1. ansible-playbook -i server.ini deploy_curve.yml
  4. 如果需要使用快照克隆功能,需要有S3账号,可以使用网易云的对象存储

    1. 1. server.ini 中,填写s3_nos_addresss3_snapshot_bucket_names3_aks3_sk
    2. 2. 安装快照克隆服务
    3. ansible-playbook -i server.ini deploy_curve.yml --tags snapshotclone
    4. ansible-playbook -i server.ini deploy_curve.yml --tags snapshotclone_nginx
  5. 执行命令查看当前集群状态,主要看以下几个状态:

    • Cluster status中的total copysets为100,unhealthy copysets为0
    • Mds status中current MDS不为空,offline mds list为空
    • Etcd status中的current etcd不为空,offline etcd list为空
    • Chunkserver status中的offline为0
    1. curve_ops_tool status
  6. 安装 Nebd 服务和 NBD 包

    1. ansible-playbook -i client.ini deploy_nebd.yml
    2. ansible-playbook -i client.ini deploy_nbd.yml
    3. ansible-playbook -i client.ini deploy_curve_sdk.yml
  7. 创建 CURVE 卷,并通过 NBD 挂载到本地。创建CURVE卷的时候可能会报Fail to listen,这个属于日志打印问题,不影响结果,可以忽略

    1. 1. 创建 CURVE 卷: 命令为 curve create [-h] --filename FILENAME --length LENGTH --user USER LENGTH >= 10。其中length单位为GB
    2. curve create --filename /test --length 10 --user curve
    3. 2. 挂载卷
    4. sudo curve-nbd map cbd:pool//test_curve_
    5. 3. 查看设备挂载情况(在docker环境中,list-mapped会看不到,可以选择lsblk看一下是否有/dev/nbd0类型的卷)
    6. curve-nbd list-mapped
  8. 部署监控(可选)。关于监控体系的文档见curve监控体系文档,监控的部署需要用到docker编排,首先请先确保安装了docker和docker-compose。其次,需要在curve包的同一级目录下下载并解压curve-monitor的tar包。

    1. ansible-playbook deploy_monitor.yml -i server.ini

多机部署

  • 适用场景:用多台 Linux 服务器,搭建 CURVE 最小的拓扑的集群,可以用于初步性能测试。

准备环境

准备三台部署主机,确保其软件满足需求:

  • 推荐安装 Debian9 或者 Centos7/8
  • Linux 操作系统开放外网访问,用于下载 CURVE 的安装包
  • 部署需要在每个机器上创建一个有root权限的公共用户
  • 部署主机需要开放 CURVE 集群节点间所需ssh端口
  • 目前仅支持在 x86_64 (AMD64) 架构上部署 CURVE 集群
  • 选择三台机器中的一个作为中控机,安装 ansible 2.5.9,用于部署集群(目前只支持ansible 2.5.9下的部署
  • 安装 docker 18.09 及以上, 用于部署快照克隆服务器

同时,确保每个机器都至少一个数据盘可以用于格式化供chunkserver使用。

CURVE 集群拓扑:

实例 个数 IP 端口
MDS 3 10.192.100.1
10.192.100.2
10.192.100.3
6666
Chunkserver
(三个Server上分别挂10个盘,每个Server上启动10个Chunkserver用例)
10 * 3 10.192.100.1
10.192.100.2
10.192.100.3
8200
CentOs7/8环境准备具体步骤

下面这些步骤要三台机器都操作:

  1. root用户登录机器,创建curve用户:

    1. $ adduser curve
  2. 在root下设置curve用户免密sudo

    1. $ su # 进入root用户
    2. $ 在/etc/sudoers.d下面创建一个新文件curve,里面添加一行:curve ALL=(ALL) NOPASSWD:ALL
    3. $ su curve # 切换到curve用户
    4. $ sudo ls # 测试sudo是否正确配置
  3. 确保源里面有以下几个包:net-tools, openssl>=1.1.1, perf, perl-podlators, make

下面的步骤只需要在中控机上执行:

  1. curve用户下配置ssh登陆到所有机器(包括自己),假设三台机器的ip分别为10.192.100.1,10.192.100.2,10.192.100.3
    1. $ su curve # 切换到curve用户
    2. $ ssh-keygen # 生成ssh秘钥
    3. $ ssh-copy-id curve@10.192.100.1 # 拷贝key到第一个机器
    4. $ ssh-copy-id curve@10.192.100.2 # 拷贝key到第二个机器
    5. $ ssh-copy-id curve@10.192.100.3 # 拷贝key到第三个机器
    6. $ ssh 10.192.100.1 # 挨个验证一下配置是否正确
  2. 安装ansible 2.5.9 ```bash $ sudo yum install python2 # 安装python2 $ ln -s /usr/bin/python2 /usr/bin/python # 设置默认使用python2 $ pip2 install ansible==2.5.9 # 安装ansible $ ansible-playbook # 如果没有报错的话说明安装成功,报错的话执行下面两步 $ pip install —upgrade pip $ pip install —upgrade setuptools
  3. 确保源里面有以下几个包:net-tools, openssl>=1.1.1, perf, perl-podlators, make

Debian9环境准备步骤

下面这些步骤要三台机器都操作:

  1. root用户登录机器,创建curve用户
    1. $ adduser curve
  2. 设置curve用户免密sudo
    1. $ su # 进入root用户
    2. $ apt install sudo # 安装sudo,如果没有安装过的话
    3. $ 在/etc/sudoers.d下面创建一个新文件curve,里面添加一行:curve ALL=(ALL) NOPASSWD:ALL
    4. $ sudo -iu curve # 切换到curve用户
    5. $ sudo ls # 测试sudo是否正确配置
    下面的步骤只需要在中控机上执行:
  3. curve用户下配置ssh登陆到所有机器(包括自己),假设三台机器的ip分别为10.192.100.1,10.192.100.2,10.192.100.3
    1. $ su curve # 切换到curve用户
    2. $ ssh-keygen # 生成ssh秘钥
    3. $ ssh-copy-id curve@10.192.100.1 # 拷贝key到第一个机器
    4. $ ssh-copy-id curve@10.192.100.2 # 拷贝key到第二个机器
    5. $ ssh-copy-id curve@10.192.100.3 # 拷贝key到第三个机器
    6. $ ssh 10.192.100.1 # 挨个验证一下配置是否正确
  4. 安装ansible 2.5.9
    1. $ apt install python
    2. $ apt install python-pip
    3. $ pip install ansible==2.5.9
    4. $ ansible-playbook # 如果没有报错的话说明安装成功,报错的话执行下面两步
    5. $ pip install --upgrade pip
    6. $ pip install --upgrade setuptools

实施部署

  1. 切换到curve用户下执行以下操作

  2. 获取tar包并解压

    有两种方式可以获得tar包:

    1. github release页面下载稳定版本tar包
    2. 自行通过编译环境打tar包,该方式可以让您体验测试最新代码:编译开发环境搭建
    1. # 如下几个tar包可替换为其他版本(如您采用方式2自行打包,则不需要下载,拷贝相关tar包即可),下载命令仅供参考,请使用最新版本
    2. wget https://github.com/opencurve/curve/releases/download/v{version}/curve_{version}.tar.gz
    3. wget https://github.com/opencurve/curve/releases/download/v{version}/nbd_{version}.tar.gz
    4. wget https://github.com/opencurve/curve/releases/download/v{version}/nebd_{version}.tar.gz
    5. tar zxvf curve_{version}.tar.gz
    6. tar zxvf nbd_{version}.tar.gz
    7. tar zxvf nebd_{version}.tar.gz
    8. cd curve/curve-ansible
  3. 在中控机上修改配置文件

    server.ini

    1. [mds]
    2. mds1 ansible_ssh_host=10.192.100.1 // 改动
    3. mds2 ansible_ssh_host=10.192.100.2 // 改动
    4. mds3 ansible_ssh_host=10.192.100.3 // 改动
    5. [etcd]
    6. etcd1 ansible_ssh_host=10.192.100.1 etcd_name=etcd1 // 改动
    7. etcd2 ansible_ssh_host=10.192.100.2 etcd_name=etcd2 // 改动
    8. etcd3 ansible_ssh_host=10.192.100.3 etcd_name=etcd3 // 改动
    9. [snapshotclone]
    10. snap1 ansible_ssh_host=10.192.100.1 // 改动
    11. snap2 ansible_ssh_host=10.192.100.2 // 改动
    12. snap3 ansible_ssh_host=10.192.100.3 // 改动
    13. [snapshotclone_nginx]
    14. nginx1 ansible_ssh_host=10.192.100.1 // 改动
    15. nginx2 ansible_ssh_host=10.192.100.2 // 改动
    16. [zone1]
    17. server1 ansible_ssh_host=10.192.100.1 // 改动
    18. [zone2]
    19. server2 ansible_ssh_host=10.192.100.2 // 改动
    20. [zone3]
    21. server3 ansible_ssh_host=10.192.100.3 // 改动
    22. # 请确保zone内机器数量一致
    23. [chunkservers:children]
    24. zone1
    25. zone2 // 改动
    26. zone3 // 改动
    27. [monitor]
    28. localhost ansible_ssh_host=127.0.0.1 // 部署监控的机器,可以根据需要改动
    29. [mds:vars]
    30. mds_dummy_port=6667
    31. mds_port=6666
    32. mds_subnet=10.192.100.0/22 // 改成想要起mds服务的ip对应的子网
    33. defined_healthy_status="cluster is healthy"
    34. mds_package_version="0.0.6.1+160be351"
    35. tool_package_version="0.0.6.1+160be351"
    36. # 启动命令是否用sudo
    37. mds_need_sudo=True
    38. mds_config_path=/etc/curve/mds.conf
    39. mds_log_dir=/data/log/curve/mds
    40. topo_file_path=/etc/curve/topo.json
    41. [etcd:vars]
    42. etcd_listen_client_port=2379
    43. etcd_listen_peer_port=2380
    44. etcd_name="etcd"
    45. etcd_need_sudo=True
    46. defined_healthy_status="cluster is healthy"
    47. etcd_config_path=/etc/curve/etcd.conf.yml
    48. etcd_log_dir=/data/log/curve/etcd
    49. etcd_data_dir=/etcd/data
    50. etcd_wal_dir=/etcd/wal
    51. [snapshotclone:vars]
    52. snapshot_port=5556
    53. snapshot_dummy_port=8081
    54. snapshot_subnet=10.192.100.0/22 // 改成想要启动mds服务的ip对应的子网
    55. defined_healthy_status="cluster is healthy"
    56. snapshot_package_version="0.0.6.1.1+7af4d6a4"
    57. snapshot_need_sudo=True
    58. snapshot_config_path=/etc/curve/snapshot_clone_server.conf
    59. snap_s3_config_path=/etc/curve/s3.conf
    60. snap_client_config_path=/etc/curve/snap_client.conf
    61. client_register_to_mds=False
    62. client_chunkserver_op_max_retry=50
    63. client_chunkserver_max_rpc_timeout_ms=16000
    64. client_chunkserver_max_stable_timeout_times=64
    65. client_turn_off_health_check=False
    66. snapshot_clone_server_log_dir=/data/log/curve/snapshotclone
    67. [chunkservers:vars]
    68. wait_service_timeout=60
    69. check_copysets_status_times=1000
    70. check_copysets_status_interval=1
    71. cs_package_version="0.0.6.1+160be351"
    72. defined_copysets_status="Copysets are healthy"
    73. chunkserver_base_port=8200
    74. chunkserver_format_disk=True // 改动,为了更好的性能,实际生产环境需要将chunkserver上的磁盘全部预格式化,这个过程比较耗时1T的盘格式80%化大概需要1个小时
    75. auto_get_disk_list=False // 改动,如果需要自动获取要格式化的磁盘,而不是在group_vars中指定的话改为true
    76. get_disk_list_cmd="lsscsi |grep ATA|awk '{print $7}'|awk -F/ '{print $3}'" // 改动,自动获取磁盘列表的命令,根据需要可调整
    77. chunk_alloc_percent=80 // 预创的chunkFilePool占据磁盘空间的比例,比例越大,格式化越慢
    78. wal_segment_alloc_percent=10 // 如果使用wal覆盖写,且文件池和chunkfilepool分开则需要指定
    79. # 每台机器上的chunkserver的数量
    80. chunkserver_num=3 // 改动,修改成机器上需要部署chunkserver的磁盘的数量
    81. chunkserver_need_sudo=True
    82. chunkserver_conf_path=/etc/curve/chunkserver.conf
    83. chunkserver_data_dir=/data // 改动,chunkserver想要挂载的目录,如果有两个盘,则会被分别挂载到/data/chunkserver0,/data/chunkserver1这些目录
    84. chunkserver_subnet=10.192.100.1/22 // 改动
    85. global_enable_external_server=True
    86. chunkserver_external_subnet=10.192.0.1/22 // 改动,如果机器有两个ip,就设置成和chunkserver_subnet不同的,如果只有一个,保持一致即可
    87. chunkserver_s3_config_path=/etc/curve/cs_s3.conf
    88. # chunkserver使用的client相关的配置
    89. chunkserver_client_config_path=/etc/curve/cs_client.conf
    90. client_register_to_mds=False
    91. client_chunkserver_op_max_retry=3
    92. client_chunkserver_max_stable_timeout_times=64
    93. client_turn_off_health_check=False
    94. disable_snapshot_clone=True // 改动,这一项取决于是否需要使用快照克隆功能,需要的话设置为False,并提供s3_ak和s3_sk
    95. chunk_size=16777216
    96. chunkserver_walfilepool_segment_size=8388608
    97. retain_pool=False // 改动,设置为True的话可以保留chunkfilepool,清理再重新部署的时候可以加速
    98. walfilepool_use_chunk_file_pool=True
    99. [snapshotclone_nginx:vars]
    100. snapshotcloneserver_nginx_dir=/etc/curve/nginx
    101. snapshot_nginx_conf_path=/etc/curve/nginx/conf/nginx.conf
    102. snapshot_nginx_lua_conf_path=/etc/curve/nginx/app/etc/config.lua
    103. nginx_docker_internal_port=80
    104. nginx_docker_external_port=5555
    105. [monitor:vars]
    106. monitor_work_dir=/etc/curve/monitor
    107. monitor_retention_time=7d
    108. monitor_retention_size=256GB
    109. prometheus_listen_port=9090
    110. prometheus_scrape_interval=3s
    111. prometheus_evaluation_interval=15s
    112. grafana_username=curve
    113. grafana_password=123
    114. grafana_listen_port=3000
    115. monitor_package_version="0.0.6.1.1+7af4d6a4"
    116. [all:vars]
    117. need_confirm=True
    118. curve_ops_tool_config=/etc/curve/tools.conf
    119. snap_tool_config_path=/etc/curve/snapshot_tools.conf
    120. wait_service_timeout=20
    121. deploy_dir="${HOME}"
    122. s3_ak="" // 如果需要快照克隆服务,则修改成自己s3账号对应的值
    123. s3_sk="" // 如果需要快照克隆服务,则修改成自己s3账号对应的值
    124. s3_nos_address="" // 如果需要快照克隆服务,则修改成s3服务的地址
    125. s3_snapshot_bucket_name="" // 如果需要快照克隆服务,则修改成自己在s3上的桶名
    126. ansible_ssh_port=22
    127. curve_root_username=root // 改动,修改成自己需要的username,因为目前的一个bug,用到快照克隆的话用户名必须为root
    128. curve_root_password=root_password // 改动,修改成自己需要的密码
    129. lib_install_prefix=/usr/local
    130. bin_install_prefix=/usr
    131. ansible_connection=ssh // 改动
    132. check_health=False
    133. clean_log_when_clean=False // clean的时候是否要清理日志
    134. snapshot_nginx_vip=127.0.0.1
    135. nginx_docker_external_port=5555
    136. curve_bin_dir=/usr/bin
    137. start_by_daemon=True // 可以选择是否用daemon启动
    138. sudo_or_not=True // 如果当前用户可以执行sudo,可以改为False
    139. ansible_become_user=curve
    140. ansible_become_flags=-iu curve
    141. update_config_with_puppet=False
    142. # 启动服务要用到ansible的异步操作,否则ansible退出后chunkserver也会退出
    143. # 异步等待结果的总时间
    144. service_async=5
    145. # 异步查询结果的间隔
    146. service_poll=1
    147. install_with_deb=False
    148. restart_directly=False

    client.ini

    1. [client]
    2. client1 ansible_ssh_host=10.192.100.1 // 修改成想要部署client的机器的ip,可以是server.ini中的机器,也可以是其他的机器,保证网络互通即可
    3. # 仅用于生成配置中的mds地址
    4. [mds]
    5. mds1 ansible_ssh_host=10.192.100.1 // 改成和server.ini中的mds列表一致即可
    6. mds2 ansible_ssh_host=10.192.100.2 // 改动
    7. mds3 ansible_ssh_host=10.192.100.3 // 改动
    8. [client:vars]
    9. ansible_ssh_port=1046
    10. nebd_package_version="1.0.2+e3fa47f"
    11. nbd_package_version=""
    12. sdk_package_version="0.0.6.1+160be351"
    13. deploy_dir=/usr/bin
    14. nebd_start_port=9000
    15. nebd_port_max_range=5
    16. nebd_need_sudo=True
    17. client_config_path=/etc/curve/client.conf
    18. nebd_client_config_path=/etc/nebd/nebd-client.conf
    19. nebd_server_config_path=/etc/nebd/nebd-server.conf
    20. nebd_data_dir=/data/nebd
    21. nebd_log_dir=/data/log/nebd
    22. curve_sdk_log_dir=/data/log/curve
    23. [mds:vars]
    24. mds_port=6666
    25. [all:vars]
    26. need_confirm=True
    27. need_update_config=True
    28. update_config_with_puppet=False
    29. ansible_ssh_port=22
    30. lib_install_prefix=/usr/local
    31. bin_install_prefix=/usr
    32. ansible_connection=ssh // 改动
    33. wait_service_timeout=20
    34. curve_bin_dir=/usr/bin
    35. start_by_daemon=True // 是否用daemon的方式启动nebd-server

group_vars/mds.yml

  1. ---
  2. # 集群拓扑信息
  3. cluster_map:
  4. servers:
  5. - name: server1
  6. internalip: 10.192.100.1 // 部署chunkserver的机器对应的内部ip,用于curve集群内部(mds和chunkserver,chunkserver之间)通信
  7. internalport: 0 // 改动,多机部署情况下internalport必须是0,不然只有机器上对应端口的chunkserver才能够注册上
  8. externalip: 10.192.100.1 // 部署chunkserver的机器对应的外部ip,用于接受client的请求,可以设置成和internal ip一致
  9. externalport: 0 // 改动,多机部署情况下externalport必须是0,不然只有机器上对应端口的chunkserver才能够注册上
  10. zone: zone1
  11. physicalpool: pool1
  12. - name: server2
  13. internalip: 10.192.100.2 // 改动,原因参考上一个server
  14. internalport: 0 // 改动,原因参考上一个server
  15. externalip: 10.192.100.2 // 改动,原因参考上一个server
  16. externalport: 0 // 改动,原因参考上一个server
  17. zone: zone2
  18. physicalpool: pool1
  19. - name: server3
  20. internalip: 10.192.100.3 // 改动,原因参考上一个server
  21. internalport: 0 // 改动,原因参考上一个server
  22. externalip: 10.192.100.3 // 改动,原因参考上一个server
  23. externalport: 0 // 改动,原因参考上一个server
  24. zone: zone3
  25. physicalpool: pool1
  26. logicalpools:
  27. - name: logicalPool1
  28. physicalpool: pool1
  29. type: 0
  30. replicasnum: 3
  31. copysetnum: 300 // copyset数量与集群规模有关,建议平均一个chunkserver上100个copyset,比如三台机器,每台3个盘的话是3*3*100=900个copyset,除以三副本就是300个
  32. zonenum: 3
  33. scatterwidth: 0

group_vars/chunkservers.yml 修改成机器上具体的磁盘的名字列表,数量不固定。

  1. disk_list:
  2. - sda
  3. - sdb
  4. - sdc

如果个别chunkserver的磁盘名字和其他的不同,需要单独拎出来放在host_vars下面。比如本例中,假设server1和server2上都是三个盘分别是sda,sdb,sdc和group_vars中的一致,而server3的是sdd,sde,sdf,sdg,那么需要在host_vars下面新增一个server3.yml,其中的内容为:

  1. disk_list:
  2. - sdd
  3. - sde
  4. - sdf
  5. - sdg
  1. 部署集群并启动服务。ansible默认的并发度为5,如果机器超过5个的话,每一步操作会先在前5台机器上操作,完成之后再操作下面5台。如果想要提升速度,可以在ansible-playbook后面加上-f [并发数]选项。

    1. ansible-playbook -i server.ini deploy_curve.yml
  2. 如果需要使用快照克隆功能,需要有S3账号,可以使用网易云的对象存储 同上

    1. 1. server.ini 中,填写s3_nos_addresss3_snapshot_bucket_names3_aks3_sk disable_snapshot_clone=False
    2. 2. 安装快照克隆服务
    3. ansible-playbook -i server.ini deploy_curve.yml --tags snapshotclone
    4. ansible-playbook -i server.ini deploy_curve.yml --tags snapshotclone_nginx
  3. 执行命令查看当前集群状态,主要看以下几个状态:

    • Cluster status中的total copysets为100,unhealthy copysets为0
    • Mds status中current MDS不为空,offline mds list为空
    • Etcd status中的current etcd不为空,offline etcd list为空
    • Chunkserver status中的offline为0
      1. curve_ops_tool status
  4. 安装 Nebd 服务和 NBD 包

    1. ansible-playbook -i client.ini deploy_nebd.yml
    2. ansible-playbook -i client.ini deploy_nbd.yml
    3. ansible-playbook -i client.ini deploy_curve_sdk.yml
  5. 在client的机器上创建 CURVE 卷,并通过 NBD 挂载到本地。创建CURVE卷的时候可能会报Fail to listen,这个属于日志打印问题,不影响结果,可以忽略。

    1. 1. 创建 CURVE 卷: 命令为 curve create [-h] --filename FILENAME --length LENGTH --user USER LENGTH >= 10。其中length单位为GB
    2. curve create --filename /test --length 10 --user curve
    3. 2. 挂载卷
    4. sudo curve-nbd map cbd:pool//test_curve_
    5. 3. 查看设备挂载情况
    6. curve-nbd list-mapped