{"id":16393,"date":"2021-06-03T15:05:50","date_gmt":"2021-06-03T13:05:50","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/"},"modified":"2021-06-03T15:05:50","modified_gmt":"2021-06-03T13:05:50","slug":"patroni-on-freebsd-13","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/","title":{"rendered":"Patroni on FreeBSD 13?"},"content":{"rendered":"<p>You can already find several blog posts around <a href=\"https:\/\/www.dbi-services.com\/blog\/?s=patroni\" target=\"_blank\" rel=\"noopener\">PostgreSQL protected by Patroni on our blog<\/a>. They all have in common, that the setup is on a flavor of Linux. As I got impressed by <a href=\"https:\/\/www.freebsd.org\/\" target=\"_blank\" rel=\"noopener\">FreeBSD<\/a> and played with it during the last weeks (some blog posts <a href=\"https:\/\/www.dbi-services.com\/blog\/?s=freebsd\" target=\"_blank\" rel=\"noopener\">here<\/a>), I wanted to know if Patroni runs well on FreeBSD. Well, here are the results &#8230;<\/p>\n<p><!--more--><\/p>\n<p>As usual you need at least three nodes for automatic fail-over to work, in my case these are:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] grep patroni \/etc\/hosts\n192.168.22.71          patroni1-freebsd  patroni1-freebsd.it.dbi-services.com\n192.168.22.72          patroni2-freebsd  patroni2-freebsd.it.dbi-services.com\n192.168.22.73          patroni3-freebsd  patroni3-freebsd.it.dbi-services.com\n<\/pre>\n<p>On all of these nodes PostgreSQL 13.3 is already installed in the same location:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni2:\/home\/postgres\/ [pg133] ls \/u01\/app\/postgres\/product\/13\/db_3\/\nbin     include lib     share\n<\/pre>\n<p>Except for this sudo configuration:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] sudo grep postgres \/usr\/local\/etc\/sudoers \npostgres ALL=(ALL) NOPASSWD: ALL\n<\/pre>\n<p>&#8230; nothing happened on these systems. <\/p>\n<p>The first bit we usually install and configure is <a href=\"https:\/\/etcd.io\/\" target=\"_blank\" rel=\"noopener\">etcd<\/a> but there are no pre-build binaries to download from the <a href=\"https:\/\/github.com\/etcd-io\/etcd\/releases\/tag\/v3.4.16\" target=\"_blank\" rel=\"noopener\">GitHub page<\/a>. So either we need to compile it from source, or we use the packages provided by FreeBSD:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] sudo pkg search etcd\ncoreos-etcd-2.3.8_4            Highly-available key value store and service discovery\ncoreos-etcd31-3.1.20_2         Highly-available key value store and service discovery\ncoreos-etcd32-3.2.32           Highly-available key value store and service discovery\ncoreos-etcd33-3.3.23           Highly-available key value store and service discovery\ncoreos-etcd34-3.4.14           Highly-available key value store and service discovery\netcd-1.0.1_3                   Enhanced Tiny CD, a simple ncurses-based CD player\nnetcdf-4.7.4                   C library for machine-independent, array-oriented data access\nnetcdf-cxx-4.3.1_1             C++ library for machine-independent, array-oriented data access\nnetcdf-fortran-4.5.3           Fortran library for machine-independent, array-oriented data access\noctave-forge-netcdf-1.0.14_2   Octave-forge package netcdf\np5-NetCDF-1.2.4_7              Perl5 module to read and write netCDF files\npnetcdf-1.8.1_10               Library providing high-performance I\/O\npy37-netCDF4-1.3.1_8           Python Interface to the NetCDF Library (versions 3 and 4)\npy37-netcdf-flattener-1.2.0    Flatten NetCDF files while preserving references\nrubygem-ruby-netcdf-0.7.2_3    Ruby interface to the NetCDF scientific IO library\nsetcdboot-1.0                  Mark a file bootable within a DEC Alpha ISO-966\n<\/pre>\n<p>Let&#8217;s use the latest release and install the FreeBSD package (on all nodes):<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] sudo pkg install coreos-etcd34-3.4.14\nUpdating FreeBSD repository catalogue...\nFreeBSD repository is up to date.\nAll repositories are up to date.\nThe following 1 package(s) will be affected (of 0 checked):\n\nNew packages to be INSTALLED:\n        coreos-etcd34: 3.4.14\n\nNumber of packages to be installed: 1\n\nThe process will require 35 MiB more space.\n9 MiB to be downloaded.\n\nProceed with this action? [y\/N]: y\n[1\/1] Fetching coreos-etcd34-3.4.14.txz: 100%    9 MiB   2.3MB\/s    00:04    \nChecking integrity... done (0 conflicting)\n[1\/1] Installing coreos-etcd34-3.4.14...\n[1\/1] Extracting coreos-etcd34-3.4.14: 100%\n<\/pre>\n<p>Once etcd is installed it needs a configuration file on each host, here they are:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] cat \/usr\/local\/etc\/etcd.conf \nname: patroni1\ndata-dir: \/u02\/pgdata\/etcd\ninitial-advertise-peer-urls: http:\/\/192.168.22.71:2380\nlisten-peer-urls: http:\/\/192.168.22.71:2380\nlisten-client-urls: http:\/\/192.168.22.71:2379,http:\/\/localhost:2379\nadvertise-client-urls: http:\/\/192.168.22.71:2379\ninitial-cluster: patroni1=http:\/\/192.168.22.71:2380,patroni2=http:\/\/192.168.22.72:2380,patroni3=http:\/\/192.168.22.73:2380\nenable-v2: true\n\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] ssh patroni2-freebsd cat \/usr\/local\/etc\/etcd.conf\nname: patroni2\ndata-dir: \/u02\/pgdata\/etcd\ninitial-advertise-peer-urls: http:\/\/192.168.22.72:2380\nlisten-peer-urls: http:\/\/192.168.22.72:2380\nlisten-client-urls: http:\/\/192.168.22.72:2379,http:\/\/localhost:2379\nadvertise-client-urls: http:\/\/192.168.22.72:2379\ninitial-cluster: patroni1=http:\/\/192.168.22.71:2380,patroni2=http:\/\/192.168.22.72:2380,patroni3=http:\/\/192.168.22.73:2380\nenable-v2: true\n\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] ssh patroni3-freebsd cat \/usr\/local\/etc\/etcd.conf\nname: patroni3\ndata-dir: \/u02\/pgdata\/etcd\ninitial-advertise-peer-urls: http:\/\/192.168.22.73:2380\nlisten-peer-urls: http:\/\/192.168.22.73:2380\nlisten-client-urls: http:\/\/192.168.22.73:2379,http:\/\/localhost:2379\nadvertise-client-urls: http:\/\/192.168.22.73:2379\ninitial-cluster: patroni1=http:\/\/192.168.22.71:2380,patroni2=http:\/\/192.168.22.72:2380,patroni3=http:\/\/192.168.22.73:2380\nenable-v2: true\n<\/pre>\n<p>Testing the configuration can easily be done by starting etcd on all nodes:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni2:\/home\/postgres\/ [pg133] etcd --config-file \/usr\/local\/etc\/etcd.conf \n<\/pre>\n<p>Once up and running on all three nodes, verify that all is fine with etcd:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] etcdctl endpoint status --endpoints=192.168.22.71:2379,192.168.22.72:2379,192.168.22.73:2379 -w table\n+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+\n|      ENDPOINT      |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |\n+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+\n| 192.168.22.71:2379 | 52009b42a701a943 |  3.4.14 |   25 kB |      true |      false |        13 |         10 |                 10 |        |\n| 192.168.22.72:2379 | 26d9ce490122dc7a |  3.4.14 |   25 kB |     false |      false |        13 |         10 |                 10 |        |\n| 192.168.22.73:2379 | 6141508d7bd79cb5 |  3.4.14 |   25 kB |     false |      false |        13 |         10 |                 10 |        |\n+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+\n<\/pre>\n<p>The next step is to configure automatic start of etcd when the nodes comes up. This is a bit different in FreeBSD than what you know from Linux. A detailed guide on how to do that can be found <a href=\"https:\/\/docs.freebsd.org\/en\/articles\/rc-scripting\/\" target=\"_blank\" rel=\"noopener\">here<\/a>. We&#8217;ll be using this simple script (you should of course extend that script to provide a stop command, add logging to a logfile &#8230;):<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] cat \/etc\/rc.d\/etcd \n#!\/usr\/local\/bin\/bash\n\n# PROVIDE: ETCD\n# REQUIRE: DAEMON FILESYSTEMS NETWORKING\n# BEFORE:  LOGIN \n# KEYWORD: shutdown\n\n. \/etc\/rc.subr\n\nname=\"etcd\"\nrcvar=etcd_enable\nstart_cmd=\"su - postgres -c '\/usr\/sbin\/daemon -c -f \/usr\/local\/bin\/etcd --config-file \/usr\/local\/etc\/etcd.conf'\"\n\nload_rc_config $name\nrun_rc_command \"$1\"\n<\/pre>\n<p>To test if it basically works use the &#8220;onestart&#8221; argument:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\nostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] sudo \/etc\/rc.d\/etcd onestart\n[WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead\n2021-06-03 17:31:49.344284 I | etcdmain: Loading server configuration from \"\/usr\/local\/etc\/etcd.conf\". Other configuration command line flags and environment variables will be ignored if provided.\n2021-06-03 17:31:49.344428 I | etcdmain: etcd Version: 3.4.14\n2021-06-03 17:31:49.344461 I | etcdmain: Git SHA: Not provided (use .\/build instead of go build)\n...\n<\/pre>\n<p>Looks good, let&#8217;s add it to rc.conf so etcd will startup automatically:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] grep etcd \/etc\/rc.conf\netcd_enable=\"YES\"\n<\/pre>\n<p>Once you&#8217;ve done that on all nodes, reboot and check that all is fine:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] sudo init 6\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] ssh patroni2-freebsd init 6\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] ssh patroni3-freebsd init 6\n# wait for reboot\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] etcdctl endpoint status --endpoints=192.168.22.71:2379,192.168.22.72:2379,192.168.22.73:2379 -w table\n+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+\n|      ENDPOINT      |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |\n+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+\n| 192.168.22.71:2379 | 52009b42a701a943 |  3.4.14 |   33 kB |     false |      false |       146 |         16 |                 16 |        |\n| 192.168.22.72:2379 | 26d9ce490122dc7a |  3.4.14 |   33 kB |      true |      false |       146 |         16 |                 16 |        |\n| 192.168.22.73:2379 | 6141508d7bd79cb5 |  3.4.14 |   25 kB |     false |      false |       146 |         16 |                 16 |        |\n+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+\n<\/pre>\n<p>So far, so good for etcd. The next step is to install Patroni, and this is not different from an installation on Linux (no surprise here, it is based on Python):<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] sudo pkg install py37-pip\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] sudo pip install --upgrade setuptools\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] pip install --user psycopg2-binary\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] pip install --user python-etcd\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] pip install --user wheel\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] pip install --user patroni[etcd]\n<\/pre>\n<p>The configuration of Patroni is of course not different than on Linux, here is an example for the first host:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] cat \/usr\/local\/etc\/patroni.yml \nscope: postgres_patroni\nname: pg-patroni1\n\nrestapi:\n  listen: 192.168.22.71:8008\n  connect_address: 192.168.22.71:8008\n\netcd:\n    hosts: 192.168.22.71:2379,192.168.22.72:2379,192.168.22.73:2379\n\nlog:\n  dir: \/u02\/log\/patroni\/\n  file_num: 14\n  file_size: 10000000\n  \nbootstrap:\n  dcs:\n    ttl: 30\n    loop_wait: 10\n    retry_timeout : 10\n    maximum_lag_on_failover: 1048576\n    postgresql:\n      use_pg_rewind: true\n      use_slots: true\n      parameters:\n        wal_keep_segments: 100\n\n  initdb:\n  - encoding: UTF8\n  - data-checksums\n\n  pg_hba:\n  - host replication all 0.0.0.0\/0 md5\n  - host all all 0.0.0.0\/0 md5\n  - hostssl all all 0.0.0.0\/0 md5\npostgresql:\n  listen: \"*:5432\"\n  connect_address: 192.168.22.71:5432\n  data_dir: \/u02\/pgdata\/13\/PG1\n  bin_dir: \/u01\/app\/postgres\/product\/13\/db_3\/bin\n  authentication:\n    replication:\n      username: postgres\n      password: postgres\n    superuser:\n      username: postgres\n      password: postgres\n  parameters:\n    logging_collector: 'on'\n    log_truncate_on_rotation: 'on'\n    log_filename: 'postgresql-%a.log'\n    log_rotation_age: '1440'\n    log_line_prefix: '%m - %l - %p - %h - %u@%d - %x'\n    log_directory: '\/u02\/pgdata\/13\/PG1\/pg_log'\n    log_min_messages: 'WARNING'\n    log_autovacuum_min_duration: '60s'\n    log_min_error_statement: 'NOTICE'\n    log_min_duration_statement: '30s'\n    log_checkpoints: 'on'\n    log_statement: 'ddl'\n    log_lock_waits: 'on'\n    log_temp_files: '0'\n    log_timezone: 'Europe\/Zurich'\n    log_connections: off\n    log_disconnections: off\n    log_duration: off\n    checkpoint_completion_target: 0.9\n    checkpoint_timeout: '20min'\n    client_min_messages: 'WARNING'\n    wal_level: 'replica'\n    hot_standby_feedback: 'on'\n    max_wal_senders: '10'\n    max_replication_slots: '10'\n    shared_preload_libraries: 'pg_stat_statements'\n    autovacuum_vacuum_threshold: 50\n    archive_mode: 'on'\n    archive_command: '\/bin\/true'\n    cluster_name: 'PG1' \n<\/pre>\n<p>If all is fine, you should be able to bootstrap the first node:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] .local\/bin\/patroni \/usr\/local\/etc\/patroni.yml \nThe files belonging to this database system will be owned by user \"postgres\".\nThis user must also own the server process.\n\nThe database cluster will be initialized with locale \"C.UTF-8\".\nThe default text search configuration will be set to \"english\".\n\nData page checksums are enabled.\n\ncreating directory \/u02\/pgdata\/13\/PG1 ... ok\ncreating subdirectories ... ok\nselecting dynamic shared memory implementation ... posix\nselecting default max_connections ... 100\nselecting default shared_buffers ... 128MB\nselecting default time zone ... Europe\/Vaduz\ncreating configuration files ... ok\nrunning bootstrap script ... ok\nperforming post-bootstrap initialization ... ok\nsyncing data to disk ... ok\n\ninitdb: warning: enabling \"trust\" authentication for local connections\nYou can change this by editing pg_hba.conf or using the option -A, or\n--auth-local and --auth-host, the next time you run initdb.\n\nSuccess. You can now start the database server using:\n\n    \/u01\/app\/postgres\/product\/13\/db_3\/bin\/pg_ctl -D \/u02\/pgdata\/13\/PG1 -l logfile start\n\nlocalhost:5432 - no response\n2021-06-03 18:39:24.699 CEST - 1 - 1495 -  - @ - 0LOG:  redirecting log output to logging collector process\n2021-06-03 18:39:24.699 CEST - 2 - 1495 -  - @ - 0HINT:  Future log output will appear in directory \"\/u02\/pgdata\/13\/PG1\/pg_log\".\nlocalhost:5432 - accepting connections\nlocalhost:5432 - accepting connections\n<\/pre>\n<p>Do exactly the same on the remaining to nodes and then create the rc script for Patroni (note the dependency on etcd):<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] sudo cat \/etc\/rc.d\/patroni\n#!\/usr\/local\/bin\/bash\n\n# PROVIDE: PATRONI\n# REQUIRE: ETCD\n# BEFORE:  LOGIN \n# KEYWORD: shutdown\n\n. \/etc\/rc.subr\n\nname=\"patroni\"\nrcvar=patroni_enable\nstart_cmd=\"su - postgres -c '\/usr\/sbin\/daemon -c -f \/home\/postgres\/.local\/bin\/patroni \/usr\/local\/etc\/patroni.yml'\"\n\nload_rc_config $name\nrun_rc_command \"$1\"\n<\/pre>\n<p>Enable autostart in rc.conf:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] grep patroni \/etc\/rc.conf\nhostname=\"freebsd-patroni1.it.dbi-services.com\"\npatroni_enable=\"YES\"\n<\/pre>\n<p>&#8230; and reboot all nodes. The result should be this:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@freebsd-patroni1:\/home\/postgres\/ [pg133] .local\/bin\/patronictl -c \/usr\/local\/etc\/patroni.yml list \n+ Cluster: postgres_patroni (6969608203440481745) +----+-----------+\n| Member      | Host          | Role    | State   | TL | Lag in MB |\n+-------------+---------------+---------+---------+----+-----------+\n| pg-patroni1 | 192.168.22.71 | Leader  | running |  5 |           |\n| pg-patroni2 | 192.168.22.72 | Replica | running |  5 |         0 |\n| pg-patroni3 | 192.168.22.73 | Replica | running |  5 |         0 |\n+-------------+---------------+---------+---------+----+-----------+\n<\/pre>\n<p>Works as expected.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>You can already find several blog posts around PostgreSQL protected by Patroni on our blog. They all have in common, that the setup is on a flavor of Linux. As I got impressed by FreeBSD and played with it during the last weeks (some blog posts here), I wanted to know if Patroni runs well [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[1543,77],"type_dbi":[],"class_list":["post-16393","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-patroni","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Patroni on FreeBSD 13? - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Patroni on FreeBSD 13?\" \/>\n<meta property=\"og:description\" content=\"You can already find several blog posts around PostgreSQL protected by Patroni on our blog. They all have in common, that the setup is on a flavor of Linux. As I got impressed by FreeBSD and played with it during the last weeks (some blog posts here), I wanted to know if Patroni runs well [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-06-03T13:05:50+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Patroni on FreeBSD 13?\",\"datePublished\":\"2021-06-03T13:05:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/\"},\"wordCount\":408,\"commentCount\":0,\"keywords\":[\"Patroni\",\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/\",\"name\":\"Patroni on FreeBSD 13? - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2021-06-03T13:05:50+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Patroni on FreeBSD 13?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Patroni on FreeBSD 13? - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/","og_locale":"en_US","og_type":"article","og_title":"Patroni on FreeBSD 13?","og_description":"You can already find several blog posts around PostgreSQL protected by Patroni on our blog. They all have in common, that the setup is on a flavor of Linux. As I got impressed by FreeBSD and played with it during the last weeks (some blog posts here), I wanted to know if Patroni runs well [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/","og_site_name":"dbi Blog","article_published_time":"2021-06-03T13:05:50+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Patroni on FreeBSD 13?","datePublished":"2021-06-03T13:05:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/"},"wordCount":408,"commentCount":0,"keywords":["Patroni","PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/","url":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/","name":"Patroni on FreeBSD 13? - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2021-06-03T13:05:50+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/patroni-on-freebsd-13\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Patroni on FreeBSD 13?"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/16393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=16393"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/16393\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=16393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=16393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=16393"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=16393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}