A EPAS/PostgreSQL (version >=10) extension to enable execution of EFM commands through the normal database connection
The extension provides following functions and views:
-- functions --
efm_extension | efm_allow_node | integer | text | normal
efm_extension | efm_cluster_status | SETOF text | text | normal
efm_extension | efm_disallow_node | integer | text | normal
efm_extension | efm_failover | integer | | normal
efm_extension | efm_list_properties | SETOF text | | normal
efm_extension | efm_resume_monitoring | integer | | normal
efm_extension | efm_set_priority | integer | text, text | normal
efm_extension | efm_switchover | integer | | normal
--Views--
efm_extension | efm_local_properties | view | enterprisedb
efm_extension | efm_nodes_details | view | enterprisedb
To use this module, user has to have following:
- EFM is installed and configures at database node. For more information on installing and configuring EFM use the EDB document
- Following sudo rule is defined for enterprisedb/postgres system user
cat /etc/sudoers.d/enterprisedb
# Copyright EnterpriseDB Corporation, 2019-2020. All Rights Reserved.
#
# Do not edit this file. Changes to the file may be overwritten
# during an upgrade.
#
# This file assumes you are running your efm cluster as user 'efm'. If not,
# then you will need to copy this file.
# Allow user 'enterprisedb' to sudo /usr/edb/efm-3.10/bin/efm as efm.
enterprisedb ALL=(efm) NOPASSWD:/usr/edb/efm-3.10/bin/efm
- User has to set the following GUC in EDB Postgres postgresql.conf or they can also set at database/user level too:
edb=# select name, setting from pg_settings where name ~* '^efm.';
name | setting
-------------------------+---------------------------
efm.cluster_name | efm
efm.command_path | /usr/edb/efm-3.10/bin/efm
efm.edb_sudo | sudo -u efm
efm.properties_location | /etc/edb/efm-3.10
- For setting above parameters user can use following
ALTER SYSTEM
command
ALTER SYSTEM SET efm.cluster_name TO 'efm';
ALTER SYSTEM SET efm.command_path TO '/usr/edb/efm-3.10/bin/efm';
ALTER SYSTEM SET efm.edb_sudo TO 'sudo -u efm';
ALTER SYSTEM SET efm.properties_location TO '/usr/edb/efm-3.10';
SELECT pg_reload_conf();
# pg_config needs to be on the path!
# if non-default pg_config location is needed one can specify it similar to USE_PGXS i.e. PG_CONFIG=/path/...
git clone https://github.com/vibhorkum/efm_extension
cd efm_extension
make
sudo make install
CREATE EXTENSION efm_extension; -- needs to be done by a superuser
edb=# select efm_extension.efm_cluster_status('text');
efm_cluster_status
------------------------------------------------------------------------
Cluster Status: efm
VIP:
Agent Type Address Agent DB Info
--------------------------------------------------------------
Idle 172.17.0.2 UP UNKNOWN
Allowed node host list:
172.17.0.2
Membership coordinator: 172.17.0.2
Standby priority host list:
(List is empty.)
Promote Status:
Idle Node Status (idle nodes ignored in XLog location comparisons):
Address XLog Loc Info
--------------------------------------------------------------
172.17.0.2 0/35BFC10 DB is not in recovery.
(23 rows)
edb=# select efm_extension.efm_cluster_status('json');
efm_cluster_status
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
{"nodes":{"172.17.0.2":{"type":"Idle","agent":"UP","db":"UNKNOWN","info":" ","xlog":"0\/35BFC10","xloginfo":"DB is not in recovery."}},"allowednodes":["172.17.0.2"],"membershipcoordinator":"172.17.0.2","
failoverpriority":[],"VIP":"","minimumstandbys":0,"messages":["Did not find XLog location for any non-idle nodes."]}
(1 row)
edb=# select efm_extension.efm_allow_node('172.17.0.2');
efm_allow_node
----------------
0
(1 row)
edb=# select efm_extension.efm_disallow_node('172.17.0.2');
efm_disallow_node
-------------------
0
(1 row)
edb=# select * from efm_extension.efm_nodes_details ;
node_ip | property | value
------------+----------+--------------------------
172.17.0.2 | db | "UNKNOWN"
172.17.0.2 | info | " "
172.17.0.2 | type | "Idle"
172.17.0.2 | xlog | "0/35BC388"
172.17.0.2 | agent | "UP"
172.17.0.2 | xloginfo | "DB is not in recovery."
(6 rows)
edb=# select * from efm_extension.efm_local_properties ;
name | value
---------------------------+----------------------------------
efm.license |
db.user | efm
db.password.encrypted | 074b627bf50168881d246c5dd32fd8d0
db.port | 5444
db.database | edb
db.service.owner | enterprisedb
db.service.name | edb-as-10
db.bin | /usr/edb/as10/bin
db.recovery.conf.dir | /pgdata
jdbc.ssl | false
jdbc.ssl.mode | verify-ca
user.email | unknow@gmail.com
script.notification |
bind.address | 172.17.0.2:5430
admin.port | 5431
is.witness | false
local.period | 10
local.timeout | 60
local.timeout.final | 10
remote.timeout | 10
node.timeout | 50
pingServerIp | 8.8.8.8
pingServerCommand | /bin/ping -q -c3 -w5
auto.allow.hosts | true
db.reuse.connection.count | 0
auto.failover | true
auto.reconfigure | true
promotable | true
minimum.standbys | 0
recovery.check.period | 2
auto.resume.period | 0
virtualIp |
virtualIp.interface |
virtualIp.netmask |
script.fence |
script.post.promotion |
script.resumed |
script.db.failure |
script.master.isolated |
sudo.command | sudo
sudo.user.command | sudo -u %u
jgroups.loglevel | INFO
efm.loglevel | INFO
jvm.options | -Xmx32m
(44 rows)