์ฝ๊ธฐ ๋ณต์ ๋ณธ
ํ๋ก์ ํธ์ ์ฝ๊ธฐ ๋ณต์ ๋ณธ ์ธ์คํด์ค ์ธํธ๊ฐ ํฌํจ๋์ด ์๊ณ , ์ฝ๊ธฐ ๋ณต์ ๋ณธ์์ SELECT ์ฟผ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ณ
๊ธฐ๋ณธ ์ธ์คํด์ค์์ ์์ฑ, ์ญ์ ๋ฐ ์
๋ฐ์ดํธ ์์
์ ์ํํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ด ํ์ํ ๊ฒฝ์ฐ,
Drizzle ๋ด์์ withReplicas() ํจ์๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
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<string[]>(),
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]);์ด์ ์ด์ ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก 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)