sql >> Databasteknik >  >> RDS >> MariaDB

Bygga en Hot Standby på Amazon AWS med MariaDB Cluster

Galera Cluster 4.0 släpptes först som en del av MariaDB 10.4 och det finns många betydande förbättringar i den här versionsversionen. Den mest imponerande funktionen i den här utgåvan är Streaming Replication som är utformad för att hantera följande problem.

  • Problem med långa transaktioner
  • Problem med stora transaktioner
  • Problem med hotspots i tabeller

I en tidigare blogg fördjupade vi oss i den nya strömningsreplikeringsfunktionen i en tvådelad serieblogg (del 1 och del 2). En del av denna nya funktion i Galera 4.0 är nya systemtabeller som är mycket användbara för att fråga och kontrollera Galera Cluster-noderna och även loggarna som har bearbetats i Streaming Replication.

Också i tidigare bloggar har vi också visat dig det enkla sättet att distribuera ett MySQL Galera Cluster på AWS och även hur du distribuerar ett MySQL Galera Cluster 4.0 på Amazon AWS EC2.

Percona har inte släppt en GA för deras Percona XtraDB Cluster (PXC) 8.0 ännu eftersom vissa funktioner fortfarande är under utveckling, till exempel MySQL wsrep-funktionen WSREP_SYNC_WAIT_UPTO_GTID som ser ut att inte finnas ännu (åtminstone). på PXC 8.0.15-5-27dev.4.2 version). Men när PXC 8.0 kommer att släppas kommer den att vara fullspäckad med fantastiska funktioner som...

  • Förbättrat motståndskraftigt kluster
  • Molnvänligt kluster
  • förbättrad förpackning
  • Krypteringsstöd
  • Atomic DDL

Medan vi väntar på lanseringen av PXC 8.0 GA kommer vi i den här bloggen att ta upp hur du kan skapa en Hot Standby Node på Amazon AWS för Galera Cluster 4.0 med MariaDB.

Vad är en Hot Standby?

Hot standby är en vanlig term inom datoranvändning, särskilt på högdistribuerade system. Det är en metod för redundans där ett system körs samtidigt med ett identiskt primärt system. När ett fel inträffar på den primära noden, tar hot standby omedelbart över och ersätter det primära systemet. Data speglas till båda systemen i realtid.

För databassystem är en hot standby-server vanligtvis den andra noden efter den primära mastern som körs på kraftfulla resurser (samma som mastern). Denna sekundära nod måste vara lika stabil som den primära mastern för att fungera korrekt.

Den fungerar också som en dataåterställningsnod om huvudnoden eller hela klustret går ner. Hot standby-noden kommer att ersätta den misslyckade noden eller klustret samtidigt som den kontinuerligt betjänar efterfrågan från klienterna.

I Galera Cluster kan alla servrar som ingår i klustret fungera som en standby-nod. Men om regionen eller hela klustret går ner, hur kommer du att kunna hantera detta? Att skapa en standby-nod utanför den specifika regionen eller nätverket i ditt kluster är ett alternativ här.

I följande avsnitt visar vi dig hur du skapar en standby-nod på AWS EC2 med MariaDB.

Distribuera en Hot Standby på Amazon AWS

Tidigare har vi visat dig hur du kan skapa ett Galera-kluster på AWS. Du kanske vill läsa Distribuera MySQL Galera Cluster 4.0 på Amazon AWS EC2 om du är ny på Galera 4.0.

Du kan distribuera din heta standby-nod på en annan uppsättning Galera Cluster som använder synkron replikering (kolla den här bloggen Zero Downtime Network Migration With MySQL Galera Cluster Using Relay Node) eller genom att distribuera en asynkron MySQL/MariaDB-nod . I den här bloggen kommer vi att ställa in och distribuera hot standby-noden som replikerar asynkront från en av Galera-noderna.

Konfiguration av Galera Cluster

I den här exempelinställningen distribuerade vi kluster med tre noder med MariaDB 10.4.8-versionen. Detta kluster distribueras under USA:s östra region (Ohio) och topologin visas nedan:

Vi kommer att använda 172.31.26.175-servern som master för vår asynkrona slav som kommer att fungera som väntelägesnod.

Ställa in din EC2-instans för Hot Standby-nod

I AWS-konsolen, gå till EC2 som finns under avsnittet Beräkna och klicka på Starta instans för att skapa en EC2-instans precis som nedan.

Vi skapar den här instansen under regionen USA:s västra (Oregon). För din OS-typ kan du välja vilken server du gillar (jag föredrar Ubuntu 18.04) och välja typ av instans baserat på din föredragna måltyp. För det här exemplet kommer jag att använda t2.micro eftersom det inte kräver någon sofistikerad installation och det är bara för den här provinstallationen.

Som vi har nämnt tidigare är det bäst att din heta standby-nod är placerad i en annan region och inte samlokaliserad eller inom samma region. Så om det regionala datacentret går ner eller drabbas av ett nätverksavbrott, kan ditt hot standby-läge vara ditt failover-mål när det gick dåligt.

Innan vi fortsätter, i AWS, kommer olika regioner att ha sitt eget Virtual Private Cloud (VPC) och sitt eget nätverk. För att kunna kommunicera med Galera-klusternoderna måste vi först definiera en VPC-peering så att noderna kan kommunicera inom Amazonas infrastruktur och inte behöver gå utanför nätverket, vilket bara lägger till overhead- och säkerhetsproblem.

Gå först till din VPC där din heta standby-nod ska finnas och gå sedan till Peering Connections. Sedan måste du ange VPC för din standby-nod och Galera kluster VPC. I exemplet nedan har jag us-west-2 sammankopplad med us-east-2.

När du har skapat den ser du en post under dina Peering-anslutningar. Du måste dock acceptera begäran från Galera-klustret VPC, som finns på us-east-2 i det här exemplet. Se nedan,

När du har accepterat, glöm inte att lägga till CIDR i routingtabellen. Se den här externa bloggen VPC Peering om hur du gör det efter VPC Peering.

Nu, låt oss gå tillbaka och fortsätta skapa EC2-noden. Se till att din säkerhetsgrupp har rätt regler eller nödvändiga portar som måste öppnas. Se manualen för brandväggsinställningar för mer information om detta. För den här konfigurationen har jag bara ställt in All Traffic för att accepteras eftersom detta bara är ett test. Se nedan,

Se till att när du skapar din instans har du ställt in rätt VPC och att du har definierat ditt rätta subnät. Du kan kolla in den här bloggen om du behöver hjälp med det.

Konfigurera MariaDB Async-slaven

Steg ett

Först måste vi ställa in arkivet, lägga till arkivnycklarna och uppdatera paketlistan i arkivets cache,

$ vi /etc/apt/sources.list.d/mariadb.list

$ apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

$ apt update

Steg två

Installera MariaDB-paketen och dess obligatoriska binärer

$ apt-get install mariadb-backup  mariadb-client mariadb-client-10.4 libmariadb3 libdbd-mysql-perl mariadb-client-core-10.4 mariadb-common mariadb-server-10.4 mariadb-server-core-10.4 mysql-common

Steg tre

Låt oss nu ta en säkerhetskopia med hjälp av xbstream för att överföra filerna till nätverket från en av noderna i vårt Galera-kluster.

## Radera datakatalogen för den nyligen installerade MySQL i din heta standby-nod.

$ systemctl stop mariadb

$ rm -rf /var/lib/mysql/*

## Sedan på hot standby-noden, kör detta på terminalen,

$ socat -u tcp-listen:9999,reuseaddr stdout 2>/tmp/netcat.log | mbstream -x -C /var/lib/mysql

## Sedan på målmastern, det vill säga en av noderna i ditt Galera-kluster (som är noden 172.31.28.175 i det här exemplet), kör detta på terminalen,

$ mariabackup  --backup --target-dir=/tmp --stream=xbstream | socat - TCP4:172.32.31.2:9999

där 172.32.31.2 är IP-adressen för värdstandbynoden.

Steg fyra

Förbered din MySQL-konfigurationsfil. Eftersom detta är i Ubuntu, redigerar jag filen i /etc/mysql/my.cnf och med följande exempel på my.cnf från vår ClusterControl-mall,

[MYSQLD]

user=mysql

basedir=/usr/

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

pid_file=/var/lib/mysql/mysql.pid

port=3306

log_error=/var/log/mysql/mysqld.log

log_warnings=2

# log_output = FILE



#Slow logging    

slow_query_log_file=/var/log/mysql/mysql-slow.log

long_query_time=2

slow_query_log=OFF

log_queries_not_using_indexes=OFF



### INNODB OPTIONS

innodb_buffer_pool_size=245M

innodb_flush_log_at_trx_commit=2

innodb_file_per_table=1

innodb_data_file_path = ibdata1:100M:autoextend

## You may want to tune the below depending on number of cores and disk sub

innodb_read_io_threads=4

innodb_write_io_threads=4

innodb_doublewrite=1

innodb_log_file_size=64M

innodb_log_buffer_size=16M

innodb_buffer_pool_instances=1

innodb_log_files_in_group=2

innodb_thread_concurrency=0

# innodb_file_format = barracuda

innodb_flush_method = O_DIRECT

innodb_rollback_on_timeout=ON

# innodb_locks_unsafe_for_binlog = 1

innodb_autoinc_lock_mode=2

## avoid statistics update when doing e.g show tables

innodb_stats_on_metadata=0

default_storage_engine=innodb



# CHARACTER SET

# collation_server = utf8_unicode_ci

# init_connect = 'SET NAMES utf8'

# character_set_server = utf8



# REPLICATION SPECIFIC

server_id=1002

binlog_format=ROW

log_bin=binlog

log_slave_updates=1

relay_log=relay-bin

expire_logs_days=7

read_only=ON

report_host=172.31.29.72

gtid_ignore_duplicates=ON

gtid_strict_mode=ON



# OTHER THINGS, BUFFERS ETC

key_buffer_size = 24M

tmp_table_size = 64M

max_heap_table_size = 64M

max_allowed_packet = 512M

# sort_buffer_size = 256K

# read_buffer_size = 256K

# read_rnd_buffer_size = 512K

# myisam_sort_buffer_size = 8M

skip_name_resolve

memlock=0

sysdate_is_now=1

max_connections=500

thread_cache_size=512

query_cache_type = 0

query_cache_size = 0

table_open_cache=1024

lower_case_table_names=0

# 5.6 backwards compatibility (FIXME)

# explicit_defaults_for_timestamp = 1



performance_schema = OFF

performance-schema-max-mutex-classes = 0

performance-schema-max-mutex-instances = 0



[MYSQL]

socket=/var/lib/mysql/mysql.sock

# default_character_set = utf8

[client]

socket=/var/lib/mysql/mysql.sock

# default_character_set = utf8

[mysqldump]

socket=/var/lib/mysql/mysql.sock

max_allowed_packet = 512M

# default_character_set = utf8



[xtrabackup]



[MYSQLD_SAFE]

# log_error = /var/log/mysqld.log

basedir=/usr/

# datadir = /var/lib/mysql

Naturligtvis kan du ändra detta enligt dina inställningar och krav.

Steg fem

Förbered säkerhetskopian från steg #3, d.v.s. den avslutande säkerhetskopieringen som nu är i hot standby-noden genom att köra kommandot nedan,

$ mariabackup --prepare --target-dir=/var/lib/mysql

Steg sex

Ställ in äganderätten till datakatalogen i hot standby-noden,

$ chown -R mysql.mysql /var/lib/mysql

Steg sju

Starta nu MariaDB-instansen

$  systemctl start mariadb

Steg åtta

Sistligen måste vi ställa in den asynkrona replikeringen,

## Skapa replikeringsanvändaren på huvudnoden, dvs noden i Galera-klustret

MariaDB [(none)]> CREATE USER 'cmon_replication'@'172.32.31.2' IDENTIFIED BY 'PahqTuS1uRIWYKIN';

Query OK, 0 rows affected (0.866 sec)

MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'cmon_replication'@'172.32.31.2';

Query OK, 0 rows affected (0.127 sec)

## Hämta GTID-slavpositionen från xtrabackup_binlog_info enligt följande,

$  cat /var/lib/mysql/xtrabackup_binlog_info

binlog.000002   71131632 1000-1000-120454

##  Ställ sedan in slavreplikeringen enligt följande,

MariaDB [(none)]> SET GLOBAL gtid_slave_pos='1000-1000-120454';

Query OK, 0 rows affected (0.053 sec)

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.31.28.175', MASTER_USER='cmon_replication', master_password='PahqTuS1uRIWYKIN', MASTER_USE_GTID = slave_pos;

## Kontrollera nu slavstatusen,

MariaDB [(none)]> show slave status \G

*************************** 1. row ***************************

                Slave_IO_State: Waiting for master to send event

                   Master_Host: 172.31.28.175

                   Master_User: cmon_replication

                   Master_Port: 3306

                 Connect_Retry: 60

               Master_Log_File: 

           Read_Master_Log_Pos: 4

                Relay_Log_File: relay-bin.000001

                 Relay_Log_Pos: 4

         Relay_Master_Log_File: 

              Slave_IO_Running: Yes

             Slave_SQL_Running: Yes

               Replicate_Do_DB: 

           Replicate_Ignore_DB: 

            Replicate_Do_Table: 

        Replicate_Ignore_Table: 

       Replicate_Wild_Do_Table: 

   Replicate_Wild_Ignore_Table: 

                    Last_Errno: 0

                    Last_Error: 

                  Skip_Counter: 0

           Exec_Master_Log_Pos: 4

               Relay_Log_Space: 256

               Until_Condition: None

                Until_Log_File: 

                 Until_Log_Pos: 0

            Master_SSL_Allowed: No

            Master_SSL_CA_File: 

            Master_SSL_CA_Path: 

               Master_SSL_Cert: 

             Master_SSL_Cipher: 

                Master_SSL_Key: 

         Seconds_Behind_Master: 0

 Master_SSL_Verify_Server_Cert: No

                 Last_IO_Errno: 0

                 Last_IO_Error: 

                Last_SQL_Errno: 0

                Last_SQL_Error: 

   Replicate_Ignore_Server_Ids: 

              Master_Server_Id: 1000

                Master_SSL_Crl: 

            Master_SSL_Crlpath: 

                    Using_Gtid: Slave_Pos

                   Gtid_IO_Pos: 1000-1000-120454

       Replicate_Do_Domain_Ids: 

   Replicate_Ignore_Domain_Ids: 

                 Parallel_Mode: conservative

                     SQL_Delay: 0

           SQL_Remaining_Delay: NULL

       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

              Slave_DDL_Groups: 0

Slave_Non_Transactional_Groups: 0

    Slave_Transactional_Groups: 0

1 row in set (0.000 sec)

Lägga till din Hot Standby-nod till ClusterControl

Om du använder ClusterControl är det enkelt att övervaka din databasservers tillstånd. För att lägga till detta som en slav, välj det Galera-nodkluster du har och gå sedan till valknappen som visas nedan för att lägga till replikeringsslav:

Klicka på Lägg till replikeringsslav och välj att lägga till en befintlig slav precis som nedan,

Vår topologi ser lovande ut.

Som du kanske märker fungerar vår nod 172.32.31.2 som vår hot standby noden har en annan CIDR som prefix som 172.32.% us-west-2 (Oregon) medan de andra noderna är på 172.31.% placerade på us-east-2 (Ohio). De är helt i olika regioner, så om nätverksfel uppstår på dina Galera-noder, kan du failover till din hot standby-nod.

Slutsats

Att bygga en Hot Standby på Amazon AWS är enkelt och okomplicerat. Allt du behöver är att bestämma dina kapacitetskrav och din nätverkstopologi, säkerhet och protokoll som behöver ställas in.

Att använda VPC Peering hjälper till att påskynda interkommunikation mellan olika regioner utan att gå till det offentliga internet, så anslutningen förblir inom Amazons nätverksinfrastruktur.

Att använda asynkron replikering med en slav är naturligtvis inte tillräckligt, men den här bloggen fungerar som grunden för hur du kan initiera detta. Du kan nu enkelt skapa ett annat kluster där den asynkrona slaven replikerar och skapa ytterligare en serie Galera-kluster som fungerar som dina Disaster Recovery-noder, eller så kan du också använda variabeln gmcast.segment i Galera för att replikera synkront precis som det vi har på den här bloggen.


  1. Så här fixar du föråldrade oracle.sql.ArrayDescriptor, oracle.sql.STRUCT och oracle.sql.StructDescriptor

  2. python pip installation psycopg2 installationsfel

  3. Hur man laddar ner Postgres bytea kolumn som fil

  4. Hur ställer jag in ORDER BY-parametrar med en förberedd PDO-sats?