【phoenix-部署】Docker+Nginx+Keepalived实现高可用Phoenix负载均衡

一、系统环境

参考hadoop集群搭建中的“一、安装环境准备”。

架构设计:
QueryServer是一个单独部署的HTTP服务,接收轻客户端的RPC请求,并将SQL转发给Phoenix Core进行解析优化执行。与重客户端相比,轻客户端的的读写性能略有降低。(轻重客户端对比:https://yq.aliyun.com/articles/688631)

【phoenix-部署】Docker+Nginx+Keepalived实现高可用Phoenix负载均衡_第1张图片
phoenix高可用负载均衡架构

二、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
  • 验证


    【phoenix-部署】Docker+Nginx+Keepalived实现高可用Phoenix负载均衡_第2张图片
【phoenix-部署】Docker+Nginx+Keepalived实现高可用Phoenix负载均衡_第3张图片
python测试

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
    【phoenix-部署】Docker+Nginx+Keepalived实现高可用Phoenix负载均衡_第4张图片
  • 将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

  • 测试


    【phoenix-部署】Docker+Nginx+Keepalived实现高可用Phoenix负载均衡_第5张图片

    停掉hdc-data6 docker: systemctl stop docker


    【phoenix-部署】Docker+Nginx+Keepalived实现高可用Phoenix负载均衡_第6张图片

    hdc-data6再次启动docker时,还需同时 启动keepalived(手动)

你可能感兴趣的:(【phoenix-部署】Docker+Nginx+Keepalived实现高可用Phoenix负载均衡)