1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/blackeybaord-kingshard

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
kingshard_date_sharding.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 18:42 b4fbb46

Kingshard: обзор функции разделения таблиц по времени

В документе в основном представлены способы разделения таблиц Kingshard на Hash и Range. Недавно был разработан способ разделения таблиц по временному измерению. Разделение таблиц по временному измерению является распространённым сценарием использования, поэтому ниже приводится обзор функции временного разделения таблиц в Kingshard.

1. Поддерживаемые типы времени

Поля разделения таблиц в kingshard поддерживают три типа времени MySQL:

  • Тип date: формат YYYY-MM-DD, например: 2016-03-04. Обратите внимание, что kingshard не поддерживает форматы, такие как 2016-3-04, 2016-03-4 или 2016-3-4.
  • Тип datetime: формат YYYY-MM-DD HH:MM:SS, например: 2016-03-04 13:23:43. Обратите внимание, что kingshard также не поддерживает такие форматы, как 2016-3-04 13:23:43, 2016-03-4 13:23:43 или 2016-3-4 13:23:43. Необходимо строго следовать указанному формату, чтобы kingshard мог его поддерживать.
  • Тип timestamp: целочисленный тип, например: 1457165568, который соответствует 2016-3-5 16:12:48.

2. Поддерживаемые типы разделения по времени

Kingshard поддерживает три формата времени MySQL:

  • Тип date: формат YYYY-MM-DD, например: 2016-03-04. Обратите внимание, что kingshard не поддерживает форматы, такие как 2016-3-04, 2016-03-4 или 2016-3-4.
  • Тип datetime, формат: YYYY-MM-DD HH:MM:SS.
  • Тип timestamp, целочисленный.

3. Демонстрация функций

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

# server listen addr
addr : 0.0.0.0:9696

# server user and password
user :  kingshard
password : kingshard
# the web api server
web_addr : 0.0.0.0:9797
#HTTP Basic Auth
web_user : admin
web_password : admin

# if set log_path, the sql log will write into log_path/sql.log,the system log
# will write into log_path/sys.log
#log_path : /Users/flike/log

# log level[debug|info|warn|error],default error
log_level : debug

# if set log_sql(on|off) off,the sql log will not output
log_sql: on

# only log the query that take more than slow_log_time ms
#slow_log_time : 100

# the path of blacklist sql file
# all these sqls in the file will been forbidden by kingshard
#blacklist_sql_file: /Users/flike/blacklist

# only allow this ip list ip to connect kingshard
#allow_ips: 127.0.0.1

# the charset of kingshard, if you don't set this item
# the default charset of kingshard is utf8.
#proxy_charset: gbk

# node is an agenda for real remote mysql server.
nodes :
-
    name : node1

    # default max conns for mysql server
    max_conns_limit : 32

    # all mysql in a node must have the same user and password
    user :  kingshard
    password : kingshard

    # master represents a real mysql master server
    master : 127.0.0.1:3306

    # slave represents a real mysql salve server,and the number after '@' is
    # read load weight of this slave.
    #slave : 192.168.59.101:3307@2,192.168.59.101:3307@3
    down_after_noalive : 32
-
    name : node2

    # default max conns for mysql server
    max_conns_limit : 32

    # all mysql in a node must have the same user and password
    user :  kingshard
    password : kingshard

    # master represents a real mysql master server
    master : 192.168.59.103:3307

    # slave represents a real mysql salve server
    slave :

    # down mysql after N seconds noalive
    # 0 will no down
    down_after_noalive: 32

# schema defines sharding rules, the db is the sharding table database.
schema :
    nodes: [node1,node2]
    default: node1
    shard:
    -
       db : kingshard
       table: test_shard_year
       key: ctime
       type: date_year
       nodes: [node1,node2]
       date_range: [2015-2016,2017-2018]

3.1 Разделение по годам

3.1.1 Конфигурация

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

       table: test_shard_year
       key: ctime
       type: date_year
       nodes: [node1,node2]
       date_range: [2015-2016,2017-2018]

Это означает:

  • Ключ разделения — ctime.
  • Разделение по годам — date_year.
  • Таблицы test_shard_year_2015 и test_shard_year_2016 находятся на узле node1. Таблицы test_shard_year_2017 и test_shard_year_2018 находятся на узле node2.
  • Если на одном узле есть только одна таблица, можно настроить date_range [2015, 2017–2018].

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

3.1.2 Демонстрация

На узле node1 создаются две дочерние таблицы test_shard_year_2015 и test_shard_year_2016. На узле node2 создаются две дочерние таблицы test_shard_year_2017 и test_shard_year_2018. Создание таблиц SQL выглядит следующим образом:

CREATE TABLE `test_shard_year_2016` (
  `id` int(10) NOT NULL,
  `name` varchar(40) DEFAULT NULL,
  `ctime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Вставка данных:

Query OK, 1 row affected (0.01 sec)

mysql> insert into
``` **Конечно, вот перевод текста на русский язык:**

test_shard_year(id,name,ctime) values(13,"world","2016-03-22");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_shard_year where ctime < "2016-03-23";
+----+-------+---------------------+
| id | name  | ctime               |
+----+-------+---------------------+
| 12 | hello | 2015-02-22 13:23:45 |
| 13 | world | 2016-03-22 00:00:00 |
+----+-------+---------------------+
2 rows in set (0.00 sec)

**Соответствующий SQL log:**

2016/03/05 12:06:32 - OK - 1.2ms - 127.0.0.1:56597->127.0.0.1:3306: insert into test_shard_year_2015(id, name, ctime) values (12, 'hello', '2015-02-22 13:23:45')
2016/03/05 12:06:59 - OK - 2.0ms - 127.0.0.1:56597->127.0.0.1:3306:insert into test_shard_year_2016(id, name, ctime) values (13, 'world', '2016-03-22')
2016/03/05 12:08:30 - OK - 1.6ms - 127.0.0.1:56597->127.0.0.1:3306:select * from test_shard_year_2015 where ctime < '2016-03-23'
2016/03/05 12:08:30 - OK - 0.3ms - 127.0.0.1:56597->127.0.0.1:3306:select * from test_shard_year_2016 where ctime < '2016-03-23'

Конечно, если вы используете id в качестве метки времени Unix для разделения таблиц, Kingshard также поддерживает это. Конфигурация выглядит следующим образом:

table: test_shard_year
key: id
type: date_year
nodes: [node1,node2]
date_range: [2015–2016,2017–2018]

Вставка данных:

mysql> insert into test_shard_year(id,name,ctime) values(1457410310,"world","2018-03-22");
Query OK, 1 row affected (0.01 sec)

mysql> select * from test_shard_year where id = 1457410310;
+------------+-------+---------------------+
| id         | name  | ctime               |
+------------+-------+---------------------+
| 1457410310 | world | 2018-03-22 00:00:00 |
+------------+-------+---------------------+
1 row in set (0.00 sec)

1457410310 эта метка времени Unix соответствует дате: 2016–03–08 12:11:50. Kingshard точно направил эту запись в дочернюю таблицу test_shard_year_2016.
**Соответствующий SQL log:**

2016/03/08 12:12:49 - OK - 1.0ms - 127.0.0.1:56669->127.0.0.1:3306:insert into test_shard_year_2016(id, name, ctime) values (1457410310, 'world', '2018-03-22')
2016/03/08 12:13:23 - OK - 0.4ms - 127.0.0.1:56669->127.0.0.1:3306:select * from test_shard_year_2016 where id = 1457410310

### 3.2 Разделение по месяцам

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

table: test_shard_month
key: ctime
type: date_month
nodes: [node1,node2]
date_range: [201512–201602,201609–2016010]

Эта конфигурация означает:

— ключ sharding — это ctime.
— тип разделения по месяцам — date_month.
— две дочерние таблицы test_shard_month_201512 и test_shard_month_201601, test_shard_month_201602 находятся на node1, а две другие дочерние таблицы test_shard_month_201609 и test_shard_month_201610 — на node2.
— Если у вас есть только одна дочерняя таблица на одном узле, вы можете настроить date_range[201501,201609–201610].

Обратите внимание: формат именования дочерних таблиц должен быть: shard_table_YYYYMM, где shard_table — имя разделяемой таблицы, а YYYYMM — год и месяц.

Функциональная демонстрация аналогична разделению по годам.

### 3.3 Разделение по дням

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

table: test_shard_day
key: ctime
type: date_day
nodes: [node1,node2]
date_range: [20151222–20151224,20160901–20160902]

Эта конфигурация означает:

— ключ sharding — это ctime.
— тип разделения по дням — date_day.
— Две дочерние таблицы test_shard_day_20151222, test_shard_day_20151223 и test_shard_day_20151224 находятся на node1, а две другие дочерние таблицы test_shard_day_20160901 и test_shard_day_20160902 — на node2.
— Если у вас есть только одна дочерняя таблица на одном узле, вы можете настроить date_range[20150101,20160901–20161010].

Обратите внимание: формат именования дочерних таблиц должен быть: shard_table_YYYYMMDD, где shard_table — имя разделяемой таблицы, а YYYYMMDD — год, месяц и день.

Функциональная демонстрация аналогична разделению по годам.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/blackeybaord-kingshard.git
git@api.gitlife.ru:oschina-mirror/blackeybaord-kingshard.git
oschina-mirror
blackeybaord-kingshard
blackeybaord-kingshard
master