灰度环境搭建,集群,openresty(nginx+lua)公开版

本次针对灰度测试重点如下: 

1. 灰度API组的添加、删除、查询(对应提测接口)

2. 灰度版本与API组的映射的添加、删除、查询(对应提测接口)

3. 灰度分流是否正常,在配置了1和2的路由后,对应版本的请求是否正确路由到指定后段API组(可通过API组的日志确认),默认走stable API组流程是否正确(即没有配置任何灰度的时候,是否所有版本都路由到stable API)

4. API组内部(包括stable API)根据班级取模策略路由到不同的API实例机器,比如,如果stable API组有三台API机器服务,classId=100、101和102的班级,上课的时候这三个班级应该会分散路由到三台服务器上

5. 服务器故障摘除稳定性验证,4中的API组入锅摘除非默认实例,正在这个实例上课的班级是否可以重连到另外一台机器正常上课

6. 客户端接入的流量是否均匀分散在不同nginx服务器上

===============================

申请服务器【redmine工单】

由于AI直播课项目接下来流量会增长,需要做高可用部署,同时需要做灰度发布,现需要新申请服务器如下:
辛苦把XX 设置为sudo权限(以下几台服务器需要QA手动安装一些依赖的环境)
RD在7月11号提测,需要在此之前搭建环境完毕,辛苦尽快高优处理~
1)新增两台服务器做为现有线上业务的扩充,另增一台恢复发布服务器,共3台,服务器配置如下
cpu:8核
内存:16G
磁盘:100G
外网:需要配备外网ip,带宽100M
请使用A线上热备机
Static hostname: localhost.localdomain
Transient hostname: A
Icon name: computer-vm
Chassis: vm
Machine ID: f180f4f45ab34cdc85a5a7b5b599b20e
Boot ID: b9a35b5caacb4a208c6cef3526c59f6b
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-693.11.6.el7.x86_64
Architecture: x86-64

2)新增两台做为业务的流量入口服务器,需要带宽较大,共2台,服务器配置如下
cpu:8核
内存:8G
磁盘:100G
外网:需要配备外网ip,带宽100M

thanks!

===============================

申请线上机器数据库授权【redmine工单】

===============================

申请ULB域名解析【redmine工单】

对系统盘做镜像

/data是数据盘

tar czvf pic.tar pic

1.1k指的是当前文件夹的大小,不包括文件夹里的内容

du -h

线上

sudo su 

tar czvf data.tar data/    压缩文件

/data文件为3.9G

压缩完tar包后,属组改为个人

sudo chown lishan.lishan data.tar 

sudo mv ./data.tar ~

ip a

因为两台服务器不通,所以需要把tar包从线上机器ip1拉到跳板机,再在跳板机拉到新服务器ip2,登录服务器是通的

lishan@xx:~$ scp zz:/home/lishan/data.tar .
data.tar

lishan@xx~$ scp data.tar yy:/home/lishan/

[lishan@yy ~]$ sudo mv ./data.tar /

[lishan@yy /]$ sudo tar xvf data.tar

其他一台线上机器、灰度机器同理

lishan@10-10-123-101:~$ scp data.tar 10.9.19.51:/home/lishan/

lishan@10-10-123-101:~$ scp data.tar 10.9.123.249:/home/lishan/

du -h

df -h

测试环境单机部署,后端&前端业务代码与nginx灰度配置放在同一台服务器

sudo -u xx -H bash     # 切换到build用户

1》》》新增业务代码路径 /data/www下

mkdir -p /data/www/aiclassapi_stable     #线上stable目录

mkdir -p /data/www/aiclassapi_gray     #线上gray目录

===aiclassapi_stable1的appconf.toml===

sudo vim /data/www/aiclassapi_stable1/appconf.toml

[server]
Listen = ":8100"     # stable1的API的端口

[loadbalance]
Host = "ip:9100"     # 同stable的nginx1配置,nginx1的IP,nginx1的端口

===aiclassapi_stable2的appconf.toml===

sudo vim /data/www/aiclassapi_stable2/appconf.toml

[server]
Listen = ":8102"     # stable2的API的端口

[loadbalance]
Host = "ip:9100"     # 同stable的nginx1配置,nginx1的IP,nginx1的端口

===aiclassapi_gray的appconf.toml===

sudo vim /data/www/aiclassapi_gray/appconf.toml

[server]
Listen = ":8200"          # gray的API的端口

[loadbalance]
Host = "ip:9200"      # 同gray的nginx2配置,nginx2的IP,nginx2的端口

2》》》新增新环境supervisor的conf文件

======= sudo vim /etc/supervisor/supervisor.d/aiclassapi.conf

配置3个supervisor进程,内容如下:

[program:aiclassapi_stable1]
command=/data/www/aiclassapi_stable1/aiclass_frontlistener
directory=/data/www/aiclassapi_stable1
user=build
autostart=true
autorestart=true
stdout_logfile=/data/logs/supervisor/aiclassapi_stable1_out.log
stderr_logfile=/data/logs/supervisor/aiclassapi_stable1_err.log

[program:aiclassapi_stable2]
command=/data/www/aiclassapi_stable2/aiclass_frontlistener
directory=/data/www/aiclassapi_stable2
user=build
autostart=true
autorestart=true
stdout_logfile=/data/logs/supervisor/aiclassapi_stable2_out.log
stderr_logfile=/data/logs/supervisor/aiclassapi_stable2_err.log

[program:aiclassapi_gray]
command=/data/www/aiclassapi_gray/aiclass_frontlistener
directory=/data/www/aiclassapi_gray
user=build
autostart=true
autorestart=true
stdout_logfile=/data/logs/supervisor/aiclassapi_gray_out.log
stderr_logfile=/data/logs/supervisor/aiclassapi_gray_err.log

3》》》新增新环境nginx.conf配置路径 /data/ngx.conf/aiclassapi

mkdir -p /data/ngx.conf/aiclassapi     # build权限

创建3个conf文件

sudo netstat -nap|grep 8100     # API端口占用情况,线上API有3台,因为是不同的机器,所以端口分别为8100 8100 8100

sudo netstat -nap|grep 9100     # nginx端口占用情况,线上nginx有2台,端口为9100 9200

===balancer_stable.ngx.conf的nginx配置===

sudo vim balancer_stable.ngx.conf

        upstream default_aiclass_upstream {

                        server 127.0.0.1:8100;      # stable业务API的端口  内网外网都可以访问
        }

       

         server {
                    listen 9100;       # stable注册到nginx1,nginx1的端口

                    server_name ip;     # nginx1的IP

       }

===balancer_gray.ngx.conf的nginx配置===

sudo vim balancer_gray.ngx.conf

        upstream default_aiclass_upstream {

                        server ip:8200;     # gray的API的端口

        }

   

        server {
                 listen 9200;
                 server_name ip;     #gray的nginx2的IP、PORT

        }

===grayscaler.ngx.conf的nginx配置===

sudo vim grayscaler.ngx.conf

        map $scheme $upstream_scheme {

                 default http;

                 'https' http;     # 内部接口之间的调用,用http,用https会降低效率
                 'wss' ws;
         }

        upstream default_gray_upstream {
                        server 127.0.0.1:9100;      # 默认为nginx1的IP、PORT
        }

#测试环境不需要ULB,监听端口443,配置ssl证书

server {
listen 443 ssl;
server_name qaaiclass.knowbox.cn;
set $site_home_fe /data/www/aiclassfe;
ssl_certificate /data/ngx.conf/ssl/_.knowbox.cn.crt;
ssl_certificate_key /data/ngx.conf/ssl/_.knowbox.cn.key;
server_tokens off;

}

4》》》/usr/local/openresty/nginx/conf 新增3个conf文件===

cd /usr/local/openresty/nginx/conf

1> sudo vim /usr/local/openresty/nginx/conf/balancer_stable.ngx.conf

user  build;       # nginx子进程worker的用户权限,注:nginx主进程master的用户权限为root

worker_processes  2;      # nginx子进程个数,一般系统是几核,子进程数就是几个

pid  logs/nginx_aiclassapi_stable.pid;     # pid不能重复,保持与项目名称一致

include /data/ngx.conf/aiclassapi/balancer_stable.ngx.conf;     # 在新建aiclassapi路径下分别对应不同环境的ngx.conf文件,独立文件

2> sudo vim /usr/local/openresty/nginx/conf/balancer_gray.ngx.conf

user build;
worker_processes 2;

pid  logs/nginx_aiclassapi_gray.pid;

include /data/ngx.conf/aiclassapi/balancer_gray.ngx.conf;

3> sudo vim /usr/local/openresty/nginx/conf/grayscaler.ngx.conf

user build;
worker_processes 2;

pid  logs/nginx_aiclassapi_grayscaler.pid;

include /data/ngx.conf/aiclassapi/grayscaler.ngx.conf;

5》》》新建新环境nginx的log路径

sudo mkdir -p /data/logs/nginx/aiclassap      # 存放stable gray grayscaler 的日志

sudo chmod 777 /data/logs/nginx/aiclassapi

6》》》建立完ng日志目录,重启nginx

history出来的数据带行数,用awk去掉第一列,打印全部内容$0

awk '{$1="";print $0}' 1.txt


ps -ef|grep nginx

sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/nginx.conf -s stop     #把老的服务停掉

把老的服务

alphaaiclassupdate.knowbox.cn.conf

betaaiclassupdate.knowbox.cn.conf

qaaiclass.knowbox.cn.conf.old

qaaicms.knowbox.cn.conf

qaaiop.knowbox.cn.conf

qa.kinana.cn.conf

迁过去,在/usr/local/openresty/nginx/conf/grayscaler.ngx.conf 中include修改,

include /data/ngx.conf/aiclassapi/grayscaler.ngx.conf;
include /data/ngx.conf/*.conf;

#把新的服务启动

sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/balancer_gray.ngx.conf 
sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/grayscaler.ngx.conf 
sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/balancer_stable.ngx.conf 

#把新的服务重启

sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/balancer_gray.ngx.conf -s reload 
sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/grayscaler.ngx.conf -s reload 
sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/balancer_stable.ngx.conf  -s reload

lishan@ip:/data/www$ sudo supervisorctl status

sudo supervisorctl stop aiclass_backoperation aiclass_frontlistener aiclass_backcms   把老的服务停掉,新的服务启动

sudo supervisorctl restart aiclass_backoperation aiclass_backcms aiclassapi_gray aiclassapi_stable

测试成功否:

curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/list'

curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/update?ups=ip:8200&desc=gray机器'

curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/update?ups=ip:8300&desc=gray机器'

curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/list'

curl 'https://qaaiclass.knowbox.cn/grayscale/version/list'

curl 'https://qaaiclass.knowbox.cn/grayscale/version/update?version=2&ups=ip:8200&desc=gray机器'

curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/list'

用户请求先请求nginx,nginx转发到某台业务服务器,但日志输出先打业务API,再打nginx的日志

具体打到哪台服务器,首先是根据version映射到stable还是gray,如果stable和gray对应注册了N个API机器就是用classId膜N

内部接口

curl 'https://qaaiclass.knowbox.cn/api/loadbalance/upstream/list'

curl 'https://qaaiclass.knowbox.cn/api/loadbalance/upstream/proxy?sid=73'

lishan@ip:~$ curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/list'
{"code":0,"data":{"list":[{"ups":"ip:8300","desc":"gray机器"},{"ups":"ip:8200","desc":"gray机器"}]},"message":"success"}lishan@ip:~$
lishan@ip:~$ curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/update?ups=ip:8200&desc=gray机器'
{"code":0,"data":{},"message":"success"}lishan@ip:~$
lishan@ip:~$ curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/update?ups=ip:8300&desc=gray机器'
{"code":0,"data":{},"message":"success"}[email protected]:~$ curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/list'
{"code":0,"data":{"list":[{"ups":"ip:8200","desc":"gray机器"},{"ups":"ip:8300","desc":"gray机器"}]},"message":"success"}lishan@ip:~$
lishan@ip:~$ curl 'https://qaaiclass.knowbox.cn/grayscale/version/list'
{"code":0,"data":{"list":[{"ups":"ip:8200","version":"3"},{"ups":"ip:8200","version":"1.0"},{"ups":"ip:8200","version":"1.4.2-alpha1"},{"ups":"ip:8200","version":"1.0.1"},{"ups":"ip:8200","version":"2"},{"ups":"ip:8200","version":"1.4.3-alpha.1"}]},"message":"success"}lishan@ip:~$
lishan@ip~$ curl 'https://qaaiclass.knowbox.cn/grayscale/version/update?version=2&ups=ip:8200&desc=gray机器'
{"code":0,"data":{},"message":"success"}lishan@ip:~$
lishan@ip:~$ curl 'https://qaaiclass.knowbox.cn/grayscale/upstream/list'
{"code":0,"data":{"list":[{"ups":"ip:8200","desc":"gray机

预览环境多机部署

 

A   alias aipre1='ssh ip'
B   alias aipre2='ssh ip'
C   alias aipregray='ssh ip'
D   alias aiprengx1='ssh ip'
E   alias aiprengx2='ssh ip'

压缩tar包

[root@ip /]# tar czvf data.tar data

压缩完tar包后,属组改为个人

sudo chown lishan.lishan data.tar 

sudo mv ./data.tar ~

ip a

因为两台服务器不通,所以需要把tar包从预览服务器aipre1---10.9.176.45拉到跳板机,再在跳板机拉到新预览服务器aipre2---ip2,登录服务器是通的

lishan@10-10-123-101:~$ scp ip:/home/lishan/data.tar ./data.tar

lishan@10-10-123-101:~$ scp data.tar ip:/home/lishan/

[lishan@ip /]$ sudo mv ./data.tar /

[lishan@ip /]$ cd /

[lishan@ip /]$ sudo tar xvf data.tar

[lishan@ip /]$ sudo rm -rf data.tar

灰度服务器aipregray同理

lishan@10-10-123-101:~$ scp ip:/home/lishan/data.tar ./data.tar

lishan@10-10-123-101:~$ scp data.tar ip:/home/lishan/

[lishan@ip7 ~]$ sudo mv ./data.tar /

[lishan@ip7 ~]$ cd /

[lishan@ip7 /]$ sudo tar xvf data.tar

[lishan@ip7 /]$ sudo rm -rf data.tar

删除其他项目代码路径、日志、ng配置、supervisor配置等

cd /data/logs

sudo rm -rf go/ quick_cal_wx_miniapp

cd /data/logs/aiclass

sudo rm -rf backcms op/

cd /data/logs/nginx

sudo rm -rf codebox ngx_backop precomicgame_* wxminiapp_*

cd /data/logs/supervisor

sudo rm -rf *

cd /data/ngx.conf

sudo rm -rf pre*

cd /data/www/

sudo rm -rf aiclassfe aiclass_update_fe aicms aiop aiop_fe commic quick_cal_wx_miniapp

cd /data/www

sudo su build

mv aiclassapi/ aiclassapi_stable

因为在灰度机器aipregray上的操作一样,设计shell脚本实现如上操作

-rwxrwxrwx  1 root   root        450 Jul 17 18:13 shell.sh

sudo sh shell.sh

aiprengx1     3台stable机器会注册到此ngx1上

[lishan@ip data]$ sudo su build

1》》》新增新环境nginx.conf配置路径 /data/ngx.conf/aiclassapi

从测试环境同步到预览环境   lishan@ip:/data/ngx.conf$ sudo sz aiclassapi.tar

[build@ip ngx.conf]$ sudo rz

sudo tar xvf aiclassapi.tar

创建nginx conf文件路径

mkdir -p /data/ngx.conf/aiclassapi     # build权限

创建2个conf文件

balancer_stable.ngx.conf    

grayscaler.ngx.conf

查看端口占用情况

sudo netstat -nap|grep 8100     # API端口占用情况,线上API有3台,端口分别为8100 8101 8102

sudo netstat -nap|grep 8500     # API端口占用情况,灰度API有1台,端口分别为8500

sudo netstat -nap|grep 9100     # nginx端口占用情况,线上nginx有2台,端口为9100 9101

2》》》配置supervisor配置文件(ABC)

A   alias aipre1='ssh ip'

sudo vim /etc/supervisord.d/aiclassapi.conf

[program:aiclassapi_stable]
command=/data/www/aiclassapi_stable/aiclass_frontlistener
directory=/data/www/aiclassapi_stable
user=build
autostart=true
autorestart=true
stdout_logfile=/data/logs/supervisor/aiclassapi_stable_out.log
stderr_logfile=/data/logs/supervisor/aiclassapi_stable_err.log

B   alias aipre2='ssh ip'

sudo vim /etc/supervisord.d/aiclassapi.conf

[program:aiclassapi_stable]
command=/data/www/aiclassapi_stable/aiclass_frontlistener
directory=/data/www/aiclassapi_stable
user=build
autostart=true
autorestart=true
stdout_logfile=/data/logs/supervisor/aiclassapi_stable_out.log
stderr_logfile=/data/logs/supervisor/aiclassapi_stable_err.log

C   alias aipregray='ssh ip'

[program:aiclassapi_gray]
command=/data/www/aiclassapi_gray/aiclass_frontlistener
directory=/data/www/aiclassapi_gray
user=build
autostart=true
autorestart=true
stdout_logfile=/data/logs/supervisor/aiclassapi_gray_out.log
stderr_logfile=/data/logs/supervisor/aiclassapi_gray_err.log

3》》》业务代码stable、gray的appconf.toml配置

A   alias aipre1='ssh ip'

sudo vim /data/www/aiclassapi_stable/appconf.toml

[server]
Listen = ":8100"     #stable1的端口
Env = "release" #values: debug | test | release
OriginAllow = ["*"]

[loadbalance]
Host = "ip:9100"     #aiprengx1的IP、PORT

B   alias aipre2='ssh ip'

sudo vim /data/www/aiclassapi_stable/appconf.toml

[server]
Listen = ":8100"      #stable2的端口
Env = "release" #values: debug | test | release
OriginAllow = ["*"]

[loadbalance]
Host = "ip:9100"      #aiprengx1的IP、PORT

C   alias aipregray='ssh ip'

sudo vim /data/www/aiclassapi_gray/appconf.toml

[server]
Listen = ":8200"       #gray的端口
Env = "release" #values: debug | test | release
OriginAllow = ["*"]

[loadbalance]
Host = "ip:9200"      #aiprengx2的IP、PORT

4》》》nginx配置(D)

D   alias aiprengx1='ssh ip'

===balancer_stable.ngx.conf的nginx配置===

sudo vim /data/ngx.conf/aiclassapi/balancer_stable.ngx.conf

upstream default_aiclass_upstream {
server ip:8100;     # A---aipre1业务API的IP、PORT  内网外网都可以访问
}

server {
listen 9100;      #aiprengx1的端口
server_name ip;     # D---aiprengx1的IP

}

===balancer_gray.ngx.conf的nginx配置===

sudo vim /data/ngx.conf/aiclassapi/balancer_gray.ngx.conf

upstream default_aiclass_upstream {
server ip:8200;      #C---aipregray的IP、PORT
}

server {
listen 9200;
server_name ip;     #aiprengx1的IP、PORT

}

===grayscaler.ngx.conf的nginx配置===

sudo vim /data/ngx.conf/aiclassapi/grayscaler.ngx.conf

增加一行main配置

env AICLASS_GRAYSCALE_MODE=pre;

map $scheme $upstream_scheme {
default http;
'https' http;      # 内部接口之间的调用,用http,用https会降低效率
'wss' ws;
}

upstream default_gray_upstream {
server ip:9100;     #aiprengx1的IP、PORT
}

server {
listen 443 ssl;
server_name preaiclass.knowbox.cn;     #域名访问

}

D---aiprengx1的/data/ngx.conf/aiclassapi 放置的为 grayscaler.ngx.conf、balancer_stable.ngx.conf

E—aiprengx2的/data/ngx.conf/aiclassapi 放置的为 grayscaler.ngx.conf、balancer_gray.ngx.conf

grayscaler.ngx.conf的配置一样,默认为第一台ng的IP、POTR

upstream default_gray_upstream {
server ip:9100;
}

5》》》D---aiprengx1的/usr/local/openresty/nginx/conf 新增3个conf文件===

cd /usr/local/openresty/nginx/conf

balancer_gray.ngx.conf

balancer_stable.ngx.conf

grayscaler.ngx.conf

[lishan@ip conf]$ sudo sz balancer_*

[lishan@ip conf]$ sudo sz grayscaler.ngx.conf

上传到[build@ip conf]$ sudo rz  

因为是拷贝已经编辑好的文件配置。以下同测试环境配置

1> sudo vim /usr/local/openresty/nginx/conf/balancer_stable.ngx.conf

user  build;       # nginx子进程worker的用户权限,注:nginx主进程master的用户权限为root

worker_processes  2;      # nginx子进程个数,一般系统是几核,子进程数就是几个

pid  logs/nginx_aiclassapi_stable.pid;     # pid不能重复,保持与项目名称一致

include /data/ngx.conf/aiclassapi/balancer_stable.ngx.conf;     # 在新建aiclassapi路径下分别对应不同环境的ngx.conf文件,独立文件

2> sudo vim /usr/local/openresty/nginx/conf/balancer_gray.ngx.conf

user build;
worker_processes 2;

pid  logs/nginx_aiclassapi_gray.pid;

include /data/ngx.conf/aiclassapi/balancer_gray.ngx.conf;

3> sudo vim /usr/local/openresty/nginx/conf/grayscaler.ngx.conf

user build;
worker_processes 2;

pid  logs/nginx_aiclassapi_grayscaler.pid;

include /data/ngx.conf/aiclassapi/grayscaler.ngx.conf;
include /data/ngx.conf/*.conf     #老的op cms update服务的ng配置文件需要用grayscaler.ngx.conf重启

6》》》D---aiprengx1新建预览环境nginx的log路径

sudo mkdir -p /data/logs/nginx/aiclassapi      # 存放stable gray grayscaler 的日志

sudo chmod 777 /data/logs/nginx/aiclassapi

7》》》建立完ng日志目录,重启nginx

history出来的数据带行数,用awk去掉第一列,打印全部内容$0

awk '{$1="";print $0}' 1.txt

ps -ef|grep nginx

sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/nginx.conf -s stop     #把老的服务停掉

ps -ef|grep nginx
sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/balancer_gray.ngx.conf 
sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/grayscaler.ngx.conf 
sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/balancer_stable.ngx.conf 

测试成功否:

curl 'https://preaiclass.knowbox.cn/grayscale/upstream/list'

curl 'https://preaiclass.knowbox.cn/grayscale/upstream/update?ups=ip:9200&desc=gray机器'       灰度gray注册到的ngx2

因为请求的是grayscale, grayscale 比 balance_stable, balance_gray高一级。所以grayscale填写下级的ip+port

将域名preaiclass.knowbox通过ULB重定向到2台nginx服务器 --- nginx1:ip     nginx2:ip

DBA:

把域名 preaiclass.knowbox.cn 解析改到ip

117.50.18.191 ulb的外网IP,提供443服务,转发到内网ip ip2 的80端口。http 请求指向80 https指向443

grayscaler监听80端口,stable ngx监听9100端口,gray ngx监听9200端口,aiclassapi stable组监听8100、8101、8102…,appconf的loadvalance填9100,aiclassapi gray组监听8200、8201…,appconf里loadbalance填9200

如果域名直接解析到grayscaler,那么grayscaler就监听443端口并配置好证书

线上是通过ulb转发到grayscale的就grayscale监听80端口不用配证书

81班级 ,会打到 8100 第一台stable1 81对2取膜 =1

这里指向stable ngx监听的ip:端口就行

73对2台stable 取膜是 1 , 会打到stable1 还是2

因为go api可以随时下线也可以随时上线

后面挂的两台go服务稳定的话就会是一致的了,比如73就会一直映射到stable1

机器注册接口不对外,在lua代码里,需要登录到nginx机器

nginx1的端口为9100,nginx2的端口为9200

alias aingx1='ssh ip1'
alias aingx2='ssh ip2'

nginx1上请求接口,看到3台API的机器注册顺序,如399全量班级取膜为0,日志会打到第1台机器ip1;250全量班级取膜为1,会打到第二台机器ip2。测试时候可以取3个连续的classId

[lishan@ip ~]$ curl 127.0.0.1:9100/loadbalance/upstream/list

nginx2上请求接口,看到1台灰度机器注册,灰度班级37班请求日志会打到灰度机器ip

{"ip:8100":1,"10.9.84.249:8100":1,"ip:8100":1}

[lishan@ip ~]$  curl 127.0.0.1:9200/loadbalance/upstream/list
{"ip:8200":1}

线上环境多机部署

 

alias aipro1='ssh ip'
alias aipro2='ssh ip'
alias aipro3='ssh ip'
alias aigray='ssh ip'
alias aingx1='ssh ip'
alias aingx2='ssh ip'

===============【redmine工单】

配置ULB的机器,并指向以下2台线上nginx服务器
ngx1 :ip1
ngx2 :ip2

辛苦提供ulb的外网IP,对外提供443服务,转发到内网ip1 ip2 的80端口

thanks

后端API服务器新增代码路径aiclassapi_stable,log路径,appconf.toml后端服务占用的端口以及注册到的nginx1,supervisor的conf配置文件   --3台; 待线上配置OK后,申请域名取消解析aipro1,申请解析到ULB。

线上灰度机器后端业务代码新增代码路径aiclassapi_gray,log路径,appconf.toml后端服务占用的端口以及注册到的nginx2   --1台;

nginx配置文件路径、入口文件、nginx的log路径,aingx1存放balancer_stable.ngx.conf、grayscaler.ngx.conf。aingx2存放balancer_gray.ngx.conf、grayscaler.ngx.conf。用户请求https443端口转发到ng的80端口,FE代码需要迁移至此服务器   --2台;

2台nginx

ip a 

aingx1   ip1

aingx2   ip2

sudo su build

mkdir -p /data/ngx.conf/aiclassapi

从aingx1拷贝跳板机

lishan@10-10-123-101:~$ scp ip1:/usr/local/openresty/nginx/conf/balancer_stable.ngx.conf ~

lishan@10-10-123-101:~$ scp ip1:/usr/local/openresty/nginx/conf/balancer_gray.ngx.conf ~

lishan@10-10-123-101:~$ scp ip1:/usr/local/openresty/nginx/conf/grayscaler.ngx.conf ~

从跳板机拷贝到aingx2

lishan@10-10-123-101:~$ scp ./balancer_gray.ngx.conf balancer_stable.ngx.conf grayscaler.ngx.conf ip1:/home/lishan/

[lishan@ip2 ~]$ sudo mv ./balancer_* grayscaler.ngx.conf /usr/local/openresty/nginx/conf

sudo chown root:root *

线上:

[lishan@ip1 ~]$ vim /etc/supervisord.conf

supervisor主进程日志:

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)

子进程conf文件:

[include]
files = /etc/supervisord.d/*.conf

如果线上ws稳定,supervisor主进程日志不会有太多内容。如果一直断线重连,日志会记录

线上3台stable的supervisor启动

stable2 stable3 新服务

服务端: sudo /usr/bin/python /bin/supervisord -c /etc/supervisord.conf

客户端: sudo supervisorctl status

stable1 老服务

客户端: sudo supervisorctl update

客户端: sudo supervisorctl status

2台nginx机器新建/data/www/aiclassfe   和/data/www/ailua

sudo supervisorctl stop aiclass_frontlistener

ps -ef|grep nginx|grep -v grep |awk '{print $2}'|xargs sudo kill -9

ngx1上,启动新服务

sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/grayscaler.ngx.conf 

sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/balancer_stable.ngx.conf 

ngx2上,启动新服务

sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/grayscaler.ngx.conf 

sudo /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/balancer_gray.ngx.conf 

sudo lsof -i:80

 把grayscale的nginx都改为监听80端口,ssl相关配置都删掉

servername 改为本机内网ip,reload重启

server {
listen 80;
server_name ip;
set $site_home_fe /data/www/aiclassfe;
server_tokens off;

aingx1验证测试

[lishan@ip~]$ curl 'ip/grayscale/upstream/list'      本地调用,不走ULB负载均衡

[lishan@ip~]$ curl --insecure 'https://ip/grayscale/upstream/list'     ULB负载均衡,模拟用户请求

aingx2验证测试

[lishan@ip2 ~]$ curl 'ip/grayscale/upstream/list'      本地调用,不走ULB负载均衡

[lishan@ip2 ~]$ curl --insecure 'https://ip/grayscale/upstream/list'     ULB负载均衡,模拟用户请求

两台nginx都存了map,灰度系统点击上线,会在某台nginx注册,然后同步到另一台。

curl命令多个参数要带上\&

[lishan@1ip aiclassapi]$ curl ip/grayscale/version/update?version=1.4.3\&ups=ip:9200

把域名 preaiclass.knowbox.cn 解析改到ip ulb的外网IP,提供443服务,转发到内网ip1 ip2 的80端口

AI直播课http跳转到 https,将443还是转发到80,然后将80转发到81,后端监听到的81端口会rewite到ulb的443。线上域名为 aiclass.knowbox.cn 对应ulb的IP为ip

ulb无法单独实现 需要后端RS服务器做一些配合设置

ULB的vserver 要开两个监听 一个80端口 HTTP 一个 443端口HTTPS ssl设置在443这个server上即可

然后后端rs服务器 web服务要做的是 监听80端口 rewrite到443端口 监听443端口提供正常的http服务

将443还是转发到80,然后将80转发到81,后端监听到的81端口会rewite到ulb的443

==================

定级小程序(nginx,无lua项目)

nginx启动方式由   /usr/local/openresty/bin/openresty -c /usr/local/openresty/nginx/conf/nginx.conf 变更为

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。

用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

因为Supervisor是Python开发的,安装前先检查一下系统否安装了Python2.4以上版本。

安装与配置步聚

示例环境条件:CentOS7+Python2.7

1.安装supervisor   

easy_install supervisor  (前提安装了python的easy_install工具)

supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。

例如在10.10.89.78上安装示意图:

2.配置

运行supervisord服务的时候,需要指定supervisor配置文件,如果没有显示指定,默认在以下目录查找:

$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
../etc/supervisord.conf (Relative to the executable)
../supervisord.conf (Relative to the executable)

$CWD表示运行supervisord程序的目录

可以通过运行echo_supervisord_conf 程序生成supervisor的初始化配置文件,如下所示:

mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

例如在10.10.89.78测试机上生成配置文件如下:

生成后的位置: /etc/supervisor/supervisord.conf

3.配置文件参数说明

supervisor的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档介绍。 
注:分号(;)开头的配置表示注释

[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ;socket文件的mode,默认是0700
;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid

;[inet_http_server] ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user ;登录管理后台的用户名
;password=123 ;登录管理后台的密码

[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024 ;可以打开的文件描述符的最小值,默认 1024
minprocs=200 ;可以打开的进程数的最小值,默认 200

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord

; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程

;包含其它配置文件
[include]
files = relative/directory/*.ini ;可以指定一个或多个以.ini结束的配置文件
  例如测试机上,我们在supervisord.conf同级目录下创建supervisord.d目录,该目录下存放一些我们自定义的各个业务的conf配置文件,再上面这个include中引用它

     

    在此目录下配置我们具体项目的配置,下面是tikucheck项目的具体配置:

1 [program:tikucheck]              #项目名
2 user=root                              #程序的运行用户
3 directory=/data/beta/SusuanApiAutoTest/SusuanApiAutoTest-pyunit/src   #项目根目录  
4 command=python SusuanOperations/Teacher/flaskServerOpers.py         #执行命令,这里是个python项目因此只是简单的python命令执行
5 autostart=true
6 autorestart=true
7 startsecs=10
8 stdout_logfile=/data/beta/SusuanApiAutoTest/SusuanApiAutoTest-pyunit/src/logs/flaskServer.log    #日志记录
9 stdout_logfile_maxbytes=1MB
10 stdout_logfile_backups=10
11 stdout_capture_maxbytes=1MB
12 stderr_logfile=/data/beta/SusuanApiAutoTest/SusuanApiAutoTest-pyunit/src/logs/flaskServer_error.log  #错误日志记录
13 stderr_logfile_maxbytes=1MB
14 stderr_logfile_backups=10
15 stderr_capture_maxbytes=1MB
16 stopsignal=INT
17 [supervisord]

4.启动服务

supervisord -c /etc/supervisor/supervisord.conf

5.交互命令

 supervisord启动成功后,可以通过supervisorctl客户端控制进程,启动、停止、重启。运行supervisorctl命令,不加参数,会进入supervisor客户端的交互终端,并会列出当前所管理的所有进程。

例如10.10.89.78上的题库验证python服务,在supervisord.conf文件包含include的目录下tikucheck.conf中program:tikucheck项目

sudo /usr/local/bin/supervisorctl -c /etc/supervisor/supervisord.conf status tikucheck  查看该项目服务状态

sudo /usr/local/bin/supervisorctl -c /etc/supervisor/supervisord.conf start tikucheck    启动

sudo /usr/local/bin/supervisorctl -c /etc/supervisor/supervisord.conf stop tikucheck  停止

sudo /usr/local/bin/supervisorctl -c /etc/supervisor/supervisord.conf restart tikucheck  重启

发布了45 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42498050/article/details/87986223