µ±Ç°Î»Öà : 145zÓÎÏ·Õ¾¡¡|¡¡Ä§Á¦±¦±´¡¡|¡¡¼¼Êõ½Ì³Ì¡¡|¡¡

ħÁ¦¸ßЧÔËάÊֲ᣺³¤ÆÚÎȶ¨ÔËÓªµÄ30¸öºËÐļ¼Êõµã

Èȶȣº
רΪ³ÖÐøÔËÓª´òÔìµÄʵսָÄÏ£¬º­¸Ç·þÎñÆ÷µ÷ÓÅ¡¢Ó¦¼±´¦Àí¡¢Íæ¼ÒÁô´æ²ßÂԵȹؼüÔËά³¡¾°£¬½â¾ö99%³£¼ûÎÊÌâ

🛠️ ·þÎñÆ÷ÐÔÄÜÉî¶ÈÓÅ»¯·½°¸

🔧 ·þÎñ¶ËѹÁ¦²âÊÔ¹¤¾ß

ʹÓÃרÓÃѹ²â¹¤¾ß£¨Ê¾Àý£©

./cg_stress_test -n 500 -t 180 # Ä£Äâ500Íæ¼ÒÔÚÏß3·ÖÖÓ

¹Ø¼ü¼à¿ØÖ¸±ê£º

¨X¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨j¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨j¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨[
Ö¸±ê ¨U °²È«ãÐÖµ ¨U ΣÏÕ״̬ ¨U

¨d¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨p¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨p¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨g
CPU¸ºÔØ(1min) ¨U < 3.0 ¨U > 5.0 (ºìÉ«) ¨U

µØÍ¼·þÑÓ³Ù ¨U < 50ms ¨U > 200ms ¨U

Êý¾Ý¿âÏìÓ¦ ¨U < 10ms ¨U > 100ms ¨U

¨^¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨m¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨m¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨a

📦 Êý¾Ý¿â·Ö±í²ßÂÔʵս

Íæ¼ÒÊý¾Ý·ÖÇø·½°¸£º
-- °´½ÇÉ«µÈ¼¶·Ö±í´æ´¢
CREATE TABLE char_data_1_50 LIKE char_data_template;
CREATE TABLE char_data_51_100 LIKE char_data_template;
ALTER TABLE char_data_1_50 PARTITION BY RANGE(level) (
PARTITION p0 VALUES LESS THAN (51)
);

🚨 ½ô¼±¹ÊÕÏ´¦Àí¹¤¾ßÏä

💥 Êý¾Ý¿â±ÀÀ£»Ö¸´Á÷³Ì

graph TB
A[·þÎñÒì³£] --> B{ÅŲ鲽Öè}
--> C[¼ì²éMySQLÈÕÖ¾]

--> D[³¢ÊÔ°²È«Ä£Ê½Æô¶¯]

--> E[³É¹¦£¿]

-- ÊÇ --> F[ÔöÁ¿±¸·Ý]

-- ·ñ --> G[Ö´ÐÐÐÞ¸´ÃüÁî]

--> H[myisamchk --recover]

--> I[»Ö¸´³É¹¦£¿]

-- ·ñ --> J[ʹÓñ¸·Ý»Ö¸´]

🔄 Íæ¼ÒÊý¾ÝÐÞ¸´ÃüÁ

»Øµµ²Ù×÷£¨Ö¸¶¨Ê±¼äµã£©

./gm_tool rollback_char Íæ¼ÒID '2024-07-20 12:00:00'

ÎïÆ·¶ªÊ§²¹³¥

INSERT INTO items (char_id, item_id) VALUES
(10245, 12345),
(10245, 54321);

📊 Íæ¼ÒÔËÓª»Æ½ð¹«Ê½

🎯 ¾«×¼»î¶¯Éè¼Æ¿ò¼Ü

»î¶¯Ð§Òæ = (ÔÚÏßʱ³¤½±Àø × 0.3) + (ÐÂÍæ¼ÒÑûÇë × 0.5) + (¸¶·Ñת»¯ × 0.2)

ÆßϦ»î¶¯°¸Àý£º
function QixiEvent()
local activePlayers = GetOnlineCount() -- »ñÈ¡µ±Ç°ÔÚÏß
if activePlayers < 50 then
StartDoubleExp() -- ÈËÊý²»×ãʱÆô¶¯Ë«±¶¾­Ñé
else
StartBossRush(11003) -- ÕÙ»½Äê¶ÈÏÞ¶¨BOSS
end
LogEvent("ÆßϦ»î¶¯¼¤»îÔÚÏߣº"..activePlayers)
end

🛡️ °²È«·ÀÓùÇ¿»¯´ëÊ©

🌐 DDoS·À»¤ÅäÖÃ

Nginx·ÀÓùÅäÖÃʾÀý

limit_req_zone $binary_remote_addr zone=antiddos:10m rate=30r/s;

server {
location /gamesvr {
limit_req zone=antiddos burst=100;
proxy_pass http://backend;
proxy_connect_timeout 3s; # ¿ìËÙʧ°Ü
}

🔍 Íâ¹ÒÌØÕ÷À¹½Ø¿â

×îмì²â¹æÔò£¨2024.07¸üУ©£º
speed_detect = r'SetSpeed.*?' -- ±äËÙ¼ì²â
wallhack_pattern = r'Coord[0-9]{5},[0-9]{5}' -- ×ø±êÒì³£

📈 Êý¾Ý»¯ÔËÓªÒDZí°å

¹Ø¼üÔËÓªÖ¸±ê¼à¿Ø

-- ÈÕ±¨×Ô¶¯Éú³É½Å±¾
SELECT
DATE(login_time) AS ÈÕÆÚ,
COUNT(DISTINCT uid) AS DAU,
ROUND(AVG(online_minutes),1) AS È˾ùÔÚÏß,
SUM(recharge_amount) AS ³äÖµ×ܶî
FROM player_stats
GROUP BY DATE(login_time)
ORDER BY ÈÕÆÚ DESC LIMIT 7;

Á÷Ê§Íæ¼ÒÔ¤¾¯Ä£ÐÍ£º

Á÷ʧ·çÏÕ = (×îºóÔÚÏß > 72h) + (µÈ¼¶>40) + (×î½üµÇ¼ÌìÊý¼õÉÙ)
·çÏÕÖµ > 2 → ´¥·¢ÓʼþÕÙ»Ø

🧩 ²å¼þ¿ª·¢¸ß¼¶¼¼ÇÉ

📦 ¿ç°æ±¾¼æÈÝÄ£¿é

c++
// C++²å¼þ¼æÈݲãʾÀý
if defined(CROSSGATE_VER_37)

#include "gmsv37_api.h"
elif defined(CROSSGATE_VER_40)

#include "gmsv40_api.h"
endif

void CustomFunction() {
// °æ±¾ÊÊÅä´úÂë

⚠️ ·¨ÂɺϹæÌرðÌáÐÑ
2024ÄêйæÖصãÌáʾ£º

- Íæ¼ÒÊý¾Ý´æ´¢±ØÐëÔÚÖйú´ó½¾³ÄÚ·þÎñÆ÷

- µÇ½½çÃæÐèÃ÷È·±ê×¢£º"·Ç¹Ù·½»³¾É·þÎñÆ÷"

- Íæ¼ÒЭÒéÐë°üº¬£º"ËùÓÐÓÎÏ·×ÊÔ´Öø×÷Ȩ¹éÖêʽ»áÉçENIXËùÓÐ"

¡ï Ç¿ÁÒ½¨Ò飺

ʹÓÿªÔ´·þÎñ¶Ë´úÂ루ÈçCROSSGATE-OSS£©¿É½µµÍ90%·¨ÂÉ·çÏÕ

ÔËάóðÑÔ£º
¼¼Êõ±¸·Ý·½°¸£¨3-2-1Ô­Ôò£©£º

3·Ý±¸·Ý → 2ÖÖ´æ´¢½éÖÊ → 1·ÝÒìµØ±£´æ

Íæ¼ÒÊý¾Ý±¸·ÝÃüÁ

mysqldump -uadmin -p --single-transaction crossgate > /backup/crossgate_$(date +%s).sql

(¸½×¢£ºÎÄÖм¼Êõ·½°¸ÊÊÓÃÓÚħÁ¦±¦±´3.0-4.0¸÷°æ±¾£¬Çë¸ù¾Ýʵ¼Ê»·¾³µ÷ÊÔ)