{"id":16445211,"url":"https://github.com/dgapitts/vagrant-pg96-slony","last_synced_at":"2025-02-26T08:25:50.383Z","repository":{"id":145829529,"uuid":"331597306","full_name":"dgapitts/vagrant-pg96-slony","owner":"dgapitts","description":null,"archived":false,"fork":false,"pushed_at":"2021-01-23T20:16:45.000Z","size":43,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-01-08T22:38:52.931Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dgapitts.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-01-21T10:48:20.000Z","updated_at":"2021-01-23T20:16:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"64874757-1835-4fe0-8e58-7bbde1b14a97","html_url":"https://github.com/dgapitts/vagrant-pg96-slony","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dgapitts%2Fvagrant-pg96-slony","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dgapitts%2Fvagrant-pg96-slony/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dgapitts%2Fvagrant-pg96-slony/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dgapitts%2Fvagrant-pg96-slony/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dgapitts","download_url":"https://codeload.github.com/dgapitts/vagrant-pg96-slony/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240816724,"owners_count":19862350,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-11T09:43:40.073Z","updated_at":"2025-02-26T08:25:50.353Z","avatar_url":"https://github.com/dgapitts.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Summary\n\n\nTraining environment for learning how to setup slony replication.\n\n*I've got this setup and working now*, after reading the slony overview document from dalibo (https://public.dalibo.com/exports/conferences/_archives/_2011/201110_slony/pgconfeu_slony.pdf).\n\nThe last two things I've done\n\n* set listen_addresses='*' in postgres.conf\n* added final setup_slony_master_and_slave.sh (before i.e. below, I was only slarting the master slon process - hence the connectivity problems I was getting below )\n\n```\n~/projects/vagrant-pg96-slony $ cat setup_slony_master_and_slave.sh\n. ~/.bash_profile\nmkdir /tmp/master\ncd /tmp/master\n/usr/pgsql-9.6/bin/slonik /vagrant/init_master.slonik \u0026\nsleep 2\nmkdir /tmp/slave\ncd /tmp/slave\n/usr/pgsql-9.6/bin/slonik /vagrant/init_slave.slonik \u0026\nsleep 2\ncd /tmp/master\nnohup slon slony_example \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" \u0026\nsleep 2\ncd /tmp/slave\nnohup slon slony_example \"dbname=pgbenchslave  host=localhost port=5432 user=slonyrep password=changeme\" \u0026\n```\n\nNote: this is 99% scripted i.e. you should just need to type vagrant up, although I did need to start the master and slave slon processes manually i.e. for some reason the called embedded within the setup_slony_master_and_slave.sh are not working (maybe sort sort of missing env parameter with shell scripts call shell scripts) \n\n\n```\n~/projects/vagrant-pg96-slony $ vagrant ssh\nLast login: Fri Jan 22 17:17:25 2021\n[pg96slony:vagrant:~] # pg\nLast login: Fri Jan 22 17:17:39 UTC 2021\n[pg96slony:postgres:~] #  PGPASSWORD=changeme psql -U slonyrep -h localhost -p 5432 -d pgbenchslave -c \"select count(*) from pgbench_branches;\"\n count\n-------\n     0\n(1 row)\n\n[pg96slony:postgres:~] # ps -ef|grep slon\npostgres  3944  3895  0 17:19 pts/0    00:00:00 grep --color=auto slon\n[pg96slony:postgres:~] # cat /tmp/setup_slony_master_and_slave.sh\n. ~/.bash_profile\nmkdir /tmp/master\ncd /tmp/master\n/usr/pgsql-9.6/bin/slonik /vagrant/init_master.slonik \u0026\nsleep 2\nmkdir /tmp/slave\ncd /tmp/slave\n/usr/pgsql-9.6/bin/slonik /vagrant/init_slave.slonik \u0026\nsleep 2\ncd /tmp/master\nnohup slon slony_example \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" \u0026\nsleep 2\ncd /tmp/slave\nnohup slon slony_example \"dbname=pgbenchslave  host=localhost port=5432 user=slonyrep password=changeme\" \u0026\n\n[pg96slony:postgres:~] # cd /tmp/master\n[pg96slony:postgres:/tmp/master] # lt\ntotal 0\n[pg96slony:postgres:/tmp/master] # cd /tmp/master\n[pg96slony:postgres:/tmp/master] # nohup slon slony_example \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" \u0026\n[1] 3968\n[pg96slony:postgres:/tmp/master] # nohup: ignoring input and appending output to ‘nohup.out’\n\n[pg96slony:postgres:/tmp/master] # cd /tmp/slave\n[pg96slony:postgres:/tmp/slave] # nohup slon slony_example \"dbname=pgbenchslave  host=localhost port=5432 user=slonyrep password=changeme\" \u0026\n[2] 3985\n[pg96slony:postgres:/tmp/slave] # nohup: ignoring input and appending output to ‘nohup.out’\n\n[pg96slony:postgres:/tmp/slave] #  PGPASSWORD=changeme psql -U slonyrep -h localhost -p 5432 -d pgbenchslave -c \"select count(*) from pgbench_branches;\"\n count\n-------\n     1\n(1 row)\n\n[pg96slony:postgres:/tmp/slave] # ps -ef|grep slon\npostgres  3968  3895  0 17:20 pts/0    00:00:00 slon slony_example dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\npostgres  3969  3968  0 17:20 pts/0    00:00:00 slon slony_example dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\npostgres  3973  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbench ::1(47480) idle\npostgres  3979  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbenchslave ::1(47482) idle\npostgres  3980  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbench ::1(47484) idle\npostgres  3981  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbench ::1(47486) idle\npostgres  3982  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbench ::1(47488) idle\npostgres  3983  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbench ::1(47490) idle\npostgres  3985  3895  0 17:20 pts/0    00:00:00 slon slony_example dbname=pgbenchslave  host=localhost port=5432 user=slonyrep password=changeme\npostgres  3986  3985  0 17:20 pts/0    00:00:00 slon slony_example dbname=pgbenchslave  host=localhost port=5432 user=slonyrep password=changeme\npostgres  3990  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbenchslave ::1(47494) idle\npostgres  3996  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbench ::1(47496) idle\npostgres  3997  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbenchslave ::1(47498) idle\npostgres  3998  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbenchslave ::1(47500) idle\npostgres  3999  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbenchslave ::1(47502) idle\npostgres  4000  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbenchslave ::1(47504) idle\npostgres  4002  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbench ::1(47508) idle\npostgres  4003  3801  0 17:20 ?        00:00:00 postgres: slonyrep pgbenchslave ::1(47510) idle\npostgres  4021  3895  0 17:21 pts/0    00:00:00 grep --color=auto slon\n[pg96slony:postgres:/tmp/slave] # psql -U slonyrep -h localhost -p 5432 -d pgbenchslave -c \"select count(*) from pgbench_branches;\"\n count\n-------\n     1\n(1 row)\n```\n\n\n## Useful documentation for slony (reference)\n\n* https://www.slony.info/documentation/2.1/tutorial.html\n* https://www.slony.info/documentation/stmtsetaddtable.html\n* https://sites.google.com/site/pgsqldoc/Home/slony\n* https://hub.packtpub.com/replication-solutions-postgresql/\n* https://severalnines.com/blog/experts-guide-slony-replication-postgresql\n* https://serverfault.com/questions/198002/postgresql-what-does-grant-all-privileges-on-database-d\n* https://public.dalibo.com/exports/conferences/_archives/_2011/201110_slony/pgconfeu_slony.pdf \n\n\n\n\n## Earlier issues - setup seems almost complete although still hitting connectivity issues between master and slave \nTo install slony we first need to install perl\n\n```\n  yum install -y perl\n  yum install -y slony1-96\n```\n\nInitial DB setup ... \n\n```\n  su -c \"/usr/pgsql-12/bin/pgbench -i -s 1\" -s /bin/sh vagrant\n  su -c \"pg_dump -s -p 5432 -h localhost pgbench | psql -h localhost -p 5432 pgbenchslave\" -s /bin/sh vagrant\n```\n\n\nI'm struggling to get slony up and running, but making notes of all the challenges/steps I'm working through, this is a learning exercise...\n\n* I've added md5 .pgpass entries as per https://www.slony.info/documentation/security.html and https://gazelle.ihe.net/content/adding-slave\n* I also updated pg_hba.conf entries\n* However the initiallisation following commanads only partially work\n```\nFirst  Session:\n[pg96slony:vagrant:~] # pg\nLast login: Thu Jan 21 21:02:58 UTC 2021\n[pg96slony:postgres:~] # /usr/pgsql-9.6/bin/slonik /vagrant/init_master.slonik\n[pg96slony:postgres:~] # /usr/pgsql-9.6/bin/slonik /vagrant/init_slave.slonik\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\n\nSecond Session\n[pg96slony:postgres:~] #  nohup slon slony_example \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" \u0026\n[1] 4100\n[pg96slony:postgres:~] # nohup: ignoring input and appending output to ‘nohup.out’\n\n[pg96slony:postgres:~] #\n[pg96slony:postgres:~] # tail -f nohup.out\n2021-01-21 21:13:18 UTC CONFIG version for \"dbname=pgbenchslave host=localhost port=5432 user=slonyrep password=changeme\" is 90620\n2021-01-21 21:13:18 UTC CONFIG version for \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" is 90620\n2021-01-21 21:13:18 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 21:13:18 UTC CONFIG cleanupThread: bias = 60\n2021-01-21 21:13:18 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 21:13:18 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 21:13:20 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 21:13:20 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 21:13:20 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 21:13:20 UTC CONFIG remoteWorkerThread_2: update provider configuration\n^C\n[pg96slony:postgres:~] # tail -1000f nohup.out\n2021-01-21 21:13:18 UTC CONFIG main: slon version 2.2.10 starting up\n2021-01-21 21:13:18 UTC INFO   slon: watchdog process started\n2021-01-21 21:13:18 UTC CONFIG slon: watchdog ready - pid = 4100\n2021-01-21 21:13:18 UTC CONFIG slon: worker process created - pid = 4101\n2021-01-21 21:13:18 UTC CONFIG main: Integer option vac_frequency = 3\n2021-01-21 21:13:18 UTC CONFIG main: Integer option log_level = 0\n2021-01-21 21:13:18 UTC CONFIG main: Integer option sync_interval = 2000\n2021-01-21 21:13:18 UTC CONFIG main: Integer option sync_interval_timeout = 10000\n2021-01-21 21:13:18 UTC CONFIG main: Integer option sync_group_maxsize = 20\n2021-01-21 21:13:18 UTC CONFIG main: Integer option syslog = 0\n2021-01-21 21:13:18 UTC CONFIG main: Integer option quit_sync_provider = 0\n2021-01-21 21:13:18 UTC CONFIG main: Integer option remote_listen_timeout = 300\n2021-01-21 21:13:18 UTC CONFIG main: Integer option monitor_interval = 500\n2021-01-21 21:13:18 UTC CONFIG main: Integer option explain_interval = 0\n2021-01-21 21:13:18 UTC CONFIG main: Integer option tcp_keepalive_idle = 0\n2021-01-21 21:13:18 UTC CONFIG main: Integer option tcp_keepalive_interval = 0\n2021-01-21 21:13:18 UTC CONFIG main: Integer option tcp_keepalive_count = 0\n2021-01-21 21:13:18 UTC CONFIG main: Integer option apply_cache_size = 100\n2021-01-21 21:13:18 UTC CONFIG main: Boolean option log_pid = 0\n2021-01-21 21:13:18 UTC CONFIG main: Boolean option log_timestamp = 1\n2021-01-21 21:13:18 UTC CONFIG main: Boolean option tcp_keepalive = 1\n2021-01-21 21:13:18 UTC CONFIG main: Boolean option monitor_threads = 1\n2021-01-21 21:13:18 UTC CONFIG main: Boolean option enable_version_check = 1\n2021-01-21 21:13:18 UTC CONFIG main: Boolean option remote_listen_serializable_transactions = 1\n2021-01-21 21:13:18 UTC CONFIG main: Real option real_placeholder = 0.000000\n2021-01-21 21:13:18 UTC CONFIG main: String option cluster_name = slony_example\n2021-01-21 21:13:18 UTC CONFIG main: String option conn_info = dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\n2021-01-21 21:13:18 UTC CONFIG main: String option pid_file = [NULL]\n2021-01-21 21:13:18 UTC CONFIG main: String option log_timestamp_format = %Y-%m-%d %H:%M:%S %Z\n2021-01-21 21:13:18 UTC CONFIG main: String option archive_dir = [NULL]\n2021-01-21 21:13:18 UTC CONFIG main: String option sql_on_connection = [NULL]\n2021-01-21 21:13:18 UTC CONFIG main: String option lag_interval = [NULL]\n2021-01-21 21:13:18 UTC CONFIG main: String option command_on_logarchive = [NULL]\n2021-01-21 21:13:18 UTC CONFIG main: String option syslog_facility = LOCAL0\n2021-01-21 21:13:18 UTC CONFIG main: String option syslog_ident = slon\n2021-01-21 21:13:18 UTC CONFIG main: String option cleanup_interval = 10 minutes\n2021-01-21 21:13:18 UTC CONFIG main: local node id = 1\n2021-01-21 21:13:18 UTC INFO   main: main process started\n2021-01-21 21:13:18 UTC CONFIG main: launching sched_start_mainloop\n2021-01-21 21:13:18 UTC CONFIG main: loading current cluster configuration\n2021-01-21 21:13:18 UTC CONFIG storeNode: no_id=2 no_comment='Slave node'\n2021-01-21 21:13:18 UTC CONFIG storePath: pa_server=2 pa_client=1 pa_conninfo=\"dbname=pgbenchslave host=localhost port=5432 user=slonyrep password=changeme\" pa_connretry=10\n2021-01-21 21:13:18 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 21:13:18 UTC CONFIG storeSet: set_id=1 set_origin=1 set_comment='All pgbench tables'\n2021-01-21 21:13:18 UTC CONFIG main: last local event sequence = 5000000013\n2021-01-21 21:13:18 UTC CONFIG main: configuration complete - starting threads\n2021-01-21 21:13:18 UTC INFO   localListenThread: thread starts\n2021-01-21 21:13:18 UTC CONFIG version for \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" is 90620\n2021-01-21 21:13:18 UTC CONFIG enableNode: no_id=2\n2021-01-21 21:13:18 UTC INFO   main: running scheduler mainloop\n2021-01-21 21:13:18 UTC INFO   remoteListenThread_2: thread starts\n2021-01-21 21:13:18 UTC CONFIG cleanupThread: thread starts\n2021-01-21 21:13:18 UTC INFO   syncThread: thread starts\n2021-01-21 21:13:18 UTC INFO   monitorThread: thread starts\n2021-01-21 21:13:18 UTC INFO   remoteWorkerThread_2: thread starts\n2021-01-21 21:13:18 UTC CONFIG version for \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" is 90620\n2021-01-21 21:13:18 UTC CONFIG version for \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" is 90620\n2021-01-21 21:13:18 UTC CONFIG version for \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" is 90620\n2021-01-21 21:13:18 UTC CONFIG version for \"dbname=pgbenchslave host=localhost port=5432 user=slonyrep password=changeme\" is 90620\n2021-01-21 21:13:18 UTC CONFIG version for \"dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme\" is 90620\n2021-01-21 21:13:18 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 21:13:18 UTC CONFIG cleanupThread: bias = 60\n2021-01-21 21:13:18 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 21:13:18 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 21:13:20 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 21:13:20 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 21:13:20 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 21:13:20 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 21:15:40 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 21:15:40 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 21:19:26 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n```\n* Partially work in that they setup the _slony_example schema and added triggers\n\n```\n[pg96slony:postgres:~] # psql -d pgbench\npsql (9.6.20)\npgbench=# \\d+ pgbench_accounts\n                       Table \"public.pgbench_accounts\"\n  Column  |     Type      | Modifiers | Storage  | Stats target | Description\n----------+---------------+-----------+----------+--------------+-------------\n aid      | integer       | not null  | plain    |              |\n bid      | integer       |           | plain    |              |\n abalance | integer       |           | plain    |              |\n filler   | character(84) |           | extended |              |\nIndexes:\n    \"pgbench_accounts_pkey\" PRIMARY KEY, btree (aid)\nTriggers:\n    _slony_example_logtrigger AFTER INSERT OR DELETE OR UPDATE ON pgbench_accounts FOR EACH ROW EXECUTE PROCEDURE _slony_example.logtrigger('_slony_example', '1', 'k')\n    _slony_example_truncatetrigger BEFORE TRUNCATE ON pgbench_accounts FOR EACH STATEMENT EXECUTE PROCEDURE _slony_example.log_truncate('1')\nDisabled user triggers:\n    _slony_example_denyaccess BEFORE INSERT OR DELETE OR UPDATE ON pgbench_accounts FOR EACH ROW EXECUTE PROCEDURE _slony_example.denyaccess('_slony_example')\n    _slony_example_truncatedeny BEFORE TRUNCATE ON pgbench_accounts FOR EACH STATEMENT EXECUTE PROCEDURE _slony_example.deny_truncate()\nOptions: fillfactor=100\n\n\n[pg96slony:postgres:~] # psql -U slonyrep -h localhost -p 5432 -d pgbench\npsql (9.6.20)\nType \"help\" for help.\n\npgbench=# \\dn\n      List of schemas\n      Name      |  Owner\n----------------+----------\n _slony_example | slonyrep\n public         | postgres\n(2 rows)\n\npgbench=# SET search_path TO _slony_example, public;\nSET\npgbench=# \\x\nExpanded display is on.\npgbench=# select * from sl_table;\n-[ RECORD 1 ]----------------------\ntab_id      | 1\ntab_reloid  | 16393\ntab_relname | pgbench_accounts\ntab_nspname | public\ntab_set     | 1\ntab_idxname | pgbench_accounts_pkey\ntab_altered | f\ntab_comment | accounts table\n-[ RECORD 2 ]----------------------\ntab_id      | 2\ntab_reloid  | 16396\ntab_relname | pgbench_branches\ntab_nspname | public\ntab_set     | 1\ntab_idxname | pgbench_branches_pkey\ntab_altered | f\ntab_comment | branches table\n-[ RECORD 3 ]----------------------\ntab_id      | 3\ntab_reloid  | 16390\ntab_relname | pgbench_tellers\ntab_nspname | public\ntab_set     | 1\ntab_idxname | pgbench_tellers_pkey\ntab_altered | f\ntab_comment | tellers table\n-[ RECORD 4 ]----------------------\ntab_id      | 4\ntab_reloid  | 16387\ntab_relname | pgbench_history\ntab_nspname | public\ntab_set     | 1\ntab_idxname | pgbench_history_pkey\ntab_altered | f\ntab_comment | history table\n```\n\nHowever the actual replication seems to be hanging \n\n```\n[pg96slony:postgres:~] # PGPASSWORD=changeme psql -U slonyrep -h localhost -p 5432 -d pgbenchslave -c \"select count(*) from pgbench_branches;\"\n count\n-------\n     0\n(1 row)\n\n[pg96slony:postgres:~] # PGPASSWORD=changeme psql -U slonyrep -h localhost -p 5432 -d pgbench -c \"select count(*) from pgbench_branches;\"\n count\n-------\n     1\n(1 row)\n```\n\n\nI suspect connectivity issues\n\n```\npostgres=# \\du\n                                   List of roles\n Role name |                         Attributes                         | Member of\n-----------+------------------------------------------------------------+-----------\n postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}\n slonyrep  | Superuser                                                  | {}\n vagrant   |                                                            | {}\n```\n\n\n\nNB I also trying to work through this example (https://hub.packtpub.com/replication-solutions-postgresql/#more) and using the postgres user\n\n\n```\n[pg96slony:postgres:~] # createdb test1\n[pg96slony:postgres:~] # createdb test2\n[pg96slony:postgres:~] # psql -d test1\npsql (9.6.20)\nType \"help\" for help.\n\ntest1=# create table t_test (id numeric primary key, name\ntest1(#   varchar);\nCREATE TABLE\ntest1=# insert into t_test values(1,'A'),(2,'B'), (3,'C');\nINSERT 0 3\ntest1=#\ntest1=# \\q\n[pg96slony:postgres:~] # psql\npsql (9.6.20)\nType \"help\" for help.\npostgres=# alter user postgres with password 'changeme';\nALTER ROLE\npostgres=# \\q\n[pg96slony:postgres:~] # vi ~/.pgpass\n[pg96slony:postgres:~] # pg_dump -s -p 5432 -h localhost test1 | psql -h localhost -p 5432 test2\nSET\n..\nCREATE EXTENSION\nCOMMENT\nSET\nSET\nCREATE TABLE\nALTER TABLE\nALTER TABLE\n[pg96slony:postgres:~] # psql -d  test2\npsql (9.6.20)\nType \"help\" for help.\n\ntest2=# select * from t_test;\n id | name\n----+------\n(0 rows)\n\ntest2=# \\q\n\n\n[pg96slony:postgres:~] # head -20 init_*\n==\u003e init_master2.slonik \u003c==\n#! /bin/slonik\n  cluster name = mycluster;\n  node 1 admin conninfo = 'dbname=test1 host=localhost\nport=5432 user=postgres password=changeme';\n  node 2 admin conninfo = 'dbname=test2 host=localhost\nport=5432 user=postgres password=changeme';\n  init cluster ( id=1);\n  create set (id=1, origin=1);\n  set add table(set id=1, origin=1, id=1, fully qualified\nname = 'public.t_test');\n  store node (id=2, event node = 1);\n  store path (server=1, client=2, conninfo='dbname=test1\nhost=localhost port=5432 user=postgres password=changeme');\n  store path (server=2, client=1, conninfo='dbname=test2\nhost=localhost port=5432 user=postgres password=changeme');\n  store listen (origin=1, provider = 1, receiver = 2);\n  store listen (origin=2, provider = 2, receiver = 1);\n\n==\u003e init_slave2.slonik \u003c==\n#! /bin/slonik\n  cluster name = mycluster;\n  node 1 admin conninfo = 'dbname=test1 host=localhost\nport=5432 user=postgres password=changeme';\n  node 2 admin conninfo = 'dbname=test2 host=localhost\nport=5432 user=postgres password=changeme';\nsubscribe set ( id = 1, provider = 1, receiver = 2,\n  forward = no);\n```  \n\nbut similar results i.e. the triggers and _mycluster (for slony metadata) are added but no data is replicated\n\n```\n\n[pg96slony:postgres:~] # slonik init_master2.slonik\ninit_master2.slonik:16: waiting for event (1,5000000007) to be confirmed on node 2\ninit_master2.slonik:16: waiting for event (1,5000000007) to be confirmed on node 2\ninit_master2.slonik:16: waiting for event (1,5000000007) to be confirmed on node 2\ninit_master2.slonik:16: waiting for event (1,5000000007) to be confirmed on node 2\n\n[pg96slony:postgres:~] # slonik init_slave2.slonik\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\nwaiting for events  (2,5000000001) only at (2,0) to be confirmed on node 1\n\n\n[pg96slony:postgres:~] # nohup slon mycluster \"dbname=test1 host=localhost port=5432\n\u003e   user=postgres password=changeme\" \u0026\n[1] 8057\n[pg96slony:postgres:~] # nohup: ignoring input and appending output to ‘nohup.out’\n\n[pg96slony:postgres:~] # tail -1000f nohup.out\n2021-01-21 23:37:05 UTC CONFIG main: slon version 2.2.10 starting up\n2021-01-21 23:37:05 UTC INFO   slon: watchdog process started\n2021-01-21 23:37:05 UTC CONFIG slon: watchdog ready - pid = 8057\n2021-01-21 23:37:05 UTC CONFIG slon: worker process created - pid = 8058\n2021-01-21 23:37:05 UTC CONFIG main: Integer option vac_frequency = 3\n2021-01-21 23:37:05 UTC CONFIG main: Integer option log_level = 0\n2021-01-21 23:37:05 UTC CONFIG main: Integer option sync_interval = 2000\n2021-01-21 23:37:05 UTC CONFIG main: Integer option sync_interval_timeout = 10000\n2021-01-21 23:37:05 UTC CONFIG main: Integer option sync_group_maxsize = 20\n2021-01-21 23:37:05 UTC CONFIG main: Integer option syslog = 0\n2021-01-21 23:37:05 UTC CONFIG main: Integer option quit_sync_provider = 0\n2021-01-21 23:37:05 UTC CONFIG main: Integer option remote_listen_timeout = 300\n2021-01-21 23:37:05 UTC CONFIG main: Integer option monitor_interval = 500\n2021-01-21 23:37:05 UTC CONFIG main: Integer option explain_interval = 0\n2021-01-21 23:37:05 UTC CONFIG main: Integer option tcp_keepalive_idle = 0\n2021-01-21 23:37:05 UTC CONFIG main: Integer option tcp_keepalive_interval = 0\n2021-01-21 23:37:05 UTC CONFIG main: Integer option tcp_keepalive_count = 0\n2021-01-21 23:37:05 UTC CONFIG main: Integer option apply_cache_size = 100\n2021-01-21 23:37:05 UTC CONFIG main: Boolean option log_pid = 0\n2021-01-21 23:37:05 UTC CONFIG main: Boolean option log_timestamp = 1\n2021-01-21 23:37:05 UTC CONFIG main: Boolean option tcp_keepalive = 1\n2021-01-21 23:37:05 UTC CONFIG main: Boolean option monitor_threads = 1\n2021-01-21 23:37:05 UTC CONFIG main: Boolean option enable_version_check = 1\n2021-01-21 23:37:05 UTC CONFIG main: Boolean option remote_listen_serializable_transactions = 1\n2021-01-21 23:37:05 UTC CONFIG main: Real option real_placeholder = 0.000000\n2021-01-21 23:37:05 UTC CONFIG main: String option cluster_name = mycluster\n2021-01-21 23:37:05 UTC CONFIG main: String option conn_info = dbname=test1 host=localhost port=5432\n  user=postgres password=changeme\n2021-01-21 23:37:05 UTC CONFIG main: String option pid_file = [NULL]\n2021-01-21 23:37:05 UTC CONFIG main: String option log_timestamp_format = %Y-%m-%d %H:%M:%S %Z\n2021-01-21 23:37:05 UTC CONFIG main: String option archive_dir = [NULL]\n2021-01-21 23:37:05 UTC CONFIG main: String option sql_on_connection = [NULL]\n2021-01-21 23:37:05 UTC CONFIG main: String option lag_interval = [NULL]\n2021-01-21 23:37:05 UTC CONFIG main: String option command_on_logarchive = [NULL]\n2021-01-21 23:37:05 UTC CONFIG main: String option syslog_facility = LOCAL0\n2021-01-21 23:37:05 UTC CONFIG main: String option syslog_ident = slon\n2021-01-21 23:37:05 UTC CONFIG main: String option cleanup_interval = 10 minutes\n2021-01-21 23:37:05 UTC CONFIG main: local node id = 1\n2021-01-21 23:37:05 UTC INFO   main: main process started\n2021-01-21 23:37:05 UTC CONFIG main: launching sched_start_mainloop\n2021-01-21 23:37:05 UTC CONFIG main: loading current cluster configuration\n2021-01-21 23:37:05 UTC CONFIG storeNode: no_id=2 no_comment=''\n2021-01-21 23:37:05 UTC CONFIG storePath: pa_server=2 pa_client=1 pa_conninfo=\"dbname=test2\nhost=localhost port=5432 user=postgres password=changeme\" pa_connretry=10\n2021-01-21 23:37:05 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 23:37:05 UTC CONFIG storeSet: set_id=1 set_origin=1 set_comment='A replication set so boring no one thought to give it a name'\n2021-01-21 23:37:05 UTC CONFIG main: last local event sequence = 5000000007\n2021-01-21 23:37:05 UTC CONFIG main: configuration complete - starting threads\n2021-01-21 23:37:05 UTC INFO   localListenThread: thread starts\n2021-01-21 23:37:05 UTC CONFIG version for \"dbname=test1 host=localhost port=5432\n  user=postgres password=changeme\" is 90620\n2021-01-21 23:37:05 UTC CONFIG enableNode: no_id=2\n2021-01-21 23:37:05 UTC INFO   main: running scheduler mainloop\n2021-01-21 23:37:05 UTC INFO   remoteListenThread_2: thread starts\n2021-01-21 23:37:05 UTC CONFIG cleanupThread: thread starts\n2021-01-21 23:37:05 UTC INFO   syncThread: thread starts\n2021-01-21 23:37:05 UTC INFO   monitorThread: thread starts\n2021-01-21 23:37:05 UTC INFO   remoteWorkerThread_2: thread starts\n2021-01-21 23:37:05 UTC CONFIG version for \"dbname=test1 host=localhost port=5432\n  user=postgres password=changeme\" is 90620\n2021-01-21 23:37:05 UTC CONFIG version for \"dbname=test1 host=localhost port=5432\n  user=postgres password=changeme\" is 90620\n2021-01-21 23:37:05 UTC CONFIG version for \"dbname=test2\nhost=localhost port=5432 user=postgres password=changeme\" is 90620\n2021-01-21 23:37:05 UTC CONFIG version for \"dbname=test1 host=localhost port=5432\n  user=postgres password=changeme\" is 90620\n2021-01-21 23:37:05 UTC CONFIG version for \"dbname=test1 host=localhost port=5432\n  user=postgres password=changeme\" is 90620\n2021-01-21 23:37:05 UTC CONFIG cleanupThread: bias = 60\n2021-01-21 23:37:05 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 23:37:05 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 23:37:05 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 23:37:07 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 23:37:07 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 23:37:07 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 23:37:07 UTC CONFIG remoteWorkerThread_2: update provider configuration\n2021-01-21 23:37:27 UTC CONFIG storeListen: li_origin=2 li_receiver=1 li_provider=2\n2021-01-21 23:37:27 UTC CONFIG remoteWorkerThread_2: update provider configuration\nNOTICE:  Slony-I: Logswitch to sl_log_2 initiated\n2021-01-21 23:47:06 UTC INFO   cleanupThread:    0.024 seconds for cleanupEvent()\nNOTICE:  Slony-I: log switch to sl_log_2 still in progress - sl_log_1 not truncated\n2021-01-21 23:57:06 UTC INFO   cleanupThread:    0.004 seconds for cleanupEvent()\nNOTICE:  Slony-I: log switch to sl_log_2 still in progress - sl_log_1 not truncated\n2021-01-22 00:07:06 UTC INFO   cleanupThread:    0.009 seconds for cleanupEvent()\n2021-01-22 00:07:06 UTC INFO   cleanupThread:    0.033 seconds for vacuuming\nNOTICE:  Slony-I: log switch to sl_log_2 still in progress - sl_log_1 not truncated\n2021-01-22 00:17:07 UTC INFO   cleanupThread:    0.004 seconds for cleanupEvent()\n``` \n\n\n### Setting up slonyrep user with md5 \n\nI'm not sure if this is the really the right approach, being a (slony newbie) but here is what I setup\n\n```\n~/projects/vagrant-pg96-slony $ cat setup_slonyrep_dbuser.sh\n# to be run as postgres\ncreateuser -S slonyrep\npsql -c \"create user slonyrep with password 'changeme'\";\npsql -d pgbench -c \"GRANT ALL PRIVILEGES ON DATABASE pgbench TO slonyrep;\";\npsql -d pgbench -c \"GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO slonyrep;\"\npsql -d pgbenchslave -c \"GRANT ALL PRIVILEGES ON DATABASE pgbenchslave TO slonyrep;\";\npsql -d pgbenchslave -c \"GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO slonyrep;\"\n```\n\n\nand finally checking that I can \n```\n[pg96slony:postgres:~] # PGPASSWORD=changeme psql -U slonyrep -d pgbenchslave -c \"select count(*) from pgbench_branches;\"\n count\n-------\n     0\n\n```\n\n### Debuging - Ident authentication failed\n\n#### problem - Ident authentication failed for user \"slonyrep\nThis was my rough startin point \n```\n[pg96slony:vagrant:/vagrant] # cat init_master.slonik\n#! /usr/pgsql-9.6/bin/slonik\n  cluster name = mycluster;\n  node 1 admin conninfo = 'dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme';\n  node 2 admin conninfo = 'dbname=pgbenchslave host=localhost port=5432 user=slonyrep password=changeme'';\n  init cluster ( id=1);\n  create set (id=1, origin=1);\n  set add table(set id=1, origin=1, id=1, fully qualified\nname = 'public.t_test');\n  store node (id=2, event node = 1);\n  store path (server=1, client=2, conninfo='dbname=pgbench  host=localhost port=5432 user=slonyrep password=changeme');\n  store path (server=2, client=1, conninfo='dbname=pgbenchslave host=localhost port=5432 user=slonyrep password=changeme');\n  store listen (origin=1, provider = 1, receiver = 2);\n  store listen (origin=2, provider = 2, receiver = 1);\n```\n\nand while this works\n\n```\n[pg96slony:vagrant:/vagrant] # PGPASSWORD=changeme psql -d pgbench  -p 5432 -U slonyrep\npsql (9.6.20)\nType \"help\" for help.\n\npgbench=\u003e \\q\n```\nthis doesn't\n\n```\n[pg96slony:vagrant:/vagrant] # PGPASSWORD=changeme psql -d pgbench -h 127.0.0.1  -p 5432 -U slonyrep\npsql: FATAL:  Ident authentication failed for user \"slonyrep\"\n```\n\nI needed to update my pg_hba.conf\n\n```\nhost    pgbench         slonyrep        127.0.0.1/32            md5\nhost    pgbench         slonyrep        localhost               md5\nhost    pgbenchslave    slonyrep        127.0.0.1/32            md5\nhost    pgbenchslave    slonyrep        localhost               md5\n```\n\n\n### Debug permission denied\n\n#### problem - permission denied to set parameter \"session_replication_role\"\n\n```\n[pg96slony:postgres:/vagrant] # /usr/pgsql-9.6/bin/slonik init_master.slonik\ninit_master.slonik:5: PGRES_FATAL_ERROR SET datestyle TO 'ISO'; SET session_replication_role TO local;  - ERROR:  permission denied to set parameter \"session_replication_role\"\nUnable to set session configuration parameters\ninit_master.slonik:5: PGRES_FATAL_ERROR SET datestyle TO 'ISO'; SET session_replication_role TO local;  - ERROR:  permission denied to set parameter \"session_replication_role\"\nUnable to set session configuration parameters\ninit_master.slonik:5: PGRES_FATAL_ERROR select 1 from \"pg_catalog\".pg_namespace N \twhere N.nspname = '_mycluster'; - ERROR:  current transaction is aborted, commands ignored until end of transaction block\ninit_master.slonik:5: Error: cannot determine  if namespace \"_mycluster\" exists in node 1\n[pg96slony:postgres:/vagrant] #\n```\n\n#### solution add superuser role to replication user\n\n```\n[pg96slony:postgres:/vagrant] # psql -c \"alter user slonyrep superuser\"\nALTER ROLE\n```\n\n\n### Debug duplicate keys\n\n#### problem - duplicate key value violates unique constraint sl_set-pkey\n\n```\n[pg96slony:postgres:~] # /usr/pgsql-9.6/bin/slonik /vagrant/init_master.slonik\n/vagrant/init_master.slonik:7: PGRES_FATAL_ERROR lock table \"_mycluster\".sl_event_lock, \"_mycluster\".sl_config_lock;select \"_mycluster\".storeSet(1, 'All pgbench tables');  - ERROR:  duplicate key value violates unique constraint \"sl_set-pkey\"\nDETAIL:  Key (set_id)=(1) already exists.\nCONTEXT:  SQL statement \"insert into \"_mycluster\".sl_set\n\t\t\t(set_id, set_origin, set_comment) values\n\t\t\t(p_set_id, v_local_node_id, p_set_comment)\"\n```\n\n#### solution rebuild VM\n\nThe problem here was around try to initialize the master node multiple nodes:\n* it is hard to unpick the slony internal schema\n* in the real world I guess you should be careful, maybe you can backup slony schema before making changes\n* in my case I rebuilt the VM (vagrant destroy;vagrant up ...)\n\n\n\n\n\n\n\n\n\n\n### Diggging around in the _slony_example schema\n\n\n```\n[pg96slony:postgres:~] # psql -U slonyrep -h localhost -p 5432 -d pgbenchslave\npsql (9.6.20)\nType \"help\" for help.\n\npgbenchslave=# select count(*) from pgbench_accounts;\n count\n-------\n     0\n(1 row)\n\npgbenchslave=# \\dn\n      List of schemas\n      Name      |  Owner\n----------------+----------\n _slony_example | slonyrep\n public         | postgres\n(2 rows)\n\npgbenchslave=# SET search_path TO _slony_example, public;\nSET\npgbenchslave=# select * from sl_table;\n tab_id | tab_reloid | tab_relname | tab_nspname | tab_set | tab_idxname | tab_altered | tab_comment\n--------+------------+-------------+-------------+---------+-------------+-------------+-------------\n(0 rows)\n```\n\nAlthough I was seeing data is the master node\n\n\n\n\n### Legacy step\n\n\nThe tutorial documentation (https://www.slony.info/documentation/2.1/tutorial.html) is a bit vauge, \n\n```\nBecause Slony-I depends on the databases having the pl/pgSQL procedural language installed, we better install it now. \nIt is possible that you have installed pl/pgSQL into the template1 database in which case you can skip this step because it's already installed into the $MASTERDBNAME.\ncreatelang -h $MASTERHOST plpgsql $MASTERDBNAME\n```\n\nbut this step appears to legacy for my setup  \n\n```\n[pg96slony:postgres:~] # createlang plpgsql pgbench\ncreatelang: language \"plpgsql\" is already installed in database \"pgbench\"\n[pg96slony:postgres:~] # createlang plpgsql pgbenchslave\ncreatelang: language \"plpgsql\" is already installed in database \"pgbenchslave\"\n```\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdgapitts%2Fvagrant-pg96-slony","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdgapitts%2Fvagrant-pg96-slony","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdgapitts%2Fvagrant-pg96-slony/lists"}