Kaynağa Gözat

redis部署文档fix;增加合服redis脚本

Jim 1 yıl önce
ebeveyn
işleme
d12285c3ce

+ 62 - 0
RO_Server_Trunk-branch_0.1.39/scripts/copy_redis.sh

@@ -0,0 +1,62 @@
+#!/bin/bash
+
+# 检查参数数量
+if [ "$#" -ne 2 ]; then
+    echo "用法: $0 源数据库 目标数据库"
+    exit 1
+fi
+
+# 获取源数据库和目标数据库
+src_db=$1
+dst_db=$2
+
+# 初始化游标
+cursor=0
+
+# 使用 SCAN 分批次扫描键
+while true; do
+    # 扫描一批键
+    result=$(redis-cli -n $src_db SCAN $cursor MATCH "*" COUNT 100)
+    cursor=$(echo "$result" | head -n 1)  # 获取新的游标
+    keys=$(echo "$result" | tail -n +2)   # 获取当前批次的键
+
+    # 遍历当前批次的键
+    for key in $keys; do
+        # 检查键名是否包含源数据库编号,如果是则替换为目标数据库编号
+        new_key=$(echo "$key" | sed "s/account_${src_db}_/account_${dst_db}_/g")
+
+        # 获取键的类型
+        type=$(redis-cli -n $src_db TYPE "$key")
+
+        # 根据类型复制数据
+        case $type in
+            "string")
+                value=$(redis-cli -n $src_db GET "$key")
+                redis-cli -n $dst_db SET "$new_key" "$value"
+                ;;
+            "hash")
+                fields=$(redis-cli -n $src_db HGETALL "$key")
+                redis-cli -n $dst_db HMSET "$new_key" $fields
+                ;;
+            "list")
+                elements=$(redis-cli -n $src_db LRANGE "$key" 0 -1)
+                redis-cli -n $dst_db RPUSH "$new_key" $elements
+                ;;
+            "set")
+                members=$(redis-cli -n $src_db SMEMBERS "$key")
+                redis-cli -n $dst_db SADD "$new_key" $members
+                ;;
+            "zset")
+                members=$(redis-cli -n $src_db ZRANGE "$key" 0 -1 WITHSCORES)
+                redis-cli -n $dst_db ZADD "$new_key" $members
+                ;;
+        esac
+    done
+
+    # 如果游标为 0,表示扫描完成
+    if [ "$cursor" -eq 0 ]; then
+        break
+    fi
+done
+
+echo "数据复制完成!"

+ 65 - 0
RO_Server_Trunk-branch_0.1.39/scripts/merge_redis.sh

@@ -0,0 +1,65 @@
+#!/bin/bash
+
+# 定义迁移函数
+migrate_db() {
+    local src_db=$1
+    local dst_db=$2
+    local cursor=0
+    local batch_size=500  # 根据实际情况调整批次大小
+
+    while true; do
+        # 使用SCAN分批次获取键(带超时设置)
+        result=$(timeout 30 redis-cli -n "$src_db" SCAN "$cursor" MATCH "*" COUNT "$batch_size")
+        cursor=$(echo "$result" | head -n 1)
+        keys=$(echo "$result" | tail -n +2)
+
+        [ -z "$keys" ] && break
+
+        # 使用管道处理减少子进程调用
+        {
+            echo "$keys" | while read -r key; do
+                # 键名替换
+                new_key=$(echo "$key" | sed "s/account_${src_db}_/account_${dst_db}_/g")
+
+                # 使用管道处理不同类型的数据
+                type=$(redis-cli -n "$src_db" TYPE "$key" | tr -d '\r')
+
+                case "$type" in
+                    string)
+                        redis-cli -n "$src_db" GET "$key" | xargs -I{} redis-cli -n "$dst_db" SET "$new_key" "{}"
+                        ;;
+                    hash)
+                        redis-cli -n "$src_db" HGETALL "$key" | awk 'NR%2==1 {k=$0} NR%2==0 {print k, $0}' | xargs -L 2 redis-cli -n "$dst_db" HMSET "$new_key"
+                        ;;
+                    list)
+                        redis-cli -n "$src_db" LRANGE "$key" 0 -1 | xargs -I{} redis-cli -n "$dst_db" RPUSH "$new_key" "{}"
+                        ;;
+                    set)
+                        redis-cli -n "$src_db" SMEMBERS "$key" | xargs -I{} redis-cli -n "$dst_db" SADD "$new_key" "{}"
+                        ;;
+                    zset)
+                        redis-cli -n "$src_db" ZRANGE "$key" 0 -1 WITHSCORES | awk '{if(NR>1) print $1, $2}' | xargs -L 2 redis-cli -n "$dst_db" ZADD "$new_key"
+                        ;;
+                    *)
+                        echo "Unsupported type: $type for key: $key"
+                        ;;
+                esac
+            done
+        } | parallel -j 8  # 使用parallel并行处理每个批次
+    done
+}
+
+# 控制并发迁移的任务数量
+max_concurrency=4
+semaphore=$(mktemp)
+
+for db in {1..30}; do
+    (
+        flock -x 200
+        migrate_db "$db" "$db"
+    ) 200>"$semaphore"
+done
+
+wait
+rm -f "$semaphore"
+echo "All databases migrated successfully!"

+ 7 - 15
RO_Server_Trunk-branch_0.1.39/word/redis部署优化.md

@@ -5,22 +5,14 @@
  - 每台机器开多个服,都共用本机的一个redis,单机模式,每当redis save/bgsave时,会占用大量cpu资源,影响游戏业务
 
 ### 优化后
- - 在从节点机器上开2个从节点,一个连国内测试服(6380端口,配置文件:redis_cn.conf),一个连国外测试服(6381端口,配置文件:redis_overseas.conf) 
- - 游戏服上的redis节点,作为主节点,主节点不做自动备份
- - 从节点开启自动备份,备份文件名分别为dump_cn.rdb,dump_overseas.rdb
+ - ~~在从节点机器上开2个从节点,一个连国内测试服(6380端口,配置文件:redis_cn.conf),一个连国外测试服(6381端口,配置文件:redis_overseas.conf)~~ 
+ - ~~游戏服上的redis节点,作为主节点,主节点不做自动备份~~
+ - ~~从节点开启自动备份,备份文件名分别为dump_cn.rdb,dump_overseas.rdb~~
+ - 单独开一台redis机器,游戏服连接这台机器得redis
+ - 注意服务器安全,要配置白名单,只允许游戏服的ip访问这个端口,或者看有必要的话换个端口(之前测试的时候机器被攻击了,怀疑就是通过6379这个端口)
 
 ### 部署方式
- - 游戏服务器上修改redis.conf: bind 后面加个本机内网ip;save 改为 ”“。重启redis
- - 在从节点机器上拷贝redis_cn.conf为redis_xxx.conf(xxx 取个名字,要能标识为对应哪个环境的节点)并修改 
-   - replicaof 后面的ip改为上一步中bind加的内网ip
-   - port 改一个没被占用的端口
-   - 修改pidfile、pidfile、dbfilename:
-   ```
-   vim redis_xxx.conf
-   /_cn/_xxx/g
-   ```
-   - 重启redis
+ - redis机器上修改redis.conf: bind 后面加上对应内游戏服的内网ip,加上密码
+ - 游戏服的yaml配置文件里面修改redis的ip、端口、密码
  
-## 主节点关闭redis之前需要手动save一次,否则会丢数据(因为主节点不自动save了)。如果忘了手动save,启动之前就得去从节点拷贝rdb到主节点,再启动
-
 ### 后续正式服也需要一套同样的操作