合服优化,运行二次合服

master
PC-202302260912\Administrator 2023-08-22 18:48:13 +08:00
parent af779d5dfd
commit 4e08c1a850
6 changed files with 246 additions and 162 deletions

View File

@ -1,24 +1,42 @@
#!/bin/bash #!/bin/bash
# MongoDB的账号、密码、端口等信息 # MongoDB的账号、密码、端口等信息
MONGO_HOST=$1 mongo_host=$1
MONGO_PORT=$2 mongo_port=$2
MONGO_USER=$3 mongo_user=$3
MONGO_PASSWORD=$4 mongo_password=$4
MONGO_AUTH_DB=$5
# 导出数据的数据库和集合 # 导出数据的数据库和集合
DATABASE_NAME=$6 database_name=$5
COLLECTION_NAME=$7 collection_name=$6
# 操作
controls=$7
# 导出数据保存的目录 # 导出数据保存的目录
EXPORT_DIRECTORY="/data/jieling/hefu" 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

View File

@ -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<String, String> parameterMap = JsonUtil.getInstence().getParameterMap(request);
String[] serverIds = parameterMap.get("serverIds").split("#");
List<String> strings = Arrays.asList(serverIds);
List<ServerInfo> 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("#",",") + " 关服成功";
}
}

View File

@ -35,7 +35,7 @@ public class CHefuDaoImpl implements CHefuDao {
@Override @Override
public CHefuInfo findHefuByServerID(int serverId) throws Exception { public CHefuInfo findHefuByServerID(int serverId) throws Exception {
MongoTemplate mongoTemplate = connect.getMongoTemplete(dbName); 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); return mongoTemplate.findOne(query, CHefuInfo.class);
} }

View File

@ -131,7 +131,7 @@ public class ServerInfoDaoImpl implements ServerInfoDao {
if (serverInfo.getSub_channel() != null && !"".equals(serverInfo.getSub_channel())){ if (serverInfo.getSub_channel() != null && !"".equals(serverInfo.getSub_channel())){
update.set("sub_channel",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); MongoTemplate mongoTemplate = connect.getMongoTemplete(dbName);
Query query = new Query(Criteria.where("server_id").is(serverInfo.getServer_id())); Query query = new Query(Criteria.where("server_id").is(serverInfo.getServer_id()));
mongoTemplate.updateMulti(query, update, ServerInfo.class); mongoTemplate.updateMulti(query, update, ServerInfo.class);

View File

@ -4,7 +4,9 @@ import com.jmfy.dao.CHefuDao;
import com.jmfy.dao.ServerInfoDao; import com.jmfy.dao.ServerInfoDao;
import com.jmfy.model.CHefuInfo; import com.jmfy.model.CHefuInfo;
import com.jmfy.model.ServerInfo; import com.jmfy.model.ServerInfo;
import com.jmfy.utils.AutoServerManager;
import com.jmfy.utils.RedisUtil; import com.jmfy.utils.RedisUtil;
import com.jmfy.utils.SeqUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -14,14 +16,11 @@ import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.text.SimpleDateFormat; import java.lang.reflect.Member;
import java.util.*; import java.util.*;
/** /**
* @Author hj *
* @Date 2023/5/11 10:28:41
* @Description:
* @Version 1.0
*/ */
@Component @Component
public class HeFuManager { public class HeFuManager {
@ -29,11 +28,13 @@ public class HeFuManager {
private static CHefuDao hefuDao; private static CHefuDao hefuDao;
private static ServerInfoDao serverInfoDao; private static ServerInfoDao serverInfoDao;
private static SeqUtils seqUtils;
@Autowired @Autowired
public HeFuManager(CHefuDao hefuDao, ServerInfoDao serverInfoDao) { public HeFuManager(CHefuDao hefuDao, ServerInfoDao serverInfoDao, SeqUtils seqUtils) {
HeFuManager.hefuDao = hefuDao; HeFuManager.hefuDao = hefuDao;
HeFuManager.serverInfoDao = serverInfoDao; HeFuManager.serverInfoDao = serverInfoDao;
HeFuManager.seqUtils = seqUtils;
} }
private static final Map<Integer, Integer> hefuMap = new HashMap<>(); private static final Map<Integer, Integer> hefuMap = new HashMap<>();
@ -47,8 +48,7 @@ public class HeFuManager {
return masterId == serverId; return masterId == serverId;
} }
@PostConstruct public static void setHefuMap(){
public void init(){
try { try {
List<CHefuInfo> hefuList = hefuDao.findHefuList(); List<CHefuInfo> hefuList = hefuDao.findHefuList();
if (hefuList == null || hefuList.isEmpty()){ if (hefuList == null || hefuList.isEmpty()){
@ -64,128 +64,132 @@ public class HeFuManager {
} }
} }
/** @PostConstruct
* mongo public void init(){
*/ setHefuMap();
// @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 ./";
// hefu|10001|10002#10003#10004 // hefu|10001|10002#10003#10004
public static void hefu(String cmd) { public static void hefu(String cmd) {
try { try {
String[] split = cmd.split("\\|"); String[] split = cmd.split("\\|");
int masterId = Integer.parseInt(split[1]);
String slave = split[2]; String slave = split[2];
String[] strings = slave.split("#"); String[] strings = slave.split("#");
LOGGER.info("合服信息:{}",cmd); LOGGER.info("合服菜单======================{}",cmd);
// 主服id
// mongo连接信息 int masterId = Integer.parseInt(split[1]);
// String[] data = mongoData(); // 从服列表
// String nowTime = getNowTime(); Set<Integer> salveList = new HashSet<>();
// LOGGER.info("mongo信息{},date:{}",data.toString(),nowTime); Arrays.stream(strings).forEach(v->salveList.add(Integer.parseInt(v)));
// // 处理数据库
// // 主服 dealMongo(masterId, salveList);
// boolean script = merageScript(MONGO_BACKUPS_COMMAND, String.valueOf(masterId), data[0], data[1], data[2], data[3], path, nowTime); // 处理redis
// if (!script){ dealRedis(masterId, salveList);
// LOGGER.error("备份主服中断:{}",masterId); // 处理gm数据库信息
// throw new Exception("备份主服中断"); dealIpPort(masterId, salveList);
// } // 合服记录入库
// // 合服 addHeFuInfo(masterId, salveList);
// for (String s : strings) { // 重启服务器
// boolean back = merageScript(MONGO_BACKUPS_COMMAND, s, data[0], data[1], data[2], data[3], path, nowTime); AutoServerManager.rebootServer(String.valueOf(masterId));
// if (!back){ // 更新合服缓存
// LOGGER.error("备份从服中断:{}",s); setHefuMap();
// 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<Integer> 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("合服完成");
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
} }
LOGGER.info("合服完成==============================/n");
}
private static void addHeFuInfo(int masterId, Set<Integer> 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<Integer> 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() { public static void mergeScript(String ip, String port, String user, String pwd, String db1, String coll, String con){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH"); String script = "config/script/hefu_mongo.sh";
return sdf.format(new Date(System.currentTimeMillis())); String space = " ";
} String command = "bash" + space + script + space + ip + space + port + space + user + space + pwd +
space + db1 + space + coll + space + con;
/**
*
* @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 + "/");
boolean isSuccess = exeShell(command); boolean isSuccess = exeShell(command);
if (isSuccess) { if (isSuccess) {
LOGGER.info("mongoBackups==>exeShell:{}", command); LOGGER.info("mongoBackups==>exeShell:{}", command);
} else { } else {
LOGGER.error("mongoBackups==>exeShell:{}", command); LOGGER.error("mongoBackups==>exeShell:{}", command);
} }
return isSuccess;
} }
/** /**
* shell * shell
*
* @param command
*/ */
public static boolean exeShell(String command) { public static boolean exeShell(String command) {
Process process = null; Process process;
try { try {
process = Runtime.getRuntime().exec(command); process = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader( BufferedReader reader = new BufferedReader(
@ -205,26 +209,28 @@ public class HeFuManager {
return true; return true;
} }
public static String[] mongoData() { /**
//"mongodb://zhj:zhj666@60.1.1.22:27017/?authSource\u003dadmin" * ip
String[] mongdData = mongoClient.split(":"); * @param masterSID id
String user = mongdData[1].substring(2); * @param slaveId id
String[] hosts = mongdData[2].split("@"); * @throws Exception
String password = hosts[0]; */
String host = hosts[1]; private static void dealIpPort(int masterSID, Set<Integer> slaveId) throws Exception {
String port = mongdData[3].split("/")[0]; for (Integer slave : slaveId) {
String[] datas = new String[4]; CHefuInfo hefuInfo = hefuDao.findHefuByServerID(slave);
datas[0] = host; if (hefuInfo != null){
datas[1] = port; for (Integer serverId : hefuInfo.getSlaveServerIds()) {
datas[2] = user; upsertServerIpAndPort(masterSID, serverId);
datas[3] = password; }
return datas; }else {
upsertServerIpAndPort(masterSID, slave);
}
}
} }
public static void upsertServerIpAndPort(int masterSID, int slowSID) throws Exception { public static void upsertServerIpAndPort(int masterSID, int slaveSID) throws Exception {
LOGGER.info("开始处理IP和端口===========a{}b:{}",masterSID,slowSID);
ServerInfo masterServer = serverInfoDao.getServerInfo(String.valueOf(masterSID)); 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.setIp(masterServer.getIp());
slaveServer.setPort(masterServer.getPort()); slaveServer.setPort(masterServer.getPort());
slaveServer.setCoreName(masterServer.getCoreName()); 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 GUILD_CHALLENGE_RANK = "GUILD_CHALLENGE_RANK";//公会副本排行榜
public static final String ARENA_RANK = "ARENA_RANK";//竞技场排行榜 public static final String ARENA_RANK = "ARENA_RANK";//竞技场排行榜
public static void dealRedis(int masterSID, int slowSID){ public static void dealRedis(int masterSID, Set<Integer> slaveId){
LOGGER.info("开始处理redis排行榜===========a{}b:{}",masterSID,slowSID); for (Integer slowSID : slaveId) {
// 战力排行榜处理 LOGGER.info("开始处理redis排行榜===========master{}slave:{}",masterSID,slowSID);
defaultRankOfRedis(FORCE_CURR_RANK,masterSID,slowSID); // 战力排行榜处理
// 心魔试炼排行榜处理 defaultRankOfRedis(FORCE_CURR_RANK,masterSID,slowSID);
defaultRankOfRedis(MONSTER_ATTACK_RANK,masterSID,slowSID); // 心魔试炼排行榜处理
// 公会战力排行榜处理 defaultRankOfRedis(MONSTER_ATTACK_RANK,masterSID,slowSID);
defaultRankOfRedis(GUILD_FORCE_RANK,masterSID,slowSID); // 公会战力排行榜处理
// 山河社稷图星级排行榜处理 defaultRankOfRedis(GUILD_FORCE_RANK,masterSID,slowSID);
defaultRankOfRedis(SHAN_HE_SHE_JI_STAR_RANK,masterSID,slowSID); // 山河社稷图星级排行榜处理
// 山河社稷图关卡等级排行榜处理 defaultRankOfRedis(SHAN_HE_SHE_JI_STAR_RANK,masterSID,slowSID);
defaultRankOfRedis(SHAN_HE_SHE_JI_CHAPTER_RANK,masterSID,slowSID); // 山河社稷图关卡等级排行榜处理
// 竞技场防御编队处理 defaultRankOfRedis(SHAN_HE_SHE_JI_CHAPTER_RANK,masterSID,slowSID);
defaultRankOfRedis(AREDEF_TEAM_FORCE_RANK,masterSID,slowSID); // 竞技场防御编队处理
// 四灵试炼排行榜处理 defaultRankOfRedis(AREDEF_TEAM_FORCE_RANK,masterSID,slowSID);
fourRankOfRedis(FOUR_CHALLENGE_TIER_RANK,masterSID,slowSID); // 四灵试炼排行榜处理
// 公会副本排行榜处理 fourRankOfRedis(FOUR_CHALLENGE_TIER_RANK,masterSID,slowSID);
deleteRankOfRedis(GUILD_CHALLENGE_RANK,masterSID); // 公会副本排行榜处理
// 竞技场排行榜处理 deleteRankOfRedis(GUILD_CHALLENGE_RANK,masterSID);
deleteRankOfRedis(ARENA_RANK,masterSID); // 竞技场排行榜处理
LOGGER.info("处理redis排行榜完成"); deleteRankOfRedis(ARENA_RANK,masterSID);
LOGGER.info("{} 处理redis排行榜完成======================", slowSID);
}
} }
public static void defaultRankOfRedis(String key, int masterSID, int slowSID){ public static void defaultRankOfRedis(String key, int masterSID, int slowSID){

View File

@ -1,18 +1,20 @@
package com.jmfy.model; package com.jmfy.model;
import org.springframework.data.annotation.Id; 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.Document;
import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.data.mongodb.core.mapping.Field;
import java.util.ArrayList;
import java.util.List; 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") @Document(collection = "c_hefu_info")
@CompoundIndexes({@CompoundIndex(name = "masterIndex", def = "{'masterServerId': 1}")})
public class CHefuInfo { public class CHefuInfo {
@Id @Id
@ -47,4 +49,8 @@ public class CHefuInfo {
public void setSlaveServerIds(List<Integer> slaveServerIds) { public void setSlaveServerIds(List<Integer> slaveServerIds) {
this.slaveServerIds = slaveServerIds; this.slaveServerIds = slaveServerIds;
} }
public void setSlaveServerIds(Set<Integer> slaveServerIds) {
this.slaveServerIds = new ArrayList<>(slaveServerIds);
}
} }