mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-28 15:50:38 +00:00
Compare commits
13 Commits
RemoteExte
...
hack/compu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
31f5251983 | ||
|
|
5f9e4dd58a | ||
|
|
1222cb67b9 | ||
|
|
f05f452dfd | ||
|
|
2278146381 | ||
|
|
6fae789e88 | ||
|
|
9ea8a744a3 | ||
|
|
5ec4de05c9 | ||
|
|
fb7d2939e1 | ||
|
|
4ffe43b8f7 | ||
|
|
ba252c9513 | ||
|
|
03753e277e | ||
|
|
86be2747d0 |
5
.github/workflows/build_and_test.yml
vendored
5
.github/workflows/build_and_test.yml
vendored
@@ -852,7 +852,7 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
shell: sh -eu {0}
|
shell: sh -eu {0}
|
||||||
env:
|
env:
|
||||||
VM_BUILDER_VERSION: v0.18.5
|
VM_BUILDER_VERSION: v0.19.0
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -874,8 +874,7 @@ jobs:
|
|||||||
- name: Build vm image
|
- name: Build vm image
|
||||||
run: |
|
run: |
|
||||||
./vm-builder \
|
./vm-builder \
|
||||||
-enable-file-cache \
|
-spec=vm-image-spec.yaml \
|
||||||
-cgroup-uid=postgres \
|
|
||||||
-src=369495373322.dkr.ecr.eu-central-1.amazonaws.com/compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}} \
|
-src=369495373322.dkr.ecr.eu-central-1.amazonaws.com/compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}} \
|
||||||
-dst=369495373322.dkr.ecr.eu-central-1.amazonaws.com/vm-compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}}
|
-dst=369495373322.dkr.ecr.eu-central-1.amazonaws.com/vm-compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}}
|
||||||
|
|
||||||
|
|||||||
@@ -714,6 +714,23 @@ RUN wget https://github.com/pksunkara/pgx_ulid/archive/refs/tags/v0.1.3.tar.gz -
|
|||||||
cargo pgrx install --release && \
|
cargo pgrx install --release && \
|
||||||
echo "trusted = true" >> /usr/local/pgsql/share/extension/ulid.control
|
echo "trusted = true" >> /usr/local/pgsql/share/extension/ulid.control
|
||||||
|
|
||||||
|
#########################################################################################
|
||||||
|
#
|
||||||
|
# Layer "pg-wait-sampling-pg-build"
|
||||||
|
# compile pg_wait_sampling extension
|
||||||
|
#
|
||||||
|
#########################################################################################
|
||||||
|
FROM build-deps AS pg-wait-sampling-pg-build
|
||||||
|
COPY --from=pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
|
|
||||||
|
ENV PATH "/usr/local/pgsql/bin/:$PATH"
|
||||||
|
RUN wget https://github.com/postgrespro/pg_wait_sampling/archive/refs/tags/v1.1.5.tar.gz -O pg_wait_sampling.tar.gz && \
|
||||||
|
echo 'a03da6a413f5652ce470a3635ed6ebba528c74cb26aa4cfced8aff8a8441f81ec6dd657ff62cd6ce96a4e6ce02cad9f2519ae9525367ece60497aa20faafde5c pg_wait_sampling.tar.gz' | sha512sum -c && \
|
||||||
|
mkdir pg_wait_sampling-src && cd pg_wait_sampling-src && tar xvzf ../pg_wait_sampling.tar.gz --strip-components=1 -C . && \
|
||||||
|
make USE_PGXS=1 -j $(getconf _NPROCESSORS_ONLN) && \
|
||||||
|
make USE_PGXS=1 -j $(getconf _NPROCESSORS_ONLN) install && \
|
||||||
|
echo 'trusted = true' >> /usr/local/pgsql/share/extension/pg_wait_sampling.control
|
||||||
|
|
||||||
#########################################################################################
|
#########################################################################################
|
||||||
#
|
#
|
||||||
# Layer "neon-pg-ext-build"
|
# Layer "neon-pg-ext-build"
|
||||||
@@ -750,6 +767,7 @@ COPY --from=rdkit-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
|||||||
COPY --from=pg-uuidv7-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
COPY --from=pg-uuidv7-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
COPY --from=pg-roaringbitmap-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
COPY --from=pg-roaringbitmap-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
COPY --from=pg-embedding-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
COPY --from=pg-embedding-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
|
COPY --from=pg-wait-sampling-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
COPY pgxn/ pgxn/
|
COPY pgxn/ pgxn/
|
||||||
|
|
||||||
RUN make -j $(getconf _NPROCESSORS_ONLN) \
|
RUN make -j $(getconf _NPROCESSORS_ONLN) \
|
||||||
|
|||||||
@@ -210,12 +210,7 @@ impl GlobalConnPool {
|
|||||||
client.session.send(session_id)?;
|
client.session.send(session_id)?;
|
||||||
latency_timer.pool_hit();
|
latency_timer.pool_hit();
|
||||||
latency_timer.success();
|
latency_timer.success();
|
||||||
return Ok(Client {
|
return Ok(Client::new(client, pool).await);
|
||||||
conn_id: client.conn_id,
|
|
||||||
inner: Some(client),
|
|
||||||
span: Span::current(),
|
|
||||||
pool,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let conn_id = uuid::Uuid::new_v4();
|
let conn_id = uuid::Uuid::new_v4();
|
||||||
@@ -263,15 +258,11 @@ impl GlobalConnPool {
|
|||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
new_client.map(|inner| Client {
|
// new_client.map(|inner| Client::new(inner, pool).await)
|
||||||
conn_id: inner.conn_id,
|
Ok(Client::new(new_client?, pool).await)
|
||||||
inner: Some(inner),
|
|
||||||
span: Span::current(),
|
|
||||||
pool,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn put(&self, conn_info: &ConnInfo, client: ClientInner) -> anyhow::Result<()> {
|
fn put(&self, conn_info: &ConnInfo, client: ClientInner, pid: i32) -> anyhow::Result<()> {
|
||||||
let conn_id = client.conn_id;
|
let conn_id = client.conn_id;
|
||||||
|
|
||||||
// We want to hold this open while we return. This ensures that the pool can't close
|
// We want to hold this open while we return. This ensures that the pool can't close
|
||||||
@@ -315,9 +306,9 @@ impl GlobalConnPool {
|
|||||||
|
|
||||||
// do logging outside of the mutex
|
// do logging outside of the mutex
|
||||||
if returned {
|
if returned {
|
||||||
info!(%conn_id, "pool: returning connection '{conn_info}' back to the pool, total_conns={total_conns}, for this (db, user)={per_db_size}");
|
info!(%conn_id, "pool: returning connection '{conn_info}' back to the pool, total_conns={total_conns}, for this (db, user)={per_db_size}, pid={pid}");
|
||||||
} else {
|
} else {
|
||||||
info!(%conn_id, "pool: throwing away connection '{conn_info}' because pool is full, total_conns={total_conns}");
|
info!(%conn_id, "pool: throwing away connection '{conn_info}' because pool is full, total_conns={total_conns}, pid={pid}");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -528,6 +519,22 @@ struct ClientInner {
|
|||||||
conn_id: uuid::Uuid,
|
conn_id: uuid::Uuid,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ClientInner {
|
||||||
|
pub async fn get_pid(&mut self) -> anyhow::Result<i32> {
|
||||||
|
let rows = self.inner.query("select pg_backend_pid();", &[]).await?;
|
||||||
|
if rows.len() != 1 {
|
||||||
|
Err(anyhow::anyhow!(
|
||||||
|
"expected 1 row from pg_backend_pid(), got {}",
|
||||||
|
rows.len()
|
||||||
|
))
|
||||||
|
} else {
|
||||||
|
let pid = rows[0].get(0);
|
||||||
|
info!(%pid, "got pid");
|
||||||
|
Ok(pid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Client {
|
impl Client {
|
||||||
pub fn metrics(&self) -> Arc<MetricCounter> {
|
pub fn metrics(&self) -> Arc<MetricCounter> {
|
||||||
USAGE_METRICS.register(self.inner.as_ref().unwrap().ids.clone())
|
USAGE_METRICS.register(self.inner.as_ref().unwrap().ids.clone())
|
||||||
@@ -539,6 +546,7 @@ pub struct Client {
|
|||||||
span: Span,
|
span: Span,
|
||||||
inner: Option<ClientInner>,
|
inner: Option<ClientInner>,
|
||||||
pool: Option<(ConnInfo, Arc<GlobalConnPool>)>,
|
pool: Option<(ConnInfo, Arc<GlobalConnPool>)>,
|
||||||
|
pid: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Discard<'a> {
|
pub struct Discard<'a> {
|
||||||
@@ -547,12 +555,25 @@ pub struct Discard<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Client {
|
impl Client {
|
||||||
|
pub(self) async fn new(
|
||||||
|
mut inner: ClientInner,
|
||||||
|
pool: Option<(ConnInfo, Arc<GlobalConnPool>)>,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
conn_id: inner.conn_id,
|
||||||
|
pid: inner.get_pid().await.unwrap_or(-1),
|
||||||
|
inner: Some(inner),
|
||||||
|
span: Span::current(),
|
||||||
|
pool,
|
||||||
|
}
|
||||||
|
}
|
||||||
pub fn inner(&mut self) -> (&mut tokio_postgres::Client, Discard<'_>) {
|
pub fn inner(&mut self) -> (&mut tokio_postgres::Client, Discard<'_>) {
|
||||||
let Self {
|
let Self {
|
||||||
inner,
|
inner,
|
||||||
pool,
|
pool,
|
||||||
conn_id,
|
conn_id,
|
||||||
span: _,
|
span: _,
|
||||||
|
pid: _,
|
||||||
} = self;
|
} = self;
|
||||||
(
|
(
|
||||||
&mut inner
|
&mut inner
|
||||||
@@ -609,10 +630,11 @@ impl Drop for Client {
|
|||||||
.expect("client inner should not be removed");
|
.expect("client inner should not be removed");
|
||||||
if let Some((conn_info, conn_pool)) = self.pool.take() {
|
if let Some((conn_info, conn_pool)) = self.pool.take() {
|
||||||
let current_span = self.span.clone();
|
let current_span = self.span.clone();
|
||||||
|
let pid = self.pid;
|
||||||
// return connection to the pool
|
// return connection to the pool
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
let _span = current_span.enter();
|
let _span = current_span.enter();
|
||||||
let _ = conn_pool.put(&conn_info, client);
|
let _ = conn_pool.put(&conn_info, client, pid);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
143
vm-image-spec.yaml
Normal file
143
vm-image-spec.yaml
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
# Supplemental file for neondatabase/autoscaling's vm-builder, for producing the VM compute image.
|
||||||
|
---
|
||||||
|
commands:
|
||||||
|
- name: cgconfigparser
|
||||||
|
user: root
|
||||||
|
sysvInitAction: sysinit
|
||||||
|
shell: "cgconfigparser -l /etc/cgconfig.conf -s 1664"
|
||||||
|
- name: pgbouncer
|
||||||
|
user: nobody
|
||||||
|
sysvInitAction: respawn
|
||||||
|
shell: "/usr/local/bin/pgbouncer /etc/pgbouncer.ini"
|
||||||
|
- name: postgres-exporter
|
||||||
|
user: nobody
|
||||||
|
sysvInitAction: respawn
|
||||||
|
shell: 'DATA_SOURCE_NAME="user=cloud_admin sslmode=disable dbname=postgres" /bin/postgres_exporter --extend.query-path /etc/postgres_exporter_queries.yml'
|
||||||
|
shutdownHook: |
|
||||||
|
su -p postgres --session-command '/usr/local/bin/pg_ctl stop -D /var/db/postgres/compute/pgdata -m fast --wait -t 10'
|
||||||
|
files:
|
||||||
|
- filename: pgbouncer.ini
|
||||||
|
content: |
|
||||||
|
[databases]
|
||||||
|
*=host=localhost port=5432 auth_user=cloud_admin
|
||||||
|
[pgbouncer]
|
||||||
|
listen_port=6432
|
||||||
|
listen_addr=0.0.0.0
|
||||||
|
auth_type=scram-sha-256
|
||||||
|
auth_user=cloud_admin
|
||||||
|
auth_dbname=postgres
|
||||||
|
client_tls_sslmode=disable
|
||||||
|
server_tls_sslmode=disable
|
||||||
|
pool_mode=transaction
|
||||||
|
max_client_conn=10000
|
||||||
|
default_pool_size=16
|
||||||
|
max_prepared_statements=0
|
||||||
|
- filename: cgconfig.conf
|
||||||
|
content: |
|
||||||
|
# Configuration for cgroups in VM compute nodes
|
||||||
|
group neon-postgres {
|
||||||
|
perm {
|
||||||
|
admin {
|
||||||
|
uid = postgres;
|
||||||
|
}
|
||||||
|
task {
|
||||||
|
gid = users;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memory {}
|
||||||
|
}
|
||||||
|
- filename: postgres_exporter_queries.yml
|
||||||
|
content: |
|
||||||
|
postgres_exporter_pg_database_size:
|
||||||
|
query: "SELECT pg_database.datname, pg_database_size(pg_database.datname) as bytes, 42 as fourtytwo FROM pg_database"
|
||||||
|
cache_seconds: 30
|
||||||
|
metrics:
|
||||||
|
- datname:
|
||||||
|
usage: "LABEL"
|
||||||
|
description: "Name of the database"
|
||||||
|
- bytes:
|
||||||
|
usage: "GAUGE"
|
||||||
|
description: "Disk space used by the database"
|
||||||
|
- fourtytwo:
|
||||||
|
usage: "GAUGE"
|
||||||
|
description: "fourtytwo"
|
||||||
|
build: |
|
||||||
|
# Build cgroup-tools
|
||||||
|
#
|
||||||
|
# At time of writing (2023-03-14), debian bullseye has a version of cgroup-tools (technically
|
||||||
|
# libcgroup) that doesn't support cgroup v2 (version 0.41-11). Unfortunately, the vm-monitor
|
||||||
|
# requires cgroup v2, so we'll build cgroup-tools ourselves.
|
||||||
|
FROM debian:bullseye-slim as libcgroup-builder
|
||||||
|
ENV LIBCGROUP_VERSION v2.0.3
|
||||||
|
|
||||||
|
RUN set -exu \
|
||||||
|
&& apt update \
|
||||||
|
&& apt install --no-install-recommends -y \
|
||||||
|
git \
|
||||||
|
ca-certificates \
|
||||||
|
automake \
|
||||||
|
cmake \
|
||||||
|
make \
|
||||||
|
gcc \
|
||||||
|
byacc \
|
||||||
|
flex \
|
||||||
|
libtool \
|
||||||
|
libpam0g-dev \
|
||||||
|
&& git clone --depth 1 -b $LIBCGROUP_VERSION https://github.com/libcgroup/libcgroup \
|
||||||
|
&& INSTALL_DIR="/libcgroup-install" \
|
||||||
|
&& mkdir -p "$INSTALL_DIR/bin" "$INSTALL_DIR/include" \
|
||||||
|
&& cd libcgroup \
|
||||||
|
# extracted from bootstrap.sh, with modified flags:
|
||||||
|
&& (test -d m4 || mkdir m4) \
|
||||||
|
&& autoreconf -fi \
|
||||||
|
&& rm -rf autom4te.cache \
|
||||||
|
&& CFLAGS="-O3" ./configure --prefix="$INSTALL_DIR" --sysconfdir=/etc --localstatedir=/var --enable-opaque-hierarchy="name=systemd" \
|
||||||
|
# actually build the thing...
|
||||||
|
&& make install
|
||||||
|
|
||||||
|
FROM quay.io/prometheuscommunity/postgres-exporter:v0.12.0 AS postgres-exporter
|
||||||
|
|
||||||
|
# Build pgbouncer
|
||||||
|
#
|
||||||
|
FROM debian:bullseye-slim AS pgbouncer
|
||||||
|
RUN set -e \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get install -y \
|
||||||
|
curl \
|
||||||
|
build-essential \
|
||||||
|
pkg-config \
|
||||||
|
libevent-dev \
|
||||||
|
libssl-dev
|
||||||
|
|
||||||
|
ENV PGBOUNCER_VERSION 1.21.0
|
||||||
|
ENV PGBOUNCER_GITPATH 1_21_0
|
||||||
|
RUN set -e \
|
||||||
|
&& curl -sfSL https://github.com/pgbouncer/pgbouncer/releases/download/pgbouncer_${PGBOUNCER_GITPATH}/pgbouncer-${PGBOUNCER_VERSION}.tar.gz -o pgbouncer-${PGBOUNCER_VERSION}.tar.gz \
|
||||||
|
&& tar xzvf pgbouncer-${PGBOUNCER_VERSION}.tar.gz \
|
||||||
|
&& cd pgbouncer-${PGBOUNCER_VERSION} \
|
||||||
|
&& LDFLAGS=-static ./configure --prefix=/usr/local/pgbouncer --without-openssl \
|
||||||
|
&& make -j $(nproc) \
|
||||||
|
&& make install
|
||||||
|
merge: |
|
||||||
|
# tweak nofile limits
|
||||||
|
RUN set -e \
|
||||||
|
&& echo 'fs.file-max = 1048576' >>/etc/sysctl.conf \
|
||||||
|
&& test ! -e /etc/security || ( \
|
||||||
|
echo '* - nofile 1048576' >>/etc/security/limits.conf \
|
||||||
|
&& echo 'root - nofile 1048576' >>/etc/security/limits.conf \
|
||||||
|
)
|
||||||
|
|
||||||
|
COPY cgconfig.conf /etc/cgconfig.conf
|
||||||
|
COPY pgbouncer.ini /etc/pgbouncer.ini
|
||||||
|
COPY postgres_exporter_queries.yml /etc/postgres_exporter_queries.yml
|
||||||
|
RUN set -e \
|
||||||
|
&& chown postgres:postgres /etc/pgbouncer.ini \
|
||||||
|
&& chmod 0644 /etc/pgbouncer.ini \
|
||||||
|
&& chmod 0644 /etc/cgconfig.conf \
|
||||||
|
&& chmod 0644 /etc/postgres_exporter_queries.yml
|
||||||
|
|
||||||
|
COPY --from=libcgroup-builder /libcgroup-install/bin/* /usr/bin/
|
||||||
|
COPY --from=libcgroup-builder /libcgroup-install/lib/* /usr/lib/
|
||||||
|
COPY --from=libcgroup-builder /libcgroup-install/sbin/* /usr/sbin/
|
||||||
|
COPY --from=postgres-exporter /bin/postgres_exporter /bin/postgres_exporter
|
||||||
|
COPY --from=pgbouncer /usr/local/pgbouncer/bin/pgbouncer /usr/local/bin/pgbouncer
|
||||||
Reference in New Issue
Block a user