sql >> Databasteknik >  >> RDS >> MariaDB

Kör ProxySQL som en Helper Container på Kubernetes

ProxySQL sitter vanligtvis mellan applikations- och databasnivåerna, i så kallad omvänd proxynivå. När dina applikationsbehållare är orkestrerade och hanterade av Kubernetes, kanske du vill använda ProxySQL framför dina databasservrar.

I det här inlägget kommer vi att visa dig hur du kör ProxySQL på Kubernetes som en hjälpbehållare i en pod. Vi kommer att använda Wordpress som exempelapplikation. Datatjänsten tillhandahålls av vår MySQL-replikering med två noder, som distribueras med ClusterControl och sitter utanför Kubernetes-nätverket på en barmetallinfrastruktur, som illustreras i följande diagram:

ProxySQL Docker Image

I det här exemplet kommer vi att använda ProxySQL Docker-avbildning som underhålls av Severalnines, en allmän allmän bild byggd för multi-purpose användning. Bilden kommer utan entrypoint-skript och stöder Galera Cluster (utöver inbyggt stöd för MySQL-replikering), där ett extra skript krävs för hälsokontrollsyften.

I grund och botten, för att köra en ProxySQL-behållare, kör du helt enkelt följande kommando:

$ docker run -d -v /path/to/proxysql.cnf:/etc/proxysql.cnf severalnines/proxysql

Den här bilden rekommenderar att du binder en ProxySQL-konfigurationsfil till monteringspunkten, /etc/proxysql.cnf, även om du kan hoppa över detta och konfigurera det senare med ProxySQL-administratörskonsolen. Exempel på konfigurationer finns på Docker Hub-sidan eller Github-sidan.

ProxySQL på Kubernetes

Att designa ProxySQL-arkitekturen är ett subjektivt ämne och i hög grad beroende av placeringen av applikationen och databasbehållarna samt rollen som ProxySQL själv. ProxySQL dirigerar inte bara frågor, den kan också användas för att skriva om och cache-förfrågningar. Effektiva cacheträffar kan kräva en anpassad konfiguration som är skräddarsydd specifikt för applikationsdatabasens arbetsbelastning.

Helst kan vi konfigurera ProxySQL för att hanteras av Kubernetes med två konfigurationer:

  1. ProxySQL som en Kubernetes-tjänst (centraliserad distribution).
  2. ProxySQL som en hjälpbehållare i en pod (distribuerad distribution).

Det första alternativet är ganska enkelt, där vi skapar en ProxySQL-pod och bifogar en Kubernetes-tjänst till den. Applikationer kommer sedan att ansluta till ProxySQL-tjänsten via nätverk på de konfigurerade portarna. Standard är 6033 för MySQL belastningsbalanserad port och 6032 för ProxySQL administrationsport. Den här implementeringen kommer att behandlas i det kommande blogginlägget.

Det andra alternativet är lite annorlunda. Kubernetes har ett koncept som kallas "pod". Du kan ha en eller flera behållare per pod, dessa är relativt tätt kopplade. En pods innehåll är alltid samlokaliserat och samschemalagt och körs i ett delat sammanhang. En pod är den minsta hanterbara containerenheten i Kubernetes.

Båda distributionerna kan enkelt särskiljas genom att titta på följande diagram:

Det primära skälet till att poddar kan ha flera behållare är att stödja hjälpprogram som hjälper en primär applikation. Typiska exempel på hjälptillämpningar är datautdragare, datapådrivare och proxyservrar. Hjälpar- och primärapplikationer behöver ofta kommunicera med varandra. Vanligtvis görs detta genom ett delat filsystem, som visas i den här övningen, eller genom loopback-nätverksgränssnittet, localhost. Ett exempel på detta mönster är en webbserver tillsammans med ett hjälpprogram som söker efter nya uppdateringar i ett Git-förråd.

Det här blogginlägget kommer att täcka den andra konfigurationen - att köra ProxySQL som en hjälpbehållare i en pod.

ProxySQL som hjälpare i en Pod

I den här installationen kör vi ProxySQL som en hjälpbehållare till vår Wordpress-behållare. Följande diagram illustrerar vår högnivåarkitektur:

I den här installationen är ProxySQL-behållaren tätt kopplad till Wordpress-behållaren, och vi kallade den som "blogg"-pod. Om schemaläggning sker, t.ex. Kubernetes-arbetarnoden går ner, kommer dessa två behållare alltid att omschemaläggas tillsammans som en logisk enhet på nästa tillgängliga värd. För att hålla programbehållarnas innehåll beständigt över flera noder måste vi använda ett klustrade eller fjärranslutna filsystem, som i det här fallet är NFS.

ProxySQL-rollen är att tillhandahålla ett databasabstraktionslager till applikationsbehållaren. Eftersom vi kör en MySQL-replikering med två noder som backend-databastjänsten, är läs-skrivdelning avgörande för att maximera resursförbrukningen på båda MySQL-servrarna. ProxySQL utmärker sig på detta och kräver minimala eller inga ändringar av applikationen.

Det finns ett antal andra fördelar med ProxySQL i den här installationen:

  • Ta med funktionen för cachning av frågor närmast applagret som körs i Kubernetes.
  • Säker implementering genom att ansluta via ProxySQL UNIX-socketfil. Det är som ett rör som servern och klienterna kan använda för att ansluta och utbyta förfrågningar och data.
  • Distribuerad omvänd proxynivå med delad ingenting-arkitektur.
  • Mindre nätverkskostnader på grund av implementering av "hoppa över nätverk".
  • Statslös distributionsmetod genom att använda Kubernetes ConfigMaps.

Förbereder databasen

Skapa wordpress-databasen och användaren på mastern och tilldela med rätt behörighet:

mysql-master> CREATE DATABASE wordpress;
mysql-master> CREATE USER [email protected]'%' IDENTIFIED BY 'passw0rd';
mysql-master> GRANT ALL PRIVILEGES ON wordpress.* TO [email protected]'%';

Skapa också ProxySQL-övervakningsanvändaren:

mysql-master> CREATE USER [email protected]'%' IDENTIFIED BY 'proxysqlpassw0rd';

Ladda sedan om bidragstabellen:

mysql-master> FLUSH PRIVILEGES;

Förbereder podden

Kopiera och klistra in följande rader i en fil som heter blog-deployment.yml på värden där kubectl är konfigurerad:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: blog
  labels:
    app: blog
spec:
  replicas: 1
  selector:
    matchLabels:
      app: blog
      tier: frontend
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: blog
        tier: frontend
    spec:

      restartPolicy: Always

      containers:
      - image: wordpress:4.9-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: localhost:/tmp/proxysql.sock
        - name: WORDPRESS_DB_USER
          value: wordpress
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
        - name: shared-data
          mountPath: /tmp

      - image: severalnines/proxysql
        name: proxysql
        volumeMounts:
        - name: proxysql-config
          mountPath: /etc/proxysql.cnf
          subPath: proxysql.cnf
        - name: shared-data
          mountPath: /tmp

      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim
      - name: proxysql-config
        configMap:
          name: proxysql-configmap
      - name: shared-data
        emptyDir: {}

YAML-filen har många rader och låt oss bara titta på den intressanta delen. Det första avsnittet:

apiVersion: apps/v1
kind: Deployment

Den första raden är apiVersion. Vårt Kubernetes-kluster körs på v1.12 så vi bör hänvisa till Kubernetes v1.12 API-dokumentation och följa resursdeklarationen enligt detta API. Nästa är den typ som talar om vilken typ av resurs vi vill distribuera. Deployment, Service, ReplicaSet, DaemonSet, PersistentVolume är några av exemplen.

Nästa viktiga avsnitt är avsnittet "behållare". Här definierar vi alla behållare som vi skulle vilja köra tillsammans i denna pod. Den första delen är Wordpress-behållaren:

      - image: wordpress:4.9-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: localhost:/tmp/proxysql.sock
        - name: WORDPRESS_DB_USER
          value: wordpress
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
        - name: shared-data
          mountPath: /tmp

I det här avsnittet säger vi åt Kubernetes att distribuera Wordpress 4.9 med Apache webbserver och vi gav behållaren namnet "wordpress". Vi vill också att Kubernetes ska skicka ett antal miljövariabler:

  • WORDPRESS_DB_HOST - Databasvärden. Eftersom vår ProxySQL-behållare finns i samma Pod som Wordpress-behållaren, är det säkrare att använda en ProxySQL-socket-fil istället. Formatet för att använda socketfilen i Wordpress är "localhost:{sökväg till socketfilen}". Som standard finns den under /tmp-katalogen i ProxySQL-behållaren. Den här /tmp-sökvägen delas mellan Wordpress- och ProxySQL-behållare genom att använda "shared-data" volymmounts som visas längre ner. Båda behållarna måste montera denna volym för att dela samma innehåll under /tmp-katalogen.
  • WORDPRESS_DB_USER - Ange wordpress databasanvändare.
  • WORDPRESS_DB_PASSWORD - Lösenordet för WORDPRESS_DB_USER . Eftersom vi inte vill avslöja lösenordet i den här filen kan vi dölja det med Kubernetes Secrets. Här instruerar vi Kubernetes att läsa den hemliga resursen "mysql-pass" istället. Hemligheter måste skapas i avancerat innan podden distribueras, som förklaras längre ner.

Vi vill också publicera port 80 i containern för slutanvändaren. Wordpress-innehållet som lagras inuti /var/www/html i behållaren kommer att monteras i vår beständiga lagring som körs på NFS.

Därefter definierar vi ProxySQL-behållaren:

      - image: severalnines/proxysql:1.4.12
        name: proxysql
        volumeMounts:
        - name: proxysql-config
          mountPath: /etc/proxysql.cnf
          subPath: proxysql.cnf
        - name: shared-data
          mountPath: /tmp
        ports:
        - containerPort: 6033
          name: proxysql

I avsnittet ovan säger vi åt Kubernetes att distribuera en ProxySQL med severalnines/proxysql bildversion 1.4.12. Vi vill också att Kubernetes ska montera vår anpassade, förkonfigurerade konfigurationsfil och mappa den till /etc/proxysql.cnf inuti behållaren. Det kommer att finnas en volym som heter "shared-data" som mappar till /tmp-katalogen för att dela med Wordpress-bilden - en tillfällig katalog som delar en pods livstid. Detta gör att ProxySQL-socket-filen (/tmp/proxysql.sock) kan användas av Wordpress-behållaren vid anslutning till databasen, utan att TCP/IP-nätverket förbigår.

Den sista delen är avsnittet "volymer":

      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim
      - name: proxysql-config
        configMap:
          name: proxysql-configmap
      - name: shared-data
        emptyDir: {}

Kubernetes måste skapa tre volymer för denna pod:

  • wordpress-persistent-storage - Använd PersistentVolumeClaim resurs för att mappa NFS-export till behållaren för beständig datalagring för Wordpress-innehåll.
  • proxysql-config - Använd ConfigMap resurs för att mappa ProxySQL-konfigurationsfilen.
  • delad data - Använd emptyDir resurs för att montera en delad katalog för våra behållare inuti podden. emptyDir resurs är en tillfällig katalog som delar en pods livstid.

Därför måste vi, baserat på vår YAML-definition ovan, förbereda ett antal Kubernetes-resurser innan vi kan börja distribuera "blogg"-podden:

  1. PersistentVolume och PersistentVolumeClaim - För att lagra webbinnehållet i vår Wordpress-applikation, så när podden schemaläggs om till en annan arbetarnod, kommer vi inte att förlora de senaste ändringarna.
  2. Hemligheter - För att dölja Wordpress-databasens användarlösenord i YAML-filen.
  3. ConfigMap - För att mappa konfigurationsfilen till ProxySQL-behållaren, så när den schemaläggs till en annan nod, kan Kubernetes automatiskt montera om den igen.
Severalnines MySQL på Docker:How to Containerize Your DatabaseUpptäck allt du behöver förstå när du överväger att köra en MySQL-tjänst ovanpå Docker containervirtualisering Ladda ner Whitepaper

PersistentVolume och PersistentVolumeClaim

En bra beständig lagring för Kubernetes bör vara tillgänglig för alla Kubernetes-noder i klustret. För det här blogginläggets skull använde vi NFS som leverantör av PersistentVolume (PV) eftersom det är enkelt och stöds direkt. NFS-servern finns någonstans utanför vårt Kubernetes-nätverk och vi har konfigurerat den för att tillåta alla Kubernetes-noder med följande rad inuti /etc/exports:

/nfs    192.168.55.*(rw,sync,no_root_squash,no_all_squash)

Observera att NFS-klientpaketet måste installeras på alla Kubernetes-noder. Annars skulle Kubernetes inte kunna montera NFS korrekt. På alla noder:

$ sudo apt-install nfs-common #Ubuntu/Debian
$ yum install nfs-utils #RHEL/CentOS

Se också till att målkatalogen finns på NFS-servern:

(nfs-server)$ mkdir /nfs/kubernetes/wordpress

Skapa sedan en fil som heter wordpress-pv-pvc.yml och lägg till följande rader:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv
  labels:
    app: blog
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 3Gi
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /nfs/kubernetes/wordpress
    server: 192.168.55.200
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: wp-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  selector:
    matchLabels:
      app: blog
      tier: frontend

I definitionen ovan vill vi att Kubernetes tilldelar 3 GB volymutrymme på NFS-servern för vår Wordpress-behållare. Notera för produktionsanvändning, NFS bör konfigureras med automatisk provisionerare och lagringsklass.

Skapa PV- och PVC-resurserna:

$ kubectl create -f wordpress-pv-pvc.yml

Verifiera om dessa resurser har skapats och statusen måste vara "Bound":

$ kubectl get pv,pvc
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
persistentvolume/wp-pv   3Gi        RWO            Recycle          Bound    default/wp-pvc                           22h

NAME                           STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/wp-pvc   Bound    wp-pv    3Gi        RWO                           22h

Hemligheter

Den första är att skapa en hemlighet som ska användas av Wordpress-behållaren för WORDPRESS_DB_PASSWORD miljöfaktor. Anledningen är helt enkelt för att vi inte vill exponera lösenordet i klartext i YAML-filen.

Skapa en hemlig resurs som heter mysql-pass och skicka lösenordet därefter:

$ kubectl create secret generic mysql-pass --from-literal=password=passw0rd

Verifiera att vår hemlighet har skapats:

$ kubectl get secrets mysql-pass
NAME         TYPE     DATA   AGE
mysql-pass   Opaque   1      7h12m

ConfigMap

Vi behöver också skapa en ConfigMap-resurs för vår ProxySQL-behållare. En Kubernetes ConfigMap-fil innehåller nyckel-värdepar av konfigurationsdata som kan konsumeras i pods eller användas för att lagra konfigurationsdata. Med ConfigMaps kan du koppla bort konfigurationsartefakter från bildinnehåll för att hålla applikationer i containers bärbara.

Eftersom vår databasserver redan körs på bare-metal-servrar med ett statiskt värdnamn och IP-adress plus statiskt användarnamn och lösenord för övervakning, kommer ConfigMap-filen i detta fall att lagra förkonfigurerad konfigurationsinformation om ProxySQL-tjänsten som vi vill använda.

Skapa först en textfil som heter proxysql.cnf och lägg till följande rader:

datadir="/var/lib/proxysql"
admin_variables=
{
        admin_credentials="admin:adminpassw0rd"
        mysql_ifaces="0.0.0.0:6032"
        refresh_interval=2000
}
mysql_variables=
{
        threads=4
        max_connections=2048
        default_query_delay=0
        default_query_timeout=36000000
        have_compress=true
        poll_timeout=2000
        interfaces="0.0.0.0:6033;/tmp/proxysql.sock"
        default_schema="information_schema"
        stacksize=1048576
        server_version="5.1.30"
        connect_timeout_server=10000
        monitor_history=60000
        monitor_connect_interval=200000
        monitor_ping_interval=200000
        ping_interval_server_msec=10000
        ping_timeout_server=200
        commands_stats=true
        sessions_sort=true
        monitor_username="proxysql"
        monitor_password="proxysqlpassw0rd"
}
mysql_servers =
(
        { address="192.168.55.171" , port=3306 , hostgroup=10, max_connections=100 },
        { address="192.168.55.172" , port=3306 , hostgroup=10, max_connections=100 },
        { address="192.168.55.171" , port=3306 , hostgroup=20, max_connections=100 },
        { address="192.168.55.172" , port=3306 , hostgroup=20, max_connections=100 }
)
mysql_users =
(
        { username = "wordpress" , password = "passw0rd" , default_hostgroup = 10 , active = 1 }
)
mysql_query_rules =
(
        {
                rule_id=100
                active=1
                match_pattern="^SELECT .* FOR UPDATE"
                destination_hostgroup=10
                apply=1
        },
        {
                rule_id=200
                active=1
                match_pattern="^SELECT .*"
                destination_hostgroup=20
                apply=1
        },
        {
                rule_id=300
                active=1
                match_pattern=".*"
                destination_hostgroup=10
                apply=1
        }
)
mysql_replication_hostgroups =
(
        { writer_hostgroup=10, reader_hostgroup=20, comment="MySQL Replication 5.7" }
)

Var extra uppmärksam på avsnitten "mysql_servers" och "mysql_users", där du kan behöva ändra värdena så att de passar din databasklusterinställning. I det här fallet har vi två databasservrar som körs i MySQL-replikering som sammanfattas i följande Topology-skärmdump från ClusterControl:

Alla skrivningar ska gå till masternoden medan läsningar vidarebefordras till värdgrupp 20, som definierats under avsnittet "mysql_query_rules". Det är grunden för läs/skrivdelning och vi vill använda dem helt och hållet.

Importera sedan konfigurationsfilen till ConfigMap:

$ kubectl create configmap proxysql-configmap --from-file=proxysql.cnf
configmap/proxysql-configmap created

Kontrollera om ConfigMap är inläst i Kubernetes:

$ kubectl get configmap
NAME                 DATA   AGE
proxysql-configmap   1      45s

Distribuera Pod

Nu borde vi vara bra att distribuera bloggpodden. Skicka distributionsjobbet till Kubernetes:

$ kubectl create -f blog-deployment.yml

Verifiera poddens status:

$ kubectl get pods
NAME                           READY   STATUS              RESTARTS   AGE
blog-54755cbcb5-t4cb7          2/2     Running             0          100s

Den måste visa 2/2 under kolumnen READY, vilket indikerar att det finns två behållare som kör inuti poden. Använd flaggan -c för att kontrollera Wordpress- och ProxySQL-behållarna inuti bloggpodden:

$ kubectl logs blog-54755cbcb5-t4cb7 -c wordpress
$ kubectl logs blog-54755cbcb5-t4cb7 -c proxysql

Från ProxySQL-behållareloggen bör du se följande rader:

2018-10-20 08:57:14 [INFO] Dumping current MySQL Servers structures for hostgroup ALL
HID: 10 , address: 192.168.55.171 , port: 3306 , weight: 1 , status: ONLINE , max_connections: 100 , max_replication_lag: 0 , use_ssl: 0 , max_latency_ms: 0 , comment:
HID: 10 , address: 192.168.55.172 , port: 3306 , weight: 1 , status: OFFLINE_HARD , max_connections: 100 , max_replication_lag: 0 , use_ssl: 0 , max_latency_ms: 0 , comment:
HID: 20 , address: 192.168.55.171 , port: 3306 , weight: 1 , status: ONLINE , max_connections: 100 , max_replication_lag: 0 , use_ssl: 0 , max_latency_ms: 0 , comment:
HID: 20 , address: 192.168.55.172 , port: 3306 , weight: 1 , status: ONLINE , max_connections: 100 , max_replication_lag: 0 , use_ssl: 0 , max_latency_ms: 0 , comment:

HID 10 (skrivarvärdgrupp) måste bara ha en ONLINE-nod (indikerar en enda master) och den andra värden måste vara i åtminstone OFFLINE_HARD-status. För HID 20 förväntas den vara ONLINE för alla noder (vilket indikerar flera läsrepliker).

För att få en sammanfattning av distributionen, använd beskrivflaggan:

$ kubectl describe deployments blog

Vår blogg körs nu, men vi kan inte komma åt den utanför Kubernetes-nätverket utan att konfigurera tjänsten, som förklaras i nästa avsnitt.

Skapa bloggtjänsten

Det sista steget är att skapa bifoga en tjänst till vår pod. Detta för att säkerställa att vår Wordpress-bloggpod är tillgänglig från omvärlden. Skapa en fil som heter blog-svc.yml och klistra in följande rad:

apiVersion: v1
kind: Service
metadata:
  name: blog
  labels:
    app: blog
    tier: frontend
spec:
  type: NodePort
  ports:
  - name: blog
    nodePort: 30080
    port: 80
  selector:
    app: blog
    tier: frontend

Skapa tjänsten:

$ kubectl create -f blog-svc.yml

Kontrollera om tjänsten är korrekt skapad:

[email protected]:~/proxysql-blog# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
blog         NodePort    10.96.140.37   <none>        80:30080/TCP   26s
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        43h

Port 80 publicerad av bloggpodden är nu mappad till omvärlden via port 30080. Vi kan komma åt vårt blogginlägg på http://{any_kubernetes_host}:30080/ och bör omdirigeras till Wordpress installationssida. Om vi ​​fortsätter med installationen skulle den hoppa över databasanslutningsdelen och direkt visa denna sida:

Det indikerar att vår MySQL- och ProxySQL-konfiguration är korrekt konfigurerad i filen wp-config.php. Annars skulle du omdirigeras till databaskonfigurationssidan.

Vår implementering är nu klar.

Hantera ProxySQL-behållare inuti en Pod

Failover och återställning förväntas hanteras automatiskt av Kubernetes. Till exempel, om Kubernetes-arbetaren går ner, kommer podden att återskapas i nästa tillgängliga nod efter --pod-eviction-timeout (standard är 5 minuter). Om behållaren kraschar eller dödas kommer Kubernetes att ersätta den nästan omedelbart.

Vissa vanliga hanteringsuppgifter förväntas vara annorlunda när de körs inom Kubernetes, som visas i nästa avsnitt.

Skala upp och ned

I ovanstående konfiguration distribuerade vi en replik i vår distribution. För att skala upp, ändra helt enkelt spec.replikorna värde i enlighet med detta genom att använda kommandot kubectl edit:

$ kubectl edit deployment blog

Det kommer att öppna distributionsdefinitionen i en standardtextfil och helt enkelt ändra spec.replicas värde till något högre, till exempel "repliker:3". Spara sedan filen och kontrollera omedelbart utrullningsstatusen genom att använda följande kommando:

$ kubectl rollout status deployment blog
Waiting for deployment "blog" rollout to finish: 1 of 3 updated replicas are available...
Waiting for deployment "blog" rollout to finish: 2 of 3 updated replicas are available...
deployment "blog" successfully rolled out

Vid det här laget har vi tre bloggpoddar (Wordpress + ProxySQL) som körs samtidigt i Kubernetes:

$ kubectl get pods
NAME                             READY   STATUS              RESTARTS   AGE
blog-54755cbcb5-6fnqn            2/2     Running             0          11m
blog-54755cbcb5-cwpdj            2/2     Running             0          11m
blog-54755cbcb5-jxtvc            2/2     Running             0          22m

Vid det här laget ser vår arkitektur ut ungefär så här:

Observera att det kan kräva mer anpassning än vår nuvarande konfiguration för att köra Wordpress smidigt i en horisontell produktionsmiljö (tänk på statiskt innehåll, sessionshantering och annat). De ligger faktiskt utanför ramen för det här blogginlägget.

Procedurerna för nedskalning är liknande.

Konfigurationshantering

Konfigurationshantering är viktig i ProxySQL. Det är här magin händer där du kan definiera din egen uppsättning frågeregler för att göra frågecache, brandvägg och omskrivning. I motsats till vanlig praxis, där ProxySQL skulle konfigureras via administratörskonsolen och pressa in i persistens genom att använda "SAVE .. TO DISK", kommer vi att hålla oss till konfigurationsfiler endast för att göra saker mer portabla i Kubernetes. Det är anledningen till att vi använder ConfigMaps.

Eftersom vi förlitar oss på vår centraliserade konfiguration som lagras av Kubernetes ConfigMaps, finns det ett antal sätt att utföra konfigurationsändringar. För det första genom att använda kommandot kubectl edit:

$ kubectl edit configmap proxysql-configmap

Det öppnar konfigurationen i en standardtextredigerare och du kan direkt göra ändringar i den och spara textfilen när den är klar. Annars, återskapa configmaps bör också göra:

$ vi proxysql.cnf # edit the configuration first
$ kubectl delete configmap proxysql-configmap
$ kubectl create configmap proxysql-configmap --from-file=proxysql.cnf

Efter att konfigurationen har tryckts in i ConfigMap, starta om kapseln eller behållaren som visas i avsnittet Servicekontroll. Att konfigurera behållaren via ProxySQL-administratörsgränssnittet (port 6032) kommer inte att göra den beständig efter omläggning av podden av Kubernetes.

Servicekontroll

Eftersom de två behållarna inuti en pod är tätt kopplade, är det bästa sättet att tillämpa ProxySQL-konfigurationsändringarna att tvinga Kubernetes att byta ut pod. Tänk på att vi har tre bloggpoddar nu efter att vi skalat upp:

$ kubectl get pods
NAME                             READY   STATUS              RESTARTS   AGE
blog-54755cbcb5-6fnqn            2/2     Running             0          31m
blog-54755cbcb5-cwpdj            2/2     Running             0          31m
blog-54755cbcb5-jxtvc            2/2     Running             1          22m

Använd följande kommando för att ersätta en pod i taget:

$ kubectl get pod blog-54755cbcb5-6fnqn -n default -o yaml | kubectl replace --force -f -
pod "blog-54755cbcb5-6fnqn" deleted
pod/blog-54755cbcb5-6fnqn

Verifiera sedan med följande:

$ kubectl get pods
NAME                             READY   STATUS              RESTARTS   AGE
blog-54755cbcb5-6fnqn            2/2     Running             0          31m
blog-54755cbcb5-cwpdj            2/2     Running             0          31m
blog-54755cbcb5-qs6jm            2/2     Running             1          2m26s

Du kommer att märka att den senaste podden har startats om genom att titta på kolumnen AGE och RESTART, den kom med ett annat podnamn. Upprepa samma steg för de återstående baljorna. Annars kan du också använda kommandot "docker kill" för att döda ProxySQL-behållaren manuellt inuti Kubernetes-arbetarnoden. Till exempel:

(kube-worker)$ docker kill $(docker ps | grep -i proxysql_blog | awk {'print $1'})

Kubernetes kommer då att ersätta den dödade ProxySQL-behållaren med en ny.

Övervakning

Använd kommandot kubectl exec för att köra SQL-satsen via mysql-klienten. Till exempel, för att övervaka frågesammanslutning:

$ kubectl exec -it blog-54755cbcb5-29hqt -c proxysql -- mysql -uadmin -p -h127.0.0.1 -P6032
mysql> SELECT * FROM stats_mysql_query_digest;

Eller med en one-liner:

$ kubectl exec -it blog-54755cbcb5-29hqt -c proxysql -- mysql -uadmin -p -h127.0.0.1 -P6032 -e 'SELECT * FROM stats_mysql_query_digest'

Genom att ändra SQL-satsen kan du övervaka andra ProxySQL-komponenter eller utföra administrativa uppgifter via denna administratörskonsol. Återigen, det kommer bara att kvarstå under ProxySQL-behållarens livstid och kommer inte att kvarstå om podden schemaläggs om.

Sluta tankar

ProxySQL har en nyckelroll om du vill skala dina applikationsbehållare och ha ett intelligent sätt att komma åt en distribuerad databasbackend. Det finns ett antal sätt att distribuera ProxySQL på Kubernetes för att stödja vår applikationstillväxt när den körs i stor skala. Det här blogginlägget täcker bara en av dem.

I ett kommande blogginlägg kommer vi att titta på hur man kör ProxySQL i ett centraliserat tillvägagångssätt genom att använda det som en Kubernetes-tjänst.


  1. Toppverktyg för säkerhetskopiering för PostgreSQL

  2. De 10 bästa anledningarna till att använda Access och Excel tillsammans

  3. Hur REGEXP_REPLACE() fungerar i MariaDB

  4. SQL-kommando för att lista och visa alla databaser i MySQL och MariaDB