بناء مجموعة PostgreSQL عالية التوفر باستخدام Patroni ، وغيرها ، HAProxy

لقد حدث أنه في وقت تحديد المشكلة لم يكن لدي خبرة كافية لتطوير هذا الحل وتشغيله بمفرده. ثم بدأت غوغلينغ.


لا أعرف ما هي الفائدة ، لكن للمرة الألف واجهت حقيقة أنه حتى لو كنت تفعل كل شيء خطوة بخطوة كما في البرنامج التعليمي ، فقم بإعداد نفس البيئة مثل المؤلف ، ثم لا شيء يعمل على الإطلاق. ليس لدي أي فكرة عما يدور حوله هذا ، ولكن عندما صادفت هذا مرة أخرى ، قررت - وسأكتب تعليمي عندما يعمل كل شيء. واحدة ستعمل بالتأكيد.


أدلة على الانترنت


لقد حدث أن شبكة الإنترنت لا تعاني من نقص في العديد من الأدلة والبرامج التعليمية ، خطوة بخطوة ، وما شابه ذلك. لقد حدث أنه تم تكليفي بتطوير حل لتنظيم مناسب وإنشاء مجموعة PostgreSQL آمنة من الفشل ، وكانت المتطلبات الرئيسية منها هي دفق النسخ المتماثل من خادم Master إلى جميع النسخ المتماثلة والإدخال التلقائي للحجز عند فشل خادم Master.


في هذه المرحلة ، تم تعريف كومة التقنيات المستخدمة:


  • PostgreSQL باعتباره DBMS
  • راعي كحل التجميع
  • etcd كما وزعت التخزين ل Patroni
  • HAproxy لتنظيم نقطة إدخال واحدة للتطبيقات التي تستخدم قاعدة البيانات

تركيب


انتباهكم - بناء مجموعة PostgreSQL عالية التوفر باستخدام Patroni ، etcd ، HAProxy.


تم تنفيذ جميع العمليات على الأجهزة الافتراضية مع تثبيت دبيان 10.


etcd


لا أوصي بتثبيت برنامج etcd على نفس الأجهزة التي يوجد بها المستفيدون و postgresql ، نظرًا لأن تحميل القرص مهم جدًا بالنسبة لـ etcd. ولكن لأغراض التدريب ، سنفعل ذلك.
تثبيت الخ


#!/bin/bash apt-get update apt-get install etcd 

أضف المحتويات إلى الملف / etc / default / etcd

[عضو]


ETCD_NAME = datanode1 # اسم المضيف لجهازك
ETCD_DATA_DIR = "/ var / lib / etcd / default.etcd"


يجب أن تكون جميع عناوين IP صالحة. يجب تعيين LISTER الأقران ، العميل الخ إلى عنوان IP من المضيف


ETCD_LISTEN_PEER_URLS = " http://192.168.0.143:2380 " # عنوان جهازك
ETCD_LISTEN_CLIENT_URLS = " http://192.168.0.143:2379 ، http ://127.0.0.1:2379" # عنوان جهازك


[العنقودية]


ETCD_INITIAL_ADVERTISE_PEER_URLS = " http://192.168.0.143:2380 " # عنوان جهازك
ETCD_INITIAL_CLUSTER = "datanode1 = http://192.168.0.143:2380،datanode2=http://192.168.0.144:2380،datanode3=http://192.168.0.145:2380 " # عناوين جميع الأجهزة في مجموعة etcd
ETCD_INITIAL_CLUSTER_STATE = "جديد"
ETCD_INITIAL_CLUSTER_TOKEN = "etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS = " http://192.168.0.143:2379 " # عنوان جهازك


قم بتشغيل الأمر


 systemctl restart etcd 

PostgreSQL 9.6 + المستفيد


أول شيء فعله هو تثبيت ثلاثة أجهزة افتراضية لتثبيت البرنامج الضروري عليها. بعد تثبيت الأجهزة ، إذا تابعت البرنامج التعليمي الخاص بي ، يمكنك تشغيل هذا البرنامج النصي البسيط الذي (تقريبًا) يفعل كل شيء لك. تشغيل كجذر.


يرجى ملاحظة أن البرنامج النصي يستخدم الإصدار 9.6 من PostgreSQL ، وهذا بسبب المتطلبات الداخلية لشركتنا. لم يتم اختبار الحل على إصدارات أخرى من PostgreSQL.


 #!/bin/bash apt-get install gnupg -y echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" >> /etc/apt/sources.list wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - apt-get update apt-get install postgresql-9.6 python3-pip python3-dev libpq-dev -y systemctl stop postgresql pip3 install --upgrade pip pip install psycopg2 pip install patroni[etcd] echo "\ [Unit] Description=Runners to orchestrate a high-availability PostgreSQL After=syslog.target network.target [Service] Type=simple User=postgres Group=postgres ExecStart=/usr/local/bin/patroni /etc/patroni.yml KillMode=process TimeoutSec=30 Restart=no [Install] WantedBy=multi-user.targ\ " > /etc/systemd/system/patroni.service mkdir -p /data/patroni chown postgres:postgres /data/patroni chmod 700 /data/patroni touch /etc/patroni.yml 

بعد ذلك ، في ملف /etc/patroni.yml الذي تم إنشاؤه للتو ، تحتاج إلى وضع المحتويات التالية ، وبالطبع تغيير عناوين IP في جميع الأماكن إلى العناوين التي تستخدمها.
إيلاء الاهتمام للتعليقات في هذا yaml. تغيير العناوين الخاصة بك على كل جهاز في الكتلة.


/etc/patroni.yml
 scope: pgsql #       namespace: /cluster/ #       name: postgres1 #       restapi: listen: 192.168.0.143:8008 #   ,      connect_address: 192.168.0.143:8008 #   ,      etcd: hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 #     ,      etcd    # this section (bootstrap) will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster # and all other cluster members will use it as a `global configuration` bootstrap: dcs: ttl: 100 loop_wait: 10 retry_timeout: 10 maximum_lag_on_failover: 1048576 postgresql: use_pg_rewind: true use_slots: true parameters: wal_level: replica hot_standby: "on" wal_keep_segments: 5120 max_wal_senders: 5 max_replication_slots: 5 checkpoint_timeout: 30 initdb: - encoding: UTF8 - data-checksums - locale: en_US.UTF8 # init pg_hba.conf     ,    pg_hba: - host replication postgres ::1/128 md5 - host replication postgres 127.0.0.1/8 md5 - host replication postgres 192.168.0.143/24 md5 - host replication postgres 192.168.0.144/24 md5 - host replication postgres 192.168.0.145/24 md5 - host all all 0.0.0.0/0 md5 users: admin: password: admin options: - createrole - createdb postgresql: listen: 192.168.0.143:5432 #   ,      connect_address: 192.168.0.143:5432 #   ,      data_dir: /data/patroni #    ,       bin_dir: /usr/lib/postgresql/9.6/bin #       postgresql pgpass: /tmp/pgpass authentication: replication: username: postgres password: postgres superuser: username: postgres password: postgres create_replica_methods: basebackup: checkpoint: 'fast' parameters: unix_socket_directories: '.' tags: nofailover: false noloadbalance: false clonefrom: false nosync: false 

يجب تشغيل البرنامج النصي على الأجهزة الثلاثة للمجموعة ، تمامًا كما تحتاج إلى وضع التكوين في ملف /etc/patroni.yml على جميع الأجهزة.


عند القيام بهذه العمليات على جميع الأجهزة الموجودة في الكتلة ، قم بتشغيل الأمر التالي على أي منها


 systemctl start patroni systemctl start postgresql 

انتظر حوالي 30 ثانية ، ثم قم بتشغيل هذا الأمر على بقية أجهزة الكتلة.


HAproxy


نحن نستخدم HAproxy الرائع لتوفير نقطة دخول واحدة. سيكون الخادم الرئيسي متاحًا دائمًا على عنوان الجهاز الذي تم نشر HAproxy عليه.


من أجل عدم جعل جهاز HAproxy نقطة فشل واحدة ، قم بتشغيله في حاوية Docker ، وبعد ذلك سيكون من الممكن تشغيله في مجموعة K8 وجعل نظام تجاوز الفشل أكثر موثوقية.


قم بإنشاء دليل حيث يمكنك تخزين ملفين - Dockerfile و haproxy.cfg. اذهب إليها.


Dockerfile
 FROM ubuntu:latest RUN apt-get update \ && apt-get install -y haproxy rsyslog \ && rm -rf /var/lib/apt/lists/* RUN mkdir /run/haproxy COPY haproxy.cfg /etc/haproxy/haproxy.cfg CMD haproxy -f /etc/haproxy/haproxy.cfg && tail -F /var/log/haproxy.log 

كن حذراً ، يجب أن تسرد الأسطر الثلاثة الأخيرة من ملف haproxy.cfg عناوين أجهزتك. ستقوم HAproxy بالاتصال بـ Patroni ، في رؤوس HTTP ، سيعود الخادم الرئيسي دائمًا 200 ، وستعود النسخة المتماثلة 503.


haproxy.cfg
 global maxconn 100 defaults log global mode tcp retries 2 timeout client 30m timeout connect 4s timeout server 30m timeout check 5s listen stats mode http bind *:7000 stats enable stats uri / listen postgres bind *:5000 option httpchk http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions server postgresql1 192.168.0.143:5432 maxconn 100 check port 8008 server postgresql2 192.168.0.144:5432 maxconn 100 check port 8008 server postgresql3 192.168.0.145:5432 maxconn 100 check port 8008 

نظرًا لوجودنا في الدليل الذي "يكمن" فيه كلا الملفين ، سنقوم بتنفيذ أوامر تعبئة الحاوية بالتسلسل ، وكذلك تشغيله مع إعادة توجيه المنافذ الضرورية:


 docker build -t my-haproxy . docker run -d -p5000:5000 -p7000:7000 my-haproxy 

الآن ، افتح عنوان متصفح جهازك باستخدام HAproxy وتحديد المنفذ 7000 ، سترى إحصائيات على نظامك.


في حالة UP ، سيتم تحديد موقع الخادم الرئيسي ، والنسخ المتماثلة في حالة DOWN. هذا أمر طبيعي ، في الواقع أنهم يعملون ، ولكن يتم عرضهم في هذا النموذج بسبب حقيقة أنهم يعيدون 503 إلى طلبات من HAproxy. يسمح لنا ذلك دائمًا بمعرفة أي من الخوادم الثلاثة هو المعلم الرئيسي في الوقت الحالي.


استنتاج


أنت رائع! في 30 دقيقة فقط ، قمت بنشر مجموعة قاعدة بيانات ممتازة آمنة من الفشل مع تدفق النسخ المتماثل والتوفير التلقائي. إذا كنت تخطط لاستخدام هذا الحل ، فراجع وثائق Patroni الرسمية ، وخاصة دورها فيما يتعلق بأداة patronictl ، والتي توفر وصولاً سهلاً لإدارة مجموعتك.


تهانينا!

Source: https://habr.com/ru/post/ar482314/


All Articles