From 4e08c1a85025e5db2b57b7f3f0b5bc58ccfe1818 Mon Sep 17 00:00:00 2001 From: "PC-202302260912\\Administrator" <1769111741@qq.com> Date: Tue, 22 Aug 2023 18:48:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E6=9C=8D=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E4=BA=8C=E6=AC=A1=E5=90=88=E6=9C=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/script/hefu_mongo.sh | 46 ++- .../jmfy/controller/HeFuNewController.java | 52 ++++ .../java/com/jmfy/dao/impl/CHefuDaoImpl.java | 2 +- .../com/jmfy/dao/impl/ServerInfoDaoImpl.java | 2 +- .../java/com/jmfy/handler/HeFuManager.java | 292 +++++++++--------- src/main/java/com/jmfy/model/CHefuInfo.java | 14 +- 6 files changed, 246 insertions(+), 162 deletions(-) create mode 100644 src/main/java/com/jmfy/controller/HeFuNewController.java diff --git a/conf/script/hefu_mongo.sh b/conf/script/hefu_mongo.sh index c583322..6bf3bdd 100644 --- a/conf/script/hefu_mongo.sh +++ b/conf/script/hefu_mongo.sh @@ -1,24 +1,42 @@ #!/bin/bash # MongoDB的账号、密码、端口等信息 -MONGO_HOST=$1 -MONGO_PORT=$2 -MONGO_USER=$3 -MONGO_PASSWORD=$4 -MONGO_AUTH_DB=$5 - +mongo_host=$1 +mongo_port=$2 +mongo_user=$3 +mongo_password=$4 # 导出数据的数据库和集合 -DATABASE_NAME=$6 -COLLECTION_NAME=$7 +database_name=$5 +collection_name=$6 +# 操作 +controls=$7 # 导出数据保存的目录 EXPORT_DIRECTORY="/data/jieling/hefu" +if [ ! -d "$EXPORT_DIRECTORY" ]; then + mkdir -p $EXPORT_DIRECTORY + echo "已创建目录 $EXPORT_DIRECTORY" +fi + +if [ "$controls" = "dump" ]; then + # 导出数据 + mongodump --host "$mongo_host" --port "$mongo_port" --username "$mongo_user" --password "$mongo_password" --authenticationDatabase admin --db "$database_name" --collection "$collection_name" --out $EXPORT_DIRECTORY + echo "备份数据库 $database_name $collection_name 完成" +elif [ "$controls" = "restore" ]; then + # 导入数据的目录 + IMPORT_DIRECTORY="/data/jieling/hefu/$collection_name" + # 导入数据 + mongorestore --host $mongo_host --port "$mongo_port" --username "$mongo_user" --password "$mongo_password" --authenticationDatabase admin --db "$database_name" "$IMPORT_DIRECTORY" + echo "导入数据库 $collection_name 到 $database_name 完成" +elif [ "$controls" = "drop" ]; then + # 清库命令 + js_command="db.getSiblingDB('${database_name}').${collection_name}.clear()" + #删库 + mongo --host "$mongo_host" --port "$mongo_port" --username "$mongo_user" --password "$mongo_password" --authenticationDatabase admin --eval "$js_command" + echo "清空数据库 $database_name $collection_name 完成" +else + echo "操作参数错误!!! $controls" +fi -# 导入数据的目录 -IMPORT_DIRECTORY="/data/jieling/hefu" -# 导出数据 -mongodump --host $MONGO_HOST --port $MONGO_PORT --username $MONGO_USER --password $MONGO_PASSWORD --authenticationDatabase $MONGO_AUTH_DB --db $DATABASE_NAME --collection $COLLECTION_NAME --out $EXPORT_DIRECTORY -# 导入数据 -mongorestore --host $MONGO_HOST --port $MONGO_PORT --username $MONGO_USER --password $MONGO_PASSWORD --authenticationDatabase $MONGO_AUTH_DB --db $DATABASE_NAME $IMPORT_DIRECTORY \ No newline at end of file diff --git a/src/main/java/com/jmfy/controller/HeFuNewController.java b/src/main/java/com/jmfy/controller/HeFuNewController.java new file mode 100644 index 0000000..1cd78b7 --- /dev/null +++ b/src/main/java/com/jmfy/controller/HeFuNewController.java @@ -0,0 +1,52 @@ +package com.jmfy.controller; + +import com.jmfy.dao.ServerInfoDao; +import com.jmfy.model.ServerAreaInfo; +import com.jmfy.model.ServerAreaInfoManager; +import com.jmfy.model.ServerInfo; +import com.jmfy.utils.JsonUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.util.*; + +@Controller +public class HeFuNewController { + + private static final Logger LOGGER = LoggerFactory.getLogger(HeFuNewController.class); + + @Resource + private ServerInfoDao serverInfoDao; + + + /** + * 批量开启白名单 + * @param request + * @return + * @throws Exception + */ + @RequestMapping(value = "/closeServer", method = {RequestMethod.POST, RequestMethod.GET}) + public @ResponseBody String closeServer(HttpServletRequest request) throws Exception { + HashMap parameterMap = JsonUtil.getInstence().getParameterMap(request); + String[] serverIds = parameterMap.get("serverIds").split("#"); + List strings = Arrays.asList(serverIds); + List allServerInfo = serverInfoDao.getAllServerInfo(); + for (ServerInfo serverInfo : allServerInfo) { + if (strings.contains(serverInfo.getServer_id())) { + serverInfo.setStatus("1"); + serverInfo.setIsWhite("1"); +// serverInfoDao.updateServerInfo(serverInfo.getServer_id(), 1, 1, 0, 0); + } + } + return "服务器:" + parameterMap.get("serverIds").replace("#",",") + " 关服成功"; + } + +} diff --git a/src/main/java/com/jmfy/dao/impl/CHefuDaoImpl.java b/src/main/java/com/jmfy/dao/impl/CHefuDaoImpl.java index ab81638..d695c37 100644 --- a/src/main/java/com/jmfy/dao/impl/CHefuDaoImpl.java +++ b/src/main/java/com/jmfy/dao/impl/CHefuDaoImpl.java @@ -35,7 +35,7 @@ public class CHefuDaoImpl implements CHefuDao { @Override public CHefuInfo findHefuByServerID(int serverId) throws Exception { MongoTemplate mongoTemplate = connect.getMongoTemplete(dbName); - Query query = new Query(Criteria.where("serverId").is(serverId)); + Query query = new Query(Criteria.where("masterServerId").is(serverId)); return mongoTemplate.findOne(query, CHefuInfo.class); } diff --git a/src/main/java/com/jmfy/dao/impl/ServerInfoDaoImpl.java b/src/main/java/com/jmfy/dao/impl/ServerInfoDaoImpl.java index e5bb1b0..b8410f8 100644 --- a/src/main/java/com/jmfy/dao/impl/ServerInfoDaoImpl.java +++ b/src/main/java/com/jmfy/dao/impl/ServerInfoDaoImpl.java @@ -131,7 +131,7 @@ public class ServerInfoDaoImpl implements ServerInfoDao { if (serverInfo.getSub_channel() != null && !"".equals(serverInfo.getSub_channel())){ update.set("sub_channel",serverInfo.getSub_channel()); } -// update.set("isSlave",serverInfo.getIsSlave()); + update.set("isSlave",serverInfo.getIsSlave()); MongoTemplate mongoTemplate = connect.getMongoTemplete(dbName); Query query = new Query(Criteria.where("server_id").is(serverInfo.getServer_id())); mongoTemplate.updateMulti(query, update, ServerInfo.class); diff --git a/src/main/java/com/jmfy/handler/HeFuManager.java b/src/main/java/com/jmfy/handler/HeFuManager.java index a50d7fa..659e0d0 100644 --- a/src/main/java/com/jmfy/handler/HeFuManager.java +++ b/src/main/java/com/jmfy/handler/HeFuManager.java @@ -4,7 +4,9 @@ import com.jmfy.dao.CHefuDao; import com.jmfy.dao.ServerInfoDao; import com.jmfy.model.CHefuInfo; import com.jmfy.model.ServerInfo; +import com.jmfy.utils.AutoServerManager; import com.jmfy.utils.RedisUtil; +import com.jmfy.utils.SeqUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -14,14 +16,11 @@ import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.io.BufferedReader; import java.io.InputStreamReader; -import java.text.SimpleDateFormat; +import java.lang.reflect.Member; import java.util.*; /** - * @Author hj - * @Date 2023/5/11 10:28:41 - * @Description: - * @Version 1.0 + * 合服管理类 */ @Component public class HeFuManager { @@ -29,11 +28,13 @@ public class HeFuManager { private static CHefuDao hefuDao; private static ServerInfoDao serverInfoDao; + private static SeqUtils seqUtils; @Autowired - public HeFuManager(CHefuDao hefuDao, ServerInfoDao serverInfoDao) { + public HeFuManager(CHefuDao hefuDao, ServerInfoDao serverInfoDao, SeqUtils seqUtils) { HeFuManager.hefuDao = hefuDao; HeFuManager.serverInfoDao = serverInfoDao; + HeFuManager.seqUtils = seqUtils; } private static final Map hefuMap = new HashMap<>(); @@ -47,8 +48,7 @@ public class HeFuManager { return masterId == serverId; } - @PostConstruct - public void init(){ + public static void setHefuMap(){ try { List hefuList = hefuDao.findHefuList(); if (hefuList == null || hefuList.isEmpty()){ @@ -64,128 +64,132 @@ public class HeFuManager { } } - /** - * mongo数据库信息 - */ -// @Value("${spring.data.gameMongodb.uri}") - private static String mongoClient; - - private static String path = "/data/jieling/hefu/"; - - /** - * mongo 备份 - */ - private static String MONGO_BACKUPS_COMMAND = "mongodump --forceTableScan --host 10.0.0.176 --port 27017 -u rwuser -p Ysj666_777 --authenticationDatabase admin -d ysj_40001 -o ./"; - /** - * mongo 备份 - */ - private static String MONGO_RESTORE_COMMAND = "mongorestore --host 10.0.0.176 --port 27017 -u rwuser -p Ysj666_777 --authenticationDatabase admin -d ysj_40001 ./"; - + @PostConstruct + public void init(){ + setHefuMap(); + } // hefu|10001|10002#10003#10004 public static void hefu(String cmd) { try { String[] split = cmd.split("\\|"); - int masterId = Integer.parseInt(split[1]); String slave = split[2]; String[] strings = slave.split("#"); - LOGGER.info("合服信息:{}",cmd); - - // mongo连接信息 -// String[] data = mongoData(); -// String nowTime = getNowTime(); -// LOGGER.info("mongo信息:{},date:{}",data.toString(),nowTime); -// -// // 主服 -// boolean script = merageScript(MONGO_BACKUPS_COMMAND, String.valueOf(masterId), data[0], data[1], data[2], data[3], path, nowTime); -// if (!script){ -// LOGGER.error("备份主服中断:{}",masterId); -// throw new Exception("备份主服中断"); -// } -// // 合服 -// for (String s : strings) { -// boolean back = merageScript(MONGO_BACKUPS_COMMAND, s, data[0], data[1], data[2], data[3], path, nowTime); -// if (!back){ -// LOGGER.error("备份从服中断:{}",s); -// throw new Exception("备份从服中断"); -// } -// } -// for (String s : strings) { -// boolean restore = merageScript(MONGO_RESTORE_COMMAND, s, data[0], data[1], data[2], data[3], path, nowTime); -// if (!restore){ -// LOGGER.error("导入中断:{}",s); -// throw new Exception("导入中断"); -// } -// } - - // 处理从服redis - for (String s : strings) { - int slaveId = Integer.parseInt(s); - dealRedis(masterId,slaveId); - } - - // 处理从服的gm服务器信息 - ArrayList list = new ArrayList<>(); - for (String s : strings) { - int slaveId = Integer.parseInt(s); - list.add(slaveId); - upsertServerIpAndPort(masterId,slaveId); - } - - // 合服信息入库 - CHefuInfo hefuInfo = new CHefuInfo(); - hefuInfo.setMasterServerId(masterId); - hefuInfo.setSlaveServerIds(list); - hefuDao.upsertHefuInfo(hefuInfo); - LOGGER.info("合服完成"); + LOGGER.info("合服菜单======================:{}",cmd); + // 主服id + int masterId = Integer.parseInt(split[1]); + // 从服列表 + Set salveList = new HashSet<>(); + Arrays.stream(strings).forEach(v->salveList.add(Integer.parseInt(v))); + // 处理数据库 + dealMongo(masterId, salveList); + // 处理redis + dealRedis(masterId, salveList); + // 处理gm数据库信息 + dealIpPort(masterId, salveList); + // 合服记录入库 + addHeFuInfo(masterId, salveList); + // 重启服务器 + AutoServerManager.rebootServer(String.valueOf(masterId)); + // 更新合服缓存 + setHefuMap(); }catch (Exception e){ e.printStackTrace(); } + LOGGER.info("合服完成==============================/n"); + } + + private static void addHeFuInfo(int masterId, Set salveList) throws Exception { + + // 预防二次合服,删除之前得合服记录 + CHefuInfo hefu = hefuDao.findHefuByServerID(masterId); + if (hefu != null){ + hefuDao.removeHefuInfo(hefu); + } + for (Integer id : salveList) { + CHefuInfo hefu2 = hefuDao.findHefuByServerID(id); + if (hefu2 != null){ + salveList.addAll(hefu2.getSlaveServerIds()); + hefuDao.removeHefuInfo(hefu2); + } + } + + // 创建新得合服记录 + CHefuInfo hefuInfo = new CHefuInfo(); + // 因为库里有自定义得数据,所以从10开始计算 + int hefuId = seqUtils.getSequence("hefu_id") + 10; + hefuInfo.setId(hefuId); + hefuInfo.setMasterServerId(masterId); + hefuInfo.setSlaveServerIds(salveList); + hefuDao.upsertHefuInfo(hefuInfo); + } + + private static void dealMongo(int masterId, Set salveList) { + String userdb = "user", guildb = "guildInfo", maildb = "mailingSystem"; + String dump = "dump", restore = "restore", drop = "drop"; + String[] dbValue = getMongoDbValue(); + LOGGER.info("开始处理合服mongo数据库=================:{}",Arrays.toString(dbValue)); + + String masterServer = "jieling_"+masterId; + // 备份主服得用户表和工会表 + mergeScript(dbValue[0],dbValue[1],dbValue[2],dbValue[3],masterServer,userdb,dump); + mergeScript(dbValue[0],dbValue[1],dbValue[2],dbValue[3],masterServer,guildb,dump); + LOGGER.info("备份主服mongo数据库完成=================:{}",masterServer); + + // 备份从服得用户表和工会表 + for (Integer id : salveList) { + String slaveServer = "jieling_"+id; + mergeScript(dbValue[0],dbValue[1],dbValue[2],dbValue[3],slaveServer,userdb,dump); + mergeScript(dbValue[0],dbValue[1],dbValue[2],dbValue[3],slaveServer,guildb,dump); + LOGGER.info("备份从服mongo数据库完成=================:{}",slaveServer); + } + + // 导入从服得用户表和工会表 + for (Integer id : salveList) { + String slaveServer = "jieling_"+id; + mergeScript(dbValue[0],dbValue[1],dbValue[2],dbValue[3],masterServer,slaveServer,restore); + LOGGER.info("导入从服mongo数据库完成=================:{}==>{}",slaveServer,masterServer); + } + + // 清理主服得全服邮件 + mergeScript(dbValue[0],dbValue[1],dbValue[2],dbValue[3],masterServer,maildb,drop); + LOGGER.info("清理主服全服邮件,合服mongo完成=================:{}",masterServer); + } + + public static String[] getMongoDbValue(){ + String[] result = new String[4]; + String mongodb = AutoServerManager.getGameMongodb(); + String[] split = mongodb.split("@"); + String[] split2 = split[0].split(":"); + String[] split3 = split[1].split(":"); + result[0] = split2[0];// ip + result[1] = split2[1];// port + result[2] = split3[0];// account + result[3] = split3[1];// pwd + return result; } /** - * 获取当前时间 - * - * @return + * 合并命令 */ - private static String getNowTime() { - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH"); - return sdf.format(new Date(System.currentTimeMillis())); - } - - /** - * - * @param serverId - * @param mongodbHost - * @param mongoProt - * @param mongoUser - * @param mongoPaw - * @param mongoPath - * @param date - */ - public boolean merageScript(String script, String serverId, String mongodbHost, String mongoProt, String mongoUser, String mongoPaw, String mongoPath, String date){ - String command = script.replace("10.0.0.176", mongodbHost) - .replace("27017", mongoProt) - .replace("rwuser", mongoUser) - .replace("Ysj666_777", mongoPaw) - .replace("ysj_40001", "jieling_" + serverId) - .replace("./", mongoPath + date + "/"); + public static void mergeScript(String ip, String port, String user, String pwd, String db1, String coll, String con){ + String script = "config/script/hefu_mongo.sh"; + String space = " "; + String command = "bash" + space + script + space + ip + space + port + space + user + space + pwd + + space + db1 + space + coll + space + con; boolean isSuccess = exeShell(command); if (isSuccess) { LOGGER.info("mongoBackups==>exeShell:{}", command); } else { LOGGER.error("mongoBackups==>exeShell:{}", command); } - return isSuccess; } /** * 执行shell命令 - * - * @param command */ public static boolean exeShell(String command) { - Process process = null; + Process process; try { process = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader( @@ -205,26 +209,28 @@ public class HeFuManager { return true; } - public static String[] mongoData() { - //"mongodb://zhj:zhj666@60.1.1.22:27017/?authSource\u003dadmin" - String[] mongdData = mongoClient.split(":"); - String user = mongdData[1].substring(2); - String[] hosts = mongdData[2].split("@"); - String password = hosts[0]; - String host = hosts[1]; - String port = mongdData[3].split("/")[0]; - String[] datas = new String[4]; - datas[0] = host; - datas[1] = port; - datas[2] = user; - datas[3] = password; - return datas; + /** + * 处理ip和端口 + * @param masterSID 主服id + * @param slaveId 从服id列表 + * @throws Exception 异常 + */ + private static void dealIpPort(int masterSID, Set slaveId) throws Exception { + for (Integer slave : slaveId) { + CHefuInfo hefuInfo = hefuDao.findHefuByServerID(slave); + if (hefuInfo != null){ + for (Integer serverId : hefuInfo.getSlaveServerIds()) { + upsertServerIpAndPort(masterSID, serverId); + } + }else { + upsertServerIpAndPort(masterSID, slave); + } + } } - public static void upsertServerIpAndPort(int masterSID, int slowSID) throws Exception { - LOGGER.info("开始处理IP和端口===========,a:{},b:{}",masterSID,slowSID); + public static void upsertServerIpAndPort(int masterSID, int slaveSID) throws Exception { ServerInfo masterServer = serverInfoDao.getServerInfo(String.valueOf(masterSID)); - ServerInfo slaveServer = serverInfoDao.getServerInfo(String.valueOf(slowSID)); + ServerInfo slaveServer = serverInfoDao.getServerInfo(String.valueOf(slaveSID)); slaveServer.setIp(masterServer.getIp()); slaveServer.setPort(masterServer.getPort()); slaveServer.setCoreName(masterServer.getCoreName()); @@ -244,27 +250,29 @@ public class HeFuManager { public static final String GUILD_CHALLENGE_RANK = "GUILD_CHALLENGE_RANK";//公会副本排行榜 public static final String ARENA_RANK = "ARENA_RANK";//竞技场排行榜 - public static void dealRedis(int masterSID, int slowSID){ - LOGGER.info("开始处理redis排行榜===========,a:{},b:{}",masterSID,slowSID); - // 战力排行榜处理 - defaultRankOfRedis(FORCE_CURR_RANK,masterSID,slowSID); - // 心魔试炼排行榜处理 - defaultRankOfRedis(MONSTER_ATTACK_RANK,masterSID,slowSID); - // 公会战力排行榜处理 - defaultRankOfRedis(GUILD_FORCE_RANK,masterSID,slowSID); - // 山河社稷图星级排行榜处理 - defaultRankOfRedis(SHAN_HE_SHE_JI_STAR_RANK,masterSID,slowSID); - // 山河社稷图关卡等级排行榜处理 - defaultRankOfRedis(SHAN_HE_SHE_JI_CHAPTER_RANK,masterSID,slowSID); - // 竞技场防御编队处理 - defaultRankOfRedis(AREDEF_TEAM_FORCE_RANK,masterSID,slowSID); - // 四灵试炼排行榜处理 - fourRankOfRedis(FOUR_CHALLENGE_TIER_RANK,masterSID,slowSID); - // 公会副本排行榜处理 - deleteRankOfRedis(GUILD_CHALLENGE_RANK,masterSID); - // 竞技场排行榜处理 - deleteRankOfRedis(ARENA_RANK,masterSID); - LOGGER.info("处理redis排行榜完成"); + public static void dealRedis(int masterSID, Set slaveId){ + for (Integer slowSID : slaveId) { + LOGGER.info("开始处理redis排行榜===========,master:{},slave:{}",masterSID,slowSID); + // 战力排行榜处理 + defaultRankOfRedis(FORCE_CURR_RANK,masterSID,slowSID); + // 心魔试炼排行榜处理 + defaultRankOfRedis(MONSTER_ATTACK_RANK,masterSID,slowSID); + // 公会战力排行榜处理 + defaultRankOfRedis(GUILD_FORCE_RANK,masterSID,slowSID); + // 山河社稷图星级排行榜处理 + defaultRankOfRedis(SHAN_HE_SHE_JI_STAR_RANK,masterSID,slowSID); + // 山河社稷图关卡等级排行榜处理 + defaultRankOfRedis(SHAN_HE_SHE_JI_CHAPTER_RANK,masterSID,slowSID); + // 竞技场防御编队处理 + defaultRankOfRedis(AREDEF_TEAM_FORCE_RANK,masterSID,slowSID); + // 四灵试炼排行榜处理 + fourRankOfRedis(FOUR_CHALLENGE_TIER_RANK,masterSID,slowSID); + // 公会副本排行榜处理 + deleteRankOfRedis(GUILD_CHALLENGE_RANK,masterSID); + // 竞技场排行榜处理 + deleteRankOfRedis(ARENA_RANK,masterSID); + LOGGER.info("{} 处理redis排行榜完成======================", slowSID); + } } public static void defaultRankOfRedis(String key, int masterSID, int slowSID){ diff --git a/src/main/java/com/jmfy/model/CHefuInfo.java b/src/main/java/com/jmfy/model/CHefuInfo.java index 133c2ce..bdcd203 100644 --- a/src/main/java/com/jmfy/model/CHefuInfo.java +++ b/src/main/java/com/jmfy/model/CHefuInfo.java @@ -1,18 +1,20 @@ package com.jmfy.model; import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; +import java.util.ArrayList; import java.util.List; +import java.util.Set; /** - * @Author hj - * @Date 2023/5/17 17:22:10 - * @Description: - * @Version 1.0 + * 合服基础类 */ @Document(collection = "c_hefu_info") +@CompoundIndexes({@CompoundIndex(name = "masterIndex", def = "{'masterServerId': 1}")}) public class CHefuInfo { @Id @@ -47,4 +49,8 @@ public class CHefuInfo { public void setSlaveServerIds(List slaveServerIds) { this.slaveServerIds = slaveServerIds; } + + public void setSlaveServerIds(Set slaveServerIds) { + this.slaveServerIds = new ArrayList<>(slaveServerIds); + } }