sql >> Databáze >  >> RDS >> Mysql

Jak nasadit Percona Server pro MySQL pro vysokou dostupnost

Percona Server pro MySQL 8.0 nabízí řadu klastrovacích řešení pro vysokou dostupnost ihned po vybalení:

  • Jedna hlavní:
    • Asynchronní replikace
    • Semisynchronní replikace
  • Multimaster:
    • Skupinová replikace
    • InnoDB Cluster (kombinace MySQL Router, MySQL Shell a Percona Server se skupinovou replikací)

Nejoblíbenějším, bitvami prověřeným a vysoce škálovatelným řešením je samozřejmě asynchronní replikace. V tomto blogovém příspěvku se chystáme nasadit nastavení replikace Percona Server speciálně pro vysokou dostupnost. Zde popsané pokyny jsou založeny na CentOS 7.

Instalace serveru Percona

Pro vysokou dostupnost potřebujeme alespoň dva uzly v jednoduchém nastavení replikace master-slave:

  • db1 – hlavní (192.168.0.61)
  • db2 – slave (192.168.0.62)

Kroky popsané v této části by měly být provedeny na všech uzlech databáze (db1 a db2). Začneme instalací balíčku úložiště Percona:

$ yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

Nejnovější stabilní verzí je v tomto okamžiku Percona Server pro MySQL 8.0, ale ve výchozím nastavení je balíček úložiště nakonfigurován pouze do verze 5.7. Balíček percona-release obsahuje skript, který může povolit další úložiště pro novější produkty. Spusťte tento skript a povolená úložiště 8.0:

$ percona-release setup ps80

Potom nainstalujte nejnovější Percona Server a Percona Xtrabackup:

$ yum -y install percona-server-server percona-xtrabackup-80

V tuto chvíli byste měli mít nainstalovaný Percona Server pro MySQL 8.0.21. Všechny balíčky závislostí budou nainstalovány jako sdílené-kompat, sdílené a klientské balíčky. Poté můžeme povolit službu MySQL při spuštění a spustit službu:

$ systemctl enable mysql
$ systemctl start mysql

Při prvním spuštění bude vygenerováno nové heslo uživatele root. Nejprve potřebujeme získat informace o hesle uživatele root z protokolu chyb MySQL (výchozí je /var/log/mysqld.log v systémech založených na RHEL):

$ cat /var/log/mysqld.log | grep temporary
2020-11-06T04:53:07.402040Z 6 [Note] [MY-010454] [Server] A temporary password is generated for [email protected]: o%(_M>t1)R-P

Jak vidíte, vygenerované heslo je "o%(_M>t1)R-P". Dále musíme provést poinstalační úlohu, abychom zabezpečili instalaci serveru MySQL. Spusťte následující příkaz:

$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:

The existing password for the user account root has expired. Please set a new password.


New password:
Re-enter new password:

The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.

Using existing password for root.


Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password:

Re-enter new password:

Estimated strength of the password: 100

Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.

You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

Platnost vygenerovaného hesla uživatele root vyprší okamžitě po prvním přihlášení uživatele root. Výše uvedený pomocný skript nám pomáhá nakonfigurovat nové root heslo MySQL, zakázat vzdálené přihlášení pro root, odstranit testovací databázi a anonymní uživatele a také znovu načíst tabulky oprávnění.

Nyní jsme připraveni nakonfigurovat funkci vysoké dostupnosti pro Percona Server 8.0.

Semisynchronní replikace

Semisynchronní replikace spadá mezi asynchronní a plně synchronní replikaci. Zdroj čeká, dokud alespoň jedna replika nepřijme a nezaprotokoluje události, a poté transakci potvrdí. Zdroj nečeká na potvrzení přijetí všech replik a vyžaduje pouze potvrzení od replik, nikoli to, že události byly plně provedeny a potvrzeny na straně repliky. Semisynchronní replikace proto zaručuje, že pokud zdroj selže, všechny transakce, které provedl, byly přeneseny alespoň do jedné repliky.

Pro nejlepší integritu replikace zvolte semisynchronní replikaci. Chcete-li jej nakonfigurovat, na prvním uzlu, db1 (192.168.0.61), přidejte následující řádky do souboru /etc/my.cnf (musí být v sekci [mysqld]):

# Compatibility
default-authentication-plugin = mysql_native_password

# Replication
server_id = 61 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.61 # IP address of this host
read_only = OFF # Set ON on slave
super_read_only = OFF # Set ON on slave

# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON

# Semi-sync
plugin_load_add = rpl_semi_sync_master=semisync_master.so
plugin_load_add = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = ON

Na druhém uzlu, db2 (192.168.0.62), přidejte následující řádky do /etc/my.cnf (musí být v sekci [mysqld]):

# Compatibility
default-authentication-plugin = mysql_native_password

# Replication
server_id = 62 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.62 # IP address of this host
read_only = ON # Set ON on slave
super_read_only = ON # Set ON on slave

# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON

# Semi-sync
plugin_load_add = rpl_semi_sync_master=semisync_master.so
plugin_load_add = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = ON

Potom můžeme přistoupit k nastavení replikačního odkazu, jak je popsáno v části "Nastavení replikačního odkazu" níže.

Asynchronní replikace

Pro asynchronní replikaci jednoduše odeberte všechny možnosti související s semisynchronní replikací a měli bychom být dobří. Na prvním uzlu, db1 (192.168.0.61), přidejte následující řádky do /etc/my.cnf (musí být v sekci [mysqld]):

# Compatibility
default-authentication-plugin = mysql_native_password

# Replication
server_id = 61 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.61 # IP address of this host
read_only = OFF # Set ON on slave
super_read_only = OFF # Set ON on slave

# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON

Na druhém uzlu, db2 (192.168.0.62), přidejte následující řádky do /etc/my.cnf (musí být v sekci [mysqld]):

# Compatibility
default-authentication-plugin = mysql_native_password

# Replication
server_id = 62 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.62 # IP address of this host
read_only = ON # Set ON on slave
super_read_only = ON # Set ON on slave

# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON

Potom můžeme přistoupit k nastavení replikačního odkazu, jak je popsáno v části "Nastavení replikačního odkazu" níže.

Nastavení replikačního odkazu

Na hlavním (db1) vytvořte podřízeného uživatele a povolte uživateli připojení ze všech hostitelů v této síti (pomocí zástupných znaků %):

mysql> CREATE USER 'slave'@'192.168.0.%' IDENTIFIED WITH mysql_native_password BY '[email protected]&9';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.%';

Na podřízeném (db2) resetujte binární protokoly, nakonfigurujte pověření replikace a spusťte proces replikace:

mysql> RESET MASTER;
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.61', MASTER_USER = 'slave', MASTER_PASSWORD = '[email protected]&9', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;

Zkontrolujte stav replikace:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.61
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000008
          Read_Master_Log_Pos: 912
               Relay_Log_File: db2-relay-bin.000007
                Relay_Log_Pos: 1081
        Relay_Master_Log_File: binlog.000008
             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: 912
              Relay_Log_Space: 1500
              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: 66
                  Master_UUID: f60cf793-1feb-11eb-af72-5254008afee6
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: f60cf793-1feb-11eb-af72-5254008afee6:5-7
            Executed_Gtid_Set: f60cf793-1feb-11eb-af72-5254008afee6:1-7
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_Namespace:

Věnujte pozornost následujícímu důležitému stavu, abyste zjistili, zda je replikace správně nakonfigurována a podřízená jednotka dohonila hlavního:

  • Slave_IO_Running:Ano
  • Slave_SQL_Running:Ano
  • Seconds_Behind_Master:0

Pokud je povolena semisynchronní replikace, měli byste na master získat následující výstup:

mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
| Rpl_semi_sync_slave_status  | OFF   |
+-----------------------------+-------+

Na podřízeném zařízení je stav následující:

mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF   |
| Rpl_semi_sync_slave_status  | ON    |
+-----------------------------+-------+

U asynchronní replikace výše uvedený dotaz nevrátí nic (prázdná sada), protože moduly plug-in pro semisynchronní replikaci nejsou povoleny. V jedné sadě replikace je možné mít mix podřízených hostitelů replikujících se s asynchronní a semisynchronní replikací.

Nasazení serveru Percona pro MySQL pomocí ClusterControl

Nasadit replikaci master-slave Percona Server pomocí ClusterControl je prakticky snadné a ve výchozím nastavení ClusterControl nakonfiguruje nasazení replikace s asynchronní replikací. Jednoduše připravte uzly, které chcete nasadit, a v tomto příkladu nasadíme tříuzlový server Percona pro MySQL 8.0 s replikací master-slave. Když se objeví ClusterControl, musíme mít další uzel pro ClusterControl. Naše nastavení tedy vypadá takto:

  • ClusterControl – cc (192.168.0.19)
  • Master – db1 (192.168.0.61)
  • Slave – db2 (192.168.0.62)
  • Slave – db3 (192.168.0.63)

Na serveru ClusterControl nainstalujte ClusterControl pomocí instalačního skriptu. Jako root spusťte následující:

$ wget http://severalnines.com/downloads/cmon/install-cc
$ chmod 755 install-cc
$ ./install-cc

Postupujte podle pokynů k instalaci, dokud nebude dokončena. Poté otevřete webový prohlížeč a přejděte na adresu http://{ClusterControl_IP_address}/clustercontrol a vytvořte výchozího administrátora a heslo. Dále musíme nastavit SSH bez hesla ze serveru ClusterControl do všech databázových uzlů. Jako uživatel root musíme nejprve vygenerovat klíč SSH:

$ whoami
root
$ ssh-keygen -t rsa # press Enter on all prompts

Potom zkopírujte vytvořený veřejný klíč SSH do všech uzlů databáze:

$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db1
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db2
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db3

Nyní jsme připraveni zahájit nasazení clusteru. Přejděte na ClusterControl -> Deploy -> MySQL Replication a zadejte požadované podrobnosti, jak je uvedeno níže:

Poté kliknutím na „Pokračovat“ přejděte k dalšímu kroku, kde nakonfigurujeme specifikace instalace MySQL:

Zvolte "Percona" pro dodavatele a 8.0 jako verzi. Zbytek ponechte jako výchozí a zadejte kořenové heslo MySQL. Kliknutím na „Pokračovat“ přejděte ke konfiguraci hostitele a topologie:

Po jednom zadejte IP adresu nebo název hostitele databáze a vytvořte Ujistěte se, že se po každém vložení zobrazí zelené ikony. To znamená, že ClusterControl je schopen se dostat k odpovídajícím hostitelům prostřednictvím SSH bez hesla s poskytnutým uživatelem SSH a klíčem, jak je definováno v kroku 1. Kliknutím na tlačítko „Deploy“ zahájíte nasazení.

ClusterControl poté spustí úlohu nasazení, kde můžete sledovat průběh nasazení tak, že přejdete do ClusterControl -> Aktivita -> Úlohy -> Vytvořit cluster -> Úplné podrobnosti úlohy, jak je znázorněno na následujícím snímku obrazovky:

Po dokončení procesu byste měli vidět, že cluster je uveden na hlavním panelu :

To je vše. Rozmístění je nyní dokončeno.


  1. Pořadí provádění podmínek v klauzuli SQL 'where'

  2. Náhodný záznam z databázové tabulky (T-SQL)

  3. Příklad použití bind_result vs get_result

  4. Optimalizujte skupinový maximální dotaz