MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

ClusterControl CMON HA untuk Database Terdistribusi Ketersediaan Tinggi - Bagian Kedua (Pengaturan Akses GUI)

Pada bagian pertama, kita mendapatkan cluster HA cmon yang berfungsi:

[email protected]:~# s9s controller --list --long

S VERSION    OWNER GROUP NAME            IP PORT COMMENT

l 1.7.4.3565 system admins 10.0.0.101      10.0.0.101 9501 Acting as leader.

f 1.7.4.3565 system admins 10.0.0.102      10.0.0.102 9501 Accepting heartbeats.

f 1.7.4.3565 system admins 10.0.0.103      10.0.0.103 9501 Accepting heartbeats.

Total: 3 controller(s)

Kami memiliki tiga node yang aktif dan berjalan, satu bertindak sebagai pemimpin dan sisanya adalah pengikut, yang dapat diakses (mereka menerima detak jantung dan membalasnya). Tantangan selanjutnya adalah mengonfigurasi akses UI dengan cara yang memungkinkan kita untuk selalu mengakses UI di node pemimpin. Dalam posting blog ini kami akan menyajikan salah satu solusi yang memungkinkan Anda mencapai hal itu.

Menyiapkan HAProxy

Masalah ini bukan hal baru bagi kami. Dengan setiap kluster replikasi, MySQL atau PostgreSQL, tidak masalah,  ada satu node tempat kita harus mengirim tulisan kita. Salah satu cara untuk mencapainya adalah dengan menggunakan HAProxy dan menambahkan beberapa pemeriksaan eksternal yang menguji status node, dan berdasarkan itu, mengembalikan nilai yang tepat. Ini pada dasarnya adalah apa yang akan kita gunakan untuk memecahkan masalah kita. Kami akan menggunakan HAProxy sebagai proxy layer 4 yang telah teruji dengan baik dan kami akan menggabungkannya dengan pemeriksaan HTTP layer 7 yang akan kami tulis dengan tepat untuk kasus penggunaan kami. Hal pertama yang pertama, mari kita instal HAProxy. Kami akan menempatkannya dengan ClusterControl, tetapi juga dapat diinstal pada node yang terpisah (idealnya, node - untuk menghapus HAProxy sebagai satu-satunya titik kegagalan).

apt install haproxy

Ini menyiapkan HAProxy. Setelah selesai, kita harus memperkenalkan konfigurasi kita:

global

        pidfile /var/run/haproxy.pid

        daemon

        user haproxy

        group haproxy

        stats socket /var/run/haproxy.socket user haproxy group haproxy mode 600 level admin

        node haproxy_10.0.0.101

        description haproxy server



        #* Performance Tuning

        maxconn 8192

        spread-checks 3

        quiet

defaults

        #log    global

        mode    tcp

        option  dontlognull

        option tcp-smart-accept

        option tcp-smart-connect

        #option dontlog-normal

        retries 3

        option redispatch

        maxconn 8192

        timeout check   10s

        timeout queue   3500ms

        timeout connect 3500ms

        timeout client  10800s

        timeout server  10800s



userlist STATSUSERS

        group admin users admin

        user admin insecure-password admin

        user stats insecure-password admin



listen admin_page

        bind *:9600

        mode http

        stats enable

        stats refresh 60s

        stats uri /

        acl AuthOkay_ReadOnly http_auth(STATSUSERS)

        acl AuthOkay_Admin http_auth_group(STATSUSERS) admin

        stats http-request auth realm admin_page unless AuthOkay_ReadOnly

        #stats admin if AuthOkay_Admin



listen  haproxy_10.0.0.101_81

        bind *:81

        mode tcp

        tcp-check connect port 80

        timeout client  10800s

        timeout server  10800s

        balance leastconn

        option httpchk

#        option allbackups

        default-server port 9201 inter 20s downinter 30s rise 2 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100

        server 10.0.0.101 10.0.0.101:443 check

        server 10.0.0.102 10.0.0.102:443 check

        server 10.0.0.103 10.0.0.103:443 check

Anda mungkin ingin mengubah beberapa hal di sini seperti nama node atau backend yang menyertakan IP node kami di sini. Anda pasti ingin mengubah server yang akan Anda sertakan dalam HAProxy Anda.

Bit yang paling penting adalah:

        bind *:81

HAProxy akan mendengarkan pada port 81.

        option httpchk

Kami telah mengaktifkan pemeriksaan lapisan 7 pada node backend.

        default-server port 9201 inter 20s downinter 30s rise 2 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100

Pemeriksaan layer 7 akan dijalankan pada port 9201.

Setelah ini selesai, mulai HAProxy.

Menyiapkan xinetd dan Memeriksa Skrip

Kita akan menggunakan xinetd untuk menjalankan pemeriksaan dan mengembalikan tanggapan yang benar ke HAProxy. Langkah-langkah yang dijelaskan dalam paragraf ini harus dijalankan pada semua node cluster HA cmon.

Pertama, instal xinetd:

[email protected]:~# apt install xinetd

Setelah ini selesai, kita harus menambahkan baris berikut:

cmonhachk       9201/tcp

ke /etc/services - ini akan memungkinkan xinetd untuk membuka layanan yang akan mendengarkan pada port 9201. Kemudian kita harus menambahkan file layanan itu sendiri. Itu harus ditempatkan di /etc/xinetd.d/cmonhachk:

# default: on

# description: cmonhachk

service cmonhachk

{

        flags           = REUSE

        socket_type     = stream

        port            = 9201

        wait            = no

        user            = root

        server          = /usr/local/sbin/cmonhachk.py

        log_on_failure  += USERID

        disable         = no

        #only_from       = 0.0.0.0/0

        only_from       = 0.0.0.0/0

        per_source      = UNLIMITED

}

Akhirnya, kita membutuhkan skrip cek yang dipanggil oleh xinetd. Seperti yang didefinisikan dalam file layanan, itu terletak di /usr/local/sbin/cmonhachk.py.

#!/usr/bin/python3.5



import subprocess

import re

import sys

from pathlib import Path

import os



def ret_leader():

    leader_str = """HTTP/1.1 200 OK\r\n

Content-Type: text/html\r\n

Content-Length: 48\r\n

\r\n

<html><body>This node is a leader.</body></html>\r\n

\r\n"""

    print(leader_str)



def ret_follower():

    follower_str = """

HTTP/1.1 503 Service Unavailable\r\n

Content-Type: text/html\r\n

Content-Length: 50\r\n

\r\n

<html><body>This node is a follower.</body></html>\r\n

\r\n"""

    print(follower_str)



def ret_unknown():

    unknown_str = """

HTTP/1.1 503 Service Unavailable\r\n

Content-Type: text/html\r\n

Content-Length: 59\r\n

\r\n

<html><body>This node is in an unknown state.</body></html>\r\n

\r\n"""

    print(unknown_str)



lockfile = "/tmp/cmonhachk_lockfile"



if os.path.exists(lockfile):

    print("Lock file {} exists, exiting...".format(lockfile))

    sys.exit(1)



Path(lockfile).touch()

try:

    with open("/etc/default/cmon", 'r') as f:

        lines  = f.readlines()



    pattern1 = "RPC_BIND_ADDRESSES"

    pattern2 = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

    m1 = re.compile(pattern1)

    m2 = re.compile(pattern2)



    for line in lines:

        res1 = m1.match(line)

        if res1 is not None:

            res2 = m2.findall(line)

            i = 0

            for r in res2:

                if r != "127.0.0.1" and i == 0:

                    i += 1

                    hostname = r



    command = "s9s controller --list --long | grep {}".format(hostname)

    output = subprocess.check_output(command.split())

    state = output.splitlines()[1].decode('UTF-8')[0]

    if state == "l":

        ret_leader()

    if state == "f":

        ret_follower()

    else:

        ret_unknown()

finally:

    os.remove(lockfile)

Setelah Anda membuat file, pastikan file tersebut dapat dieksekusi:

chmod u+x /usr/local/sbin/cmonhachk.py

Ide di balik skrip ini adalah untuk menguji status node menggunakan perintah "s9s controller --list --long" dan kemudian memeriksa output yang relevan dengan IP yang dapat ditemukan di simpul lokal. Ini memungkinkan skrip untuk menentukan apakah host yang dieksekusi adalah pemimpin atau tidak. Jika node adalah pemimpinnya, skrip mengembalikan kode “HTTP/1.1 200 OK”, yang ditafsirkan oleh HAProxy sebagai node tersedia dan mengarahkan lalu lintas ke sana. Jika tidak, skrip mengembalikan “HTTP/1.1 503 Service Unavailable”, yang diperlakukan sebagai sebuah node, yang tidak sehat dan lalu lintas tidak akan diarahkan ke sana. Akibatnya, tidak peduli node mana yang akan menjadi pemimpin, HAProxy akan mendeteksinya dan menandainya sebagai tersedia di backend:

Anda mungkin perlu memulai ulang HAProxy dan xinetd untuk menerapkan perubahan konfigurasi sebelum semua bagian akan mulai bekerja dengan benar.

Memiliki lebih dari satu HAProxy memastikan kami memiliki cara untuk mengakses ClusterControl UI meskipun salah satu node HAProxy akan gagal tetapi kami masih memiliki dua (atau lebih) nama host atau IP yang berbeda untuk terhubung ke UI ClusterControl. Untuk membuatnya lebih nyaman, kami akan menerapkan Keepalive di atas HAProxy. Ini akan memantau status layanan HAProxy dan menetapkan IP Virtual ke salah satunya. Jika HAProxy itu menjadi tidak tersedia, VIP akan dipindahkan ke HAProxy lain yang tersedia. Akibatnya, kami akan memiliki satu titik masuk (VIP atau nama host yang terkait dengannya). Langkah-langkah yang akan kita ambil di sini harus dijalankan pada semua node tempat HAProxy telah diinstal.

Pertama, mari kita instal keepalive:

apt install keepalived

Kemudian kita harus mengkonfigurasinya. Kami akan menggunakan file konfigurasi berikut:

vrrp_script chk_haproxy {

   script "killall -0 haproxy"   # verify the pid existance

   interval 2                    # check every 2 seconds

   weight 2                      # add 2 points of prio if OK

}

vrrp_instance VI_HAPROXY {

   interface eth1                # interface to monitor

   state MASTER

   virtual_router_id 51          # Assign one ID for this route

   priority 102                   

   unicast_src_ip 10.0.0.101

   unicast_peer {

      10.0.0.102

10.0.0.103



   }

   virtual_ipaddress {

       10.0.0.130                        # the virtual IP

   } 

   track_script {

       chk_haproxy

   }

#    notify /usr/local/bin/notify_keepalived.sh

}

Anda harus memodifikasi file ini pada node yang berbeda. Alamat IP harus dikonfigurasi dengan benar dan prioritas harus berbeda pada semua node. Harap konfigurasikan juga VIP yang masuk akal di jaringan Anda. Anda mungkin juga ingin mengubah antarmuka - kami menggunakan eth1, di mana IP ditetapkan pada mesin virtual yang dibuat oleh Vagrant.

Mulai keepalived dengan file konfigurasi ini dan Anda akan siap melakukannya. Selama VIP aktif pada satu node HAProxy, Anda harus dapat menggunakannya untuk terhubung ke UI ClusterControl yang tepat:

Ini melengkapi pengenalan dua bagian kami untuk cluster yang sangat tersedia ClusterControl. Seperti yang kami nyatakan di awal, ini masih dalam versi beta, tetapi kami menantikan umpan balik dari pengujian Anda.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana melakukan Pemulihan Point-in-Time dari Data MySQL &MariaDB Menggunakan ClusterControl

  2. Menjalankan MariaDB di Hybrid Cloud Setup

  3. Bagaimana WEEKDAY() Bekerja di MariaDB

  4. Bagaimana MAKETIME() Bekerja di MariaDB

  5. Memigrasikan Azure Database untuk MySQL/MariaDB ke Server Lokal