Возможности Mycat ---- Фрагментация данных

задняя часть база данных MySQL алгоритм
Возможности Mycat ---- Фрагментация данных

ха-ха, во-первых, это не блог для начала работы с Mycat, но редактор чувствует себя очень вводным блогом! Этот блог в основном объясняет соответствующие знания о сегментировании данных в Mycat. В то же время редактор будет тестировать и проверять на локальная база данных, с картинками и текстами.

Раздел базы данных разделен на таблицы, он очень высокий и высокий, и всегда есть ощущение превосходства и недосягаемости, но я хочу сказать, что на самом деле, как разработчик, то, что должно прийти, всегда придет. , а чему надо учиться, так это вам все равно придется учиться, разница только в хронологическом порядке.

1. Таблица разделов

Секционирование — это хранение файлов и индексов таблицы данных в разных физических файлах Отличие от сегментирования в том, что секционирование действует на одном физическом хосте и в одной базе данных.

Типы разделов, поддерживаемые mysql, включают Range, List, Hash и Key, среди которых чаще используется Range:

Раздел диапазона: Назначает несколько строк для разделов на основе значений столбцов, принадлежащих к данному смежным интервалам.

СПИСОК разделов: Подобно разбиению по RANGE, отличие состоит в том, что разбиение LIST основано на значении столбца, совпадающем со значением в дискретном наборе значений для выбора.

HASH-раздел: Разделы для выбора на основе возвращаемого значения определяемого пользователем выражения, вычисляемого с использованием значений столбцов строк, которые должны быть вставлены в таблицу. Эта функция может содержать любое допустимое в MySQL выражение, которое возвращает неотрицательное целочисленное значение.

КЛЮЧЕВОЙ раздел: Подобно разбиению по HASH, разница в том, что разбиение по KEY поддерживает только вычисление одного или нескольких столбцов, а сервер MySQL предоставляет собственную хеш-функцию. Один или несколько столбцов должны содержать целочисленные значения.

Подтаблица относится к логическому разделению таблицы на несколько логических таблиц, которые представляют собой таблицу в целом. Существует два типа подтаблиц: горизонтальное разделение и вертикальное разделение. таблицы по диапазонам номеров мерчантов, а записи разных диапазонов распределяются по разным таблицам.

2. Типы шардинга данных Mycat

Шардинг Mycat на самом деле похож на шардинг, то есть, когда база данных слишком велика, особенно когда запись слишком частая и ее сложно поддерживать одним хостом, тогда база данных столкнется с узким местом. Мы распределяем данные, хранящиеся в одном экземпляре базы данных, по нескольким экземплярам базы данных (хостам) и выполняем доступ к нескольким устройствам для повышения производительности.Разделение данных может улучшить целостность системы.

Разделение данных относится к глобальному разделению данных на связанные логические сегменты.Существует три типа горизонтальной сегментации, вертикальной сегментации и смешанной сегментации.Далее в основном обсуждается горизонтальная и вертикальная сегментация Mycat. Важно отметить, что Mycat является распределенным, поэтому разделенные фрагменты данных обычно распределяются по разным физическим машинам и взаимодействуют через сетевое взаимодействие.

Горизонтальная сегментация

Он состоит в том, чтобы рассредоточиться на несколько библиотек узлов в соответствии с определенным правилом поля, и каждый узел содержит часть данных. Горизонтальная сегментация данных может быть просто понята как сегментация по строкам данных, то есть некоторые строки в таблице разделены на один узел, а некоторые другие строки разделены на другие узлы.С распределенной точки зрения они представляют собой целую таблицу.

вертикальный срез

База данных состоит из множества таблиц, каждая из которых соответствует определенному бизнесу.Вертикальная сегментация означает, что таблицы классифицируются в соответствии с бизнесом и не могут быть разделены на разные узлы. Вертикальное разбиение простое и понятное, правила разбиения понятные, модули приложения понятные, понятные и легко интегрируемые, но сложно расширяться, когда объем данных определенной таблицы достигает определенного уровня.

смешанная огранка

Это комбинация горизонтальной и вертикальной сегментации.

Три, вертикальная сегментация Mycat, реальный бой с горизонтальной сегментацией

1. Вертикальная сегментация

Как упоминалось выше, вертикальная сегментация в основном основана на конкретных бизнесах.Тогда мы можем представить такой сценарий.Предположим, что у нас есть очень большая система электронной коммерции, тогда нам нужно разделить таблицу заказов, таблицу потоков и таблицу пользователей. таблицы комментариев пользователей и т. д. не могут быть разделены по разным базам данных для повышения пропускной способности.Схема архитектуры примерно выглядит следующим образом:

Так как редактор тестируется на одной машине, есть только узел host1, но разные таблицы все равно соответствуют разным базам данных, но все базы принадлежат одному экземпляру базы данных (хосту), а разные хосты нужно только добавить позже.<dataHost>узел.

Конфигурационный файл mycat выглядит следующим образом:

server.xml

<user name="root">
    <property name="password">root</property>
    // 对应四个逻辑库
    <property name="schemas">order,trade,user,comment</property>
</user>

schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    
    <!-- 4个逻辑库,对应4个不同的分片节点 -->
    <schema name="order" checkSQLschema="false" sqlMaxLimit="100" dataNode="database1" />
    <schema name="trade" checkSQLschema="false" sqlMaxLimit="100" dataNode="database2" />
    <schema name="user" checkSQLschema="false" sqlMaxLimit="100" dataNode="database3" />
    <schema name="comment" checkSQLschema="false" sqlMaxLimit="100" dataNode="database4" />

    <!-- 四个分片,对应四个不同的数据库 -->
    <dataNode name="database1" dataHost="localhost1" database="database1" />
    <dataNode name="database2" dataHost="localhost1" database="database2" />
    <dataNode name="database3" dataHost="localhost1" database="database3" />
    <dataNode name="database4" dataHost="localhost1" database="database4" />
    
    <!-- 实际物理主机,只有这一台 -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="localhost:3306" user="root"
                password="root">
        </writeHost>
    </dataHost>
</mycat:schema>

Войдите в локальный mysql, создайтеorder,trade,user,comment4 базы данных:

create database database1 character set utf8;
create database database2 character set utf8;
create database database3 character set utf8;
create database database4 character set utf8;

воплощать в жизньbinв каталогеstartup_nowrap.batфайл, если выводится следующее содержимое, это означает, что mycat был успешно запущен, если нет, проверьтеorder,trade,user,commentБыли ли 4 база данных созданы.

Используйте следующую инструкцию для входа на сервер Mycat:

mysql -uroot -proot -P8066 -h127.0.0.1

существуетcommentСоздал в базеCommentтаблицу и вставить часть данных

Создайте новый в 1 вышеCommentТаблица, вставьте запись в 2, проверьте, в какой узел данных запись вставлена ​​в 3, то естьdatabase4.

2. Горизонтальная сегментация

server.xml

<user name="root">
    <property name="password">root</property>
    <property name="schemas">TESTDB</property>
</user>

schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    </schema>

    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <!-- can have multi write hosts -->
    <writeHost host="hostM1" url="localhost:3306" user="root"
       password="root">
    </writeHost>
    </dataHost>
</mycat:schema>

rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>

    <function name="rang-long"
            class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>
</mycat:rule>

confв каталогеautopartition-long.txt

# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2

Приведенная выше конфигурация создаетTESTDB, и указывает таблицу для разделения<table>метка, имя таблицыtravelrecord, стратегия разделения принимаетrang-longалгоритм, то есть поidДиапазон значений столбца данных разделен, а конкретные правила находятся вautopartition-long.txtопределено в файле, т.е.idсуществует0-500*10000Записи области хранятся вdb1изtravelrecordВ таблице,idсуществует500*10000 - 1000*10000Записи области хранятся вdb2база данныхtravelrecordВ таблице мы вставляем две части данных ниже, чтобы проверить, соответствует ли она правилам сегментирования.

Создайтеdb1,db2,db3база данных

create database db1 character set utf8;
create database db2 character set utf8;
create database db3 character set utf8;

Войдите на сервер Mycat

mysql -uroot -proot -P8066 -h127.0.0.1

Создайтеtravelrecordтаблица и вставкаidравно 1,idРавно 5000010 две записи

После создания таблицы данных структура базы данных выглядит следующим образом:

Вставьте две записи:

можно увидеть,idЗапись, равная 1, вставляется вdb1середина,idЗапись, равная 5000010, вставляется вdb2, так база действительно такая?

Это действительно так. На данный момент мы завершили горизонтальную сегментацию базы данных mycat. Этот пример демонстрирует только сегментацию в соответствии с диапазоном значений столбца id. Mycat также поддерживает множество алгоритмов сегментирования, таких как модуль, согласованный хэш алгоритм, алгоритм фрагментации по дате и т. д., вы можете прочитать книгу «Архитектура распределенной базы данных и практика предприятия — на основе промежуточного программного обеспечения Mycat» для углубленного изучения.