읽기 전용 복제본(Read Replicas)
import { sql } from 'drizzle-orm' ;
import { drizzle } from 'drizzle-orm/node-postgres' ;
import { boolean , jsonb , pgTable , serial , text , timestamp , withReplicas } from 'drizzle-orm/pg-core' ;
const usersTable = pgTable ( 'users' , {
id : serial ( 'id' as string ) .primaryKey () ,
name : text ( 'name' ) .notNull () ,
verified : boolean ( 'verified' ) .notNull () .default ( false ) ,
jsonb : jsonb ( 'jsonb' ) .$type () ,
createdAt : timestamp ( 'created_at' , { withTimezone : true }) .notNull () .defaultNow () ,
});
const primaryDb = drizzle ( "postgres://user:password@host:port/primary_db" );
const read1 = drizzle ( "postgres://user:password@host:port/read_replica_1" );
const read2 = drizzle ( "postgres://user:password@host:port/read_replica_2" );
const db = withReplicas (primaryDb , [read1 , read2]);
import { drizzle } from "drizzle-orm/mysql2" ;
import mysql from "mysql2/promise" ;
import { boolean , mysqlTable , serial , text , withReplicas } from 'drizzle-orm/mysql-core' ;
const usersTable = mysqlTable ( 'users' , {
id : serial ( 'id' as string ) .primaryKey () ,
name : text ( 'name' ) .notNull () ,
verified : boolean ( 'verified' ) .notNull () .default ( false ) ,
});
const primaryClient = await mysql .createConnection ({
host : "host" ,
user : "user" ,
database : "primary_db" ,
})
const primaryDb = drizzle ({ client : primaryClient });
const read1Client = await mysql .createConnection ({
host : "host" ,
user : "user" ,
database : "read_1" ,
})
const read1 = drizzle ({ client : read1Client });
const read2Client = await mysql .createConnection ({
host : "host" ,
user : "user" ,
database : "read_2" ,
})
const read2 = drizzle ({ client : read2Client });
const db = withReplicas (primaryDb , [read1 , read2]);
import { sql } from 'drizzle-orm' ;
import { sqliteTable , int , text , withReplicas } from 'drizzle-orm/sqlite-core' ;
import { createClient } from '@libsql/client' ;
import { drizzle } from 'drizzle-orm/libsql' ;
const usersTable = sqliteTable ( 'users' , {
id : int ( 'id' as string ) .primaryKey () ,
name : text ( 'name' ) .notNull () ,
});
const primaryDb = drizzle ({ client : createClient ({ url : 'DATABASE_URL' , authToken : 'DATABASE_AUTH_TOKEN' }) });
const read1 = drizzle ({ client : createClient ({ url : 'DATABASE_URL' , authToken : 'DATABASE_AUTH_TOKEN' }) });
const read2 = drizzle ({ client : createClient ({ url : 'DATABASE_URL' , authToken : 'DATABASE_AUTH_TOKEN' }) });
const db = withReplicas (primaryDb , [read1 , read2]);
import { drizzle } from "drizzle-orm/singlestore" ;
import mysql from "mysql2/promise" ;
import { boolean , singlestoreTable , serial , text , withReplicas } from 'drizzle-orm/singlestore-core' ;
const usersTable = singlestoreTable ( 'users' , {
id : serial ( 'id' as string ) .primaryKey () ,
name : text ( 'name' ) .notNull () ,
verified : boolean ( 'verified' ) .notNull () .default ( false ) ,
});
const primaryClient = await mysql .createConnection ({
host : "host" ,
user : "user" ,
database : "primary_db" ,
})
const primaryDb = drizzle ({ client : primaryClient });
const read1Client = await mysql .createConnection ({
host : "host" ,
user : "user" ,
database : "read_1" ,
})
const read1 = drizzle ({ client : read1Client });
const read2Client = await mysql .createConnection ({
host : "host" ,
user : "user" ,
database : "read_2" ,
})
const read2 = drizzle ({ client : read2Client });
const db = withReplicas (primaryDb , [read1 , read2]);
여러분의 프로젝트에서 읽기 전용 복제본 인스턴스 세트를 사용하고, 읽기 전용 복제본에서 SELECT 쿼리를 관리하고 기본 인스턴스에서 생성, 삭제, 업데이트 작업을 수행할 수 있는 편리한 방법이 필요하다면, Drizzle의 withReplicas()
함수를 활용할 수 있습니다.
이제 db
인스턴스를 이전과 동일한 방식으로 사용할 수 있습니다. Drizzle은 읽기 전용 복제본과 기본 인스턴스 간의 선택을 자동으로 처리합니다.
// read1 또는 read2 연결에서 읽기
await db .select () .from (usersTable)
// 삭제 작업을 위해 기본 데이터베이스 사용
await db .delete (usersTable) .where ( eq ( usersTable .id , 1 ))
$primary
키를 사용하면 읽기 작업에서도 기본 인스턴스를 강제로 사용할 수 있습니다.
// 기본 인스턴스에서 읽기
await db . $primary .select () .from (usersTable);
Drizzle을 사용하면 읽기 전용 복제본을 선택하는 커스텀 로직을 지정할 수도 있습니다. 가중치를 적용하거나 다른 커스텀 선택 방법을 사용하여 무작위로 읽기 전용 복제본을 선택할 수 있습니다. 다음은 첫 번째 복제본이 70%의 확률로 선택되고 두 번째 복제본이 30%의 확률로 선택되는 커스텀 로직을 구현한 예제입니다.
읽기 전용 복제본을 선택하는 무작위 선택 방법은 어떤 타입으로도 구현할 수 있습니다.
const db = withReplicas (primaryDb , [read1 , read2] , (replicas) => {
const weight = [ 0.7 , 0.3 ];
let cumulativeProbability = 0 ;
const rand = Math .random ();
for ( const [ i , replica ] of replicas .entries ()) {
cumulativeProbability += weight[i] ! ;
if (rand < cumulativeProbability) return replica;
}
return replicas[ 0 ] !
});
await db .select () .from (usersTable)