{"id":14709,"date":"2020-09-11T08:49:25","date_gmt":"2020-09-11T06:49:25","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/"},"modified":"2024-09-10T17:30:28","modified_gmt":"2024-09-10T15:30:28","slug":"patroni-2-0-new-features-patroni-on-pure-raft","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/","title":{"rendered":"Patroni 2.0: New features &#8211; Patroni on pure Raft"},"content":{"rendered":"<p>Last week the new Patroni 2.0 release was published which brings many new features. But one makes me absolutely curious. At the moment only as BETA, but I had to test it. Patroni on pure Raft. It&#8217;s possible to run Patroni without 3rd party dependencies. So no Etcd, Consul or Zookeeper is needed anymore. Great improvement!<br \/>\nIn this blog we will have a look at the setup and try an failover as well.<br \/>\n<!--more--><\/p>\n<h3>Starting position<\/h3>\n<p>With Patroni on Raft it is possible to run a two node Patroni cluster as well, but I decided to setup a three node cluster.<br \/>\nSo what you need to prepare:<\/p>\n<ul>\n<li>Three identical VMs with CentOS8 installed<\/li>\n<li>All with Postgres 13 and it&#8217;s dependencies installed from source. I chose Postgres 13, because the support is newly added as well in Patroni 2.0.<\/li>\n<li>I also created the \/etc\/hostname entries and exchanged the ssh-key between the three servers.<\/li>\n<li>Our <a href=\"https:\/\/www.dbi-services.com\/de\/leistungsangebot\/produkte\/dmk-management-kit\/DMK\" target=\"\u201d_blank\u201d\" rel=\"noopener noreferrer\"> DMK <\/a> is installed on these servers as well.<\/li>\n<li>Firewall and SELinux are disabled in this example. If you want to run the setup with both enable, you need to configure the firewall and SELinux first.<\/li>\n<\/ul>\n<h3>Setup Patroni<\/h3>\n<p>Let&#8217;s start with the installation of Patroni. The following steps need to be performed on all three servers. The installation is also not as complicated as before with the new release.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1;\">\n[root@partoni1 ~]$ yum install python3-psycopg2\n[root@partoni1 ~]$ su - postgres\npostgres@partoni1:\/home\/postgres\/ [pg130] pip3 install patroni[raft] --user\nCollecting patroni[raft]\n  Using cached https:\/\/files.pythonhosted.org\/packages\/7c\/d3\/21a189f5f33ef6ce4ff9433c74aa30b70fc3aaf7fecde97c2979a3abdd06\/patroni-2.0.0-py3-none-any.whl\nRequirement already satisfied: cdiff in \/usr\/local\/lib\/python3.6\/site-packages (from patroni[raft])\nRequirement already satisfied: urllib3[secure]!=1.21,&gt;=1.19.1 in \/usr\/local\/lib\/python3.6\/site-packages (from patroni[raft])\nRequirement already satisfied: PyYAML in \/usr\/local\/lib64\/python3.6\/site-packages (from patroni[raft])\nRequirement already satisfied: six&gt;=1.7 in \/usr\/lib\/python3.6\/site-packages (from patroni[raft])\nRequirement already satisfied: prettytable&gt;=0.7 in \/usr\/local\/lib\/python3.6\/site-packages (from patroni[raft])\nRequirement already satisfied: python-dateutil in \/usr\/lib\/python3.6\/site-packages (from patroni[raft])\nRequirement already satisfied: click&gt;=4.1 in \/usr\/local\/lib\/python3.6\/site-packages (from patroni[raft])\nRequirement already satisfied: psutil&gt;=2.0.0 in \/usr\/local\/lib64\/python3.6\/site-packages (from patroni[raft])\nRequirement already satisfied: pysyncobj&gt;=0.3.5; extra == \"raft\" in \/usr\/local\/lib\/python3.6\/site-packages (from patroni[raft])\nRequirement already satisfied: idna&gt;=2.0.0; extra == \"secure\" in \/usr\/lib\/python3.6\/site-packages (from urllib3[secure]!=1.21,&gt;=1.19.1-&gt;patroni[raft])\nRequirement already satisfied: pyOpenSSL&gt;=0.14; extra == \"secure\" in \/usr\/lib\/python3.6\/site-packages (from urllib3[secure]!=1.21,&gt;=1.19.1-&gt;patroni[raft])\nRequirement already satisfied: certifi; extra == \"secure\" in \/usr\/local\/lib\/python3.6\/site-packages (from urllib3[secure]!=1.21,&gt;=1.19.1-&gt;patroni[raft])\nRequirement already satisfied: cryptography&gt;=1.3.4; extra == \"secure\" in \/usr\/lib64\/python3.6\/site-packages (from urllib3[secure]!=1.21,&gt;=1.19.1-&gt;patroni[raft])\nRequirement already satisfied: asn1crypto&gt;=0.21.0 in \/usr\/lib\/python3.6\/site-packages (from cryptography&gt;=1.3.4; extra == \"secure\"-&gt;urllib3[secure]!=1.21,&gt;=1.19.1-&gt;patroni[raft])\nRequirement already satisfied: cffi!=1.11.3,&gt;=1.7 in \/usr\/lib64\/python3.6\/site-packages (from cryptography&gt;=1.3.4; extra == \"secure\"-&gt;urllib3[secure]!=1.21,&gt;=1.19.1-&gt;patroni[raft])\nRequirement already satisfied: pycparser in \/usr\/lib\/python3.6\/site-packages (from cffi!=1.11.3,&gt;=1.7-&gt;cryptography&gt;=1.3.4; extra == \"secure\"-&gt;urllib3[secure]!=1.21,&gt;=1.19.1-&gt;patroni[raft])\nInstalling collected packages: patroni\nSuccessfully installed patroni-2.0.0\n<\/pre>\n<h4>Configuration<\/h4>\n<p>As the installation was successful, we can go on with the configuration of Patroni. As I am using our DMK, the patroni.yml file is stored in the DMK home. But you can store it somewhere else (of course). You only have to adjust some values like IP addresses and name on every server.<br \/>\nBut the most important section in here is the Raft section (line 17-22).<br \/>\n&#8211; data_dir: For storing the Raft Log and snapshot. It&#8217;s an optional parameter.<br \/>\n&#8211; self_addr: It&#8217;s the address to listen for Raft connections. This needs to be set. Otherwise the node will not become part of the consensus.<br \/>\n&#8211; partner_addrs: Here the list of the other Patroni nodes needs to be added.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1;\">postgres@partoni1:\/u01\/app\/postgres\/local\/dmk\/etc\/ [pg130] cat patroni.yml\nscope: PG1\n#namespace: \/service\/\nname: patroni1\n\nrestapi:\n  listen: 192.168.22.201:8008\n  connect_address: 192.168.22.201:8008\n#  certfile: \/etc\/ssl\/certs\/ssl-cert-snakeoil.pem\n#  keyfile: \/etc\/ssl\/private\/ssl-cert-snakeoil.key\n#  authentication:\n#    username: username\n#    password: password\n\n# ctl:\n#   insecure: false # Allow connections to SSL sites without certs\n#   certfile: \/etc\/ssl\/certs\/ssl-cert-snakeoil.pem\n#   cacert: \/etc\/ssl\/certs\/ssl-cacert-snakeoil.pem\n\nraft:\n  data_dir: \/u02\/pgdata\/raft\n  self_addr: 192.168.22.201:5010\n  partner_addrs: ['192.168.22.202:5010','192.168.22.203:5010']\n\nbootstrap:\n  # and all other cluster members will use it as a `global configuration`\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_level: 'hot_standby'\n        hot_standby: \"on\"\n        wal_keep_segments: 8\n        max_replication_slots: 10\n        wal_log_hints: \"on\"\n        listen_addresses: '*'\n        port: 5432\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: '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: 'on'\n        log_disconnections: 'on'\n        log_duration: 'on'\n        client_min_messages: 'WARNING'\n        wal_level: 'replica'\n        hot_standby_feedback: 'on'\n        max_wal_senders: '10'\n        shared_buffers: '128MB'\n        work_mem: '8MB'\n        effective_cache_size: '512MB'\n        maintenance_work_mem: '64MB'\n        wal_compression: 'off'\n        max_wal_senders: '20'\n        shared_preload_libraries: 'pg_stat_statements'\n        autovacuum_max_workers: '6'\n        autovacuum_vacuum_scale_factor: '0.1'\n        autovacuum_vacuum_threshold: '50'\n        archive_mode: 'on'\n        archive_command: '\/bin\/true'\n        wal_log_hints: 'on'\n#      recovery_conf:\n#        restore_command: cp ..\/wal_archive\/%f %p\n\n  # some desired options for 'initdb'\n  initdb:  # Note: It needs to be a list (some options need values, others are switches)\n  - encoding: UTF8\n  - data-checksums\n\n  pg_hba:  # Add following lines to pg_hba.conf after running 'initdb'\n  - host replication replicator 192.168.22.0\/24 md5\n  - host all all 192.168.22.0\/24 md5\n#  - hostssl all all 0.0.0.0\/0 md5\n\n  # Additional script to be launched after initial cluster creation (will be passed the connection URL as parameter)\n# post_init: \/usr\/local\/bin\/setup_cluster.sh\n\n  # Some additional users users which needs to be created after initializing new cluster\n  users:\n    admin:\n      password: admin\n      options:\n        - createrole\n        - createdb\n    replicator:\n      password: postgres\n      options:\n        - superuser\n\npostgresql:\n  listen: 192.168.22.201:5432\n  connect_address: 192.168.22.201:5432\n  data_dir: \/u02\/pgdata\/13\/PG1\n  bin_dir: \/u01\/app\/postgres\/product\/13\/db_0\/bin\n#  config_dir:\n  pgpass: \/u01\/app\/postgres\/local\/dmk\/etc\/pgpass0\n  authentication:\n    replication:\n      username: replicator\n      password: *********\n    superuser:\n      username: postgres\n      password: *********\n  parameters:\n    unix_socket_directories: '\/tmp'\n\nwatchdog:\n  mode: automatic # Allowed values: off, automatic, required\n  device: \/dev\/watchdog\n  safety_margin: 5\n\ntags:\n    nofailover: false\n    noloadbalance: false\n    clonefrom: false\n    nosync: false\n<\/pre>\n<h4>Service<\/h4>\n<p>To start Patroni automatically after reboot. Let&#8217;s create a service.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1;\"># systemd integration for patroni\n# Put this file under \/etc\/systemd\/system\/patroni.service\n#     then: systemctl daemon-reload\n#     then: systemctl list-unit-files | grep patroni\n#     then: systemctl enable patroni.service\n#\n\n[Unit]\nDescription=dbi services patroni service\nAfter=etcd.service syslog.target network.target\n\n[Service]\nUser=postgres\nGroup=postgres\nType=simple\nExecStartPre=-\/usr\/bin\/sudo \/sbin\/modprobe softdog\nExecStartPre=-\/usr\/bin\/sudo \/bin\/chown postgres \/dev\/watchdog\nExecStart=\/home\/postgres\/.local\/bin\/patroni \/u01\/app\/postgres\/local\/dmk\/etc\/patroni.yml\nExecReload=\/bin\/kill -s HUP $MAINPID\nKillMode=process\nRestart=no\nTimeoutSec=30\n\n[Install]\nWantedBy=multi-user.target\n<\/pre>\n<p>Once everything is created and before starting Patroni, it is possible to check the Patroni configuration file. And that&#8217;s the point, when it gets a bit funny at the moment.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">postgres@partoni1:\/u02\/pgdata\/raft\/ [PG1] patroni --validate-config \/u01\/app\/postgres\/local\/dmk\/etc\/patroni.yml\nrestapi.listen 192.168.22.201:8008 didn't pass validation: 'Port 8008 is already in use.'\nTraceback (most recent call last):\n  File \"\/u01\/app\/postgres\/local\/dmk\/bin\/patroni\", line 11, in \n    sys.exit(main())\n  File \"\/home\/postgres\/.local\/lib\/python3.6\/site-packages\/patroni\/__init__.py\", line 170, in main\n    return patroni_main()\n  File \"\/home\/postgres\/.local\/lib\/python3.6\/site-packages\/patroni\/__init__.py\", line 138, in patroni_main\n    abstract_main(Patroni, schema)\n  File \"\/home\/postgres\/.local\/lib\/python3.6\/site-packages\/patroni\/daemon.py\", line 88, in abstract_main\n    Config(args.configfile, validator=validator)\n  File \"\/home\/postgres\/.local\/lib\/python3.6\/site-packages\/patroni\/config.py\", line 102, in __init__\n    error = validator(self._local_configuration)\n  File \"\/home\/postgres\/.local\/lib\/python3.6\/site-packages\/patroni\/validator.py\", line 177, in __call__\n    for i in self.validate(data):\n  File \"\/home\/postgres\/.local\/lib\/python3.6\/site-packages\/patroni\/validator.py\", line 209, in validate\n    for i in self.iter():\n  File \"\/home\/postgres\/.local\/lib\/python3.6\/site-packages\/patroni\/validator.py\", line 217, in iter\n    for i in self.iter_dict():\n  File \"\/home\/postgres\/.local\/lib\/python3.6\/site-packages\/patroni\/validator.py\", line 244, in iter_dict\n    validator = self.validator[key]._schema[d]\nKeyError: 'raft'\n<\/pre>\n<p>I tried several version of the Raft configuration. But every time I got an error. I also tried to set the system parameters for Raft and commented the Raft block out in the configuration file. But then I got the following output.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">postgres@partoni1:\/u02\/pgdata\/raft\/ [PG1] patroni --validate-config \/u01\/app\/postgres\/local\/dmk\/etc\/patroni.yml\nconsul  is not defined.\netcd  is not defined.\netcd3  is not defined.\nexhibitor  is not defined.\nkubernetes  is not defined.\nraft  is not defined.\nzookeeper  is not defined.\npostgresql.authentication.rewind  is not defined.\n<\/pre>\n<p>So seems like there is something not working correctly when validating the configuration file. In the end I was not sure what to test anymore and so I just tried to start the Patroni service. Full exploratory spirit.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">postgres@partoni1:\/u02\/pgdata\/raft\/ [PG1] sudo systemctl start patroni\npostgres@partoni1:\/u02\/pgdata\/raft\/ [PG1] sudo systemctl status patroni\n\u25cf patroni.service - dbi services patroni service\n   Loaded: loaded (\/etc\/systemd\/system\/patroni.service; enabled; vendor preset: disabled)\n   Active: active (running) since Thu 2020-09-10 11:36:40 CEST; 3s ago\n  Process: 5232 ExecStartPre=\/usr\/bin\/sudo \/bin\/chown postgres \/dev\/watchdog (code=exited, status=0\/SUCCESS)\n  Process: 5229 ExecStartPre=\/usr\/bin\/sudo \/sbin\/modprobe softdog (code=exited, status=0\/SUCCESS)\n Main PID: 5236 (patroni)\n    Tasks: 2 (limit: 11480)\n   Memory: 19.7M\n   CGroup: \/system.slice\/patroni.service\n           \u2514\u25005236 \/usr\/bin\/python3.6 \/u01\/app\/postgres\/local\/dmk\/bin\/patroni \/u01\/app\/postgres\/local\/dmk\/etc\/patroni.yml\n\nSep 10 11:36:40 partoni1 systemd[1]: Starting dbi services patroni service...\nSep 10 11:36:40 partoni1 sudo[5229]: postgres : TTY=unknown ; PWD=\/ ; USER=root ; COMMAND=\/sbin\/modprobe softdog\nSep 10 11:36:40 partoni1 sudo[5232]: postgres : TTY=unknown ; PWD=\/ ; USER=root ; COMMAND=\/bin\/chown postgres \/dev\/watchdog\nSep 10 11:36:40 partoni1 systemd[1]: Started dbi services patroni service.\n<\/pre>\n<p>And&#8230;.it starts without any errors.<br \/>\nBut that did not fully convinced me. Let&#8217;s check the Raft setup. Here Patroni delivers a simple command to check the status of the Raft setup.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">commit_idx: 62850\npostgres@partoni1:\/u02\/pgdata\/raft\/ [PG1] syncobj_admin -conn 192.168.22.201:5010 -status\nenabled_code_version: 0\nlast_applied: 62850\nleader: 192.168.22.203:5010\nleader_commit_idx: 62850\nlog_len: 31\nmatch_idx_count: 0\nnext_node_idx_count: 0\npartner_node_status_server_192.168.22.202:5010: 2\npartner_node_status_server_192.168.22.203:5010: 2\npartner_nodes_count: 2\nraft_term: 30\nreadonly_nodes_count: 0\nrevision: deprecated\nself: 192.168.22.201:5010\nself_code_version: 0\nstate: 0\nuptime: 379\nversion: 0.3.6\n<\/pre>\n<p>And of course we can still check the cluster status itself.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">postgres@partoni1:\/u02\/pgdata\/raft\/ [PG1] patronictl list\n+ Cluster: PG1 (6870147915530980670) -+---------+----+-----------+\n| Member   | Host           | Role    | State   | TL | Lag in MB |\n+----------+----------------+---------+---------+----+-----------+\n| patroni1 | 192.168.22.201 | Replica | running |  6 |         0 |\n| patroni2 | 192.168.22.202 | Leader  | running |  6 |           |\n| patroni3 | 192.168.22.203 | Replica | running |  6 |         0 |\n+----------+----------------+---------+---------+----+-----------+\n<\/pre>\n<p>This look good as well. So even the configuration validation gives us an error, the Cluster is running smoothly.<\/p>\n<h3>Failover<\/h3>\n<p>So let&#8217;s see what happens if we restart the Leader node. Within a short time, the Leader changes to another node<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">postgres@partoni3:\/home\/postgres\/ [PG1] patronictl list\n+ Cluster: PG1 (6870147915530980670) -+---------+----+-----------+\n| Member   | Host           | Role    | State   | TL | Lag in MB |\n+----------+----------------+---------+---------+----+-----------+\n| patroni1 | 192.168.22.201 | Leader  | running |  7 |           |\n| patroni3 | 192.168.22.203 | Replica | running |  7 |         0 |\n+----------+----------------+---------+---------+----+-----------+\n<\/pre>\n<p>As soon as patroni2 is back to the network, it will attach to the cluster again without issues as a Replica<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">postgres@partoni3:\/home\/postgres\/ [PG1] patronictl list\n+ Cluster: PG1 (6870147915530980670) -+---------+----+-----------+\n| Member   | Host           | Role    | State   | TL | Lag in MB |\n+----------+----------------+---------+---------+----+-----------+\n| patroni1 | 192.168.22.201 | Leader  | running |  7 |           |\n| patroni2 | 192.168.22.202 | Replica | running |  7 |         0 |\n| patroni3 | 192.168.22.203 | Replica | running |  7 |         0 |\n+----------+----------------+---------+---------+----+-----------+\n<\/pre>\n<h3>Conclusion<\/h3>\n<p>The configuration check was published as a first draft in Version 1.6.5. Seems there is some space for improvement here. Still not sure where I do the mistake and if there is really one. I also tested my patroni.yml with is configured for etcd. Maybe it&#8217;s just because of the brand new Raft possibility.<\/p>\n<p>For me, the Raft status overview is a bit cryptical. Of course, it shows the most important information, like leader, partner_node_status_server and partner_nodes_count. But compared to etcd, where I just get a simple &#8220;cluster is healthy&#8221;, it needs a bit time to getting used to. Besides that it needs some time to recognize the unavailability of one node.<\/p>\n<p>Using Patroni with pure Raft works fine and the setup is easier than the etcd setup, where you can get some member mismatches. Especially when you don&#8217;t want to install an additional tool on your server, it could get a really good possibility. The documentation of Patroni is still a bit minimalistic regarding the configuration. But with some patience you find whatever you&#8217;re searching for.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last week the new Patroni 2.0 release was published which brings many new features. But one makes me absolutely curious. At the moment only as BETA, but I had to test it. Patroni on pure Raft. It&#8217;s possible to run Patroni without 3rd party dependencies. So no Etcd, Consul or Zookeeper is needed anymore. Great [&hellip;]<\/p>\n","protected":false},"author":28,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[84,1543,77],"type_dbi":[],"class_list":["post-14709","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-high-availability","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 2.0: New features - Patroni on pure Raft - 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-2-0-new-features-patroni-on-pure-raft\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Patroni 2.0: New features - Patroni on pure Raft\" \/>\n<meta property=\"og:description\" content=\"Last week the new Patroni 2.0 release was published which brings many new features. But one makes me absolutely curious. At the moment only as BETA, but I had to test it. Patroni on pure Raft. It&#8217;s possible to run Patroni without 3rd party dependencies. So no Etcd, Consul or Zookeeper is needed anymore. Great [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-11T06:49:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-10T15:30:28+00:00\" \/>\n<meta name=\"author\" content=\"Open source Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Open source Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 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-2-0-new-features-patroni-on-pure-raft\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/\"},\"author\":{\"name\":\"Open source Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b\"},\"headline\":\"Patroni 2.0: New features &#8211; Patroni on pure Raft\",\"datePublished\":\"2020-09-11T06:49:25+00:00\",\"dateModified\":\"2024-09-10T15:30:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/\"},\"wordCount\":769,\"commentCount\":0,\"keywords\":[\"High availability\",\"Patroni\",\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/\",\"name\":\"Patroni 2.0: New features - Patroni on pure Raft - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2020-09-11T06:49:25+00:00\",\"dateModified\":\"2024-09-10T15:30:28+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Patroni 2.0: New features &#8211; Patroni on pure Raft\"}]},{\"@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\/59554f0d99383431eb6ed427e338952b\",\"name\":\"Open source Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"caption\":\"Open source Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/open-source-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Patroni 2.0: New features - Patroni on pure Raft - 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-2-0-new-features-patroni-on-pure-raft\/","og_locale":"en_US","og_type":"article","og_title":"Patroni 2.0: New features - Patroni on pure Raft","og_description":"Last week the new Patroni 2.0 release was published which brings many new features. But one makes me absolutely curious. At the moment only as BETA, but I had to test it. Patroni on pure Raft. It&#8217;s possible to run Patroni without 3rd party dependencies. So no Etcd, Consul or Zookeeper is needed anymore. Great [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/","og_site_name":"dbi Blog","article_published_time":"2020-09-11T06:49:25+00:00","article_modified_time":"2024-09-10T15:30:28+00:00","author":"Open source Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Open source Team","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/"},"author":{"name":"Open source Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b"},"headline":"Patroni 2.0: New features &#8211; Patroni on pure Raft","datePublished":"2020-09-11T06:49:25+00:00","dateModified":"2024-09-10T15:30:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/"},"wordCount":769,"commentCount":0,"keywords":["High availability","Patroni","PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/","url":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/","name":"Patroni 2.0: New features - Patroni on pure Raft - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2020-09-11T06:49:25+00:00","dateModified":"2024-09-10T15:30:28+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/59554f0d99383431eb6ed427e338952b"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/patroni-2-0-new-features-patroni-on-pure-raft\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Patroni 2.0: New features &#8211; Patroni on pure Raft"}]},{"@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\/59554f0d99383431eb6ed427e338952b","name":"Open source Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","caption":"Open source Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/open-source-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14709","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\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=14709"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14709\/revisions"}],"predecessor-version":[{"id":34684,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14709\/revisions\/34684"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=14709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=14709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=14709"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=14709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}