Lewati ke isi

Pengguna basis data

Tenax mencadangkan setiap basis data dengan satu pengguna, tenax, yang kata sandinya disimpan di Secret bernama tenax-* di samping basis data. Tenax tidak pernah memakai akun administrator. Membuat pengguna ini cukup dengan dua perintah, ditambah satu baris konfigurasi server untuk pemulihan ke detik mana pun.

NS=team-a                         # the database's namespace
PASSWORD=$(openssl rand -hex 24)  # hex: no quoting surprises

# 1. The Secret Tenax reads
kubectl -n $NS create secret generic tenax-postgres \
  --from-literal=username=tenax --from-file=password=<(printf %s "$PASSWORD")

# 2. The user, as a superuser, through the database's pod (deploy/…, sts/… or a pod)
kubectl -n $NS exec -i deploy/postgres -- psql -U postgres -v ON_ERROR_STOP=1 <<SQL
\set tenax_password '$PASSWORD'
SELECT 'CREATE ROLE tenax LOGIN REPLICATION' WHERE NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'tenax') \gexec
ALTER ROLE tenax WITH LOGIN REPLICATION PASSWORD :'tenax_password';
GRANT pg_read_all_data, pg_monitor TO tenax;
ALTER SYSTEM SET max_slot_wal_keep_size = '2GB';
SELECT pg_reload_conf();
SQL

3. Untuk pemulihan ke detik mana pun, izinkan pengguna melakukan replikasi: tambahkan baris ini ke pg_hba.conf lalu muat ulang (tanpa restart).

host  replication  tenax  all  scram-sha-256

Jika Postgres dikelola oleh operator atau chart Helm, tambahkan baris itu di tempat ia mengonfigurasi pg_hba (misalnya spec.postgresql.pg_hba di CloudNativePG, atau nilai pgHbaConfiguration milik chart).

SQL yang sama sebagai berkas, dengan komentar (docs/sql/postgres-users.sql)
docs/sql/postgres-users.sql
-- Tenax's database user for PostgreSQL 15/16/17 (run once as a superuser, e.g. with psql):
--
--   psql -v tenax_password="$TENAX_PASSWORD" -f postgres-users.sql
--
-- One user, `tenax`, does everything (ADR 0016): inventory queries, logical dumps (pg_dump), exports and checks
-- with pg_read_all_data + pg_monitor; physical base backups (pg_basebackup) and the WAL stream with REPLICATION.
--
-- For physical backups and point-in-time restore pg_hba.conf must also allow it to replicate, then reload:
--     host replication tenax all scram-sha-256
-- Without that rule Tenax still works: it takes logical backups and tells you the rule to add.
-- Also needed: wal_level = replica (the default) and max_wal_senders >= 2 (default 10).
\set ON_ERROR_STOP on

SELECT format('CREATE ROLE tenax LOGIN REPLICATION PASSWORD %L', :'tenax_password')
WHERE NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'tenax') \gexec
ALTER ROLE tenax WITH LOGIN REPLICATION NOSUPERUSER NOCREATEDB NOCREATEROLE PASSWORD :'tenax_password';
GRANT pg_read_all_data, pg_monitor TO tenax;
-- Keep backup sessions bounded.
ALTER ROLE tenax SET idle_in_transaction_session_timeout = '10min';

-- A stopped streamer must never fill the database disk: cap WAL retained by replication slots (no restart needed).
ALTER SYSTEM SET max_slot_wal_keep_size = '2GB';
SELECT pg_reload_conf();
NS=team-a
PASSWORD=$(openssl rand -hex 24)

# 1. The Secret Tenax reads
kubectl -n $NS create secret generic tenax-mysql \
  --from-literal=username=tenax --from-file=password=<(printf %s "$PASSWORD")

# 2. The user, as root (the official image has the root password in MYSQL_ROOT_PASSWORD)
kubectl -n $NS exec -i deploy/mysql -- sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -uroot' <<SQL
CREATE USER IF NOT EXISTS 'tenax'@'%' IDENTIFIED BY '$PASSWORD';
GRANT SELECT, SHOW VIEW, TRIGGER, EVENT, LOCK TABLES, PROCESS, RELOAD, SHOW_ROUTINE,
      REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'tenax'@'%';
SQL

3. Pemulihan ke detik mana pun memerlukan binlog aktif dalam format row: keduanya adalah nilai bawaan MySQL 8. select @@log_bin, @@binlog_format menampilkan 1, ROW.

SQL yang sama sebagai berkas, dengan komentar (docs/sql/mysql-users.sql)
docs/sql/mysql-users.sql
-- Tenax's database user for MySQL 8.4 (run once as root, replace the password):
--
--   mysql -uroot -p < mysql-users.sql
--
-- One user, `tenax`, does everything (ADR 0016): consistent logical dumps (mysqldump --single-transaction
-- --source-data=2), inventory and checks, and the binlog stream (mysqlbinlog --read-from-remote-server).
-- Without REPLICATION SLAVE / REPLICATION CLIENT Tenax still takes dumps, but without point-in-time restore.
--
-- Server settings (all MySQL 8 defaults except GTIDs): log_bin=ON, binlog_format=ROW, a unique server_id;
-- gtid_mode=ON with enforce_gtid_consistency=ON is recommended; binlog_expire_logs_seconds long enough for the
-- streamer to catch up after an outage (default 30 days).
CREATE USER IF NOT EXISTS 'tenax'@'%' IDENTIFIED BY 'CHANGE_ME_PASSWORD';
GRANT SELECT, SHOW VIEW, TRIGGER, EVENT, LOCK TABLES, PROCESS, RELOAD, SHOW_ROUTINE,
      REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'tenax'@'%';
FLUSH PRIVILEGES;

Selesai. Arahkan target ke Secret tersebut:

spec:
  credentials:
    secretRef: { name: tenax-postgres }

Tanpa langkah 3

Tidak ada yang gagal. Tenax mencoba melakukan replikasi dengan pengguna tersebut, dan jika basis data menolak:

  • cadangan penuh bersifat logis, sesuai jadwal kebijakan;
  • kondisi Replication pada target, konsol, dan peringatan di setiap cadangan menyebutkan dengan tepat apa yang perlu ditambahkan;
  • Tenax memeriksa lagi setiap beberapa menit dan mulai streaming dengan sendirinya setelah Anda menambahkannya.
Pengguna boleh Yang Anda dapatkan Hak akses
Membaca semuanya cadangan logis, inventaris, ekspor, pemeriksaan Postgres pg_read_all_data + pg_monitor; MySQL SELECT, SHOW VIEW, TRIGGER, EVENT, LOCK TABLES, PROCESS, RELOAD, SHOW_ROUTINE
Melakukan replikasi cadangan fisik (Postgres) dan aliran perubahan: pemulihan ke detik mana pun Postgres REPLICATION ditambah aturan pg_hba.conf; MySQL REPLICATION SLAVE, REPLICATION CLIENT

Replication slot

Aliran Postgres menyimpan WAL di replication slot sampai Tenax selesai menyimpannya. SQL di atas membatasi apa yang dapat ditahan oleh streamer yang berhenti hingga 2 GB (max_slot_wal_keep_size), Tenax memberi peringatan TenaxSlotWALRetentionHigh jauh sebelum batas itu, dan slot dihapus saat target dihapus atau pemulihan point-in-time dimatikan.

Lanjutan: jaga pengguna tetap sinkron secara otomatis, untuk penyiapan GitOps tempat kata sandi dirotasi dan basis data dibangun ulang.