1 安装简介

NDH软件整体划分为2个模块,即业务模块和管理模块,两个模块之间采用物理隔离的方式进行部署,保证业务、管理两个模块各自服务的安全性。

  • 管理模块主要用于集群管理,对外提供集群安装、升级、扩缩容、监控、报警、配置、审计管理等服务。
  • 业务模块主要为用户或上层用户提供业务通道,对外提供数据存储、任务提交和计算的功能。

1.1 安装模式

  • 基础组件内置模式:NDH大数据平台所依赖的部分基础组件比如Kerberos服务、LDAP服务以及关系型数据库服务可以选择NDH自带的,称为内置模式。
  • 基础组件外置模式:NDH大数据平台也可以不使用自带的上述服务,而是导入用户已有的Kerberos、LDAP以及数据库服务等基础组件,称为外置模式。

1.2 安装流程

3.1.1.png

2 安装前准备

2.1主机初始化

使用root用户 登录部署easyops的管控节点进行环境初始化,主机自动初始化执行完成后,将自动完成以下步骤:

  • 系统版本确认。
  • FQDN设置。
  • 时钟同步。
  • umask 设置。
  • 预置用户及免密。
  • 添加crontab权限。
  • 包服务器部署,默认部署在本机,端口81。若另有包服务器,可在1.3.2节中不下载解压NDH-V6.4.0.tar.gz,在1.3.4-3步骤中填入实际包服务器地址。

2.1.1 磁盘挂载

NDH需多块数据盘以支撑平台运行,前期需将数据盘挂载至操作系统,CentOS7系列xfs为主。EasyOps需每个节点至少存在一块数据盘,建议:系统盘≥200GB,数据盘≥1TB 注:统一将数据盘挂载至 /mnt 目录下,格式要求 /mnt/data01、/mnt/data02 ...

# 查看磁盘状态
fdisk -l
# 格式化磁盘(若存在多块磁盘,以分号分隔批量操作)
mkfs.xfs /dev/sdb
# 挂载磁盘到指定目录
mkdir -p /mnt/data01 && mount /dev/sdb /mnt/data01
# 修改/etc/fstab,增加如下配置,设置开机自动加载磁盘
/dev/vdb        /mnt/data01     xfs     defaults        0 0

2.1.2 安装docker

#root用户操作
#创建ndh包目录和docker安装目录
mkdir -p /mnt/data01/ndh
mkdir -p /mnt/data01/docker
cd /mnt/data01/ndh
  • X86架构下载NDH-V6.4.0.tar.gz包
    # X86架构 下载NDH-V6.4.0.tar.gz包到/mnt/data01/ndh目录
    # 不在本地部署包服务器可不下载NDH-V6.4.0.tar.gz,直接下载init-1.0.tar.gz并解压
    #上传  NDH-V6.4.0.tar.gz包 
    tar -zxvf NDH-V6.4.0.tar.gz -C ./
    tar -zxvf NDH-V6.4.0/common/easyops/init-1.0.tar.gz  -C ./
    cd /mnt/data01/ndh/init/docker-20.17 
    #安装docker , 输入的/mnt/data01/docker为docker安装路径
    bash install.sh /mnt/data01/docker
  • ARM架构下载NDH-V6.4.0-ARM.tar.gz包
    # X86架构 下载NDH-V6.4.0-ARM.tar.gz包到/mnt/data01/ndh目录
    # 不在本地部署包服务器可不下载NDH-V6.4.0-ARM.tar.gz,直接下载init-1.0.tar.gz并解压
    cd /mnt/data01/ndh 
    wget ${NDH-V6.4.0-ARM.tar.gz包地址}  
    tar -zxvf NDH-V6.4.0-ARM.tar.gz
    tar -zxvf NDH-V6.4.0-ARM/common/easyops/init-1.0.tar.gz 
    cd /mnt/data01/ndh/init/docker-20.17 
    #安装docker , 输入的/mnt/data01/docker为docker安装路径
    bash install.sh /mnt/data01/docker

安装完成后执行docker ps ,显示以下内容即安装成功。 2.1.png

2.1.3 启动初始化容器与包服务器部署

cd /mnt/data01/ndh/init/
sh  run-initnode.sh /mnt/data01/ndh

显示以下内容即初始化成功。

2.2.png

此时包服务器已在当前节点搭建,包服务器地址: http://${当前节点IP}:81/ndh/ ,测试该地址可访问即成功。

2.1.4 主机初始化

这一步需要用户提供一个有sudo权限的普通用户或者root用户,作为执行初始化操作的ansible账号。 若使用有sudo权限的普通用户执行时需检查/etc/sudoers文件中是否存在,若存在,需删除。

Defaults requiretty

若以上账号有密码,下一步按1.a执行。若无密码,需先配免密,下一步按1.b执行。

#进入init容器
docker exec -it nodeinit bash 
#拷贝并修改inventory/hosts文件,注意:inventory目录下只保留一个hosts文件
cp -ar ./hosts.tmp inventory/hosts
vi inventory/hosts

1. 修改inventory/hosts的内容,用户提供各节点的初始化ansible账号密码参考场景a,不提供初始化ansible账号账号的密码参考场景b:

a. 如有提供账号的密码:(若无账号密码,参考场景b)

  • node X 节点编号,仅在主机初始化时代指不同的主机,添加主机后编号也需新增。
  • ansible_ssh_host后填入节点IP
  • hostname后填入节点的hostname
  • ansible_ssh_user后填入用户提供的账号
  • ansible_password后填账号的密码
  • os后填入操作系统类型 Centos7填写centos7 , kylinV10填写kylinv10 2.3.png b. 如没有各节点账号密码时,需配置当前初始化用户到其他节点的免密登录
    #手动配置免密登录
    #(当前节点做) 生成ssh密钥对
    ssh-keygen -t rsa
    #公钥地址
    .ssh/id_rsa.pub
    #(全部节点必做)其他节点需要创建相关的目录和文件
    mkdir -p -m 700 /home/<远程节点用户名>/.ssh
    vi /home/<远程节点用户名>/.ssh/authorized_keys
    chmod 600 .ssh/authorized_keys
    #拷贝各节点的公钥至其他节点的.ssh/authorized_keys中,使集群各个节点之间免密登录。
    场景b免密登录配置成功后,修改inventory/hosts:
  • ansible_ssh_host后填入节点IP
  • hostname后填入节点的hostname
  • ansible_ssh_user后填入用户提供的账号
  • ansible_password 后的内容不需要修改
  • os后填入操作系统类型 2. 按以上两种场景修改完inventory/hosts后,测试ansible连通性:
    sh ansible.sh all id

显示如下内容即成功 2.4.png

3. 修改config.cfg 文件

vi config.cfg

根据实际情况修改以下参数:

  • LOCAL_ENNAME 业务网网卡名
  • CONFIGSERVER_IP 包服务器地址,默认使用本地包服务器地址,使用其他地址需改为其它ip。
  • CONFIGSERVER_PORT 包服务端口,默认使用81,使用其他端口需改为其它值。
  • VERSION 当前NDH版本号,X86版本填写NDH-V6.4.0 ,ARM版本填写NDH-V6.4.0-ARM
  • NTP_IP ntp服务地址 优先填客户ntp地址,客户无ntp服务器时可不修改。 2.5.png

4. 按以下步骤初始化主机

# FQDN设置
sh hostname-dns.sh

#初始化所有主机   (若只想初始化单台主机,执行./hostname-init.sh nodex 此处nodex见步骤1中的hosts文件)
sh hostname-init.sh all

显示以下内容,结尾处 failed=0 即成功。执行exit,退出并重新登录主机节点即可。 2.6.png 至此主机初始化成功,若需再添加主机,重新执行步骤1~4即可。

2.1.5 预置easyops用户

  • 如以上初始化操作使用的用户是easyops,则不再预置easyops用户,不再配置easyops用户免密登录。
  • 如以上初始化操作使用的用户不是easyops,则1.3.2节执行成功后,已在各节点预置了easyops用户,easyops私钥位于nodeinit容器的 /root/.ssh/id_rsa

3 EasyOps安装

3.1 EasyOps安装

1. 确认前置操作中easyops使用的库和用户已创建、相关授权已完成。

2. 使用easyops用户执行下列步骤

3. x86系统与aarch64系统使用的脚本不一样,需更改脚本名。

  • X86架构系统下载 install_easyops_2.0.3.1_x86.sh
  • ARM架构系统下载 install_easyops_2.0.3.1_aarch64.sh

下载安装脚本并执行

#easyops用户执行
su easyops
cd /home/easyops
#X86架构系统使用以下命令下载脚本:
wget http://${包服务器IP地址}:81/ndh/NDH-V6.4.0/common/easyops/install_easyops_2.0.3.1_x86.sh
sh install_easyops_2.0.3.1_x86.sh http://${包服务器IP地址}:81/ndh/NDH-V6.4.0 ${外置db的ip:端口} ${easyops数据库用户名} ${easyops数据库密码}

#install_easyops脚本使用方法:sh install_easyops_xxx.sh arg1 arg2 arg3 arg4 
#        arg1: 包服务器地址,填写到common的上一层,必须输入.
#        arg2:外置mysql的ip和端口,格式ip:port, 必须输入.
#        arg3: 外置db中easyops使用的用户名,不输入arg3时默认使用“easyops”.
#        arg4: 外置db中easyops使用的明文密码,不输入arg4时默认使用“EasyOps#163”.
#        arg3和arg4必须同时输入或同时不输入.
#示例:sh install_easyops_2.0.3.1.sh http://repo.bdms.service.163.org/NDH-V6.4.0 xnode4.local:3306 easyops EasyOps#163

#ARM架构系统使用以下命令下载脚本,使用方法相同
wget http://${包服务器IP地址}:81/ndh/NDH-V6.4.0-ARM/common/easyops/install_easyops_2.0.3.1_aarch64.sh

3.2 License 激活

登录easyops后点击右上角“许可证”进入许可证页面激活。 3.6.1.png 支持输入License Key 或上传许可证文件: 3.6.2.png

3.3 EasyOps n9e告警模块部署

3.3.1 服务连通性确认

该模块支持部署在非EasyOps所在节点,请根据客户现场需求选择部署节点,确认连通性:

  • 使用邮箱服务告警请确认到邮箱服务器的连通性
  • 使用企业微信机器人告警请确认到https://qyapi.weixin.qq.com 的连通性
  • 使用钉钉机器人告警请确认到https://oapi.dingtalk.com 的连通性
  • 使用飞书机器人告警请确认到https://open.feishu.cn 的连通性
  • 若独立部署,请确认n9e到EasyOps节点MySQL、Prometheus的连通性

3.3.2 解压n9e安装包

# 下载n9e安装包到/home/easyops/easyops/目录下
# 安装包解压,n9e-5.3.4.tar.gz与easyops包在同一层目录
cd /home/easyops/easyops/
tar -xzvf n9e-5.3.4.tar.gz
# 进入目录
cd n9e-5.3.4

3.3.3 删除redis 端口映射配置

删除docker-compose.yaml 以下俩行: 3.7.1.png redis 错误忽略即可

3.3.4 配置邮箱服务

若不使用邮件告警则无需配置,飞书、企业微信等其他通道配置参考 Easyops(192)告警使用说明

邮件服务配置需在n9eetc.temp/script/notify.py 文件中配置。配置前,请确保邮箱账号有效性(可以先拿邮箱客户端验证下有效性) 3.7.2.png

3.3.5 启动n9e模块

以easyops 账号运行 run.sh 启动项目。以下提示说明运行正常:

$ ./run.sh 
Loaded image: redis:6.2
Loaded image: ulric2019/nightingale:5.3.4
Stopping nserver ... done
Stopping nwebapi ... done
Stopping redis   ... done
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Starting redis ... done
Starting nserver ... done
Starting nwebapi ... done
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
redis is ok
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
nwebapi is ok
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
nserver is ok

3.3.6 修改EasyOps访问N9e配置

Q:为什么要做这个配置? A:EasyOps web界面上新增了告警web界面入口,所以需配置告警web入口地址

# 进入easyops部署目录,执行修改脚本,将IP换成对应n9e所在节点IP
cd /home/easyops/easyops/easyops-current
sh n9e-scripts/change_n9e_ip.sh <easyops节点的业务IP>

3.3.7 登录验证告警模块通

过WEB页面登录http://${easyops-ip}:8000/n9e/login,默认使用root/easyops账号密码登录系统: 3.7.3.png 或者从EasyOps界面跳转过来: 3.7.4.png 到这里已完成n9e的安装启动,默认没有任何告警规则的,可参考下面《告警接入使用说明》导入必备告警规则,或者自行创建告警规则。

4 添加主机

4.1 初始化设置

点击easyops右上角"设置"图标进入全局配置设置部分,如下图所示: 3.4.1.png 相关配置项说明如下:

  • VOLUME_MOUNT_PREFIX:数据盘目录前缀,如:/mnt/data
  • BASE_DIR:服务安装路径,建议安装到非home盘,如:/usr/easyops
  • SSH_USER:ssh登录用户名,目的主机的用户名,默认easyops
  • JAVA_HOME:jdk安装路径,不修改,默认:/usr/lib64/jdk8
  • BASE_LOG_DIR:日志存储路径,统一规定:/mnt/data01/logs
  • SSH_PASSWORD:ssh登录密码,目的主机密码;若配置密钥方式,则无需填写
  • UNINSTALL_ACTION:卸载的默认行为,不修改
  • PACKAGE_BASE_URL:安装包下载路径,统一规定:http://<包服务器>/bdms/centos7
  • PYTHON_HOME:python2默认安装路径,不修改,默认:/usr/lib64/python2
  • SSH_PRIVATE_KEY:easyops用户生成的私钥
  • SSH_PORT:ssh登录默认端口号
  • EASYOPS_REPO_BASEURL:依赖包下载路径,统一规定:http://<包服务器>/bdms/centos7/os/x86_64/
  • NODE_EXPORTER_PORT:主机指标采集器的端口,不修改,默认:9100
  • ENABLE_AUTO_START: 检测服务失败后自动拉起,不修改,默认:false

4.2 添加主机

进入到EasyOps,主页面->主机->添加主机,填写规范如下:

  • 主机列表:按照界面提示填写集群主机名称
  • 主机登录信息(优先级高):若此配置,则全局不生效;若此不配置,则全局生效
      SSH用户名:ssh登录默认的用户名,目的主机的用户名
      SSH端口号:ssh登录默认端口号
  • 认证类型(二选一):
      Private Keyeasyops私钥
      Passwordssh登录密码,目的主机密码

5 安装服务

NDH提供了两种服务安装模式,一种是使用YAML配置文件一键安装,一种是使用安装向导安装。前者适用于测试集群的安装部署,特点是方便快捷。后者适用于生产线集群的安装部署,特点是灵活可控。本节重点介绍"YAML一键安装"模式,下一章重点介绍"使用安装向导安装"模式。

5.1 YAML一键安装

进入到EasyOps主页面->总况,点击“安装技术栈”,使用Yaml快捷配置可以快速的部署整套集群,编辑Yaml内容,选择DEFAULT集群。 image.png 点击Yaml内容域下的编辑按钮,将弹出Yaml编辑器对话框。 5.1.2.png 步骤自带的语法检查器可以帮助用户检查语法规范,yaml内容填写完成后点击语法检查按钮,页面将检查用户输入的yaml内容,如果存在语法错误,会展示在上方信息栏中。

5.1.1 一键部署yml样例

# 以4台节点为例,节点列表如下
# bnode5.local, bnode6.local, bnode7.local, bnode8.local

- service: kerberos
  componentList:
    - component: master
      hostList: ["bnode6.local"]
    - component: slave
      hostList: ["bnode7.local"]
    - component: client
      # 所有机器都安装client
      hostList: ["bnode5.local","bnode6.local","bnode7.local","bnode8.local"]

- service: ldap
  componentList:
    - component: server
      hostList: ["bnode6.local","bnode7.local"]
    - component: client
      hostList: ["bnode5.local","bnode6.local","bnode7.local","bnode8.local"]

- service: ntesmysqlpaas
  componentList:
    - component: etcd
      hostList: ["bnode6.local","bnode7.local","bnode8.local"]
    - component: manager
      hostList: ["bnode8.local"]
    - component: node
      hostList: ["bnode6.local","bnode7.local"]
  configList:
    mysql:
      vip: "172.30.1.30"

- service: easy_ranger
  componentList:
    - component: admin
      hostList: ["bnode6.local","bnode7.local"]

- service: zookeeper
  componentList:
    - component: server
      hostList: ["bnode8.local","bnode6.local","bnode7.local"]
    - component: client
      # 所有机器都安装client
      hostList: ["bnode5.local","bnode6.local","bnode7.local","bnode8.local"]

- service: kafka
  componentList:
    - component: manager
      hostList: ["bnode8.local"]
    - component: broker
      hostList: ["bnode8.local","bnode6.local","bnode7.local"]

- service: elasticsearch
  componentList:
    - component: master
      hostList: ["bnode8.local","bnode6.local","bnode7.local"]
    - component: kibana
      hostList: ["bnode8.local","bnode6.local","bnode7.local"]
    - component: data
      hostList: ["bnode8.local","bnode6.local","bnode7.local"]

# - service: nginx
#   componentList:
#     - component: server
#       hostList: ["bnode7.local"]

- service: nginx_ha
  componentList:
    - component: server
      hostList: ["bnode7.local","bnode8.local"]
  configList:
    keepalived_common:
      default_virtual_ip_address: "172.30.1.29"

- service: hdfs
  componentList:
    # zkfc 必须和 namenode 在相同机器
    - component: zkfc
      hostList: ["bnode6.local","bnode7.local"]
    - component: namenode
      hostList: ["bnode6.local","bnode7.local"]
    - component: journalnode
      hostList: ["bnode8.local","bnode6.local","bnode7.local"]
    - component: datanode
      hostList: ["bnode6.local","bnode7.local","bnode8.local"]
    - component: client
      # 所有机器都安装client
      hostList: ["bnode5.local","bnode6.local","bnode7.local","bnode8.local"]

- service: yarn
  componentList:
    - component: client
      # 所有机器都安装client
      hostList: ["bnode[5-8].local"]
    - component: nodemanager
      hostList: ["bnode[6-8].local"]
    - component: resourcemanager
      # 需要安装在有zk-client的机器上
      hostList: ["bnode6.local", "bnode7.local"]
    - component: historyserver
      hostList: ["bnode6.local"]

- service: hive
  componentList:
    - component: client
      # 所有机器都安装client
      hostList: ["bnode[5-8].local"]
    - component: hiveserver
      hostList: ["bnode5.local", "bnode6.local"]
    - component: metastore
      hostList: ["bnode5.local", "bnode6.local"]

# 需要部署在hdfs-client hive-client的节点上
- service: impala
  componentList:
    - component: client
      # 所有机器都安装client
      hostList: ["bnode7.local"]
    - component: catalogd
      hostList: ["bnode7.local"]
    - component: impalad
      hostList: ["bnode7.local"]
    - component: statestored
      hostList: ["bnode7.local"]

- service: spark2
  componentList:
    - component: client
      # 所有机器都安装client
      # 需要部署在yarn的client节点
      hostList: ["bnode5.local","bnode6.local","bnode7.local"]
    - component: jobhistoryserver
      hostList: ["bnode8.local"]

- service: kyuubi
  componentList:
    - component: service
      hostList: ["bnode8.local"]

- service: hbase
  componentList:
    - component: client
      # client 需要部署在hdfs的client节点
      # 所有机器都安装client
      hostList: ["bnode[5-8].local"]
    - component: master
      # master 需要部署在hdfs的client节点
      hostList: ["bnode7.local", "bnode8.local"]
    - component: regionserver
      # 需要部署在datanode的节点
      hostList: ["bnode6.local","bnode7.local","bnode8.local"]

- service: knox
  componentList:
    - component: server
      hostList: ["bnode6.local"]

- service: meta_worker
  componentList:
    - component: api_server
      hostList: ["bnode8.local"]
    # 需要部署在journalnode的节点,且非namenode节点上
    - component: meta_server
      hostList: ["bnode8.local"]