合服优化,运行二次合服

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
# 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

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
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);
}

View File

@ -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);

View File

@ -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<Integer, Integer> hefuMap = new HashMap<>();
@ -47,8 +48,7 @@ public class HeFuManager {
return masterId == serverId;
}
@PostConstruct
public void init(){
public static void setHefuMap(){
try {
List<CHefuInfo> 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<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("合服完成");
LOGGER.info("合服菜单======================{}",cmd);
// 主服id
int masterId = Integer.parseInt(split[1]);
// 从服列表
Set<Integer> 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<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() {
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<Integer> 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<Integer> 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){

View File

@ -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<Integer> slaveServerIds) {
this.slaveServerIds = slaveServerIds;
}
public void setSlaveServerIds(Set<Integer> slaveServerIds) {
this.slaveServerIds = new ArrayList<>(slaveServerIds);
}
}