sql >> Database >  >> RDS >> MariaDB

ClusterControl CMON HA voor hoge beschikbaarheid van gedistribueerde databases - deel twee (GUI Access Setup)

In het eerste deel eindigden we met een werkend cmon HA-cluster:

[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)

We hebben drie knooppunten in gebruik, één fungeert als leider en de overige zijn volgers, die toegankelijk zijn (ze ontvangen wel hartslagen en beantwoorden ze). De resterende uitdaging is om UI-toegang zo te configureren dat we altijd toegang hebben tot de UI op het leiderknooppunt. In deze blogpost presenteren we een van de mogelijke oplossingen waarmee u precies dat kunt bereiken.

HAProxy instellen

Dit probleem is niet nieuw voor ons. Met elk replicatiecluster, MySQL of PostgreSQL, maakt het niet uit, er is één knooppunt waar we onze schrijfbewerkingen naartoe moeten sturen. Een manier om dat te bereiken zou zijn om HAProxy te gebruiken en enkele externe controles toe te voegen die de status van het knooppunt testen en op basis daarvan de juiste waarden retourneren. Dit is eigenlijk wat we gaan gebruiken om ons probleem op te lossen. We zullen HAProxy gebruiken als een goed geteste laag 4-proxy en we zullen het combineren met laag 7 HTTP-controles die we precies voor onze gebruikssituatie zullen schrijven. Laten we eerst HAProxy installeren. We zullen het samenbrengen met ClusterControl, maar het kan ook op een apart knooppunt worden geïnstalleerd (idealiter knooppunten - om HAProxy te verwijderen als het enige storingspunt).

apt install haproxy

Hiermee wordt HAProxy ingesteld. Als het klaar is, moeten we onze configuratie introduceren:

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

Misschien wil je hier enkele dingen veranderen, zoals de node- of backend-namen die hier het IP-adres van onze node bevatten. U zult zeker de servers willen wijzigen die u in uw HAProxy gaat opnemen.

De belangrijkste stukjes zijn:

        bind *:81

HAProxy luistert op poort 81.

        option httpchk

We hebben laag 7-controle op de backend-knooppunten ingeschakeld.

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

De laag 7-controle wordt uitgevoerd op poort 9201.

Zodra dit gedaan is, start HAProxy.

xinetd instellen en script controleren

We gaan xinetd gebruiken om de controle uit te voeren en correcte antwoorden terug te sturen naar HAProxy. De stappen die in deze paragraaf worden beschreven, moeten worden uitgevoerd op alle cmon HA-clusterknooppunten.

Installeer eerst xinetd:

[email protected]:~# apt install xinetd

Zodra dit gedaan is, moeten we de volgende regel toevoegen:

cmonhachk       9201/tcp

naar /etc/services - hierdoor kan xinetd een service openen die luistert op poort 9201. Dan moeten we het servicebestand zelf toevoegen. Het zou zich in /etc/xinetd.d/cmonhachk moeten bevinden:

# 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

}

Ten slotte hebben we het controlescript nodig dat wordt aangeroepen door de xinetd. Zoals gedefinieerd in het servicebestand bevindt het zich in /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)

Als je het bestand hebt gemaakt, zorg er dan voor dat het uitvoerbaar is:

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

Het idee achter dit script is dat het de status van de knooppunten test met de opdracht "s9s controller --list --long" en vervolgens de uitvoer controleert die relevant is voor het IP-adres dat het kan vinden op de lokale knoop. Hierdoor kan het script bepalen of de host waarop het wordt uitgevoerd een leider is of niet. Als het knooppunt de leider is, retourneert het script de code "HTTP/1.1 200 OK", die HAProxy interpreteert als het knooppunt beschikbaar is en het verkeer ernaartoe leidt. Anders retourneert het "HTTP/1.1 503 Service niet beschikbaar", dat wordt behandeld als een knooppunt, dat niet gezond is en het verkeer daar niet zal worden omgeleid. Als gevolg hiervan zal HAProxy, ongeacht welk knooppunt een leider wordt, het detecteren en markeren als beschikbaar in de backend:

Misschien moet u HAProxy en xinetd opnieuw opstarten om configuratiewijzigingen toe te passen voordat alle onderdelen zullen correct gaan werken.

Als we meer dan één HAProxy hebben, hebben we een manier om toegang te krijgen tot de gebruikersinterface van ClusterControl, zelfs als een van de HAProxy-knooppunten zou falen, maar we hebben nog steeds twee (of meer) verschillende hostnamen of IP-adressen om verbinding te maken met de gebruikersinterface van ClusterControl. Om het nog comfortabeler te maken, zullen we Keepalive inzetten bovenop HAProxy. Het zal de status van HAProxy-services bewaken en een virtueel IP-adres toewijzen aan een van hen. Als die HAProxy niet meer beschikbaar is, wordt VIP verplaatst naar een andere beschikbare HAProxy. Als gevolg hiervan hebben we één toegangspunt (VIP of een daaraan gekoppelde hostnaam). De stappen die we hier nemen, moeten worden uitgevoerd op alle knooppunten waar HAProxy is geïnstalleerd.

Laten we eerst keepalive installeren:

apt install keepalived

Dan moeten we het configureren. We gebruiken het volgende configuratiebestand:

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

}

Je moet dit bestand op verschillende nodes aanpassen. IP-adressen moeten correct worden geconfigureerd en de prioriteit moet op alle knooppunten anders zijn. Configureer ook VIP die zinvol is in uw netwerk. Misschien wil je ook de interface wijzigen - we hebben eth1 gebruikt, waar het IP-adres wordt toegewezen op virtuele machines die door Vagrant zijn gemaakt.

Start de keepalived met dit configuratiebestand en je zou goed moeten zijn om te gaan. Zolang VIP zich op één HAProxy-knooppunt bevindt, zou u het moeten kunnen gebruiken om verbinding te maken met de juiste ClusterControl-gebruikersinterface:

Dit voltooit onze tweedelige introductie tot ClusterControl-clusters met hoge beschikbaarheid. Zoals we aan het begin al zeiden, bevindt dit zich nog in de bètafase, maar we kijken uit naar feedback van uw tests.


  1. PostgreSQL kolommen naar rijen converteren? transponeren?

  2. Tien manieren waarop uw dataproject zal mislukken

  3. MySQLDumper:een op PHP en Perl gebaseerde MySQL-databaseback-uptool

  4. Audit van gegevenswijzigingen uitvoeren met behulp van een tijdelijke tabel