目录
(1).为什么不使用CDH/ambari/云服务
(2).重点概述
1.版本选择
2.组件拓扑与节点配置
(3).制作aws模版机与镜像
1.制作模版机
1.1.开EC2
1.2.挂载应用/数据盘
1.3.安装必要软件
1.3.1.确认操作系统版本
1.3.2安装必备库
1.3.3.安装 memkind 库
1.3.4.安装额外软件包
1.3.5.其他基础准备
1.3.5.1.创建基础目录
1.3.5.2.安装基础软件
1.3.5.3.部署docker/node-exporter
1.3.5.4.修改时区
1.3.5.5.确认磁盘挂载点重启生效
1.3.5.6.部署supervisor
1.3.5.7.安装cmake
1.3.6.源码构建kudu
1.3.7.配置supervisor的kudu启动配置文件
1.3.8.做镜像前测试模版机kudu
1.3.9.做集群内ssh免密
1.3.10.做AMI镜像前清空所有数据
1.3.11.将模版机制作为AMI镜像
1.3.12.从AMI镜像启动其余2台节点
1.3.13.配置与启动kudu的3节点集群
(4).问题与注意事项
1.kudu-master的3个节点必须在短时间内同时启动
(1).为什么不使用CDH/ambari/云服务
ambari已经被CDH所在公司收购,两者现在都已经闭源,生产使用需要付费,费用极其昂贵。
至于为什么不使用云服务,也是费用问题,因为是hadoop-flink集群用于实时计算,云服务的实时计算资源是非常昂贵的。
(2).重点概述
1.版本选择
kudu版本:1.15.0
jdk:1.8,kudu官方明确说明要使用1.8版本。
linux:kudu官方建议centos8。我们要选择aws的centos8 ami,这样的话不用自己做时钟同步。
2.组件拓扑与节点配置
3台c5a.2xlarge(8c16g)的机器,每个机器部署一个kube-master,kube-tserver,为了省钱,反正也是用于离线,可以接受。
(3).制作aws模版机与镜像
1.制作模版机
1.1.开EC2
选择aws制作的centos8镜像:这样不用自己配置时钟同步。
上图:
子网选择私有子网;禁用自动分配ip/使用弹性ip。
安全组内网全开。
存储盘:
系统盘"/"挂载点:20G
应用盘"/app"挂载点:1024G
1.2.挂载应用/数据盘
磁盘挂在参考文章:
aws生产实践-4:EC2挂载磁盘
https://mp.weixin.qq.com/s/joMicOYjPjpLjoQNheMlrA
1.3.源码方式安装kudu
1.3.1.确认操作系统版本
确认操作系统版本是:CentOS Linux release 8.2.2004 (Core)
cat /etc/redhat-release
顺带永久修改hostname:
sudo hostnamectl set-hostname --static kudu-cluster-node-1
1.3.2安装必备库
yum update -y
sudo yum install -y autoconf automake cyrus-sasl-devel cyrus-sasl-gssapi \
cyrus-sasl-plain flex gcc gcc-c++ gdb git java-1.8.0-openjdk-devel \
krb5-server krb5-workstation libtool make openssl-devel patch \
pkgconfig redhat-lsb-core rsync unzip vim-common
1.3.3.安装 memkind 库
需要支持 Kudu 的 NVM(非易失性内存)块缓存,请安装 memkind 库
sudo yum install -y memkind
如果Linux 发行版提供的 memkind 包太旧(需要 1.8.0 或更高版本),从源代码构建和安装(我的是1.10所以不需要源码安装):
$ sudo yum install numactl-libs numactl-devel
$ git clone https://github.com/memkind/memkind.git
$ cd memkind
$ ./build.sh --prefix=/usr
$ sudo yum remove memkind
$ sudo make install
$ sudo ldconfig
验证memkind是否安装成功:
查看memkind版本:
1.3.4.安装额外软件包
如果计划构建文档,请安装一些额外的软件包,包括 ruby。
$ sudo yum install -y gem graphviz zlib-devel
centos8无法安装ruby-devel。
安装ruby-devel:
sudo dnf install ruby
ruby --version
1.3.5.其他基础准备
1.3.5.1.创建基础目录
mkdir -p /app/3rd
mkdir -p /app/logs
mkdir -p /app/data
mkdir -p /app/download
mkdir -p /app/docker
mkdir -p /app/data/kudu-master/data
mkdir -p /app/data/kudu-master/metadata
mkdir -p /app/data/kudu-master/wal
mkdir -p /app/logs/kudu-master
mkdir -p /app/logs/kudu-master/supervisor
mkdir -p /app/data/kudu-tserver/data
mkdir -p /app/data/kudu-tserver/metadata
mkdir -p /app/data/kudu-tserver/wal
mkdir -p /app/logs/kudu-tserver
mkdir -p /app/logs/kudu-tserver/supervisor
1.3.5.2.安装基础软件
需要安装python(CentOS 8默认未安装Python):
sudo dnf install python3 -y
而且要做软链,否则后边编译的时候找不到python命令:
ln -s /usr/bin/python3.6 /usr/bin/python
yum install -y telnet nc lrzsz lsof wget
1.3.5.3.部署docker/node-exporter
yum install -y yum-utils
添加yum源
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
Enable the nightly or test repositories
sudo yum-config-manager --enable docker-ce-nightly
sudo yum-config-manager --enable docker-ce-test
一定要修改docker的默认存储目录!否则系统盘会炸。
mkdir /etc/docker vi /etc/docker/daemon.json { "data-root": "/app/docker" }
yum install docker-ce docker-ce-cli -y
启动docker
systemctl start docker
docker pull quay.io/prometheus/node-exporter:v1.2.2 docker run -d --restart=always -p 9100:9100 quay.io/prometheus/node-exporter:v1.2.2
1.3.5.4.修改时区
时区修改为北京时区(东8区): ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
1.3.5.5.确认磁盘挂载点重启生效
vi /etc/fstab /dev/nvme1n1 /app xfs defaults 1 1
1.3.5.6.部署supervisor
首先安装EPEL源
yum install epel-release -y
安装supervisor
yum install supervisor -y
systemctl start supervisord
1.3.5.7.安装cmake
centos8上安装cmake方式:
https://github.com/Kitware/CMake/releases
选择最新稳定版:v3.21.3
cd /app/3rd
wget https://github.com/Kitware/CMake/releases/download/v3.21.3/cmake-3.21.3-linux-x86_64.tar.gz
tar -xzvf cmake-3.21.3-linux-x86_64.tar.gz
ln -s /app/3rd/cmake-3.21.3-linux-x86_64/bin/cmake /usr/local/bin/cmake
mv cmake-3.21.3-linux-x86_64.tar.gz /app/download/
1.3.6.源码构建kudu
下载kudu1.15.0-release版本:
https://github.com/apache/kudu/releases
cd /app/3rd
wget https://github.com/apache/kudu/archive/refs/tags/1.15.0.tar.gz
tar -xzvf 1.15.0.tar.gz
mv 1.15.0.tar.gz /app/download/
cd kudu-1.15.0
注意:记住这个目录“/app/3rd/kudu-1.15.0/www”,存放后台web的静态文件,master和tserver的启动命令要指向这个目录。
Build any missing third-party requirements using the build-if-necessary.sh script. Not using the devtoolset will result in Host compiler appears to require libatomic, but cannot find it.
(安装系统确实的必要软件):要安装的东西比较多,要等很久,1个小时?
build-support/enable_devtoolset.sh thirdparty/build-if-necessary.sh
然后顺次执行:
mkdir -p build/release
cd build/release
../../build-support/enable_devtoolset.sh \
../../thirdparty/installed/common/bin/cmake \
-DCMAKE_BUILD_TYPE=release ../..
make -j4
时间会很长,耐性等待。
显示下述内容时完成编译。
sudo make DESTDIR=/opt/kudu install
1.3.7.配置supervisor的kudu启动配置文件
使用kudu用户启动kudu。
useradd kudu
将kudu所有目录修改为kudu用户持有:
chown -R kudu:kudu /app
chown -R kudu:kudu /opt/kudu
先准备好启动命令:
参考官网:https://kudu.apache.org/docs/configuration.html
master启动命令模版:
/opt/kudu/usr/local/sbin/kudu-master --master_addresses=master1-ip,master2-ip,master3-ip --fs_data_dirs=/app/data/kudu-master/data --fs_metadata_dir=/app/data/kudu-master/metadata --fs_wal_dir=/app/data/kudu-master/wal --log_dir=/app/logs/kudu-master
tserver启动命令:
/opt/kudu/usr/local/sbin/kudu-tserver --fs_data_dirs=/app/data/kudu-tserver/data --fs_metadata_dir=/app/data/kudu-tserver/metadata --fs_wal_dir=/app/data/kudu-tserver/wal --log_dir=/app/logs/kudu-tserver --tserver_master_addrs=0.0.0.0:7051
配置/etc/supervisord.d:
kudu-master.ini内容:
[program:kudu-master]
process_name=%(program_name)s
command=/opt/kudu/usr/local/sbin/kudu-master --master_addresses=master1-ip,master2-ip,master3-ip --fs_data_dirs=/app/data/kudu-master/data --fs_metadata_dir=/app/data/kudu-master/metadata --fs_wal_dir=/app/data/kudu-master/wal --log_dir=/app/logs/kudu-master --webserver_doc_root=/app/3rd/kudu/www
directory=/opt/kudu/usr/local/sbin ; 命令执行的目录
;environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=kudu ; 进程执行的用户身份
stopsignal=INT
autostart=false
autorestart=true ; 程序意外退出是否自动重启
startsecs=3 ;/自动重启间隔
stderr_logfile=/app/logs/kudu-master/supervisor/kudu-master-supervisor.err.log ; 错误日志文件
stdout_logfile=/app/logs/kudu-master/supervisor/kudu-master-supervisor.out.log ; 输出日志文件
kudu-tserver.ini内容:
[program:kudu-tserver]
process_name=%(program_name)s
command=/opt/kudu/usr/local/sbin/kudu-tserver --fs_data_dirs=/app/data/kudu-tserver/data --fs_metadata_dir=/app/data/kudu-tserver/metadata --fs_wal_dir=/app/data/kudu-tserver/wal --log_dir=/app/logs/kudu-tserver --tserver_master_addrs=master1-ip,master2-ip,master3-ip --webserver_doc_root=/app/3rd/kudu/www
directory=/opt/kudu/usr/local/sbin ; 命令执行的目录
;environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=kudu; 进程执行的用户身份
stopsignal=INT
autostart=false
autorestart=true ; 程序意外退出是否自动重启
startsecs=3 ;/自动重启间隔
stderr_logfile=/app/logs/kudu-master/supervisor/kudu-tserver-supervisor.err.log ; 错误日志文件
stdout_logfile=/app/logs/kudu-master/supervisor/kudu-tserver-supervisor.out.log ; 输出日志文件
1.3.8.做镜像前测试模版机kudu
需要在这台模版机上起一个单节点的kudu集群(一个master,一个tserver),来进行简单的check。
进入supervisorctl启动即可,日志验证。
master会提供8051开放后台web:
tserver会开放8050端口提供metrics:
http://10.0.40.184:8050/metrics
tserver通过8050端口也有一个相同的后台:
OK,说明work。
1.3.9.做集群内ssh免密
su kudu
ssh-keygen
cd ~/.ssh
> authorized_keys
cat id_rsa.pub > authorized_keys
chmod 600 authorized_keys
1.3.10.做AMI镜像前清空所有数据
先杀掉所有kudu进程(root用户下执行):supervisorctl stop all
rm -rf /app/data/kudu-master/data/*
rm -rf /app/data/kudu-master/metadata/*
rm -rf /app/data/kudu-master/wal/*
rm -rf /app/logs/kudu-master/*
rm -rf /app/logs/kudu-master/supervisor/*
rm -rf /app/data/kudu-tserver/data/*
rm -rf /app/data/kudu-tserver/metadata/*
rm -rf /app/data/kudu-tserver/wal/*
rm -rf /app/logs/kudu-tserver/*
rm -rf /app/logs/kudu-tserver/supervisor/*
1.3.11.将模版机制作为AMI镜像
因为kudu安装后自身就占用117G空间,所以制作这个ami镜像很费时间。
点击创建ami即可。
1.3.12.从AMI镜像启动其余2台节点
1.3.13.配置与启动kudu的3节点集群
依次修改3个kudu节点的hostname:
sudo hostnamectl set-hostname --static kudu-cluster-node-1
sudo hostnamectl set-hostname --static kudu-cluster-node-2
sudo hostnamectl set-hostname --static kudu-cluster-node-3
修改sudo vi /etc/supervisord.d/kudu-master.ini
command=/opt/kudu/usr/local/sbin/kudu-master --master_addresses=master1-ip,master2-ip,master3-ip --fs_data_dirs=/app/data/kudu-master/data --fs_metadata_dir=/app/data/kudu-master/metadata --fs_wal_dir=/app/data/kudu-master/wal --log_dir=/app/logs/kudu-master --webserver_doc_root=/app/3rd/kudu/www
将master1-ip,master2-ip,master3-ip改为ip。
每个节点在root下启动supervisord:systemctl start supervisord
先启动3个kube-master:supervisorctl start kube-master
要在短时间内执行完命令,否则可能会启动失败,因为master集群选举有个超时时间,超过这个时间依然没有足够节点数就宕了。
日志验证kudu-master:
master会提供8051开放后台web:
然后依次启动tserver:
supervisorctl start kudu-tserver
日志验证:
tserver会开放8050端口提供metrics:
http://10.0.40.184:8050/metrics
tserver通过8050端口也有一个相同的后台:
OK,说明work。
然后需要在配置一个内网的反向代理,方便办公网络和vpn内使用。
(4).问题与注意事项
1.kudu-master的3个节点必须在短时间内同时启动
如果只启动一个kube-master节点,会报错后stop;可以理解,配置的是3个master,最多只能坏一个master节点,否则集群肯定也就宕了。