Skip to content

Commit 19bb2f9

Browse files
committed
chore: add support for multiple read replicas
1 parent 5d8328f commit 19bb2f9

3 files changed

Lines changed: 35 additions & 18 deletions

File tree

docker-compose.yml

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,26 @@ services:
1515
DB_MAX_POOL_SIZE: 64
1616
DB_ACQUIRE_CONNECTION_TIMEOUT: 60000
1717
# Read Replica
18+
READ_REPLICAS: 1
1819
READ_REPLICA_ENABLED: 'false'
19-
RR_DB_HOST: db
20-
RR_DB_PORT: 5432
21-
RR_DB_USER: nostr_ts_relay
22-
RR_DB_PASSWORD: nostr_ts_relay
23-
RR_DB_NAME: nostr_ts_relay
24-
RR_DB_MIN_POOL_SIZE: 16
25-
RR_DB_MAX_POOL_SIZE: 64
26-
RR_DB_ACQUIRE_CONNECTION_TIMEOUT: 10000
20+
# Read Replica No. 1
21+
RR0_DB_HOST: db
22+
RR0_DB_PORT: 5432
23+
RR0_DB_USER: nostr_ts_relay
24+
RR0_DB_PASSWORD: nostr_ts_relay
25+
RR0_DB_NAME: nostr_ts_relay
26+
RR0_DB_MIN_POOL_SIZE: 16
27+
RR0_DB_MAX_POOL_SIZE: 64
28+
RR0_DB_ACQUIRE_CONNECTION_TIMEOUT: 10000
29+
# Read Replica No. 2
30+
RR1_DB_HOST: db
31+
RR1_DB_PORT: 5432
32+
RR1_DB_USER: nostr_ts_relay
33+
RR1_DB_PASSWORD: nostr_ts_relay
34+
RR1_DB_NAME: nostr_ts_relay
35+
RR1_DB_MIN_POOL_SIZE: 16
36+
RR1_DB_MAX_POOL_SIZE: 64
37+
RR1_DB_ACQUIRE_CONNECTION_TIMEOUT: 10000
2738
# Redis
2839
REDIS_HOST: nostream-cache
2940
REDIS_PORT: 6379

src/app/app.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ export class App implements IRunnable {
8383
debug('starting worker')
8484
createWorker({
8585
WORKER_TYPE: 'worker',
86+
WORKER_INDEX: i.toString(),
8687
})
8788
}
8889
logCentered(`${workerCount} client workers started`, width)

src/database/client.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,27 +46,32 @@ const getMasterConfig = (): Knex.Config => ({
4646
: 60000,
4747
} as any)
4848

49-
const getReadReplicaConfig = (): Knex.Config => ({
49+
const getReadReplicaConfigByIndex = (index: number): Knex.Config => ({
5050
tag: 'read-replica',
5151
client: 'pg',
5252
connection: {
53-
host: process.env.RR_DB_HOST,
54-
port: Number(process.env.RR_DB_PORT),
55-
user: process.env.RR_DB_USER,
56-
password: process.env.RR_DB_PASSWORD,
57-
database: process.env.RR_DB_NAME,
53+
host: process.env[`RR${index}_DB_HOST`],
54+
port: Number(process.env[`RR${index}_DB_PORT`]),
55+
user: process.env[`RR${index}_DB_USER`],
56+
password: process.env[`RR${index}_DB_PASSWORD`],
57+
database: process.env[`RR${index}_DB_NAME`],
5858
},
5959
pool: {
60-
min: process.env.RR_DB_MIN_POOL_SIZE ? Number(process.env.RR_DB_MIN_POOL_SIZE) : 0,
61-
max: process.env.RR_DB_MAX_POOL_SIZE ? Number(process.env.RR_DB_MAX_POOL_SIZE) : 3,
60+
min: process.env[`RR${index}_DB_MIN_POOL_SIZE`] ? Number(process.env[`RR${index}_DB_MIN_POOL_SIZE`]) : 0,
61+
max: process.env[`RR${index}_DB_MAX_POOL_SIZE`] ? Number(process.env[`RR${index}_DB_MAX_POOL_SIZE`]) : 3,
6262
idleTimeoutMillis: 60000,
6363
propagateCreateError: false,
64-
acquireTimeoutMillis: process.env.RR_DB_ACQUIRE_CONNECTION_TIMEOUT
65-
? Number(process.env.RR_DB_ACQUIRE_CONNECTION_TIMEOUT)
64+
acquireTimeoutMillis: process.env[`RR${index}_DB_ACQUIRE_CONNECTION_TIMEOUT`]
65+
? Number(process.env[`RR${index}_DB_ACQUIRE_CONNECTION_TIMEOUT`])
6666
: 60000,
6767
},
6868
} as any)
6969

70+
const getReadReplicaConfig = (): Knex.Config => {
71+
const readReplicaIndex = Number(process.env.WORKER_INDEX) % Number(process.env.READ_REPLICAS)
72+
return getReadReplicaConfigByIndex(readReplicaIndex)
73+
}
74+
7075
let writeClient: Knex
7176

7277
export const getMasterDbClient = () => {

0 commit comments

Comments
 (0)