Если вам нужно быстро реализовать функцию разделения чтения и записи MySQL в вашей будущей работе, вы обязательно вспомните эту статью. Если вы вернетесь сюда снова, это докажет, что вам уже отчаянно нужно простое и быстрое решение — это MySQL.官方驱动
Разделение чтения-записи, реализуемое уровнем, относительно небольшое, но очень эффективное.
JDBC-драйвер
Пакет jar драйвера MySQL, который мы часто используем, на самом деле имеет очень хорошую функцию по умолчанию, то есть разделение master-slave и HA. Если вам просто нужно разделение master-slave и функция аварийного переключения, не делайте сегментацию. Достаточно одного драйвера, промежуточный слой вводить не нужно.
Это протокол репликации. Соединитель Mysql JDBC добавил эти функции после версии 5.1.X для поддержки парадигмы доступа топологии кластера с несколькими хостами. Эта функция реализована на уровне драйвера, а поскольку это уровень драйвера, неизбежно возникают некоторые проблемы на уровне драйвера (подробности см. в разделе ).«Подбиблиотека и подтаблица»? Отбор и процесс должны быть осторожными, иначе все выйдет из-под контроля»..
Наше обычное соединение jdbc выглядит так
jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8
Соединение jdbc после преобразования протокола стало длиннее и больше!
jdbc:mysql:replication://127.0.0.1:3306,127.0.0.1:3307,127.0.0.1:3308/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=false&loadBalanceStrategy=random
Конечно, это также может быть написано в ipv6, что более интуитивно понятно.
jdbc:mysql://address=(type=master)(host=master1host),address=(type=master)(host=master2host),address=(type=slave)(host=slave1host)/db
Документация 8.0 находится здесь:Dev.MySQL.com/doc/connect… инструкция:
первое соглашение连接
, представляющий основную библиотекуMaster
Назад一堆连接
, указывающая на подчиненную библиотекуSlave
, конечно, может быть несколько
когда ты ставишьMaster
из连接
Он также помещается в заднюю стопку, тогда он также имеет атрибут «библиотека для чтения».
Есть куча параметров для управления этим所有连接
, как бороться с
Таким образом, так называемая функция разделения ведущий-ведомый, пока эта строка подключения настроена, будет мертвым деревом.
кодовый слой
В первую очередь надо изменить класс драйвера, это уже не Driver, а этот
com.mysql.jdbc.ReplicationDriver
В этой ситуации Источник данных.getConnection() Полученное соединение на самом деле является ReplicationConnection.Это соединение является виртуальным и имеет отношение «один ко многим» с реальным соединением с базой данных, поэтому не забудьте авторизовать соответствующую машину для каждого MySQL.
Итак, как отличить, является ли этот запрос чтением или записью? это на самом делеConnection
серединаreadonly
атрибут, этот атрибут запрашиваетсяheader
"только для чтения" в пройдено. Поэтому, если в запросе есть операция записи, вся транзакция должна быть readonly=false.
Для весны вы можете использовать@Transactional
Аннотация для управления этим свойством. Транзакция не может охватывать два соединения, поэтому решение о чтении или записи остается за высшим уровнем.
В следующем фрагменте кода показаны некоторые элементы, которые вы должны настроить, да, аннотации.
public interface UserManager {
public UserDO get(int id);
public void insert(UserDO user);
public void update(int id);
}
@Component
public class UserManagerImpl implements UserManager{
@Autowired
private UserDao userDao;
...
@Override
@Transactional(readOnly = false,propagation = Propagation.REQUIRED)
public void insert(UserDO user) {
this.userDao.insert(user);
}
}
Разве это не просто? Подожди, не будь слишком счастлив.
параметр
Не думайте, что это официальный драйвер, вы можете использовать его произвольно. Этот набор параметров, управляемых jdbc, по-прежнему очень богат, и стоимость обучения также выше. Он хорошо работает при небольшом трафике, но часто возникают проблемы в средах с высокой степенью параллелизма. Просто выберите самые важные здесь.
Виртуальное соединение соответствует реальному соединению с главной библиотекой и множеству соединений с подчиненной библиотекой. Для выживания и повторного запуска хоста мы должны рассмотреть три случая:
-
Мастер мертв
-
Рабы мертвы
-
Мастер и раб все мертвы
В любом случае драйвер MySQL ведет себя странно, а параметры по умолчанию не работают должным образом.
Вы можете подумать, что драйвер просто управляет несколькими соединениями, но дело обстоит сложнее. Во-первых, давайте взглянем на эту сложную взаимосвязь.
1,readFromMasterWhenNoSlavesКогда все салвы умирают, этот параметр используется для управления тем, участвует ли основная библиотека в чтении. Если трафик подчиненной библиотеки велик, настройка этого параметра очень рискованна для главной библиотеки, но если вы отключите его, запрос быстро завершится ошибкой. 2,loadBalanceStrategyПолитика используется для указания правил опроса подчиненной библиотеки. Есть опрос и взвешивание, а также могут быть указаны конкретные реализации политики. Когда вы поддерживаете или переносите экземпляр, может быть очень полезно сначала разместить пустой трафик. Возможно, вы дадите БД возможность прогреться. 3.allowMasterDownConnectionsЕсли хост не работает, произойдет сбой, когда пул соединений получит новое соединение. Но если этот параметр включен, виртуальное соединение будет создавать только группу подчиненных соединений, и все соединение будет переведено в режим только для чтения, независимо от того, какие аннотации вы установите. 4.allowSlavesDownConnectionsРазрешить ли создавать новые подключения, если больше нет библиотек только для чтения. В этом случае при включенном этом параметре высока вероятность того, что операция чтения завершится ошибкой. 5.retriesAllDownМаксимальное количество повторных попыток, когда все хосты не могут подключиться (повторные попытки), по умолчанию — 120. Если число повторных попыток достигает порогового значения, но по-прежнему не удается получить действительную ссылку, будет выдано исключение SQLException. 6.autoReconnectПоскольку экземпляр был в автономном режиме, он будет подключен к сети. Чтобы иметь возможность продолжить обслуживание после подключения к сети, этот параметр используется для управления автоматическим повторным подключением без создания исключений в случае отключения. Это нарушает целостность транзакций, но по-прежнему включено по умолчанию.Однако драйвер MySQL предоставляет больше параметров для управления этим процессом.Если ваши бизнес-требования более требовательны, вам может потребоваться протестировать эти параметры, чтобы не чувствовать себя неловко. Но по большей части это работает просто отлично.
управлять
Только с параметрами конфигурации этот протокол считается полуфабрикатом. К счастью, этот драйвер предоставляет способ управления JMX, на основе которого вы можете вносить некоторые изменения в конфигурацию и другие функции. На рынке нет такого инструмента управления конфигурацией, вероятно, потому, что он слишком нишевый.
public abstract void addSlaveHost(String groupFilter, String host) throws SQLException;
public abstract void removeSlaveHost(String groupFilter, String host) throws SQLException;
public abstract void promoteSlaveToMaster(String groupFilter, String host) throws SQLException;
public abstract void removeMasterHost(String groupFilter, String host) throws SQLException;
public abstract String getMasterHostsList(String group);
public abstract String getSlaveHostsList(String group);
public abstract String getRegisteredConnectionGroups();
public abstract int getActiveMasterHostCount(String group);
public abstract int getActiveSlaveHostCount(String group);
public abstract int getSlavePromotionCount(String group);
public abstract long getTotalLogicalConnectionCount(String group);
public abstract long getActiveLogicalConnectionCount(String group);
Кстати, упомянем пул соединений с базой данных Ali Druid. Как показано на рисунке, некоторые функции поддерживают только одно подключение по умолчанию, а поддержка нескольких хостов по-прежнему ограничена.
конец
После того, как официальный драйвер MySQL 5.1.x выпустил такую вещь, он фактически объявил о смерти некоторого небольшого промежуточного программного обеспечения, разработанного многими небольшими компаниями. Переверните службу и перепишите JDBC, но это просто для управления набором соединений.
Эта статья предназначена для студентов, которые занимаются исследованиями и разработками в области инфраструктуры. То, что некоторые люди видят, — это просто набор параметров, и те, кто действительно использует их в полной мере, почувствуют, как холодок пробегает по их спине.
Когда это ниша, вы отклоняете это. Но как только вы приняли схему, вы хотите, чтобы о ней написал весь мир. Жизнь еще никогда не была такой удачливой, ям много, и на нее еще нужно самому наступить. 0.