YugabyteDB
YugabyteDB is a PostgreSQL-compatible Open-Source Distributed SQL database. It adds horizontal scalability to applications built for PostgreSQL. We can use pREST works by connecting to any YugabyteDB node.
Start a YugabyteDB cluster with one of the Quick Start methods: YugabyteDB Documentation / Quick Start
Start prestd with the PostgreSQL connection string to one YugabyteDB node ( default port is 5433 )
Node locality
In a public or private cloud, there are multiple ways to scale out the pREST servers with YugabyteDB nodes:
- Start
prestd
withPREST_PG_URL
set to a cluster service (HA proxy, Kubernetes ClusterIP...) over the YugabyteDB nodes - Start one
prestd
for each YugabyteDB node, with its local IP - change the
github.com/jackc/pgx
driver to the cluster-aware onegithub.com/yugabyte/pgx/v4
, as in https://docs.yugabyte.com/preview/drivers-orms/go/yb-pgx/, so that it discovers all nodes of the cluster from any node.
With geo-distribution, it is recommended to co-locate the prestd
server in the same zone as the database node(s) it connects to. This will lower the latency and increase availability.
Testing
Start a YugabyteDB cluster with one of the Quick Start methods: YugabyteDB Documentation / Quick Start
Start prestd
with the PostgreSQL connection string to one YugabyteDB node ( default port is 5433 )
Example
Starting a single-node YugabyteDB cluster on Docker:
1docker network create yb-net
2
3docker run -d --hostname yb-tserver-n1 -p 7000:7000 \
4 --network yb-net yugabytedb/yugabyte:2.14.6.0-b30 \
5 yugabyted start --daemon false --listen yb-tserver-n1
Starting prestd
connecting to this node:
1docker run -d -p 3001:3000 --network yb-net \
2 -e PREST_PG_URL=postgres://yugabyte:yugabyte@yb-tserver-n1:5433/yugabyte \
3 -e PREST_DEBUG=true \
4 prest/prest:v1
Creating a view (yb_servers()
is a table function showing all YugabyteDB nodes in the cluster)
1docker run --rm --network yb-net yugabytedb/yugabyte \
2 ysqlsh -h yb-tserver-n1 -c "
3 create view yb_servers as select host,zone,region,cloud from yb_servers()
4"
Querying this view through the REST API:
1curl -i -X GET "http://127.0.0.1:3001/yugabyte/public/yb_servers" -H "Content-Type: application/json"
2
3[{"host": "yb-tserver-n1", "zone": "rack1", "cloud": "cloud1", "region": "datacenter1"}]
Starting two more YugabyteDB nodes (yb-tserver-n2
and yb-tserver-n3
) to join the previous one (yb-tserver-n1
):
1docker run -d --hostname yb-tserver-n2 \
2 --network yb-net yugabytedb/yugabyte:2.14.6.0-b30 \
3 yugabyted start --join yb-tserver-n1 --daemon false --listen yb-tserver-n2
4
5docker run -d --hostname yb-tserver-n3 \
6 --network yb-net yugabytedb/yugabyte:2.14.6.0-b30 \
7 yugabyted start --join yb-tserver-n1 --daemon false --listen yb-tserver-n3
Starting one prestd
for each YugabyteDB node:
1docker run -d -p 3002:3000 --network yb-net \
2 -e PREST_PG_URL=postgres://yugabyte:yugabyte@yb-tserver-n2:5433/yugabyte \
3 -e PREST_DEBUG=true \
4 prest/prest:v1
5
6docker run -d -p 3003:3000 --network yb-net \
7 -e PREST_PG_URL=postgres://yugabyte:yugabyte@yb-tserver-n3:5433/yugabyte \
8 -e PREST_DEBUG=true \
9 prest/prest:v1
Querying any endpoint to read from the view
1curl -i -X GET "http://127.0.0.1:3001/yugabyte/public/yb_servers" -H "Content-Type: application/json"
2
3[{"host": "yb-tserver-n3", "zone": "rack1", "cloud": "cloud1", "region": "datacenter1"}, {"host": "yb-tserver-n2", "zone": "rack1", "cloud": "cloud1", "region": "datacenter1"}, {"host": "yb-tserver-n1", "zone": "rack1", "cloud": "cloud1", "region": "datacenter1"}]
4
5curl -i -X GET "http://127.0.0.1:3003/yugabyte/public/yb_servers" -H "Content-Type: application/json"
6
7[{"host": "yb-tserver-n3", "zone": "rack1", "cloud": "cloud1", "region": "datacenter1"}, {"host": "yb-tserver-n2", "zone": "rack1", "cloud": "cloud1", "region": "datacenter1"}, {"host": "yb-tserver-n1", "zone": "rack1", "cloud": "cloud1", "region": "datacenter1"}]
All works as with PostgreSQL, with the additional High Availability and Elasticity provided by YugabyteDB 🚀