File tree Expand file tree Collapse file tree 6 files changed +190
-0
lines changed
Expand file tree Collapse file tree 6 files changed +190
-0
lines changed Original file line number Diff line number Diff line change 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" ]
Original file line number Diff line number Diff line change 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.
Original file line number Diff line number Diff line change 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:
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments