kingshard SQLブラックリスト機能紹介


kingshard SQLブラックリスト機能紹介
1.適用シーンの紹介
kingshardがオープンソースになった後、kingshardにSQLブラックリストメカニズムを追加できるかどうかを何度も言及し、kingshardが特定のルールに基づいてブラックリストのSQLをブロックできるようにした.典型的なアプリケーションシーンはいくつかあります.
  • DBAは、SQLブラックリストファイルに格納される危険なSQLを定義します.フロントエンドアプリケーションから送られてきたSQLがデータベースに危害を及ぼすことを避けることができます.このSQLは開発者が不注意で作成した可能性もあるし、SQLに注入されて生成されたSQLである可能性もある.例:delete from mytable、where条件のないSQLは、テーブル全体を削除します.
  • kingshardプロジェクトがオンラインになった後、logを通じて大量のSQLがDBに大きな圧力をもたらしていることが分かった.この場合、このSQLをブラックリストに動的に追加し、SQLの実行を阻止し、データベースの圧力を低下させることができます.たとえば、select count(*) from mytable where xxxxでは、このようなSQLが適切に最適化されていないと、システムのIOが高すぎる可能性があります.

  • 2.機能紹介
    kingshardでSQLブラックリスト機能を使用するには、構成に追加するだけです.
    blacklist_sql_file: /Users/flike/blacklist

    次にblacklistでSQLブラックリストを定義し、kingshardが転送すると、ブラックリストのSQLの転送がブロックされます.
    ブラックリストSQLは正規表現として定義されます.SQLの値は?または?+で置き換えられます.ブラックリストが有効であることを保証するために、kingshardがブラックリストのSQLを正しくブロックしたかどうかを手動で検証したほうがいい.定義ルール(前は元のSQL、次はブラックリスト形式の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', '
    hello
    ', \"hello\", '\\'' from foo select ?, ?, ?, ? from foo select 'hello'
    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 ?

    3.機能プレゼンテーション
    ブラックリストに次のSQLを追加します.
    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     SQL         ,       ,  #kingshard        SQL
    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.

    blacklistが存在する場合のkingshadの性能をsysbenchでテストしたところ、性能が著しく低下していないことがわかり、安心して使用できました.