本次针对灰度测试重点如下:
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 重启