StarRocks部署高可用 FE 集群

一、准备工作

1.1 部署规划

这里我打算部署存算一体模式,三节点。即三个FE节点,三个BE节点。假设三台IP分别为:10.10.10.50、10.10.10.51、10.10.10.52

我将采用三台centos7.9进行部署,单台配置为128C 256G 3T。

1.2 服务器检查项

关闭防火墙(或者只需能确保集群间机器相关端口的正常访问即可)

安装有JDK

进行机器设置和配置检查:

运行以下脚本,进行环境检查

bash 复制代码
#!/bin/bash

##说明:
##1、该脚本为StarRocks部署环境检测脚本,用来检测StarRocks运行的必要条件及重要系统参数。
##2、本脚本适用于红帽系系统,Ubuntu系及Debian系请根据检测项自行验证部署环境。
##3、当前不再检测系统中的Java环境,StarGo或Manager会使用自带的OpenJDK8为StarRocks配置程序级的运行环境。
##4、检测通过的项会显示为绿色的success,未通过的项会用红色字体给出提示及临时调整命令(服务器重启会失效)。
##5、在部署前请务必根据提示调整环境,以避免后续安装或使用过程中出现不必要的问题。

function cpu_check(){
    echo ""
    echo "############################ CPU检查 #############################"
    cat /proc/cpuinfo | grep avx2 2>&1 >/dev/null
    if [ $? -ne 0 ];then
        echo -e "\033[31mStarRocks BE需要CPU支持AVX2指令集才可启动,请更换至符合要求的x86架构服务器\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function linuxversion_check(){
    echo ""
    echo "########################## Linux版本检查 ##########################"
    num_tmp=$(cat /etc/redhat-release | tr -cd "[0-9]")
    linux_version=${num_tmp:0:1}
    if [ $linux_version -ne 7 ];then
        echo -e "\033[31m若无特殊原因,建议您更换使用CentOS7部署StarRocks,该系统当前测试最为充分\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function glibc_check(){
    echo ""
    echo "########################## Glibc版本检查 ##########################"
    glibc_version=$(ldd --version | head -n 1 | tail -c 3)
    if [ $glibc_version -lt 17 ];then
        echo -e "\033[31mStarRocks BE要求glibc版本最低为2.17才可启动,请升级glibc或使用更高内核版本的系统\033[0m"
    elif [ $glibc_version -ge 37 ];then
        echo -e "\033[31m检测到较高的glibc版本,StarRocks BE或将无法启动,请更换或降级系统为CentOS7\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function swap_check(){
    echo ""
    echo "############################ Swap检查 ############################"
    swap_number=$(cat /proc/sys/vm/swappiness)
    if [ $swap_number -ne 0 ];then
        echo -e "\033[31m检查项1:使用swap分区可能影响查询性能,建议配置为不优先使用,临时配置命令:echo 0 | sudo tee /proc/sys/vm/swappiness\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
    swap_file=$(free -m | grep -i swap | awk '{print $2}')
    if [ $swap_file -ne 0 ];then
        echo -e "\033[31m检查项2:检查到swap分区未禁用,推荐禁用,临时禁用命令:swapoff -a\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function kernel_check(){
    echo ""
    echo "########################### 内核参数检查 ##########################"
    om_number=$(cat /proc/sys/vm/overcommit_memory)
    if [ $om_number -ne 1 ];then
        echo -e "\033[31m检查项1:推荐调整overcommit_memory=1,以允许内核分配所有的物理内存来保障程序稳定性,临时调整命令:echo 1 | sudo tee /proc/sys/vm/overcommit_memory\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
    mmap_number=$(cat /proc/sys/vm/max_map_count)
    if [ "$mmap_number" -lt 200000 ]; then
        echo -e "\033[31m检查项2:推荐调整max_map_count=262144,来调大进程可拥有的内存映射区域的最大数量以保障程序稳定性,临时调整命令:echo 262144 | sudo tee /proc/sys/vm/max_map_count\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function ulimit_files_check(){
    echo ""
    echo "####################### 进程最大打开文件数检查 ######################"
    ulimit_fs=$(ulimit -n)
    if [ $ulimit_fs -lt 65535 ];then
        echo -e "\033[31m句柄数限制过小可能导致服务异常退出,完整调整命令:ulimit -n 655350 && echo -e '* soft nofile 655350\\\n* hard nofile 655350' >> /etc/security/limits.conf\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function ulimit_process_check(){
    echo ""
    echo "####################### 用户最大可用进程数检查 ######################"
    ulimit_ps=$(ulimit -u)
    if [ $ulimit_ps -lt 65535 ];then
        echo -e "\033[31m进程数限制过小可能导致服务异常退出,完整调整命令:ulimit -u 655350 && echo -e '* soft nproc 655350\\\n* hard nproc 655350' >> /etc/security/limits.conf && sed -i 's/4096/655350/' /etc/security/limits.d/20-nproc.conf\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function fe_port_check(){
    echo ""
    echo "########################### FE端口检查 ###########################"
    # default port 8030,9010,9020,9030
    ports=$(ss -antpl | grep -E '8030|9010|9020|9030' | wc -l)
    if [ $ports -gt 0 ];then
        echo -e "\033[31mFE需用的默认端口被占用,请检查或在部署时调整端口,检查命令:ss -antpl | grep -E '8030|9010|9020|9030'\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function be_port_check(){
    echo ""
    echo "########################### BE端口检查 ###########################"
    # default port 9060,9050,8040,8060
    ports=$(ss -antpl | grep -E '9060|9050|8040|8060|9070' | wc -l)
    if [ $ports -gt 0 ];then
        echo -e "\033[31mBE需用的默认端口被占用,请检查或在部署时调整端口,检查命令:ss -antpl | grep -E '9060|9050|8040|8060|9070'\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function broker_port_check(){
    echo ""
    echo "######################### Broker端口检查 #########################"
    # default port 8000
    ports=$(ss -antpl | grep '8000' | wc -l)
    if [ $ports -gt 0 ];then
        echo -e "\033[31mBroker需用的默认端口被占用,请检查或在部署时调整端口,检查命令:ss -antpl | grep '8000'\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function firewalld_check(){
    echo ""
    echo "########################### 防火墙检查 ###########################"
    systemctl status firewalld | grep "running"  2>&1 >/dev/null
    if [ $? -ne 0 ];then
        echo -e "\033[32msuccess\033[0m"
    else
        echo -e "\033[31m系统防火墙为启用状态,为保证集群内部通信,建议关闭内网防火墙或开放端口,临时关闭命令:systemctl stop firewalld && systemctl disable firewalld\033[0m"
    fi
}

function tcp_abort_on_overflow_check(){
    echo ""
    echo "########################## TCP参数检查 ###########################"
    tcp_aoo=$(cat /proc/sys/net/ipv4/tcp_abort_on_overflow)
    if [ $tcp_aoo -eq 1 ];then
        echo -e "\033[32msuccess\033[0m"
    else
        echo -e "\033[31m推荐调整tcp_abort_on_overflow参数值为1,临时调整命令:echo 1 | sudo tee /proc/sys/net/ipv4/tcp_abort_on_overflow\033[0m"
    fi
}

function somaxconn_check(){
    echo ""
    echo "######################### Somaxconn检查 #########################"
    somaxconn_value=$(cat /proc/sys/net/core/somaxconn)
    if [ $somaxconn_value -ge 1024 ];then
        echo -e "\033[32msuccess\033[0m"
    else
        echo -e "\033[31m推荐调整somaxconn参数值为1024,临时调整命令:echo 1024 | sudo tee /proc/sys/net/core/somaxconn\033[0m"
    fi
}

function selinux_check(){
    echo ""
    echo "########################## SELinux检查 ###########################"
    selinux_value=$(getenforce)
    if [ $selinux_value != "Enforcing" ];then
        echo -e "\033[32msuccess\033[0m"    
    else
        echo -e "\033[31m建议关闭SELinux,临时关闭命令:setenforce 0\033[0m"
    fi
}

function hugepage_check(){
    echo ""
    echo "########################## Hugepage检查 ##########################"    
    enabled_value=$(cat /sys/kernel/mm/transparent_hugepage/enabled | cut -d '[' -f2 | cut -d ']' -f1)
    if [ $enabled_value == "never" ];then
        echo -e "\033[32msuccess\033[0m"
    else
        echo -e "\033[31m检查项1:推荐禁用透明大页,临时禁用命令:echo never > /sys/kernel/mm/transparent_hugepage/enabled\033[0m" 
    fi
    defrag_value=$(cat /sys/kernel/mm/transparent_hugepage/defrag | cut -d '[' -f2 | cut -d ']' -f1)
    if [ $defrag_value == "never" ];then
        echo -e "\033[32msuccess\033[0m"
    else
        echo -e "\033[31m检查项2:推荐禁用碎片整理,临时禁用命令:echo never > /sys/kernel/mm/transparent_hugepage/defrag\033[0m" 
    fi
}

function ntp_check(){
    echo ""
    echo "########################## 时钟同步检查 ##########################"
    rpm -qa | grep ntp 2>&1 >/dev/null
    if [ $? -ne 0 ];then
        echo -e "\033[31m未检测到ntp命令,StarRocks各FE节点间的时钟差大于5秒将无法启动,建议在部署前使用ntp对各节点进行时钟同步\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function zone_check(){
    echo ""
    echo "############################ 时区检查 ############################"
    timedatectl | grep Asia/Shanghai 2>&1 >/dev/null
    if [ $? -ne 0 ];then
        echo -e "\033[31m检测到操作系统未使用Asia/Shanghai时区,不恰当的时区设置可能影响集群数据导入导出,调整命令:timedatectl set-timezone Asia/Shanghai && clock -w\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function disk_check(){
    echo ""
    echo "########################## 磁盘容量检查 ##########################"
    # disk space > 80%
    n=0
    for var in `df -h | grep '^/dev/*' | awk '{print $5}' | sed 's/\([0-9]*\).*/\1/'`
    do
        if [ $var -gt 80 ];then
            echo -e "\033[31m检测到存在磁盘剩余容量不足20%的情况,请确认磁盘空间充足后再进行集群部署,检查命令:df -h\033[0m"
            n+=1
            break
        fi
    done
    if [ $n -eq 0 ];then
        echo -e "\033[32msuccess\033[0m"
    fi
}

function mem_check(){
    echo ""
    echo "########################## 内存大小检查 ##########################"
    mem_total=$(awk '($1 == "MemTotal:"){print $2/1048576}' /proc/meminfo)
    mem_int=$(printf "%.f" $mem_total)
    if [ $mem_int -le 16 ];then
        echo -e "\033[31m服务器内存较小,为保证集群性能和稳定性,生产环境的建议内存为32G+\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function tool_check(){
    echo ""
    echo "######################### Netstat命令检查 ########################"
    rpm -qa | grep net-tools 2>&1 >/dev/null
    if [ $? -ne 0 ];then
        echo -e "\033[31m未检测到netstat命令,StarGo当前需依赖netstat检测通信,否则无法正常使用。安装命令:yum -y install net-tools\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function check(){
    cpu_check
    linuxversion_check
    glibc_check
    swap_check
    kernel_check
    ulimit_files_check
    ulimit_process_check
    fe_port_check
    be_port_check
    broker_port_check
    firewalld_check
    tcp_abort_on_overflow_check
    somaxconn_check
    selinux_check
    hugepage_check
    ntp_check
    zone_check
    disk_check
    mem_check
    tool_check
}

check

二、安装Starrocks

软件包下载:

https://www.starrocks.io/download/community

我这里下载的是最新稳定版本:

然后参考该官方文档进行部署即可:

https://docs.starrocks.io/zh/docs/3.2/deployment/deploy_manually/

这里需要重点补充的信息如下:

1、fe配置

每个服务器中,都要增加该项:

bash 复制代码
# store metadata, create it if it is not exist.
# Default value is ${STARROCKS_HOME}/meta
meta_dir = /opt/StarRocks-3.1.13/fe/meta  # 自己创建的元数据目录
priority_networks = 10.10.10.50 # 本机IP

2、be配置

bash 复制代码
# Default value is ${STARROCKS_HOME}/storage, you should create it by hand.
storage_root_path = /opt/StarRocks-3.1.13/be/bestorage # 自己创建的数据存储目录
priority_networks = 10.10.10.50 # 本机IP

3、第一次启动FE的follower节点的时候,要增加--helper

bash 复制代码
./fe/bin/start_fe.sh --helper 10.10.10.50:9010 --daemon	# foller后面的ip是fe leader的ip

用到的详细命令汇总:

bash 复制代码
# 1 在三台创建所需目录
mkdir -p /opt/StarRocks-3.1.13/fe/meta
mkdir -p /opt/StarRocks-3.1.13/be/bestorage

# 2 修改三台的配置文件
# 修改 fe/conf/fe.conf
meta_dir = /opt/StarRocks-3.1.13/fe/meta  # 自己创建的元数据目录
priority_networks = 10.10.10.50 # 本机IP
# 修改 be/conf/be.conf
storage_root_path = /opt/StarRocks-3.1.13/be/bestorage # 自己创建的数据存储目录
priority_networks = 10.10.10.50 # 本机IP

# 3 启动fe节点
./fe/bin/start_fe.sh --daemon # leader节点执行
./fe/bin/start_fe.sh --helper 10.10.10.50:9010 --daemon	# follower1节点执行
./fe/bin/start_fe.sh --helper 10.10.10.50:9010 --daemon # follower2节点执行
# 验证fe启动成功
cat fe/log/fe.log | grep thrift

# 4 启动be节点
./be/bin/start_be.sh --daemon # 3节点执行
# 验证be启动成功
cat be/log/be.INFO | grep heartbeat


# 5 登录第四台服务器,具有mysql,且可以访问leader
mysql -h 10.10.10.50 -P9030 -uroot # 用于
# 在mysql中执行以下语句:
# 增加fe follower节点
ALTER SYSTEM ADD FOLLOWER "10.10.10.51:9010";
ALTER SYSTEM ADD FOLLOWER "10.10.10.52:9010";
# 查看增加的结果:
SHOW PROC '/frontends'\G
# 增加be节点
ALTER SYSTEM ADD BACKEND "10.10.10.50:9050", "10.10.10.51:9050", "10.10.10.52:9050";
# 查看增加的结果:
SHOW PROC '/backends'\G

参考文档:

https://docs.starrocks.io/zh/docs/deployment/deploy_manually/

相关推荐
ZNineSun1 天前
新一代MPP数据库:StarRocks
starrocks·olap·数据湖·mpp·oltp
沐风_ZTL5 天前
在RK3568上C++编程,使用ISP进行图像处理
c++·图像处理·mpp·rk3568·isp·v4l2·rga
StarRocks_labs9 天前
腾讯大数据基于 StarRocks 的向量检索探索
starrocks·人工智能·搜索引擎·开源
漫步者TZ18 天前
Starrocks 对比 Clickhouse
数据库·starrocks·clickhouse
小Tomkk19 天前
Docker 部署 Starrocks 教程
运维·starrocks·docker·容器
书忆江南1 个月前
StarRocks BE源码编译、CLion高亮跳转方法
starrocks·源码·编译·be
鸿乃江边鸟1 个月前
StarRocks 怎么让特定的SQL路由到FE master节点的
大数据·starrocks·sql
大鳥1 个月前
深入了解 StarRocks 表类型:解锁高效数据分析的密码
数据库·starrocks·sql
京河小蚁2 个月前
StarRocks 生产部署一套集群,存储空间如何规划?
starrocks