Вне номера: эта статья взята из «Общественной учетной записи: блог Ли Хаодуна», приглашаем подписаться и перепечатать, сохранить аннотацию, спасибо! Есть подробные туториалы по Spring Boot и Spring Cloud Добро пожаловать в хвост!
Введение
Ввиду увеличения объема доступа к системе пропускная способность базы данных сталкивается с огромным узким местом. Для прикладной системы с большим количеством одновременных операций чтения и меньшим количеством операций записи, одна база данных делится на главную базу данных и подчиненную базу данных.Главная база данных отвечает за транзакционные добавления, удаления и изменения, а также подчиненная база данных отвечает за обработку операций запросов, что может эффективно избежать блокировок строк, вызванных обновлениями данных, и значительно повысить производительность запросов всей системы. Благодаря конфигурации одного главного и нескольких подчиненных запросов запросы могут быть равномерно распределены по нескольким копиям данных, что может еще больше повысить производительность системы. Использование подхода с несколькими ведущими и несколькими подчиненными может не только повысить пропускную способность системы, но и повысить доступность системы, так что нормальная работа системы не пострадает, даже если какая-либо база данных не работает или даже физический диск поврежден.
Хотя разделение чтения и записи может улучшить пропускную способность и доступность системы, оно также приводит к проблеме несогласованности данных, включая непротиворечивость данных между несколькими главными базами данных и непротиворечивость данных между главной и подчиненной базами данных. Кроме того, разделение чтения и записи создает те же проблемы, что и фрагментация данных, что также усложняет эксплуатацию и обслуживание базы данных для разработчиков приложений и обслуживающего персонала. Влияние прозрачного разделения чтения-записи позволяет пользователям максимально использовать базу данных master-slave в качестве базы данных, что является основной функцией промежуточного программного обеспечения разделения чтения-записи.
В предыдущей статье я представил подбазу данных и подтаблицу базы данных Mysql, а в этой статье будет представлено разделение чтения и записи.
2. План исследования
- Установить Mysql
- Настройка репликации master-slave
- Тестовая репликация master-slave
- разделение чтения-записи
- Проверка разделения чтения и записи
3. Спроектируйте реальный бой
Введение в окружающую среду
192.168.0.3
192.168.0.4
3.1. Установите базу данных Mysql
Я не буду вдаваться в подробности, здесь установлен Mysql 8.0.
3.2 Настройка репликации master-slave
Существует множество способов репликации master-slave в MySQL, в этой статье в основном демонстрируется метод репликации master-slave на основе журнала (binlog).
Принцип репликации MySQL master-slave (также называемой репликацией A/B)
- Мастер записывает изменения данных в двоичный журнал, который представляет собой файл, указанный в конфигурационном файле log-bin. Эти записи называются событиями двоичного журнала;
- Ведомый читает события двоичного журнала в ведущем через поток ввода-вывода и записывает в свой журнал реле;
- Ведомый повторяет события в журнале реле и выполняет информацию о событиях в журнале реле одно за другим локально. Он хранит данные локально, что позволяет отражать изменения в собственных данных (воспроизведение данных).
На что следует обратить внимание в конфигурации ведущий-ведомый
主从服务器操作系统版本和位数一致;
Master 和 Slave 数据库的版本要一致;
Master 和 Slave 数据库中的数据要一致;
Master 开启二进制日志, Master 和 Slave 的 server_id 在局域网内必须唯一;
Краткие шаги для настройки master-slave
Конфигурация на Мастере
1.安装数据库;
2.修改数据库配置文件, 指明 server_id, 3.开启二进制日志(log-bin);
4.启动数据库, 查看当前是哪个日志, position 号是多少;
5.登录数据库, 授权数据复制用户(IP 地址为从机 IP 地址, 如果是双向主从, 6.这里的还需要授权本机的 IP 地址, 此时自己的 IP 地址就是从 IP 地址);
7.备份数据库(记得加锁和解锁);
8.传送备份数据到 Slave 上;
9.启动数据库;
Следующие шаги являются шагами, необходимыми для успешного создания одностороннего master-slave и создания двустороннего master-slave:
登录数据库, 指定 Master 的地址、 用户、 密码等信息(此步仅双向主从时需要)
开启同步
查看状态
- Главный и подчиненный серверы выполняют следующие операции:
1.1、版本一致
1.2、初始化表,并在后台启动mysql
1.3、修改root的密码
- Измените мастер основного сервера:
#vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段/自定义都可以的
- Подключитесь к базе данных, чтобы убедиться, что конфигурация выполнена успешно.
mysql> mysql -u root -p
mysql> show master status;
Вы можете увидеть эту информацию, указывающую на то, что мы успешно настроили предыдущий
- Измените подчиненный сервер:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=226 //[必须]服务器唯一ID,默认是1,一般取IP最后一段/自定义都可以的
- Повторите вышеуказанное действие
mysql> mysql -u root -p
mysql> show master status;
Вы можете увидеть эту информацию, указывающую на то, что мы успешно настроили предыдущий
- Перезапустите mysql на обоих серверах.
systemctl restart mysqld.service
- Создайте учетную запись на главном сервере и авторизуйте подчиненный: Установите параметры главного узла на подчиненных узлах
change master to master_host='192.168.0.4',master_user='test',master_password='12root',master_log_file='mysql-bin.000001',master_log_pos=155;
Как правило, учетная запись root не используется, "%" Указывает, что все клиенты могут быть подключены, если учетная запись и пароль верны, здесь можно заменить IP-адрес конкретного клиента, например 192.168.0.4 (IP-адрес основного сервера), для усиления безопасности. 8. Включите синхронизацию master-slave
mysql> start slave; #停止主从同步命令为:stop slave
- Посмотреть статус синхронизации
mysql> show slave status\G;
Примечание. Процессы Slave_IO и Slave_SQL должны работать нормально, то есть состояние YES, в противном случае это состояние ошибки (например: один из NO является ошибкой)
Указывает, что их конфигурация синхронизации master-slave выполнена успешно.
Примечание. Если подчиненная библиотека отключена и перезапущена, для подключения к службе mysql выполните команду start slave, чтобы включить синхронизацию master-slave.
3.3 Проверка репликации ведущий-ведомый
Запрашивать базы данных двух серверов отдельно
Создайте тестовую таблицу в основной базе данных
mysql> create database test;
запрос из базы данных
Тестовая библиотека, которую мы только что создали в основной базе данных, находится в подчиненной базе данных, что указывает на то, что наш главный и подчиненный устройства успешно работают.Примечание: Напишите сценарий оболочки и используйте nagios для мониторинга двух да (процессы Slave_IO и Slave_SQL) подчиненного устройства.Если найдено только одно или ноль утвердительных ответов, это означает, что существует проблема с ведущим устройством и подчиненным устройством.Отправьте SMS-оповещения.
3.4 Разделение чтения и записи
- Создайте ds0 в основной базе данных:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`age` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
SET FOREIGN_KEY_CHECKS = 1;
Автоматически синхронизировать с базой данных
- Строительство проекта Скопируйте проект предыдущей статьи и внесите изменения на основе
конфигурация application.properties
# 配置真实数据源
sharding.jdbc.datasource.names=master1,slave0
# 主数据库
sharding.jdbc.datasource.master1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.master1.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.master1.jdbc-url=jdbc:mysql://192.168.0.3:3306/ds0?characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
sharding.jdbc.datasource.master1.username=test
sharding.jdbc.datasource.master1.password=12root
# 从数据库
sharding.jdbc.datasource.slave0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.slave0.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.slave0.jdbc-url=jdbc:mysql://192.168.0.3:3306/ds0?characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
sharding.jdbc.datasource.slave0.username=test
sharding.jdbc.datasource.slave0.password=12root
# 配置读写分离
# 配置从库选择策略,提供轮询与随机,这里选择用轮询
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=ms
sharding.jdbc.config.masterslave.master-data-source-name=master1
sharding.jdbc.config.masterslave.slave-data-source-names=slave0
# 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志
sharding.jdbc.config.props.sql.show=true
spring.main.allow-bean-definition-overriding=true
В основном измените конфигурацию application.properties, не меняйте другие места
3.5 Тестовые оценки чтения и письма
Откройте браузер, чтобы посетить:http://localhost:8080/selectзапрос пользовательской коллекции
консольная печать: Вы можете запросить, чтобы увидеть, что происходит из базы данныхОткройте браузер, чтобы посетить:http://localhost:8080/insert?id=1&name=lhd&age=12вставить часть данных консольная печать:
Вы можете увидеть основную базу данных, куда попадают вставленные данныеОсновная библиотека отвечает за запись, а подчиненная библиотека отвечает за чтение.
Таким образом, выполняется разделение чтения и записи.
адрес проекта:GitHub.com/l ИХ Аодонг 88…