읽기 전용 복제본(Read Replicas)

PostgreSQL
MySQL
SQLite
SingleStore
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]);

여러분의 프로젝트에서 읽기 전용 복제본 인스턴스 세트를 사용하고, 읽기 전용 복제본에서 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)