Percona Server за MySQL 8.0 предлага редица клъстерни решения за висока наличност в готово състояние:
- Единичен майстор:
- Асинхронна репликация
- Полусинхронна репликация
- Многоглавен:
- Групова репликация
- InnoDB Cluster (комбинация от MySQL рутер, MySQL Shell и Percona Server с групова репликация)
Най-популярното, изпитано в битки и силно мащабируемо решение е, разбира се, асинхронната репликация. В тази публикация в блога ще разположим настройка за репликация на Percona Server специално за висока наличност. Инструкциите, описани тук, са базирани на CentOS 7.
Инсталиране на Percona сървър
За висока наличност се нуждаем от поне два възела в проста настройка за репликация главен-подчинен:
- db1 - главен (192.168.0.61)
- db2 - подчинен (192.168.0.62)
Стъпките, описани в този раздел, трябва да се изпълняват на всички възли на базата данни (db1 и db2). Ще започнем с инсталиране на пакета за хранилище Percona:
$ yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
Последната стабилна версия в този момент е Percona Server за MySQL 8.0, но по подразбиране пакетът на хранилището е конфигуриран само до версия 5.7. Пакетът percona-release съдържа скрипт, който може да активира допълнителни хранилища за по-новите продукти. Нека стартираме този скрипт и активираме 8.0 хранилища:
$ percona-release setup ps80
След това инсталирайте най-новия Percona Server и Percona Xtrabackup:
$ yum -y install percona-server-server percona-xtrabackup-80
В този момент трябва да получите инсталиран Percona Server за MySQL 8.0.21. Всички пакети за зависимости ще бъдат инсталирани като споделени, споделени и клиентски пакети. След това можем да активираме услугата MySQL при стартиране и да стартираме услугата:
$ systemctl enable mysql
$ systemctl start mysql
Нова root парола ще бъде генерирана по време на първото стартиране. Трябва първо да извлечем информацията за root паролата от регистъра на грешките на MySQL (по подразбиране е /var/log/mysqld.log в базирани на 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
Както можете да видите, генерираната парола е "o%(_M>t1)R-P". След това трябва да изпълним слединсталационна задача, за да защитим инсталацията на MySQL сървъра. Изпълнете следната команда:
$ 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!
Генерираната root парола ще изтече веднага след първото влизане в root. Горният помощен скрипт ни помага да конфигурираме нова парола за MySQL root, като деактивираме дистанционното влизане за root, премахваме тестовата база данни и анонимните потребители и също така презареждаме таблиците с привилегии.
Вече сме готови да конфигурираме функцията за висока наличност за Percona Server 8.0.
Полусинхронна репликация
Полусинхронната репликация попада между асинхронна и напълно синхронна репликация. Източникът изчаква, докато поне една реплика получи и регистрира събитията, и след това извършва транзакцията. Източникът не чака всички реплики да потвърдят получаването и изисква само потвърждение от репликите, а не че събитията са били напълно изпълнени и ангажирани от страната на репликата. Следователно полусинхронната репликация гарантира, че ако източникът се срине, всички транзакции, които е извършил, са предадени на поне една реплика.
За най-добра цялост на репликация изберете полусинхронна репликация. За да го конфигурирате, на първия възел, db1 (192.168.0.61), добавете следните редове в /etc/my.cnf (трябва да е под секцията [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
На втория възел, db2 (192.168.0.62), добавете следните редове вътре в /etc/my.cnf (трябва да е под секцията [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
След това можем да продължим да настроим връзката за репликация, както е описано в "Настройка на връзката за репликация" по-долу.
Асинхронна репликация
За асинхронна репликация просто премахнете всички опции, свързани с полусинхронната репликация, и ще бъдем добре. На първия възел, db1 (192.168.0.61), добавете следните редове в /etc/my.cnf (трябва да е под секцията [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
На втория възел, db2 (192.168.0.62), добавете следните редове вътре в /etc/my.cnf (трябва да е под секцията [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
След това можем да продължим да настроим връзката за репликация, както е описано в „Настройка на връзката за репликация“ по-долу.
Настройване на връзката за репликация
На главния (db1) създайте подчинен потребител и позволете на потребителя да се свързва от всички хостове в тази мрежа (използвайки % заместващ знак):
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.%';
На подчинения (db2), нулирайте двоичните регистрационни файлове, конфигурирайте идентификационните данни за репликация и стартирайте процеса на репликация:
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;
Проверете състоянието на репликация:
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:
Обърнете внимание на следното важно състояние, за да определите дали репликацията е конфигурирана правилно и подчинението е настигнало главната:
- Slave_IO_Running:Да
- Slave_SQL_Running:Да
- Seconds_Behind_Master:0
Ако полусинхронната репликация е активирана, трябва да получите следния изход на главния:
mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_slave_status | OFF |
+-----------------------------+-------+
Докато на подчинения, състоянието е както следва:
mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF |
| Rpl_semi_sync_slave_status | ON |
+-----------------------------+-------+
За асинхронна репликация горната заявка не връща нищо (празен набор), тъй като плъгините за полусинхронно репликация не са активирани. В един набор от репликации е възможно да имате комбинация от подчинени хостове, които се реплицират с асинхронна и полусинхронна репликация.
Разгръщане на Percona Server за MySQL с помощта на ClusterControl
Практически е лесно да се разположи репликация на Percona Server от главен-подчинен с ClusterControl и по подразбиране ClusterControl ще конфигурира разполагането на репликация с асинхронна репликация. Просто подгответе възлите, които искате да разположите, и в този пример ще разположим Percona сървър с три възли за MySQL 8.0 с репликация главен-подчинен. Тъй като ClusterControl се появява в картината, от нас се изисква да имаме допълнителен възел за ClusterControl. Следователно, нашата настройка изглежда така:
- ClusterControl - cc (192.168.0.19)
- Master - db1 (192.168.0.61)
- Slave - db2 (192.168.0.62)
- Slave - db3 (192.168.0.63)
На сървъра ClusterControl инсталирайте ClusterControl с помощта на скрипта за инсталиране. Като root изпълнете следното:
$ wget http://severalnines.com/downloads/cmon/install-cc
$ chmod 755 install-cc
$ ./install-cc
Следвайте инструкциите за инсталиране, докато приключи. След това отворете уеб браузър и отидете на http://{ClusterControl_IP_address}/clustercontrol и създайте администраторски потребител и парола по подразбиране. След това трябва да настроим SSH без парола от сървъра на ClusterControl към всички възли на базата данни. Като root потребител трябва първо да генерираме SSH ключ:
$ whoami
root
$ ssh-keygen -t rsa # press Enter on all prompts
След това копирайте създадения публичен ключ на SSH във всички възли на базата данни:
$ 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
Вече сме готови да започнем внедряването на клъстера. Отидете на ClusterControl -> Разгръщане -> MySQL репликация и посочете необходимите подробности, както следва:
След това щракнете върху "Продължи", за да продължите към следващата стъпка, където конфигурираме спецификацията за инсталиране на MySQL:
Изберете "Percona" за доставчика и 8.0 като версия. Запазете останалото по подразбиране и въведете паролата за root на MySQL. Щракнете върху „Продължи“, за да продължите към конфигурацията на хоста и топологията:
Посочете IP адреса или името на хоста на хостовете на базата данни един по един и направете уверете се, че получавате иконите за зелена отметка след всяко вмъкване. Това показва, че ClusterControl може да достигне до съответните хостове чрез SSH без парола с предоставения SSH потребител и ключ, както е дефинирано в стъпка 1. Щракнете върху бутона „Разгръщане“, за да започнете внедряването.
След това ClusterControl задейства задача за внедряване, където можете да наблюдавате напредъка на внедряването, като отидете на ClusterControl -> Activity -> Jobs -> Create Cluster -> Full Job Details, както е показано на следната екранна снимка:
След като процесът приключи, трябва да видите, че клъстерът е посочен в таблото за управление :
Това е. Разгръщането вече е завършено.