После того как Kingshard стал открытым исходным кодом, пользователи неоднократно поднимали вопрос о возможности добавления в Kingshard функции чёрного списка SQL. Есть несколько типичных сценариев использования:
Администратор базы данных (DBA) может определить некоторые потенциально опасные SQL-запросы и поместить их в файл чёрного списка SQL. Это позволяет предотвратить нанесение вреда базе данных запросами, поступающими от клиентских приложений. Такие запросы могут быть результатом небрежного кодирования со стороны разработчиков или следствием атак с использованием SQL-инъекций. Например, запрос delete from mytable
без условия where
приведёт к удалению всей таблицы.
После запуска проекта на основе Kingshard можно обнаружить большое количество запросов, создающих значительную нагрузку на базу данных. В этом случае можно динамически добавить эти запросы в чёрный список, чтобы предотвратить их выполнение и снизить нагрузку на базу данных. Например, если запрос select count(*) from mytable where xxxx
не оптимизирован должным образом, он может привести к чрезмерному использованию ресурсов системы.
Чтобы использовать функцию чёрного списка SQL в Kingshard, необходимо добавить следующую конфигурацию:
blacklist_sql_file: /Users/flike/blacklist
Затем мы определяем чёрный список SQL, и Kingshard будет блокировать передачу SQL-запросов из чёрного списка.
Чёрный список SQL определяется в виде регулярных выражений. Значения в SQL заменяются символами ?
или ?+
. Чтобы обеспечить эффективность чёрного списка, рекомендуется вручную проверить, правильно ли Kingshard блокирует запросы из чёрного списка. Примеры правил (первая строка — исходный SQL, вторая строка — форма чёрного списка):
SELECT c FROM t WHERE id=1
select c from t where id=?
SELECT * FROM prices.rt_5min where id=1
select * from prices.rt_5min where id=?
select null, 5.001, 5001. from foo
select ?, ?, ? from foo
select 'hello', '\nhello\n', \"hello\", '\\'' from foo
select ?, ?, ?, ? from foo
select 'hello'\n
select ?
select * from t where (base.nid IN ('1412', '1410', '1411'))
select * from t where (base.nid in(?+))
select * from foo where a in (5) and b in (5, 8,9 ,9 , 10)
select * from foo where a in(?+) and b in(?+)
select * from foo limit 5
select * from foo limit ?
select * from foo limit 5, 10
select * from foo limit ?, ?
select * from foo limit 5 offset 10
select * from foo limit ? offset ?
INSERT INTO t (ts) VALUES (NOW())
insert into t (ts) values(?+)
insert into foo(a, b, c) values(2, 4, 5)
insert into foo(a, b, c) values(?+)
CALL foo(1, 2, 3)
call foo
LOAD DATA INFILE '/tmp/foo.txt' INTO db.tbl
load data infile ? into db.tbl
administrator command: Init DB
administrator command: Init DB
use `foo`
use ?
Добавим следующие запросы в чёрный список:
select count(*) from test_shard_hash where id > ?
select count(*) from test_shard_range
SELECT * FROM WORLD
DELETE FROM WORLD
Подключившись к Kingshard и выполнив SQL-запрос, получим следующее:
mysql> select * from world;
ERROR 1105 (HY000): sql in blacklist.
mysql> select * from world where a > 0;
+------+------+
| a | b |
+------+------+
| 10 | 23 |
| 45 | 565 |
+------+------+
2 rows in set (0.00 sec)
mysql> delete from world;
ERROR 1105 (HY000): sql in blacklist.
mysql> delete from world where a =10;
Query OK, 1 row affected (0.00 sec)
# Обратите внимание, что в чёрном списке SQL после «id >» есть пробел, который должен точно совпадать, иначе Kingshard не распознает его как запрос из чёрного списка
mysql> select count(*) from test_shard_hash where id >1;
+----------+
| count(*) |
+----------+
| 24 |
+----------+
1 row in set (0.02 sec)
mysql> select count(*) from test_shard_hash where id > 1;
ERROR 1105 (HY000): sql in blacklist.
Мы также протестировали производительность Kingshard с включённым чёрным списком SQL с помощью sysbench и обнаружили, что производительность не снизилась значительно, поэтому можно безопасно использовать эту функцию.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )