NodeJS 面对TLS写入失败:写入aerospike时出现2个问题

wkyowqbh  于 2023-02-03  发布在  Node.js
关注(0)|答案(1)|浏览(118)

我在服务器上安装了aerospike 6.0.0,并将其用作缓存。我还使用Node.js客户端5.2.0连接到数据库。aerospike节点配置为使用TLS。我使用的名称空间的配置是:

namespace application_cache {
        memory-size 5G
        replication-factor 2
        default-ttl 1h
        nsup-period 1h
        high-water-memory-pct 80
        stop-writes-pct 90
        storage-engine memory 
        }

连接到Db时传递的配置是:

"config": {
      "captureStackTraces":true,
      "connTimeoutMs": 10000,
      "maxConnsPerNode": 1000,
      "maxCommandsInQueue" : 300,
      "maxCommandsInProcess" : 100,
      "user": "test",
      "password": "test",
      "policies": {
        "read": {
          "maxRetries": 3,
          "totalTimeout": 0,
          "socketTimeout": 0
        },
        "write": {
          "maxRetries": 3,
          "totalTimeout": 0,
          "socketTimeout": 0
        },
        "info": {
          "timeout": 10000
        }
      },
      "tls": {
        "enable": true,
        "cafile": "./certs/ca.crt",
        "keyfile": "./certs/server.key",
        "certfile": "./certs/server.crt"
      },
      "hosts": [
        {
          "addr": "-----.com",
          "port": 4333,
          "tlsname": "----"
        },
        {
          "addr": "---.com",
          "port": 4333,
          "tlsname": "-----"
        },
        {
          "addr": "----.com",
          "port": 4333,
          "tlsname": "-----"
        }
      ]
    }

这是我用来写入这个名称空间中的集合的函数:

async function updateApp(appKey, bins) {
     let result = {};
     try {
         const writePolicy = new Aerospike.WritePolicy({
             maxRetries: 3,
             socketTimeout: 0,
             totalTimeout: 0,
             exists: Aerospike.policy.exists.CREATE_OR_UPDATE,
             key: Aerospike.policy.key.SEND
         });
         const key = new Aerospike.Key(namespace, set, appKey);
         let meta = {
            ttl: 3600
         };
         let bins = {};

         result = await asc.put(key, bins, meta, writePolicy);
     } catch (err) {
         console.error("Aerospike Error:", JSON.stringify({params: {namespace, set, appKey}, err: {code: err.code, message: err.message}}));
         return err;
     }
     return result;
 }

它工作的大部分时间,但偶尔我得到这个错误:

Aerospike Error: {"params":{"namespace":"application_cache","set":"apps","packageName":"com.test.application"},"err":{"code":-6,"message":"TLS write failed: -2 34D53CA5C4E0734F 10.57.49.180:4333"}}

此集合中的每条记录都有大约12-15个bin,记录的大小在300 Kb到1.5Mb之间。记录的大小越大,出现此错误的可能性就越高。以前是否有人遇到过此问题?是什么原因导致了此问题?

7xzttuei

7xzttuei1#

我在community forum上回答了这个问题,但我想我也会在这里添加它。
看看server error codescode: 6就是AS_ERR_BIN_EXISTS。您的写入策略是使用exists: Aerospike.policy.exists.CREATE_OR_UPDATE设置的,但exists的选项是:
| 姓名|说明|
| - ------|- ------|
| IGNORE|写入记录,而不管其是否存在(即创建或更新)。|
| CREATE|创建一个记录,仅当它不存在时。|
| UPDATE|更新记录,仅当记录存在时。|
| REPLACE|完全替换记录,仅当记录存在时。|
| CREATE_OR_REPLACE|如果记录存在,则完全替换记录,否则创建记录。|
我的猜测是它默认为CREATE,这只会导致它抛出那个错误。尝试更新你的写策略以使用exists: Aerospike.policy.exists.IGNORE,看看你是否仍然得到那个错误。

相关问题