1 安装简介

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

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

1.1 安装模式

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

1.2 安装流程

3.1.1.png

2 安装前准备

2.1 系统版本确认

NDH支持CentOS-7.5、RedHat-7.6操作系统,检查命令:

cat /etc/redhat-release

2.2 设置主机名符合FQDN规范

NDHManager管控服务强依赖主机名,因此须严格要求主机名设定,需与客户提前沟通确定FQDN,且确认后不可更改,若⽤户环境有所变动,需提前与⽹易⽅确认; 如果没有设置主机名可以使⽤如下命令进⾏设置:

# 设置主机名
hostnamectl set-hostname bdms1.163.com

2.3 修改/etc/hosts⽂件

将NDH集群所有主机的IP和HOSTNAME的映射关系配置到⽂件/etc/hosts 中。

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.1 bdms1.163.com
10.0.0.2 bdms2.163.com
10.0.0.3 bdms3.163.com
……

设置完成后可以通过以下命令来进⾏检查:

# 所有节点执⾏以下命令进⾏检查
hostname -i

2.4 磁盘挂载

NDH需多块数据盘以支撑平台运行,前期需将数据盘挂载至操作系统,CentOS7系列xfs为主。NDHManager需每个节点至少存在一块数据盘,建议:系统盘≥100GB,数据盘≥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.5 时钟同步检查

若客户网络不存在时间服务器或不通外网,则需在某个服务器上安装搭建时间服务器,可运行以下命令检查时钟是否同步:

timedatectl status         # 检查时间是否同步

2.6 umask 设置

如果客户环境不能进行修改,后续安装可能会出现未知异常。检查默认系统账号及easyops账号的umask是否为022。检查方式以及修改方式如下:


cat -n /etc/bashrc | grep -2 'umask'    
# 71行是普通用户的umask,期望值为002;73是超级用户的umask,期望值022
cat -n /etc/profile | grep -2 'umask'   
# 60行是普通用户的umask,期望值002;62是超级用户的更改,期望022
# 请保证上述修改之后对应位置umask参数为上文配置
# 刷新/etc/bashrc  与  /etc/profile
source /etc/bashrc      # 若修改则刷新bash配置
source /etc/profile     # 若修改则刷新系统配置
# 其他umask统一修改为02
cat -n /etc/login.defs | grep UMASK
# 所有节点设置大写 UMASK=022
sed -i "s/077/022/g" /etc/login.defs

2.7 检查是否为字符界面

使用如下命令查看系统默认启动界面:

systemctl get-default

#若显示graphical.target则表示图形化界面
#multi-user.target则表示字符界面

以root身份在终端或字符界面运行以下命令,将系统默认启动界面改为字符界面:

systemctl set-default multi-user.target

输入init 3 将图形页面转换为字符页面:

init 3

shell字符修改为en_US.UTF-8:

vi /etc/locale.conf
LANG="en_US.UTF-8"

3 NDHManager(Easyops)安装

3.1 包服务器设置

软件包上传至easyops 管控节点,配置包服务器:

# 解压安装包,根据实际情况选择数据盘替换目录
tar zxvf NDH-V2.1.1.tar.gz -C /mnt/data01/
# 安装httpd服务
yum -y install httpd    
# 需要关闭包服务器firewalld
systemctl stop firewalld 
# 创建软链
ln -s /mnt/data01/NDH-V2.1.1 /var/www/html/ndh  
# 修改httpd 服务监听端口
sed -i 's/Listen 80/Listen 81/'g  /etc/httpd/conf/httpd.conf
# 启动并设置开机自启动
systemctl start httpd && systemctl enable httpd   
# 检查httpd运行状态
systemctl status httpd          
# 正确返回:Active: active (running)

通过浏览器检查是否可以在页面上显示该组件包,在浏览器中输入http://<包服务器IP地址>:81/ndh,即可查看

3.2 Docker安装

# 添加easyops的docker使用权限,用root账号执行
groupadd docker

# Docker安装
cd /var/www/html/ndh/centos7/docker
yum localinstall -y /var/www/html/ndh/centos7/docker/*.rpm
cp /var/www/html/ndh/centos7/docker/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 启动Docker
systemctl start docker && systemctl enable docker

# 修改Docker安装目录
systemctl stop docker

#修改docker 数据存储路径
mv /var/lib/docker /mnt/data01/
ln -s /mnt/data01/docker /var/lib/docker
systemctl start docker

# 测试验证生效
检测命令:docker info

Client:
 Debug Mode: false

Server:
 Containers: 18
  Running: 8
  Paused: 0
  Stopped: 10
 Images: 6
...
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

3.3 配置管控执行账号easyops

在部署EasyOps的节点上需要创建easyops账号(有sudo权限),并设置免密其他服务器节点。

注:若部分用户不能大规模创建easyops账号的话,easyops服务器必须创建此账号,其他节点可以使用具有sudo权限的其他账号

#(必做)创建easyops账号,其他节点也使用此账号
groupadd easyops
useradd easyops -g easyops -s /bin/bash -d /home/easyops

# easyops账号能够执行docker 命令
usermod -aG docker easyops

#(必做)easyops节点配置免密
su - easyops
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa -q

#(必做)其他节点需要创建相关的目录和文件
mkdir -p -m 700 /home/<远程节点用户名>/.ssh
vi /home/<远程节点用户名>/.ssh/authorized_keys
chmod 600 .ssh/authorized_keys
#(必做)将easyops节点上的公钥复制到其他节点authorized_keys文件内

#(必做)使用root添加easyops账号的sudo权限
echo "easyops ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers

#(必做)注释Default requiretty 
#Default requiretty 

#(必做)/etc/cron.allow 添加easyops 用户
vim /etc/cron.allow
easyops

3.4 docker兼容iptables服务开启场景(选做)

• 需要在EasyOps要部署的机器上增加hosts配置,将easyops组件服务加入,配置如下:

127.0.0.1 n9e
127.0.0.1 ansible
127.0.0.1 grafana
127.0.0.1 prometheus
127.0.0.1 pushgateway
127.0.0.1 manager
127.0.0.1 db
127.0.0.1 cadvisor
127.0.0.1 web
127.0.0.1 gateway

127.0.0.1 redis
127.0.0.1 nserver
127.0.0.1 nwebapi

如果已有,请忽略已经有的配置 • 请在iptables中放开easyops端口(8000)的访问 , 以测试环境为例:

iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

3.5 EasyOps安装

# 1.复制easyops安装包复制到easyops家目录下,并开始安装,根据最新安装包进选择
cp <安装包绝对路径>/centos7/easyops/easyops-1.9.2.1.tar.gz /home/easyops/
chown easyops:docker /home/easyops/easyops-1.9.2.1.tar.gz

# 2.安装easyops
su  easyops
mkdir easyops
tar zxvf easyops-1.9.2.1.tar.gz -C easyops
cd /home/easyops/easyops/easyops-1.9.2.1
./start_services.sh

# 3.检查是否生效,查看容器是否都处于up
docker ps

# 4.EasyOps平台部署后,在管控节点执行以下指令,以更新中台组件playbook
cd /home/easyops/easyops/easyops-1.9.2.1/services-spec/tools
sudo python2 upgrade_services.py --bundle file://<包服务器绝对路径>/centos7/easyops/playbooks/bundle_easy-6.5.0.tar.gz
sudo python2 upgrade_services.py --bundle file://<包服务器绝对路径>/centos7/easyops/playbooks/bundle_sloth-6.5.0.tar.gz

在服务部署和模块启动正常后,登录EasyOps的Web界面。一般是http://xxx:8000,默认使用easyops/Easyops@1024账号密码登录系统。 3.5.1.png

3.6 License 激活

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

3.7 EasyOps n9e告警模块部署

3.7.1 服务连通性确认

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

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

3.7.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.7.3 删除redis 端口映射配置

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

3.7.4 配置邮箱服务

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

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

3.7.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.7.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.7.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集群。 5.1.1.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"]