Commit 68afdec7 by Owo Sugiana

File *.signal sebagai tanda db mirror

1 parent 6314a6b9
0.9.1 26-7-2024
---------------
- Status database mirror kini berdasarkan keberadaan file *.signal.
0.9 7-7-2024
------------
- Status database mirror kini menggunakan query ketimbang baca log file.
......
......@@ -11,6 +11,7 @@ from subprocess import (
)
from configparser import ConfigParser
from argparse import ArgumentParser
from glob import glob
from .pg_conf import Reader
from .file_rotate import FileRotate
from .logger import setup_logging
......@@ -60,14 +61,32 @@ def is_systemd():
return os.path.exists(script)
def is_pg_active(version, cluster):
service = f'postgresql@{version}-{cluster}.service'
cmd1 = ['systemctl', 'status', service]
cmd2 = ['grep', 'Active']
p1 = Popen(cmd1, stdout=PIPE)
p2 = Popen(cmd2, stdin=p1.stdout, stdout=PIPE)
out, err = p2.communicate()
if not err:
s = out.decode('utf-8')
if s:
t = s.split()
return t[1] == 'active'
def systemd_pg_service(todo):
pg_conf_dir = conf.get('main', 'pg_conf_dir')
for version in os.listdir(pg_conf_dir):
conf_dir = os.path.join(pg_conf_dir, version)
for cluster in os.listdir(conf_dir):
cluster_dir = os.path.join(conf_dir, cluster)
pg_conf = os.path.join(cluster_dir, 'postgresql.conf')
if is_mirror(pg_conf):
if is_mirror(version, cluster):
continue
is_active = is_pg_active(version, cluster)
if todo == 'start':
if is_active:
continue
elif not is_active:
continue
cmd = f'systemctl {todo} postgresql@{version}-{cluster}.service'
run(cmd)
......@@ -110,32 +129,8 @@ def pg_port(conf_file):
return value
def is_mirror(pg_conf):
r = Reader(pg_conf)
if 'include_dir' in r:
# Versi 12 - 15
conf_dir = os.path.split(pg_conf)[0]
mirror_conf = os.path.join(conf_dir, r['include_dir'], 'recovery.conf')
if os.path.exists(mirror_conf):
return True
# Versi 9.1 - 11
mirror_conf = os.path.join(r['data_directory'], 'recovery.conf')
if os.path.exists(mirror_conf):
return True
if 'primary_conninfo' in r:
return True
port = r['port']
# Versi 11 - 15
cmd_psql = f'psql -p {port} -c "SHOW primary_conninfo"'
cmd1 = ['su', '-', 'postgres', '-c', cmd_psql]
cmd2 = ['grep', 'user']
p1 = Popen(cmd1, stdout=PIPE)
p2 = Popen(cmd2, stdin=p1.stdout, stdout=PIPE)
out, err = p2.communicate()
if not err:
s = out.decode('utf-8')
if s:
return True
def is_mirror(version, cluster):
return glob(f'/var/lib/postgresql/{version}/{cluster}/*.signal')
def is_db_exists(version, port, db_name):
......@@ -162,7 +157,7 @@ def pg_local_conf():
for cluster in os.listdir(conf_dir):
cluster_dir = os.path.join(conf_dir, cluster)
pg_conf = os.path.join(cluster_dir, 'postgresql.conf')
if is_mirror(pg_conf):
if is_mirror(version, cluster):
continue
pg_hba_file = os.path.join(cluster_dir, 'pg_hba.conf')
pg_hba_bak_file = pg_hba_file + '.orig'
......@@ -243,6 +238,8 @@ def pg_backup():
version_backup_dir = os.path.join(base_backup_dir, version)
mkdir(version_backup_dir)
for cluster in os.listdir(version_conf_dir):
if is_mirror(version, cluster):
continue
cluster_conf_dir = os.path.join(version_conf_dir, cluster)
cluster_backup_dir = os.path.join(version_backup_dir, cluster)
mkdir(cluster_backup_dir)
......@@ -251,8 +248,7 @@ def pg_backup():
for db_name in db_list:
if not is_db_exists(version, port, db_name):
continue
if not is_mirror(pg_conf):
vacuum(version, port, db_name)
vacuum(version, port, db_name)
pg_dump(version, port, db_name, cluster_backup_dir)
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!