DorisDB小规模集群部署最佳实践(1/2)

在部署各种集群,尤其是规模化部署时,采用ansible方式进行批量配置安装,可极大减少安装工作量。下面介绍部署3台小规模DorisDB标准版集群,使用ansible进行安装前配置的详细过程。

0.ENV

0.1 基本配置
1) 硬件情况
服务器硬件:
  CPU:8C
  内存:32G
  硬盘:500G

2) 主机3台
主机名如下:
  doris1
  doris2
  doris3

3) 软件清单
  CentOS:7.8.2003
  doris-SE-1.14.5.tar.gz
  jdk-8u281-linux-x64.tar.gz
  mysql-5.7.33-el7-x86_64.tar.gz

0.2 组件清单-角色划分
  hosts  ROLE
  doris1  FE Leader/BE
  doris2  FE OBSERVER/BE
  doris3  Broker/BE

doris1上部署FE FOLLOWER使其成为Leader,同时部署BE;
doris2上部署FE令其作为OBSERVERr,同时部署BE;
doris3部署一个Broker方便后面学习数据导入,同时部署BE。

有关DorisDB架构详细介绍,详见上篇文章DorisDB简介章节"3. 架构介绍"。

0.3 使用场景
doris可以满足企业级用户的多种分析需求,包括OLAP多维分析,定制报表,实时数据分析,Ad-hoc数据分析等。
具体的业务场景包括:
  数据仓库建设
  OLAP/BI分析
  用户行为分析
  广告数据分析
  系统监控分析
  探针分析 APM(Application Performance Management)

1. 主机名配置

1.1 主机名设置doris[1-3]
hostnamectl set-hostname doris1

1.2 每台主机doris[1-3]增加hosts解析

echo "192.168.3.1 doris1" >> /etc/hosts
echo "192.168.3.2 doris2" >> /etc/hosts
echo "192.168.3.3 doris3" >> /etc/hosts

2. ansbile管理主机到其它节点等效性配置
2.1 每台主机doris[1-3]生成密钥

ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

2.2 拷贝doris[2-3]密钥到ansbile管理主机doris1
ssh-copy-id -i ~/.ssh/id_rsa.pub doris1

2.3 从管理主机doris1传输到其他主机doris[2-3]

scp ~/.ssh/authorized_keys doris2:~/.ssh/
scp ~/.ssh/authorized_keys doris3:~/.ssh/

2.4 验证
生成验证脚本conn_hostname.sh

cat >> /usr/local/bin/conn_hostname.sh << EOF
ssh doris1 hostname
ssh doris2 hostname
ssh doris3 hostname
EOF

生成验证脚本conn_date.sh

cat >> /usr/local/bin/conn_date.sh << EOF
ssh doris1 date
ssh doris2 date
ssh doris3 date
EOF

赋予执行权限
chmod 755 /usr/local/bin/conn_*.sh

验证,确保等效性OK

conn_hostname.sh
conn_date.sh

3. 安装ansible

我们知道现在自动化工具中,最简单、易于上手,而且最流行的当属Ansible莫属了。

3.1 确认python已经安装

[root@doris1 ~]# python -V
Python 2.7.5

3.2 在ansible管理主机安装

yum -y install epel-release
yum -y install ansible

3.3 修改主机组配置文件
ansible默认配置文件/etc/ansible/ansible.cfg;
修改主机组默认配置文件/etc/ansible/hosts

vim /etc/ansible/hosts
...
[all]
doris[1:3]

[others]
doris[2:3]

3.4 验证ansible-OK
1) 在所有主机上执行ping命令
ansible all -m ping

2) 复制本机hosts文件到主机
复制文件到其它主机,目标文件默认权限为0644
ansible others -m copy -a "src=/etc/hosts dest=/etc/"

复制文件到其它主机,目标文件权限为0755,属主属组均为root,也可单独指定执行权限mode=u+x

ansible others -m copy -a "src=/usr/local/bin/conn_date.sh dest=/usr/local/bin/ mode=0755 owner=root group=root"
ansible others -m copy -a "src=/usr/local/bin/conn_hostname.sh dest=/usr/local/bin/ mode=0755 owner=root group=root"

3) 在所有主机上安装软件
ansible all -m shell -a "yum -y install wget"

4. 关闭Swap分区

内存页(page)swap到磁盘会影响doris的性能,需要关闭。
4.1 临时关闭

ansible all -a "free -h"
ansible all -a "swapoff -a"
ansible all -a "free -h"

4.2 永久关闭
1) 注释掉/etc/fstab中的swap信息
注释结果

...
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

注释所有主机

sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/g' /etc/fstab
ansible all -a "sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/g' /etc/fstab"

查看注释结果
ansible all -a "grep swap /etc/fstab"

2) 调整swappiness参数
ansible all -a "echo vm.swappiness=0 >> /etc/sysctl.conf"

3) 重启生效
当前已临时关闭,不需要要重启
ansible all -a "reboot"

4)验证(Swap行均为0)
ansible all -a "free -h"

5. 关闭操作系统selinux
查看selinux状态[doris1]
ansible all -a "getenforce"

临时关闭[doris1]
ansible all -a “setenforce 0”

永久关闭状态-需重启,临时关闭后不需要重启[doris1]
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config

同步到其他机器[doris1]
ansible others -m copy -a "src=/etc/selinux/config dest=/etc/selinux/config"

6. 关闭操作系统防火墙[doris1]
安装期间避免端口不能访问而导致的异常,可以关闭防火墙,详见6.1,也可以打开doris对应防火墙端口,详见6.2。
6.1 关闭防火墙操作
firewall[CentOS7/8]

ansible all -a "systemctl status firewalld"
ansible all -a "systemctl stop firewalld"
ansible all -a "systemctl disable firewalld"

iptables[CentOS5/6]

ansible all -a "chkconfig iptables off"
ansible all -a "service iptables status"
ansible all -a "service iptables stop"

6.2 开放防火墙端口
1) doris标准版端口
8000、8030、8040、8060、9010、9020、9030、9050、9060

2) 逐个开放端口

ansible all -a "firewall-cmd --zone=public --add-port=8000/tcp --permanent"
ansible all -a "firewall-cmd --zone=public --add-port=8030/tcp --permanent"
ansible all -a "firewall-cmd --zone=public --add-port=8040/tcp --permanent"
ansible all -a "firewall-cmd --zone=public --add-port=8060/tcp --permanent"
ansible all -a "firewall-cmd --zone=public --add-port=9010/tcp --permanent"
ansible all -a "firewall-cmd --zone=public --add-port=9020/tcp --permanent"
ansible all -a "firewall-cmd --zone=public --add-port=9030/tcp --permanent"
ansible all -a "firewall-cmd --zone=public --add-port=9050/tcp --permanent"
ansible all -a "firewall-cmd --zone=public --add-port=9060/tcp --permanent"

关闭端口参考
firewall-cmd --zone=public --remove-port=8000/tcp --permanent

3) 配置立即生效
ansible all -a "firewall-cmd --reload"

4) 查看所有开放端口
ansible all -a "firewall-cmd --zone=public --list-ports"

7. 主机时间同步[doris1]
在Doris中,FE所在服务器的时钟最多允许5秒时钟偏差,需要进行时间同步:
1) 安装ntp
ansible all -a "yum -y install ntp"

2) 校准时间
ansible all -a "ntpdate cn.pool.ntp.org"

3) 使用crontab定时计划任务

crontab -e
00 12 * * * /sbin/ntpdate cn.pool.ntp.org

[表示每隔12个小时同步一次。 规则:分、时、日、月、星期]

4) 传输到其它节点
传输前查看权限

[root@doris1 ~]# ll /var/spool/cron/root 
-rw------- 1 root root 42 Apr 14 16:31 /var/spool/cron/root

传输到其它节点
ansible others -m copy -a "src=/var/spool/cron/root dest=/var/spool/cron/root mode=0600"

查看权限
ansible all -a "ls -lrt /var/spool/cron/root"

查看内容
ansible all -a "crontab -l"

5) 重启crontab计划任务
ansible all -a "systemctl reload crond"

6) 查看各节点时间
ansible all -a "date"

8. 设置文件描述符限制[doris1]

文件描述符限制过小会导致Doris BE启动报错,永久设置操作如下:
1) 修改limits.conf
修改

echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf

查看
cat /etc/security/limits.conf

2) 传输到其它节点

[root@doris1 ~]# ll /etc/security/limits.conf
-rw-r--r--. 1 root root 2462 Apr 14 17:00 /etc/security/limits.conf

传输到其它节点
ansible others -m copy -a "src=/etc/security/limits.conf dest=/etc/security/limits.conf"

查看所有节点内容
ansible all -a "tail -2 /etc/security/limits.conf"

3) 查看更改生效-需要重新登录会话
ansible all -m shell -a "ulimit -n"

9. 配置GCC环境[doris1]

Doris要求GCC 4.8.2+
1) 各主机安装gcc
ansible all -a "yum -y install gcc"

2) 查看安装后版本

ansible all -a "gcc --version"
...
doris1 | CHANGED | rc=0 >>
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)			#当前4.8.5,gcc4.8.2以上均可
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
...

10. 安装配置JDK8[doris1]

10.1 安装包准备
jdk8官网下载链接如下:
https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html
下载版本:jdk-8u281-linux-x64.tar.gz

10.2 检查并移除自带jdk
查看CentOS是否自带openjdk环境:
ansible all -a "yum list installed |grep java"

若有自带安装的JDK,卸载命令:

ansible all -a "yum -y remove java-1.7.0-openjdk*"
ansible all -a "yum -y remove java-1.8.0-openjdk*"

10.3 安装[doris1-3]
1) 创建安装目录[doris1]
ansible all -a "mkdir /usr/java"

2) 解压jdk安装包[doris1]
为避免使用ansible操作文件权限问题,建议在将压缩包上传到每台主机上解压。
ansible all -a "tar -zxvf /soft/jdk-8u281-linux-x64.tar.gz -C /usr/java/"

3) 配置环境变量[doris1]
配置doris1主机/etc/profile

cat >> /etc/profile << RUNDBA
##### jdk enviroument #####
export JAVA_HOME=/usr/java/jdk1.8.0_281
export PATH=\$JAVA_HOME/bin:\$PATH
export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
##############################
RUNDBA

传输到其它节点
ansible others -m copy -a "src=/etc/profile dest=/etc/profile"

4) 查看java版本
当前java版本均为1.8.0_281
ansible all -a "/usr/java/jdk1.8.0_281/bin/java -version"

11. mysql安装

DorisDB推荐使用mysql-client来连接,接下来,我们在doris01上安装稳定版的mysql 5.7。
11.1 mysql下载
MySQL5.7 General Availability(GA) Release通用发行版下载地址:
https://dev.mysql.com/downloads/mysql/5.7.html
系统选择Red Hat Enterprise Linux/Oracle Linux;
OS版本选择:Red Hat Enterprise Linux 7/Oracle Linux 7(x86,64bit)
然后选择Compressed TAR Archive进行下载。
下载后介质:mysql-5.7.33-el7-x86_64.tar.gz

11.2 mysql安装[doris1]
mysql安装到doris1主机上
1) 卸载mariadb
当前是否已安装mariadb
rpm -qa|grep mariadb

卸载mariadb,确保相关的mariadb包均已卸载[doris1]
ansible all -a "rpm -e --nodeps mariadb-libs-5.5.65-1.el7.x86_64"

2) 上传
上传至/soft
并安装mysql

3) 解压部署包

cd /soft
tar -zxvf mysql-5.7.33-el7-x86_64.tar.gz

4) 重命名为mysql,并移动至/usr/local/
mv mysql-5.7.33-el7-x86_64 /usr/local/mysql

5) 创建mysql用户
检查mysql组和用户是否存在,如果没有则创建:
cat /etc/group|grep mysql

创建:

groupadd mysql
useradd -r -g mysql mysql

useradd -r参数表示mysql用户是系统用户,不可用于登录系统。

6) 在mysql文件夹中创建data目录

cd /usr/local/mysql
mkdir data

7) 将/usr/local/mysql的所有者及所属组改为mysql
chown -R mysql.mysql /usr/local/mysql

8) 在/usr/local/mysql/support-files目录下创建my_default.cnf

cd /usr/local/mysql/support-files
vim my_default.cnf		#粘贴如下配置并保存
[mysqld]

#设置mysql的安装目录
basedir = /usr/local/mysql
#设置mysql数据库的数据存放目录
datadir = /usr/local/mysql/data
socket = /usr/local/mysql/mysql.sock
#设置字符集
character-set-server = utf8
#日志存放目录
log-error = /usr/local/mysql/data/mysqld.log
pid-file = /usr/local/mysql/data/mysqld.pid
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

9) 将配置文件拷贝至etc目录
cp my_default.cnf /etc/my.cnf

10) 环境变量配置
打开etc目录profile文件:

cat >> /etc/profile << EOF
##### mysql conf #####
export MYSQL_HOME=/usr/local/mysql
export PATH=\$PATH:\$MYSQL_HOME/bin
#########################
EOF

使环境变量生效
source /etc/profile

11) 初始化mysql

cd /usr/local/mysql
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/

12) 在初始化日志中查看密码

[root@dorisdb1 mysql]# grep password /usr/local/mysql/data/mysqld.log
2021-04-15T05:44:35.824661Z 1 [Note] A temporary password is generated for root@localhost: 6)pKw_DiPP24

13) mysqld服务添加
把启动脚本放到开机初始化目录
cp support-files/mysql.server /etc/init.d/mysqld

赋予可执行权限
chmod +x /etc/init.d/mysqld

添加为服务
chkconfig --add mysqld

启动服务
systemctl start mysqld

查看运行状态
systemctl status mysqld

14) 进入mysql并更改密码
mysql -uroot -p

先按回车,待提示输入密码时再输入密码,不要在-p后面直接加密码,因为随机生成的密码可能包含左括号,而Linux对左括号敏感,直接输入可能会报错。

修改密码为自己的密码,比如root:
set password=password('demo_415');

15) 给用户授权

grant all privileges on *.* to root@'%' identified by 'demo_415';
flush privileges;

16) 重启mysql服务
systemctl restart mysqld

mysql -uroot -p #demo_415

12. 小结

至此,使用ansible进行doris部署前期准备工作完成,dorisDB集群安装详见下篇《DorisDB小规模集群部署最佳实践(2/2)》。

文档首发于: