После оптимизации разделения чтения-записи Сяо Ван можно считать расслабленным в течение определенного периода времени.Чтобы узнать о конкретном решении разделения чтения-записи, обратитесь к этой статье:Sharding-JDBC: как оптимизировать объем запросов?
Но хорошие времена длятся недолго, и бизнес развивается слишком быстро. Объем данных в базе данных резко увеличился, а поскольку все таблицы находились в одной базе данных, локальное хранилище сервера было почти заполнено.
Из приведенного выше рисунка видно, что из-за большого количества таблиц объем данных в каждой таблице также велик, но он еще не достиг уровня горизонтального разбиения. В настоящее время проблема заключается в том, что хранилища на сервере недостаточно, и в краткосрочной перспективе нет необходимости в горизонтальном разделении, поэтому готово решение: вертикальное разделение.
Объясните, что такое вертикальное разделение?
Все мы знаем, что база данных состоит из N таблиц, каждая из которых хранит разные данные и соответствует своему бизнесу.
Так называемая вертикальная сегментация — это фактически классифицированные хранилища, большинство из которых классифицируются по типу бизнеса. Один и тот же тип хранится в одной библиотеке, а разные типы хранятся в разных библиотеках, что приводит к совместному использованию данных или нагрузке на разные библиотеки.
Например, мы можем объединить элементы, связанные с пользователем, элементы, связанные с порядком, и элементы, связанные с журналами поведения, и по очереди сдвинуть их вниз.
- преимущество:
После разделения бизнес-план становится ясным, а обслуживание данных простым, разделяя давление централизованного хранения данных.
- недостаток:
Недостатки тоже очевидны: многотабличные запросы на соединение не могут быть реализованы, а решаются только через интерфейсы, что увеличивает сложность системы и другие проблемы.
Вертикальное разделение на самом деле то же самое, что и разделение чтения-записи. По сути, это проблема с несколькими источниками данных. В этой статье мы сначала рассмотрим простейший метод вертикального разделения. Вертикальное разделение + разделение чтения-записи будет объяснено в следующей статье. .
вертикальный шпагат
Что касается того, как интегрировать Sharding-JDBC, я не буду объяснять, я объяснил это в предыдущей статье, и начну непосредственно с шагов.
Предположим, мы разбили ее на две библиотеки, а именно ds_0 и ds_1.Таблицы в каждой библиотеке разные.Таблица пользователя помещается в ds_0.SQL-скрипт такой:
CREATE DATABASE `ds_0` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE TABLE `user`(
id bigint(64) not null,
city varchar(20) not null,
name varchar(20) not null,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Таблица громкого звука находится в ds_1, а SQL-скрипт выглядит следующим образом:
CREATE DATABASE `ds_1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE TABLE `loudong` (
`id` varchar(20) NOT NULL,
`city` varchar(20) NOT NULL,
`region` varchar(20) NOT NULL,
`name` varchar(20) NOT NULL,
`ld_num` varchar(10) NOT NULL,
`unit_num` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Ядром является конфигурация и привязка источника данных:
spring.shardingsphere.datasource.names=ds0,ds1
# ds0数据源
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=123456
# ds1数据源
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds_1?characterEncoding=utf-8
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=123456
# 绑定loudong表所在节点
spring.shardingsphere.sharding.tables.loudong.actual-data-nodes=ds1.loudong
# 绑定user表所在节点
spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds0.user
# 设置自增ID
spring.shardingsphere.sharding.tables.user.key-generator.column=id
# 设置自增ID算法
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
Как его использовать или как использовать после настройки, вообще не меняя ни строчки кода. Нижний слой sharding-jdbc возьмет на себя источник данных.
Если мы не используем sharding-jdbc, то так же необходимо настроить 2 источника данных.Это фактически аналогично.Самое сложное в том, что нужно знать, какой источник данных является текущей операцией при работе с БД, потому что таблицы в каждый источник данных отличается, эти сложные операции защищены фреймворком sharding-jdbc.
Шаги разделения чтения-записи при вертикальном разделении
От исходной единой базы данных с несколькими таблицами до разделения чтения и записи и вертикального разделения нескольких баз данных.
Шаг за шагом я объясню вам решения для баз данных с высокой степенью параллелизма и большим объемом данных. И внедрить Sharding-JDBC с открытым исходным кодом для реализации конкретной схемы.
Способ дальнейшего повышения производительности после вертикального разделения состоит в вертикальном разделении чтения и записи нескольких библиотек, как показано на следующем рисунке:
Чтобы попрактиковаться в этой функции, нам нужно только добавить конфигурацию подчиненного узла для каждой библиотеки на основе вышеизложенного, а затем использовать правила master-slave для привязки источника данных master-slave следующим образом:
spring.shardingsphere.datasource.names=ds0,ds0slave,ds1,ds1slave
# ds0主数据源
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=123456
# ds0从数据源
spring.shardingsphere.datasource.ds0slave.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0slave.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0slave.url=jdbc:mysql://localhost:3306/ds0slave?characterEncoding=utf-8
spring.shardingsphere.datasource.ds0slave.username=root
spring.shardingsphere.datasource.ds0slave.password=123456
# ds1主数据源
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds_1?characterEncoding=utf-8
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=123456
# ds1从数据源
spring.shardingsphere.datasource.ds1slave.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1slave.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1slave.url=jdbc:mysql://localhost:3306/ds1slave?characterEncoding=utf-8
spring.shardingsphere.datasource.ds1slave.username=root
spring.shardingsphere.datasource.ds1slave.password=123456
# 绑定loudong表所在节点
spring.shardingsphere.sharding.tables.loudong.actual-data-nodes=ds1.loudong
# 绑定user表所在节点
spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds0.user
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
# 读写分离
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=ds0
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=ds0slave
spring.shardingsphere.sharding.master-slave-rules.ds1.master-data-source-name=ds1
spring.shardingsphere.sharding.master-slave-rules.ds1.slave-data-source-names=ds1slave
Ссылка на исходный код:GitHub.com/Йинджи Хуан/Да…
Если вы считаете, что это хорошо, не забудьте обратить внимание и поставить звезду!