Skip to content

Commit 4184083

Browse files
committed
example of database
1 parent 3d4e24b commit 4184083

File tree

6 files changed

+190
-0
lines changed

6 files changed

+190
-0
lines changed

dstack-database/Dockerfile

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
FROM ubuntu:22.04
2+
3+
# Create postgres user first
4+
RUN groupadd -r postgres --gid=999 && \
5+
useradd -r -g postgres --uid=999 postgres
6+
7+
# Install dependencies
8+
RUN apt-get update
9+
RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get -y install tzdata
10+
RUN apt-get install -y \
11+
gosu \
12+
python3-pip \
13+
postgresql-14 \
14+
postgresql-client-14 \
15+
openjdk-11-jre-headless \
16+
curl \
17+
&& rm -rf /var/lib/apt/lists/*
18+
19+
# Install ZooKeeper
20+
RUN curl -L https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz | tar xz -C /opt \
21+
&& mv /opt/apache-zookeeper-3.8.4-bin /opt/zookeeper
22+
23+
# Install Patroni
24+
RUN pip3 install patroni[zookeeper] psycopg2-binary
25+
26+
# Create necessary directories with proper permissions
27+
RUN mkdir -p /data/zookeeper /data/postgres /etc/patroni && \
28+
chown -R postgres:postgres /data/postgres && \
29+
chmod 700 /data/postgres && \
30+
chown -R postgres:postgres /etc/patroni
31+
32+
# Create necessary directories
33+
RUN mkdir -p /data/zookeeper /data/postgres /etc/patroni
34+
35+
# ZooKeeper configuration
36+
COPY zoo.cfg /opt/zookeeper/conf/
37+
38+
# Patroni configuration
39+
COPY patroni.yml /etc/patroni/
40+
41+
# Startup script
42+
COPY start.sh /
43+
RUN chmod +x /start.sh
44+
45+
EXPOSE 2181 5432 8008
46+
47+
CMD ["/start.sh"]

dstack-database/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Distributed Database using Dstack
2+
3+
Based on Patroni configuration of postgres, with Zookeeper for leader management.
4+
5+
Needs 4 nodes to tolerate 1 failure.

dstack-database/docker-compose.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
version: '3'
2+
3+
services:
4+
node1:
5+
build: .
6+
hostname: node1
7+
environment:
8+
- NODE_NAME=node1
9+
- NODE_IP=node1
10+
volumes:
11+
- node1-zk:/data/zookeeper
12+
- node1-pg:/data/postgres
13+
ports:
14+
- "5432:5432"
15+
- "2181:2181"
16+
- "8008:8008"
17+
18+
node2:
19+
build: .
20+
hostname: node2
21+
environment:
22+
- NODE_NAME=node2
23+
- NODE_IP=node2
24+
volumes:
25+
- node2-zk:/data/zookeeper
26+
- node2-pg:/data/postgres
27+
28+
node3:
29+
build: .
30+
hostname: node3
31+
environment:
32+
- NODE_NAME=node3
33+
- NODE_IP=node3
34+
volumes:
35+
- node3-zk:/data/zookeeper
36+
- node3-pg:/data/postgres
37+
38+
node4:
39+
build: .
40+
hostname: node4
41+
environment:
42+
- NODE_NAME=node4
43+
- NODE_IP=node4
44+
volumes:
45+
- node4-zk:/data/zookeeper
46+
- node4-pg:/data/postgres
47+
48+
volumes:
49+
node1-zk:
50+
node1-pg:
51+
node2-zk:
52+
node2-pg:
53+
node3-zk:
54+
node3-pg:
55+
node4-zk:
56+
node4-pg:

dstack-database/patroni.yml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
scope: postgres-cluster
2+
namespace: /db/
3+
name: #{NODE_NAME}
4+
5+
restapi:
6+
listen: 0.0.0.0:8008
7+
connect_address: #{NODE_IP}:8008
8+
9+
zookeeper:
10+
hosts: node1:2181,node2:2181,node3:2181,node4:2181
11+
session_timeout: 30
12+
reconnect_timeout: 10
13+
14+
bootstrap:
15+
dcs:
16+
ttl: 30
17+
loop_wait: 10
18+
retry_timeout: 10
19+
maximum_lag_on_failover: 1048576
20+
postgresql:
21+
use_pg_rewind: true
22+
parameters:
23+
max_connections: 100
24+
shared_buffers: 256MB
25+
wal_level: replica
26+
hot_standby: "on"
27+
max_wal_senders: 10
28+
max_replication_slots: 10
29+
wal_keep_segments: 8
30+
31+
postgresql:
32+
listen: 0.0.0.0:5432
33+
connect_address: #{NODE_IP}:5432
34+
data_dir: /data/postgres
35+
bin_dir: /usr/lib/postgresql/14/bin
36+
pgpass: /tmp/pgpass
37+
authentication:
38+
replication:
39+
username: replicator
40+
password: replpass
41+
superuser:
42+
username: postgres
43+
password: secretpassword
44+
parameters:
45+
unix_socket_directories: '/var/run/postgresql'
46+
47+
pg_hba:
48+
- host replication replicator all md5
49+
- host all all all md5

dstack-database/start.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/bin/bash
2+
set -e
3+
4+
# Fix permissions on runtime
5+
mkdir -p /var/run/postgresql
6+
chown postgres:postgres /var/run/postgresql
7+
chmod 2777 /var/run/postgresql
8+
9+
# Start ZooKeeper
10+
echo ${NODE_NAME} | sed 's/^node//' > /data/zookeeper/myid
11+
/opt/zookeeper/bin/zkServer.sh start
12+
13+
# Replace template variables
14+
sed -i "s/#{NODE_NAME}/$NODE_NAME/g" /etc/patroni/patroni.yml
15+
sed -i "s/#{NODE_IP}/$NODE_IP/g" /etc/patroni/patroni.yml
16+
17+
# Start Patroni as postgres user
18+
exec gosu postgres patroni /etc/patroni/patroni.yml
19+
20+
# Start Patroni
21+
exec patroni /etc/patroni/patroni.yml

dstack-database/zoo.cfg

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
tickTime=2000
2+
initLimit=10
3+
syncLimit=5
4+
dataDir=/data/zookeeper
5+
clientPort=2181
6+
maxClientCnxns=60
7+
autopurge.snapRetainCount=3
8+
autopurge.purgeInterval=1
9+
server.1=node1:2888:3888
10+
server.2=node2:2888:3888
11+
server.3=node3:2888:3888
12+
server.4=node4:2888:3888

0 commit comments

Comments
 (0)