В документе в основном представлены способы разделения таблиц Kingshard на Hash и Range. Недавно был разработан способ разделения таблиц по временному измерению. Разделение таблиц по временному измерению является распространённым сценарием использования, поэтому ниже приводится обзор функции временного разделения таблиц в Kingshard.
Поля разделения таблиц в kingshard поддерживают три типа времени MySQL:
Kingshard поддерживает три формата времени MySQL:
Конфигурационный файл 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]
Конфигурация для разделения по годам выглядит следующим образом:
table: test_shard_year
key: ctime
type: date_year
nodes: [node1,node2]
date_range: [2015-2016,2017-2018]
Это означает:
Обратите внимание: имена дочерних таблиц должны соответствовать формату shard_table_YYYY, где shard_table — это имя таблицы разделения, а YYYY — конкретный год.
На узле 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 )