一、前言
- 从所周知,负载均衡是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验;本篇文章讲解如何利用Nginx通过在多个 FE 节点之上部署负载均衡层以实现 StarRocks 的高可用。
一、部署架构
- Nginx作为流量统一访问入口,后端绑定多个FE节点,既可以实现负载均衡,又能实现故障自动切换。
以下示例4台机器(四台 FE,四台 BE,其中FE和BE混部,一个 Observer FE 提供元数据备份),通过二进制安装包跨节点部署 StarRocks。
架构分析:
①用户访问请求Nginx负载均衡服务器
②Nginx负载均衡服务器再分发请求转发到后端 FE_Server 服务器
二、安装Nginx
1、Ng分为源码编译安装,还有yum安装方式(两种安装方式都可以)这里可以自行选择,下面简单介绍两种安装方式如何操作
a、源码安装
# 安装扩展工具包yum源
yum -y install epel-release
# 下载nginx源码包
wget http://nginx.org/download/nginx-1.22.1.tar.gz -P /app
# 安装编译工具及依赖库
yum -y install gcc pcre-devel zlib-devel openssl-devel libxml2-devel \
libxslt-devel gd-devel GeoIP-devel jemalloc-devel libatomic_ops-devel \
perl-devel perl-ExtUtils-Embed
# 解压
tar -zxvf nginx-1.22.1.tar.gz
# 编译安装
cd /app/nginx-1.22.1/
./configure --prefix=/app/nginx --with-stream --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module
make && make install
编译完成后会在 --prefix= 指定的路径生产nginx编译好的文件,我这里是:/app/nginx,里面包含了nginx的配置文件,还有nginx编译好的二进制包:/app/nginx/sbin/nginx
b、Yum源安装
- 如果觉得源码编译太麻烦,这里也可以选择用yum安装方式,安装方式比较简单,日常生产环境使用nginx,编译模块按照nginx官方yum安装的模块,基本能满足95%以上的生产需求。
# 添加nginx包镜像地址:
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 查看包信息:
yum info nginx
# 安装包:
yum install nginx
Yum安装完nginx配置文件的地址为:/etc/nginx/ ,子配置文件在 /etc/nginx/conf.d/,主配置文件就是/etc/nginx/nginx.conf
c、查看是否安装成功
1、yum安装已经配置好了环境变量,直接可以使用nginx命令查看
# 查看版本号
nginx -v
# 查看版本和配置选项
nginx -V
- 查看是否包含有 --with-stream 模块,有这个模块才可以
2、源码编译安装的需要去前面说的 prefix 指定的路径去看,我这里是 /app/nginx ;由于是源码编译,没有配置环境变量,需要写绝对路径
# 查看版本号
/app/nginx/sbin/nginx -v
# 查看版本和配置选项
/app/nginx/sbin/nginx -V
这里源码编译的模块就很少,因为主要是用到 --with-stream 这个模块来做,其它模块也用不到;
三、配置反向代理
这里已源码编译的为例子,yum安装的方式只是nginx.conf 文件不同而已,上面有介绍
cat /app/nginx/conf/nginx.conf
user nginx;
#worker_processes auto;
worker_processes 8;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /app/nginx/modules/*.conf;
events
{
worker_connections 1024;
}
stream
{
log_format proxy '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
# 代理access_log访问日志,可自行修改
access_log /var/log/nginx/stream.log proxy;
upstream starrocks-tcp1
{
# 轮询(默认);
server 192.168.100.120:9030 weight=1 max_fails=2 fail_timeout=60s; #Follower
server 192.168.100.121:9030 weight=1 max_fails=2 fail_timeout=60s; #Follower
server 192.168.100.122:9030 weight=1 max_fails=2 fail_timeout=60s; #Follower
server 192.168.100.123:9030 weight=2 max_fails=2 fail_timeout=60s; #Observer
}
server
{
# proxy 代理的nginx监听端口,可自行修改
listen 9030;
proxy_pass starrocks-tcp1;
proxy_timeout 60s;
proxy_connect_timeout 30s;
}
}
http
{
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
weight 代表权重默认为 1,权重越高被分配的客户端越多。指定轮询几率,由于 starrocks fe分为 Followe 和 Observer。Followe为复制协议的可投票成员,参与选主和提交日志;Observer属于非投票成员,用于异步订阅复制日志,Observer 的状态落后于 Follower;和zookeeper类似,Observer 只是参与客户端连接。我们就可以加大 weight 权重,来减轻 Follower 节点的压力。
四、启动Nginx
1、源码方式启动
# 检查配置文件是否正常
/app/nginx/sbin/nginx -t
# 指定配置文件并启动
/app/nginx/sbin/nginx -c /app/nginx/conf/nginx.conf
# 停止
/app/nginx/sbin/nginx -s stop
# 查看端口是否启动成功
netstat -nltp|grep 9030
2、Yum方式启动
# 检查配置文件是否正常
nginx -t
# 由于Yum下载自带了systemctl管理脚本,直接systemctl启停方式就可以
systemctl start nginx
# 停止
systemctl stop nginx
# 查看端口是否启动成功
netstat -nltp|grep 9030
五、验证
mysql -h 192.168.100.125 -P 9030 -u root -p'xxxxxxxx' -D example_db
参数解释:
-u 指定StarRocks用户名
-p 指定StarRocks密码
-h 指定Nginx代理服务器IP
-P 指定端口
-D 指定数据库名
六、总结
- 本篇文章带大家了解了用nginx来做 proxy 负载均衡,除此之外,其它的开源工具也做很多,列如:lvs、haproxy等
- 目前官方推荐 负载均衡策略
- Nginx 除了做starrocks负载均衡,而且也可以做clickhouse的负载均衡,方案也是类似。
- 使用代理方式上需注意,如果是Flink实时写入starrocks ,需要注意不要写nginx地址,直接写后端的FE地址;proxy server 只是应用于临时客户端回话查询