Nodejs
开发后台服务,使用TypeORM
框架进行数据库开发维护,TypeORM
作为一个ORM
框架,可以应用于NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、Expo
和 Electron
等多个平台。为防止框架修改不断的操作更新数据表等问题,所以希望设置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();
}
使用这种方式操作连接数据库,需要显式的释放连接。