Authored by qinchao

nginx切换调整

... ... @@ -8,6 +8,7 @@ import com.monitor.mysql.mapper.HostInfoMapper;
import com.yoho.ops.cmdb.models.LbModel;
import com.yoho.ops.cmdb.qcloud.model.*;
import com.yoho.ops.cmdb.qcloud.util.QcloudSdkUtil;
import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
... ... @@ -35,6 +36,8 @@ public class NginxSwitchCtrl {
private Logger logger = LoggerFactory.getLogger("switchLogger");
private long sleepTime=10*1000L;
@Value("${system.envi}")
private String env;
... ... @@ -42,6 +45,271 @@ public class NginxSwitchCtrl {
HostInfoMapper hostInfoMapper;
/**
* 切换lb的权重
* cloudName 源lb
* target 目标nginx
*/
@RequestMapping(value = "switchLbWeight")
@ResponseBody
public BaseResponse switchLbWeight(String cloudName,String target) {
List<LbModel> lbList=getJavaLb().stream().filter(p->StringUtils.equals(p.getAzTag(),cloudName)).collect(Collectors.toList());
if(lbList==null||lbList.size()<=0){
return new BaseResponse(201,"源lb为空,请检测参数:"+cloudName);
}
Map<String,String> innerListenerMap=getLbListerner(true);
Map<String,String> outerListenerMap=getLbListerner(false);
for(LbModel lb:lbList){
if(lb.isClbFlag()){
switchClb(target,lb);
}else {
Map<String, String> listenerMap = outerListenerMap;
if (lb.isInnerFlag()) {
listenerMap = innerListenerMap;
}
QcloudForwardLbModel forwardLbModel = getAlbFromQcloud(lb);
if (forwardLbModel == null) {
return new BaseResponse(201, "获取alb信息出现异常,切换失败:" + lb.getKey());
}
List<AlbModelClass> dealAlb = new ArrayList<>();
for (String protoTypeAndPort : listenerMap.keySet()) {
AlbModelClass albModelClass = new AlbModelClass();
String[] protoAndPortArray = protoTypeAndPort.split(",");
String protocolType = protoAndPortArray[0];
int port = Integer.parseInt(protoAndPortArray[1]);
String domain = listenerMap.get(protoTypeAndPort);
List<String> locationIdList = new ArrayList<>();
for (QcloudForwardLbModelData data : forwardLbModel.getData()) {
if (StringUtils.equals(protocolType, data.getProtocolType()) && port == data.getLoadBalancerPort()) {
String listenerId = data.getListenerId();
for (QcloudForwardLbModelDataRule rule : data.getRules()) {
if (StringUtils.equals(domain, rule.getDomain())) {
locationIdList.add(rule.getLocationId());
List<List<QcloudLbModelBackend>> ls = getNeedChangedWei(rule.getBackends(),target);
List<QcloudLbModelBackend> needAddWeight=ls.get(0);
List<QcloudLbModelBackend> needRemoveWeight=ls.get(1);
albModelClass.setListenerId(listenerId);
albModelClass.setLocationIdList(locationIdList);
albModelClass.setNeedAddWeight(needAddWeight);
albModelClass.setNeedRemoveWeight(needRemoveWeight);
dealAlb.add(albModelClass);
}
}
}
}
}
for (AlbModelClass albModelClass : dealAlb) {
//操作weight,
List<QcloudLbModelBackend> needAddWeight = albModelClass.getNeedAddWeight();
if (needAddWeight.size() > 0) {
List<String> unInstanceIdList = new ArrayList<>();
List<Integer> weightList = new ArrayList<>();
List<Integer> portList = new ArrayList<>();
for (QcloudLbModelBackend backend : needAddWeight) {
unInstanceIdList.add(backend.getUnInstanceId());
weightList.add(10);
portList.add(backend.getPort());
}
//alb 切换权重
QcloudSdkUtil.modifyForwardSeventhBackends(lb.getLbId(), albModelClass.getListenerId(), albModelClass.getLocationIdList(), unInstanceIdList, portList, weightList);
try {
// 括号内的参数是毫秒值,线程休眠
Thread.sleep(sleepTime);//10s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
boolean recheckFlag = false;
for (AlbModelClass albModelClass : dealAlb) {
List<QcloudLbModelBackend> needRemoveWeight = albModelClass.getNeedRemoveWeight();
if (needRemoveWeight.size() > 0) {
recheckFlag = true;
break;
}
}
if (recheckFlag) {
//切掉流量之前需要校验
QcloudForwardLbModel checkBeforeMoveBackends = getAlbFromQcloud(lb);
boolean checkPass = false;
for (QcloudForwardLbModelData flbModel : checkBeforeMoveBackends.getData()) {
for (AlbModelClass albModelClass : dealAlb) {
if (StringUtils.equals(flbModel.getListenerId(), albModelClass.getListenerId())) {
List<String> unInstanceIdList = new ArrayList<>();
List<Integer> weightList = new ArrayList<>();
List<Integer> portList = new ArrayList<>();
for (QcloudLbModelBackend backend : albModelClass.getNeedRemoveWeight()) {
unInstanceIdList.add(backend.getUnInstanceId());
weightList.add(0);
portList.add(backend.getPort());
}
for (QcloudForwardLbModelDataRule rule : flbModel.getRules()) {
if (albModelClass.getLocationIdList().contains(rule.getLocationId())) {
for (QcloudLbModelBackend backend : rule.getBackends()) {
if (backend.getWeight() > 0 && !unInstanceIdList.contains(backend.getUnInstanceId())) {
checkPass = true;
break;
}
}
}
}
if (checkPass) {
//alb 切换权重
QcloudSdkUtil.modifyForwardSeventhBackends(lb.getLbId(), albModelClass.getListenerId(), albModelClass.getLocationIdList(), unInstanceIdList, portList, weightList);
try {
// 括号内的参数是毫秒值,线程休眠
Thread.sleep(sleepTime);//10s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
}
}
return new BaseResponse();
}
private BaseResponse switchClb(String target,LbModel lb){
QcloudCLBModel clbModel=getCLbFromQcloud(lb);
if(clbModel==null){
return new BaseResponse(201,"获取lb信息出现异常,切换失败lb "+lb.getKey());
}
List<List<QcloudLbModelBackend>> ls = getNeedChangedWei(clbModel.getBackendSet(),target);
List<QcloudLbModelBackend> needAddWeight=ls.get(0);
List<QcloudLbModelBackend> needRemoveWeight=ls.get(1);
//操作weight,
if(needAddWeight.size()>0){
List<String> unInstanceIdList=new ArrayList<>();
List<Integer> weightList=new ArrayList<>();
for(QcloudLbModelBackend backend:needAddWeight){
unInstanceIdList.add(backend.getUnInstanceId());
weightList.add(10);
}
//clb 切换权重
QcloudSdkUtil.modifyLoadBalancerBackends(lb.getLbId(),unInstanceIdList,weightList);
try {
// 括号内的参数是毫秒值,线程休眠
Thread.sleep(sleepTime);//10s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//移除之前一定检测一次,保证移除后,至少还有另外一个
if(needRemoveWeight.size()>0){
List<String> unInstanceIdList=new ArrayList<>();
List<Integer> weightList=new ArrayList<>();
for(QcloudLbModelBackend backend:needRemoveWeight){
unInstanceIdList.add(backend.getUnInstanceId());
weightList.add(0);
}
QcloudCLBModel checkBeforeMoveBackends=getCLbFromQcloud(lb);
boolean checkPass=false;
for(QcloudLbModelBackend backend:checkBeforeMoveBackends.getBackendSet()){
if(backend.getWeight()>0&&!unInstanceIdList.contains(backend.getUnInstanceId())){
checkPass=true;
break;
}
}
if(checkPass){
//clb 切换权重
QcloudSdkUtil.modifyLoadBalancerBackends(lb.getLbId(),unInstanceIdList,weightList);
try {
// 括号内的参数是毫秒值,线程休眠
Thread.sleep(sleepTime*2);//20s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return new BaseResponse();
}
private List<List<QcloudLbModelBackend>> getNeedChangedWei(List<QcloudLbModelBackend> backendList,String target){
List<QcloudLbModelBackend> needAddWeight=new ArrayList<>();
List<QcloudLbModelBackend> needRemoveWeight=new ArrayList<>();
for(QcloudLbModelBackend backend:backendList){
if(backend.getInstanceName().indexOf(target)>=0){
if(backend.getWeight()<=0){
needAddWeight.add(backend);
}
}else {
if(backend.getWeight()>0){
needRemoveWeight.add(backend);
}
}
}
List<List<QcloudLbModelBackend>> ls=new ArrayList<>();
ls.add(needAddWeight);
ls.add(needRemoveWeight);
return ls;
}
@Data
private class AlbModelClass{
String listenerId;
List<String> locationIdList;
List<QcloudLbModelBackend> needAddWeight;
List<QcloudLbModelBackend> needRemoveWeight;
}
private QcloudCLBModel getCLbFromQcloud(LbModel lb){
QcloudCLBModel tmp=null;
for(int i=0;i<3;i++){
tmp=QcloudSdkUtil.describeLoadBalancerBackends(lb.getLbId());
if(tmp!=null){
break;
}
}
if(tmp==null){
return null;
}
return tmp ;
}
private QcloudForwardLbModel getAlbFromQcloud(LbModel lb){
QcloudForwardLbModel tmp=null;
for(int i=0;i<3;i++){
tmp=QcloudSdkUtil.describeForwardLBBackends(lb.getLbId());
if(tmp!=null){
break;
}
}
if(tmp==null){
return null;
}
return tmp;
}
/**
* 查看nginx配置
*
* @return 2016年5月12日下午1:49:48
... ... @@ -85,13 +353,7 @@ public class NginxSwitchCtrl {
for(LbModel lb:lbList){
if(lb.isClbFlag()){
QcloudCLBModel tmp=null;
for(int i=0;i<3;i++){
tmp=QcloudSdkUtil.describeLoadBalancerBackends(lb.getLbId());
if(tmp!=null){
break;
}
}
QcloudCLBModel tmp=getCLbFromQcloud(lb);
if(tmp==null){
return new BaseResponse(201,"请求lb信息error,lb:"+lb.getLbId());
}
... ... @@ -105,13 +367,7 @@ public class NginxSwitchCtrl {
lbMap.put(lb.getKey(),ipInWeight);
}else{
QcloudForwardLbModel tmp=null;
for(int i=0;i<3;i++){
tmp=QcloudSdkUtil.describeForwardLBBackends(lb.getLbId());
if(tmp!=null){
break;
}
}
QcloudForwardLbModel tmp=getAlbFromQcloud(lb);
if(tmp==null){
return new BaseResponse(201,"请求lb信息error,lb:"+lb.getLbId());
}
... ... @@ -139,7 +395,6 @@ public class NginxSwitchCtrl {
}
addJavaNgingList(backend,java_nginx_az1,java_nginx_az2,java_nginx_az3);
}
break;
}
}
}
... ... @@ -150,7 +405,7 @@ public class NginxSwitchCtrl {
}else{
//如果两次的不一致,需要提示出来
if(!CollectionUtils.isEqualCollection((Set<String>)lbMap.get(lb.getKey()),ipInWeight)){
return new BaseResponse(201, "负载均衡protocol指定主机数量不一致,lb:"+lb.getLbId());
return new BaseResponse(201, "负载均衡protocol指定主机数量不一致,lb ->"+lb.getLbId()+":"+protoTypeAndPort);
}
}
times++;
... ...