胖蔡说技术
随便扯扯

Nodejs使用typeorm实现mysql的读写分离

Nodejs开发后台服务,使用TypeORM框架进行数据库开发维护,TypeORM作为一个ORM框架,可以应用于NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、ExpoElectron 等多个平台。为防止框架修改不断的操作更新数据表等问题,所以希望设置Mysql数据库的主从读写分离模式,本文以备记录。

配置主从复制数据库

我这里将本地数据库设置为主数据库master,所有模式更新和写入操作都使用master服务器执行。将远程数据库设置为从数据库slave, find方法或select query builder执行的所有简单查询都使用随机的slave实例。其中配置主从数据的方法请参考前文:使用docker-compose配置mysql主从备份

TypeORM配置主从连接

TypeORM框架内置主从复制功能,使用配置如下:

import {createConnections} from "typeorm";

const connections = await createConnections([
{
  type: "mysql",
  logging: true,
  replication: {
    master: {
      host: "server1",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    },
    slaves: [{
      host: "server2",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }, {
      host: "server3",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }],
    
    /**
    * 如果为true,则PoolCluster将在连接失败时尝试重新连接。 (默认值:true)
    */
    canRetry: true,

    /**
     * 如果连接失败,则节点的errorCount会增加。
     * 当errorCount大于removeNodeErrorCount时,删除PoolCluster中的节点。 (默认值:5)
     */
    removeNodeErrorCount: 5,

    /**
     * 如果连接失败,则指定在进行另一次连接尝试之前的毫秒数。
     * 如果设置为0,则将删除节点,并且永远不会重复使用。 (默认值:0)
     */
     restoreNodeTimeout: 0,

    /**
     * 确定如何选择从库:
     * RR:交替选择一个(Round-Robin)。
     * RANDOM: 通过随机函数选择节点。
     * ORDER: 无条件选择第一个
     */
    selector: "RR"
  }
}
}
])

如果要在查询构建器创建的SELECT中显式使用master,可以使用以下代码:

const masterQueryRunner = connection.createQueryRunner("master");
try {
    const postsFromMaster = await connection.createQueryBuilder(Post, "post")
        .setQueryRunner(masterQueryRunner)
        .getMany();
} finally {
      await masterQueryRunner.release();
}

使用这种方式操作连接数据库,需要显式的释放连接。

赞(0) 打赏
转载请附上原文出处链接:胖蔡叨叨叨 » Nodejs使用typeorm实现mysql的读写分离
分享到: 更多 (0)

请小编喝杯咖啡~

支付宝扫一扫打赏

微信扫一扫打赏