一、系统环境
参考hadoop集群搭建中的“一、安装环境准备
”。
架构设计:
QueryServer是一个单独部署的HTTP服务,接收轻客户端的RPC请求,并将SQL转发给Phoenix Core进行解析优化执行。与重客户端相比,轻客户端的的读写性能略有降低。(轻重客户端对比:https://yq.aliyun.com/articles/688631)
二、Docker+Nginx+Keepalived安装配置
参考原文:https://blog.51cto.com/andyxu/2286045
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。通过Docker容器实现资源隔离,方便管理维护。
Nginx 是一个很强大的高性能Web和反向代理服务,也是一个IMAP/POP3/SMTP服务。通过Nginx做负载均衡。
Keepalived 的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。通过Keepalived实现高可用。
2.1 Docker安装配置
- 添加软件源信息
yum install -y yum-utils device-mapper-persistent-data lvm2 - 安装依赖
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - 更新 yum 缓存
yum makecache fast - 安装社区版docker
yum -y install docker-ce - 添加修改配置文件,添加私有仓库地址和阿里云镜像地址(或者网易的镜像地址:http://hub-mirror.c.163.com),并指定docker数据存储目录
mkdir -p /data/docker
mkdir -p /etc/docker
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"graph": "/data/docker",
"insecure-registries": ["192.168.163.56:5000"]
}
- 启动docker,并加入开机启动
systemctl start docker
systemctl enable docker
2.2 配置nginx容器
下载nginx镜像
docker pull nginx复制nginx主配置文件到本地(创建临时nginx容器,只为拷贝配置文件)
mkdir -p /data/docker/nginx/conf
docker run --name tmp-nginx-container -d nginx:latest
docker cp tmp-nginx-container:/etc/nginx/nginx.conf /data/docker/nginx/conf/
docker rm -f tmp-nginx-container编辑创建nginx容器脚本
vi /data/docker/docker_nginx.sh
#!/bin/bash
docker run --name nginx --restart=always -p 8180:80 \
-v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /data/docker/nginx/html:/usr/share/nginx/html \
-v /data/docker/nginx/logs:/var/log/nginx \
-d nginx:latest
说明: -v 挂载的宿主机本地目录/文件路径:容器目标目录/文件路径 (目的方便维护nginx配置)
授予执行权限并执行该脚本
chmod 755 /data/docker/docker_nginx.sh
sh /data/docker/docker_nginx.sh修改nginx主配置文件
vi /data/docker/nginx/conf/nginx.conf
user nginx;
worker_processes 1; #通常设为CPU的核心数
error_log /var/log/nginx/error.log warn; #错误日志目录及日志级别:debug / info / notice / warn / error / crit
pid /var/run/nginx.pid;
events {
use epoll; #Linux最常用支持大并发的事件触发机制
worker_connections 65535;
}
http {
include /etc/nginx/mime.types; #设定mime类型,类型由mime.type文件定义
default_type application/octet-stream;
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;
keepalive_timeout 65;
#gzip on;
limit_conn_zone $binary_remote_addr zone=perip:10m; #添加limit_zone,限制同一IP并发数
include /etc/nginx/conf.d/*.conf; #包含nginx虚拟主机配置文件目录
}
upstream 模块负载均衡配置,通过默认的轮询调度方式来分发请求到后端服务器。
vi /data/docker/nginx/conf/conf.d/upstream.conf
upstream phoenix_server {
ip_hash; # 指定请求调度算法,默认是weight权重轮询调度
server 192.168.163.54:8765 max_fails=3 fail_timeout=60s;
server 192.168.163.55:8765 max_fails=3 fail_timeout=60s;
server 192.168.163.56:8765 max_fails=3 fail_timeout=60s;
}
说明:8765 端口是phoenix queryserver的默认端口。phoenix轻客户端的连接方式"
./bin/sqlline-thin.py http://host:8765
"。在使用轻客户端时需启动queryserver服务:"/opt/apps/phoenix/bin/queryserver.py start
"
server模块
vi /data/docker/nginx/conf/conf.d/server.conf
server {
listen 80;
server_name localhost; #ip地址或者域名,多个配置之间用空格分隔
location / {
root /usr/share/nginx/html;
index index.html;
}
location /phoenix {
proxy_pass http://phoenix_server; #通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化
access_log /var/log/nginx/phoenix_server.log;
error_log /var/log/nginx/phoenix_server.log;
}
limit_conn perip 200; #同一ip并发数为200,超过会返回503
}
说明:使用include 将server模块和upstream 模块分离,完整的结构如下:
.... # 全局配置
events { # nginx工作模式配置
}
http { # http设置
server { # 服务器主机配置
location { # 路由配置
}
location path {
}
location otherpath {
}
}
upstream name { # 负载均衡配置
}
}
- 编写index.html
vi /data/docker/nginx/html/index.html
Nginx
Hello,nginx in hdc-data6 server.
- 重启nginx容器
docker restart nginx -
验证
2.3 Keepalived安装配置高可用
首先,我们按照以上步骤分别在nginx集群服务器上安装配置好nginx。
- 安装依赖环境
yum -y install wget make gcc gcc-c++ openssl-devel - keepalived安装
wget http://www.keepalived.org/software/keepalived-2.0.13.tar.gz
tar xvf keepalived-2.0.13.tar.gz -C /opt/
cd /opt/keepalived-2.0.13/
./configure --prefix=/data/keepalived
make
make install
将keepalived 以服务方式启动
mkdir /etc/keepalived
cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
systemctl enable keepalived修改/etc/keepalived/keepalived.conf配置文件
! Configuration File for keepalived
global_defs {
notification_email {
[email protected] #接受邮件地址
}
notification_email_from [email protected] #发送邮件地址
smtp_server smtp.qq.com #发送邮件服务器,采用第三方
smtp_connect_timeout 30
router_id hdc-data6 #标识本节点的字条串,通常为 hostname
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#添加nginx检查脚本配置
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight 3
}
vrrp_instance VI_1 {
state MASTER #备份服务器上将MASTER改为BACKUP
interface ens33 #centos6 eth0
virtual_router_id 51
priority 100 #备份服务上将100改为小于100,可配置成90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.163.250 #有多个vip可在下面继续增加
}
#添加nginx检查脚本配置
track_script {
chk_nginx
}
}
......
- 添加检查nginx状态的脚本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
docker restart nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
sudo systemctl stop keepalived
fi
fi
授权
chmod +x /etc/keepalived/nginx_check.sh
若开启防火墙,配置firewalld防火墙允许vrrp协议
如果是backup服务器,source address改成master服务器的IP
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.163.55" protocol value="vrrp" accept"
firewall-cmd --reload重启keepalived
systemctl start keepalived-
测试
停掉hdc-data6 docker: systemctl stop docker
hdc-data6再次启动docker时,还需同时 启动keepalived(手动)