Sobes.tech
Senior

Galera კლასტერში ლიდერისთვის ხმის მიცემისთვის საგარეო ინსტრუმენტის კონფიგურაციის გამოცდილება გაქვთ?

sobes.tech AI

პასუხი AI-სგან

Galera კლასტერის ლიდერისთვის გარე ინსტრუმენტის კონფიგურაცია გამოცდილება არ არსებობს. Galera-ში ლიდერობა არ განისაზღვრება გარე ინსტრუმენტით; ყველა კვანძი კლასტერში თანასწორია და ერთდროულად შეუძლია წერის მოთხოვნების დამუშავება (რეპლიკაციის წესების დაცვით). "ლიდერის" ან პრაიმერი კვანძის არჩევის მექანიზმი კონკრეტული დავალებებისთვის (მაგალითად, მონიტორინგი ან ადმინისტრაციული ოპერაციები) ჩვეულებრივ ხორციელდება აპლიკაციის, ბალანსის ან გარე მონიტორინგისა და ორქესტრაციის ინსტრუმენტების დონეზე, არა როგორც ინტეგრირებული ინსტრუმენტი ლიდერის ხმასთვის Galera-ის კონტექსტში.

Galera კლასტერის მართვის და კონკრეტული დავალებებისთვის კვანძის არჩევისათვის შეიძლება გამოყენებულ იქნას:

  • ProxySQL / HAProxy: დატვირთვის ბალანსერი, რომელიც შეუძლია ტრეფიკის მიმართულება გარკვეულ კვანძზე მისი მდგომარეობის საფუძველზე.
  • Keepalived / Pacemaker: მაღალი ხელმისაწვდომობის ინსტრუმენტები, რომლებიც განსაზღვრავენ ვირტუალურ IP-ადრეს აქტიურ კვანძზე.
  • მონიტორინგის ინსტრუმენტები (მაგალითად, Prometheus + Alertmanager): საშუალებას აძლევს კვანძების მდგომარეობის მონიტორინგს და გადაწყვეტილებების მიღებას (მაგალითად, ტრეფიკის გადამისამართება).

Galera-ის კონტექსტში მნიშვნელოვანია:

  • კუორუმის უზრუნველყოფა split-brain სცენარების თავიდან ასაცილებლად.
  • wsrep_cluster_address და wsrep_sst_auth სწორად კონფიგურაცია.
  • SST (State Snapshot Transfer) ახალი კვანძების დამატებისას.

თუ მიზანია "საუკეთესო ჯანმრთელობის" კვანძის განსაზღვრა ადმინისტრაციული ოპერაციებისათვის, ეს უფრო მონიტორინგისა და მეტრიკების საფუძველზე არჩევის საკითხია, ვიდრე ლიდერის ხმას.


ProxySQL-ის გამოყენების მაგალითი, კონკრეტული დავალებებისათვის ერთ კვანძზე ტრეფიკის მიმართულებისთვის:

-- Galera-ის ყველა კვანძის დამატება ProxySQL-ში
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (10, 'node1', 3306), (10, 'node2', 3306), (10, 'node3', 3306);

-- წაკითხვის მოთხოვნების მიმართულება ყველა კვანძზე (hostgroup 10)
INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup) VALUES (10, 10);

-- გამოყოფილი hostgroup შექმნა "ადმინისტრაციული" კვანძისთვის (მაგალითად, node1)
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (20, 'node1', 3306);

-- კონკრეტული მოთხოვნების (მაგალითად, SHOW STATUS) მიმართულება "ადმინისტრაციული" კვანძისკენ (hostgroup 20)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup) VALUES (1, 1, 'SHOW STATUS', 20);

-- ცვლილებების დატვირთვა runtime-ში და შენახვა
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
LOAD MYSQL REPLICATION HOSTGROUPS TO RUNTIME;
SAVE MYSQL REPLICATION HOSTGROUPS TO DISK;

ამ მაგალითში ჩვენ არ ვაძლევთ "ხმას" ლიდერს, არამედ ვხმარობთ ProxySQL-ს ტრეფიკის მიმართულებისთვის გარკვეულ კვანძზე, რაც შეიძლება ინტერპრეტირდეს როგორც კვანძის არჩევა გარკვეული დავალებების შესრულებისთვის.


Keepalived-ის გამოყენების მაგალითი, ვირტუალური IP-ისთვის:

#!/bin/bash
# პსევდო-კოდი Keepalived-ის ჯანმრთელობის შემოწმების სკრიპტისთვის
# ეს სკრიპტი შესრულდება თითოეულ Galera კვანძზე

GALERA_STATUS=$(mysql -h 127.0.0.1 -e "SHOW STATUS LIKE 'wsrep_local_state';" | grep wsrep_local_state | awk '{print $2}')
GALERA_QUORUM=$(mysql -h 127.0.0.1 -e "SHOW STATUS LIKE 'wsrep_cluster_status';" | grep wsrep_cluster_status | awk '{print $2}')

if [ "$GALERA_STATUS" -eq 4 ] && [ "$GALERA_QUORUM" == "Primary" ]; then
  # კვანძი სინქრონიზებულია (4) და მთავარი კომპონენტშია
  exit 0 # ჯანმრთელი
else
  exit 1 # არასრულყოფილი
fi
# Keepalived კონფიგურაციის პსევდო-კოდი (vrrp_script ბლოკი)
vrrp_script check_galera {
  script "/etc/keepalived/scripts/check_galera.sh"
  interval 2 # ყოველ 2 წამში
  timeout 3 # 3 წამის შემდეგ
  weight 50 # სკრიპტი წარმატების შემთხვევაში წონას 50-ით ზრდის
}

vrrp_instance VI_1 {
  state BACKUP # საწყის მდგომარეობა
  interface eth0 # ქსელური ინტერფეისი
  virtual_router_id 51 # უნიკალური ID VRRP ინსტანციისთვის
  priority 100 # ამ კვანძის პრიორიტეტი (მაღალი = უფრო სავარაუდოა, რომ იყოს MASTER)
  advert_int 1 # განცხადების ინტერვალი

  authentication {
    auth_type PASS
    auth_pass your_password
  }

  virtual_ipaddress {
    192.168.1.100 # ვირტუალური IP მისამართი
  }

  track_script {
    check_galera # ტრეკი სკრიპტით
  }
}

აქ Keepalived იყენებს სკრიპტს Galera-ის მდგომარეობის შემოწმებისთვის და განსაზღვრავს ვირტუალურ IP-ს მხოლოდ "სამედიცინო" კვანძზე, რომელიც უმაღლეს პრიორიტეტს ფლობს, რაც საშუალებას აძლევს ჰქონდეს ერთიანი წვდომის წერტილი კლასტერზე, მაგრამ ეს არ არის სისტემის ხმის მიცემა Galera-ის შიგნით. ეს არის აქტიური კვანძის არჩევის სისტემა ვირტუალურ IP-ისთვის.

ჩემი გამოცდილება დაკავშირებულია ამ მექანიზმების კონფიგურაციასთან და მხარდაჭერასთან, რათა უზრუნველყოს მაღალი ხელმისაწვდომობა და ტრაფიკის მართვა Galera კლასტერებში.