kingshard--一個支持sharding的MySQL Proxy項目

kingshard簡介

kingshard(https://github.com/flike/king...)是一個由Go開發高性能MySQL Proxy項目,kingshard在知足基本的讀寫分離的功能上,致力於簡化MySQL分庫分表操做;可以讓DBA經過kingshard輕鬆平滑地實現MySQL數據庫擴容。前端

主要功能:

1.讀寫分離。
2.跨節點分表。
3.客戶端IP訪問控制。
4.平滑上線DB或下線DB,前端應用無感知。

kingshard sharding介紹

如今開源的MySQL Proxy已經有幾款了,而且有的已經在生產環境上普遍應用。但這些proxy在sharding方面,都是不能分子表的。也就是說一個node節點只能分一張表。但咱們的線上需求一般是這樣的:node

**我有一張很是大的表,行數超過十億,須要進行拆分處理。假設拆分因子是512。
若是採用單node單數據庫的分表方式,那其實這512個子表仍是存在一個物理節點上,意義不大。mysql

若是採用他們的sharding功能,就須要512個物理節點,也不現實。
面對這種需求,現有的proxy就不能很好地知足要求了。一般咱們但願將512張子表均分在幾個MySQL節點上,從而達到系統的橫向擴展。**

然而kingshard較好地實現了這種典型的需求。簡單來講,kingshard的分表方案採用兩級映射的方式:git

1.kingshard將該表分紅512張子表,例如:test_0000,test_0001,...
test_511。
2.將shardKey經過hash或range方式定位到其要操做的記錄在哪張子表上。
3.子表落在哪一個node上經過配置文件設置。

sharding支持的操做

目前kingshard sharding支持insert, delete, select, update和replace語句, 全部這五類操做都支持跨子表。但寫操做僅支持單node上的跨子表,select操做則能夠跨node,跨子表。github

sharding方式

range方式

基於整數範圍劃分來獲得子表下標。該方式的優勢:基於範圍的查詢或更新速度快,由於查詢(或更新)的範圍有可能落在同一張子表中。這樣能夠避免所有子表的查詢(更新)。缺點:數據熱點問題。由於在一段時間內整個集羣的寫壓力都會落在一張子表上。此時整個mysql集羣的寫能力受限與單臺mysql server的性能。而且,當正在集中寫的mysql 節點若是宕機的話,整個mysql集羣處於不可寫狀態。基於range方式的分表字段類型受限。sql

hash方式

kingshard採用(shardKey%子表個數)的方式獲得子表下標。優勢:數據分佈均勻,寫壓力會比較平均地落在後端的每一個MySQL節點上,整個集羣的寫性能不會受限於單個MySQL節點。而且當某個分片節點宕機,只會影響到寫入該節點的請求,其餘節點的寫入請求不受影響。分表字段類型不受限。由於任何一個類型的分表字段,均可以經過一個hash函數計算獲得一個整數。缺點:基於範圍的查詢或更新,都須要將請求發送到所有子表,對性能有必定影響。但若是不是基於範圍的查詢或更新,則性能不會受到影響。數據庫

sharding相關的配置介紹

在配置文件中,有關sharding設置是經過scheam設置:後端

schemas :
-
   db : kingshard
   nodes: [node1,node2]
   rules:
       default: node1
       shard:
       -   
           #分表名字
           table: test_shard_hash
           #sharding key
           key: id
           #子表分佈的節點名字
           nodes: [node1, node2]
           #sharding類型
           type: hash
           #子表個數分佈,表示[test_shard_hash_0000, test_shard_hash_0001, test_shard_hash_0002, test_shard_hash_003]在node1上。
           #[test_shard_hash_0004, test_shard_hash_0005, test_shard_hash_0006, test_shard_hash_007]在node2上
           locations: [4,4]

       -   
            #分表名字
           table: test_shard_range
           #sharding key
           key: id
           #sharding類型
           type: range
           #子表分佈的節點名字
           nodes: [node1, node2]
           #子表個數分佈,表示[test_shard_hash_0000, test_shard_hash_0001, test_shard_hash_0002, test_shard_hash_003]在node1上。
           #[test_shard_hash_0004, test_shard_hash_0005, test_shard_hash_0006, test_shard_hash_007]在node2上
           locations: [4,4]
           #每張子表的記錄數。[0,10000)在test_shard_hash_0000上,[10000,20000)在test_shard_hash_0001上。....
           table_row_limit: 10000

一個kingshard實例只能有一個schemas,從上面的配置能夠看出,schema能夠分爲三個部分:架構

1.db,表示這個schemas使用的數據庫。

2.nodes,表示子表分佈的節點名字。

3.rules,sharding規則。其中rules又能夠分爲兩個部分:
    - default,默認分表規則。全部操做不在shard(default規則下面的規則)中的表的SQL語句都會發向該node。
    - hash,hash分表方式。
    - range,range分表方式

kingshard架構圖

基於kingshard的子表遷移方案

經過kingshard能夠很是方便地動態遷移子表,從而保證MySQL節點的不至於負載壓力太大。大體步驟以下所述:tcp

  1. 經過自動數據遷移工具開始數據遷移。
  2. 數據差別小於某一臨界值,阻塞老子表寫操做(read-only)
  3. 等待新子表數據同步完畢
  4. 更改kingshard配置文件中的對應子表的路由規則。
  5. 刪除老節點上的子表。

Exaple

簡單演示一下kingshard的相關操做,感興趣的同窗能夠本身試一試。:)

#啓動kingshard
kingshard git:(master) ✗ ./bin/kingshard -config=etc/multi.yaml
kingshard
2015/07/19 11:13:43 - INFO - server.go:[205] - [server] "NewServer" "Server running" "netProto=tcp|address=127.0.0.1:9696" conn_id=0

#另外一個終端鏈接kingshard
mysql -ukingshard -pkingshard -h127.0.0.1 -P9696;
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10001
Server version: kingshard-1.0 Homebrew

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>use kingshard;
Database changed
mysql> select/*master*/ * from kingshard_test_conn;
+----+----------+------+-------+------+------+
| id | str      | f    | e     | u    | i    |
+----+----------+------+-------+------+------+
|  1 | a        | 3.14 | test1 | NULL | NULL |
|  5 | ""''\abc | NULL | NULL  | NULL | NULL |
|  6 | 中國     | NULL | NULL  | NULL | NULL |
+----+----------+------+-------+------+------+
3 rows in set (0.01 sec)

mysql> select * from test_shard_hash where id in(6,10);
+----+-------+------+-------+------+------+
| id | str   | f    | e     | u    | i    |
+----+-------+------+-------+------+------+
| 10 | world |  2.1 | test1 |    1 |    1 |
+----+-------+------+-------+------+------+
1 row in set (0.03 sec)

mysql> show tables;
+----------------------------+
| Tables_in_kingshard        |
+----------------------------+
| kingshard_test_conn        |
| kingshard_test_proxy_conn  |
| kingshard_test_proxy_stmt  |
| kingshard_test_shard_hash  |
| kingshard_test_shard_range |
| kingshard_test_stmt        |
| test_shard_hash_0000       |
| test_shard_hash_0001       |
| test_shard_hash_0002       |
| test_shard_hash_0003       |
| test_shard_range_0000      |
| test_shard_range_0001      |
| test_shard_range_0002      |
| test_shard_range_0003      |
+----------------------------+
14 rows in set (0.00 sec)

反饋

很是歡迎您發郵件至flikecn#126.com與做者取得聯繫,或者加入QQ羣(147926796)交流。

github:https://github.com/flike/king...

歡迎關注後端技術快訊公衆號,有關kingshard的最新消息與後端架構設計類的文章,都會在這個公衆號分享。圖片描述

相關文章
相關標籤/搜索