Sharding-JDBC: как сделать вертикальное разделение?

Java

После оптимизации разделения чтения-записи Сяо Ван можно считать расслабленным в течение определенного периода времени.Чтобы узнать о конкретном решении разделения чтения-записи, обратитесь к этой статье: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/Йинджи Хуан/Да…

Если вы считаете, что это хорошо, не забудьте обратить внимание и поставить звезду!

猿天地