Мастер-подчиненная репликация баз данных должна быть знакома каждому, и я думаю, что есть статьи, знакомящие с ней. Не обманывайтесь, думая, что репликация «главный-подчиненный» означает синхронизацию «главный-подчиненный». Сегодня мы собираемся изучить принцип и процесс синхронизации главных и подчиненных баз данных. База данных в основном используется для хранения веб-данных и чрезвычайно важна на предприятиях. Давайте посмотрим на нее вместе.
Репликация master-slave MySQL широко используется на малых и средних предприятиях, а также на крупных предприятиях. Целью репликации master-slave MySQL является обеспечение резервного копирования базы данных и регулярная синхронизация данных главной базы данных с подчиненной базой данных после выхода базы данных маскера. вниз, можно настроить базу данных веб-приложений. Быстро переключитесь на подчиненную базу данных, чтобы обеспечить высокую доступность веб-приложений.
Для синхронизации master-slave MySQL требуется как минимум 2 сервера.,Одна из них — главная библиотека,Другой - рабская библиотека,Чтобы реализовать копирование, сначала необходимо включить функцию журнала bin-log на мастере.,Журнал bin-log используется для записи операторов SQL операций добавления, удаления, изменения и обновления, выполняемых в главной библиотеке.,Весь процесс нужно запустить3индивидуальныйнить,Соответственно, Мастер включает IONить.,Слейв включает IONить и SQLнит.
Для этого эксперимента требуется использование двух серверов: один является главным, а другой — подчиненным. Подготовка к эксперименту требует работы обоих серверов.
При необходимости все же рекомендуется выключить selinux. Брандмауэр можно определить по ситуации. Вы можете напрямую отключить фаервол, если проведете собственные эксперименты.
#Закрыть брандмауэр
systemctl stop firewalld
iptables -F
#Закрыть selinux
setenforce 0
Проверьте локальный IP-адрес и проверьте, можете ли вы пропинговать www.baidu.com.
ifconfig
192.168.116.166 #Первый IP-сервер служит главным
192.168.116.128 #Второй серверIP как подчиненный
Обе версии сервера — CentOS7.9.
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
Для этого эксперимента база данных использует версию сообщества MySQL8.0. адрес загрузки пакета rpm Пакет RPM, используемый в этом эксперименте — MySQL8.0 Community Edition — можно напрямую щелкнуть по предыдущему пакету, чтобы перейти, или вы можете напрямую скопировать эту ссылку: http://repo.mysql.com/mysql80-community-release -el7.об/мин Отображается в табличной форме:
Версия сервера | IP | Версия базы данных |
---|---|---|
CentOS7.9.2009 | 192.168.116.166 (мастер) | MySQL8.0.32 Выпуск сообщества |
CentOS7.9.2009 | 192.168.116.128(с подчиненного) | MySQL8.0.32 Выпуск сообщества |
Здесь вам также необходимо установить базу данных на оба сервера.
В CentOS7 файлы и пакеты mariadb устанавливаются по умолчанию. Их необходимо сначала удалить, иначе они повлияют на последующие установки.
#Очистить существующие файлы, связанные с mariadb и mysql
[root@localhost ~]# rpm -qa grep mysql |
[root@localhost ~]# rpm -qa grep mariadb |
mariadb-libs-5.5.68-1.el7.x86_64
[root@localhost ~]# rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps
Далее найдите файлы mysql и mariadb и удалите их.
[root@localhost ~]# find / -name mariadb
[root@localhost ~]# find / -name mysql
/etc/selinux/targeted/active/modules/100/mysql
/usr/lib64/mysql
[root@localhost ~]# rm -rf /etc/selinux/targeted/active/modules/100/mysql /usr/lib64/mysql
Источник оборотов официального сайта копировать спереди,использоватьwgetСкачать,Если команда wget не,Сначала вам необходимо загрузить команду wget. - Можно копировать напрямую
yum install wget -y
wget http://repo.mysql.com/mysql80-community-release-el7.rpm
rpm -ivh mysql80-community-release-el7.rpm
yum install mysql-community-server
После их установки вы можете запустить службу напрямую;
#Запустить службу
systemctl перезапустите mysqld
Пароли инициализации двух компьютеров разные. Вы можете сначала найти их, а затем изменить пароли базы данных двух компьютеров на одинаковые.
#Найти пароль инициализации
grep -i 'password' /var/log/mysqld.log
2023-03-23T06:39:43.463553Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: q_gkjqeR1iGA
база данных Пароль идет после двоеточия:q_gkjqeR1iGA
Рекомендуется сменить пароли обеих баз данных на одинаковые для облегчения последующего тестирования.
#Войти с паролембаза данных Сменить пароль на новый
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> alter user 'root'@'localhost' identified by '#Admin$5^!';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
Заявление о смене пароля
alter user 'root'@'localhost' identified by '#Admin$5^!';
В MySQL8.0 пароль необходимо изменить как можно более сложным, прежде чем он сможет пройти. Вы можете использовать операторы для проверки сложности.
mysql> show variables like 'validate%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
Включить ли проверку пароля пользователя Место, где хранится файл паролей Пароль должен быть длиной не менее 8 символов Количество прописных и строчных букв должно быть не менее 1. Содержит хотя бы одно число Установите уровень пароля, уровень по умолчанию — средний. Содержит хотя бы один символ
Вышеуказанный контент требует работы на обоих серверах.
Главный мастер определен выше как IP-адрес сервера: 192.168.116.166. Чтобы интуитивно видеть, на каком сервере он находится, измените здесь имя хоста, чтобы его можно было легко отличить.
[root@localhost ~]# hostname master
[root@localhost ~]# bash
[root@master ~]#
Создайте пользователя базы данных «slave21», сделайте его удаленным и установите пароль.
[root@master ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create user 'slave21'@'%' identified with mysql_native_password by '#slvae21!@3LL';
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to 'slave21'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'slave21'@'%';
+-------------------------------------------------+
| Grants for slave21@% |
+-------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `slave21`@`%` |
+-------------------------------------------------+
1 row in set (0.00 sec)
Кажется, что эта картинка содержит много контента, но на самом деле там всего несколько предложений;
create user 'slave21'@'%' identified with mysql_native_password by '#slvae21!@3LL';
Смысл этого утверждения заключается в создании пользователя подчиненного21,Имя пользователя можно определить самостоятельно; @'%' означает, что вы можете использовать данные базы данных для удаленного входа в систему.,
identified with mysql_native_password by
этотиндивидуальныйправила предложениядаMySQL8.0фиксированный метод записи,Это значит установить для него пароль.
grant replication slave on *.* to 'slave21'@'%';
Это утверждение означает авторизацию этой пользовательской базы. Разрешения данных,
*.*
В общем, дайте все разрешения,Первыйиндивидуальный*значит всебаза данные, второй означает базу данныхповерхность。
flush privileges;
Этот оператор означает обновление базы данных, чтобы ранее установленное содержимое можно было синхронизировать с базой данных.
show grants for 'slave21'@'%';
Проверьте, были ли записаны ранее установленные разрешения в базу данных. Если содержимое отображается, это означает, что запись прошла успешно.
[root@master ~]# vim /etc/my.cnf
[root@master ~]# sed 4,+4p -n /etc/my.cnf
[mysqld]
server-id=21
log-bin=mysql-bin
binlog_do_db=test
binlog_ignore_db=mysql
#Перезапустить службу
[root@master ~]# systemctl restart mysqld
server-id=21 Уникальный идентификатор службы базы данных. log-bin=mysql-bin устанавливает место хранения журналов binlog binlog_do_db=test устанавливает базу данных для синхронизации. Если это не написано, значит синхронизируется все базы. binlog_ignore_db=mysql запрещает синхронизацию базы данных
Помните, что после настройки есть еще одна команда, которая должна перезапустить службу.
После настройки файла конфигурации снова войдите в систему базы данных mysql, чтобы просмотреть основную информацию.
[root@master ~]# !m
mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 157 | test | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
Зачем вам проверять эту информацию? Потому что она нужна при настройке подчиненной базы данных.
Файл — это файл хранения только что настроенной папки журнала, который используется для записи файла журнала операций MySQL. Позиция представляет собой смещение База данных Binlog_Do_DB, которую необходимо синхронизировать Binlog_Ignore_DB не синхронизирует базу данных
На этом этапе не продолжайте работать с первой главной базой данных, чтобы избежать изменения смещения.
Здесь вам нужно работать на втором сервере. Здесь также модифицируется имя хоста для повышения узнаваемости.
[root@localhost ~]# hostname slave22
[root@localhost ~]# bash
[root@slave22 ~]#
Просто напишите уникальный идентификатор с сервера,server-id=22
,Содержимое этого идентификатора не обязательно должно совпадать с приведенным выше.,Если это не тот же идентификационный номер, что и предыдущий.,Неважно, как вы это настроите.
#файл конфигурации mysql
[root@slave22 ~]# vim /etc/my.cnf
[root@slave22 ~]# sed 4,+1p -n /etc/my.cnf
[mysqld]
идентификатор сервера=22
[root@slave22 ~]# systemctl перезапустите mysqld
Не забудьте перезапустить службу
[root@slave22 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> change master to master_host='192.168.116.166',master_user='slave21',master_password='#slvae21!@3LL',master_log_file='mysql-bin.000001',master_log_pos=157;
Query OK, 0 rows affected, 8 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.116.166
Master_User: slave21
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 157
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 326
Relay_Master_Log_File: mysql-bin.000001
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: 157
Relay_Log_Space: 540
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: 21
Master_UUID: 7d57e7f4-c945-11ed-b2a1-000c29b5625a
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica 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:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.00 sec)
Оператор, который действительно необходимо выполнить;
change master to master_host='192.168.116.166',master_user='slave21',master_password='#slvae21!@3LL',master_log_file='mysql-bin.000001',master_log_pos=157;
start slave;
Включить синхронную репликацию данных
show slave status \G
После выполнения этого оператора проверьте, соответствуют ли два значения Slave_IO_Running: Yes и Slave_SQL_Running: Yes «да». Если да, это означает, что синхронизация выполняется, что также означает, что наш эксперимент прошел успешно.
Конечно, бывают случаи, когда после завершения два значения не являются «да». Одно значение может быть «нет», или оба значения могут быть «нет».
Вы можете сначала остановить подчиненное устройство и переопределить его снова, пока оба варианта не будут положительными.
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> reset slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.116.166
Master_User: slave21
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 157
Relay_Log_File: localhost-relay-bin.000003
Relay_Log_Pos: 373
Relay_Master_Log_File: mysql-bin.000001
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: 157
Relay_Log_Space: 767
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: 21
Master_UUID: 7d57e7f4-c945-11ed-b2a1-000c29b5625a
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica 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:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.00 sec)
Вы также можете сначала скопировать содержимое базы данных, подлежащей синхронизации, на подчиненный сервер, чтобы содержимое базы данных, подлежащей синхронизации, на двух серверах было абсолютно одинаковым. Затем используйте этот метод для привязки и запуска заново.
Мы закончили вышеописанные эксперименты, пора приступить к созданию базы. данные пришли на проверку, мы предварительно выбрали базу для синхронизации данныхдаtest
Затем мы создаемtest
база данных, и записывать в него таблицы, данные и т.д.
# Создано на основном мастере
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> create database abc;
Query OK, 1 row affected (0.00 sec)
mysql> use test
Database changed
mysql> create table test1(id int,name varchar(20) not null default 'username');
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test1 values(1,'zhangsan'), (2,'lisi'), (3,'wangwu');
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> desc test1;
+-------+-------------+------+-----+----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+----------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | NO | | username | |
+-------+-------------+------+-----+----------+-------+
2 rows in set (0.01 sec)
mysql> select id,name from test1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+------+----------+
3 rows in set (0.00 sec)
можно увидетьtest
база данных Уже синхронизировано,войти вtest
Посмотреть данные под ним в библиотеке,Он все еще синхронизирован.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test1 |
+----------------+
1 row in set (0.00 sec)
mysql> desc test1;
+-------+-------------+------+-----+----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+----------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | NO | | username | |
+-------+-------------+------+-----+----------+-------+
2 rows in set (0.00 sec)
mysql> select id,name from test1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+------+----------+
3 rows in set (0.00 sec)
Посмотреть базу данныхвповерхностьинформация существует,Инструкция по выбору синхронизированныхtest
база данные без проблем.
Проведя описанный выше эксперимент, вы обнаружите, что главная база данных может быть синхронизирована только с подчиненной базой данных. Итак, можно ли синхронизировать их друг с другом на этой основе. Ответ — да, это синхронизация между главной и подчиненной базой данных. Мастер. Это главный сервер. Когда он синхронизирует данные, он действует как подчиненный. Когда он записывает данные, он действует как главный. Если вы считаете, что приведенный выше контент хорош, вы можете поставить ему лайк и поддержать его!