ShardingSphere-Proxy5.1.0搭建及自定義算法編寫

1. 準備

官網下載指定版本二進制包

https://shardingsphere.apache.org/document/current/cn/downloads/

image.png

至少2G內存的centos7服務器
image.png
下載MYSQL依賴

https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar

2. 安裝ShardingSphere-Proxy

將下載好的二進制包上傳到服務器
image.png
解壓
tar -zxvf /opt/software/apache-shardingsphere-5.1.0-shardingsphere-proxy-bin.tar.gz -C /opt/module
重命名
mv /opt/module/apache-shardingsphere-5.1.0-shardingsphere-proxy-bin /opt/module/shardingsphere-5.1.0-proxy-bin
將MySQL依賴上傳到ext-lib目錄下
cd /opt/module/shardingsphere-5.1.0-proxy-bin
mkdir ext-lib
# 上傳操作省略
image.png

3. 編寫自定義算法

官方的文檔
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/startup/bin/

  1. 實現 ShardingAlgorithm 接口定義的算法實現類。
  2. 在項目 resources 目錄下創(chuàng)建 META-INF/services 目錄绽媒。
  3. META-INF/services 目錄下新建文件 org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
  4. 將實現類的絕對路徑寫入至文件 org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
  5. 將上述 Java 文件打包成 jar 包页慷。
  6. 將上述 jar 包拷貝至 ShardingSphere-Proxy 解壓后的 ext-lib/ 目錄。
  7. 將上述自定義算法實現類的 Java 文件引用配置在 YAML 文件中,具體可參考配置規(guī)則署隘。
按照官方文檔寫一個按用戶ID取模指定數據庫例子

新建Maven工程
pom.xml添加以下依賴

<dependencies>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-sharding-api</artifactId>
            <version>5.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

實現 ShardingAlgorithm 接口定義的算法實現類。
新建類ShardingDatabaseModuloAlgorithm實現StandardShardingAlgorithm接口

package com.demo.order_sharding;

import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;

import java.util.Collection;

/**
 * 按照取模分庫
 */
public class ShardingDatabaseModuloAlgorithm<T extends Comparable<?>> implements StandardShardingAlgorithm<T> {


    /**
     *  當條件為單個值時進入
     */
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<T> preciseShardingValue) {
        Long value = Long.valueOf(preciseShardingValue.getValue().toString());
        Long mo = (value % collection.size() + 1);
        String db_suffix;
        if (mo < 10) {
            db_suffix = "_0" + mo;
        } else {
            db_suffix = "_" + mo;
        }

        for (String each : collection) {
            if (each.endsWith(db_suffix)) {
                return each;
            }
        }

        throw new UnsupportedOperationException("不支持的庫" + value);
    }
    
    /**
     * 當條件為范圍時進入
     */
    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<T> rangeShardingValue) {
        return collection;
    }

    @Override
    public void init() {
        System.out.println("進入init");
    }
    
   /**
     * 算法類型名稱淆院,可自定義
     */
    @Override
    public String getType() {
        return "STANDDARD_DB_MODULO";
    }
}
 

在項目 resources 目錄下創(chuàng)建 META-INF/services 目錄此再。
META-INF/services 目錄下新建文件 org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
將實現類的絕對路徑寫入至文件 org.apache.shardingsphere.sharding.spi.ShardingAlgorithm

image.png

image.png

打包成jar包


image.png
image.png

上傳至/opt/module/shardingsphere-5.1.0-bin/ext-lib


image.png

4. YAML配置

官方說明
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/startup/bin/
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/yaml-config/rules/sharding/

分片規(guī)則和數據源配置

ShardingSphere-Proxy 支持多邏輯數據源昔搂,每個以 config- 前綴命名的 YAML 配置文件,即為一個邏輯數據源引润。
/opt/module/shardingsphere-5.1.0-bin/conf中新建一個文件config-sharding-orders.yaml

schemaName: orders

dataSources:
  orders_01:
    url: jdbc:mysql://127.0.0.1:3306/orders_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
    username: demo
    password: demo123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 100
    minPoolSize: 1
  orders_02:
    url: jdbc:mysql://127.0.0.1:3306/orders_02?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
    username: demo
    password: demo123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 100
    minPoolSize: 1
  orders_03:
    url: jdbc:mysql://127.0.0.1:3306/orders_03?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
    username: demo
    password: demo123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 100
    minPoolSize: 1
  orders_04:
    url: jdbc:mysql://127.0.0.1:3306/orders_04?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
    username: demo
    password: demo123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 100
    minPoolSize: 1

rules:
  - !SHARDING
    tables:
      # 邏輯表名
      orderlist:
        # 分庫規(guī)則
        # 語法參考
        # https://shardingsphere.apache.org/document/current/cn/features/sharding/concept/inline-expression/
        actualDataNodes: orders_0${1..4}.orderlist
          # 可以每個表都配置分庫規(guī)則巩趁,也可以只配置一個默認的分庫規(guī)則
          databaseStrategy:  
            standard: 
              shardingColumn: taobao_user_id #分庫字段
              shardingAlgorithmName: db_modulo #分庫規(guī)則名稱
        # tableStrategy:
         # standard:
            # 分表字段
            # shardingColumn: created
            # 分表規(guī)則名稱
            # shardingAlgorithmName: tables_yyyymm
      orderdetail:
        actualDataNodes: orders_0${1..4}.orderdetail
       # tableStrategy:
         # standard:
          #  shardingColumn: created
          #  shardingAlgorithmName: tables_yyyymm

    # 綁定規(guī)則列表
    bindingTables:
      - orderlist,orderdetail

    # 默認分庫規(guī)則
    defaultDatabaseStrategy:
      standard:
        shardingColumn: taobao_user_id #分庫字段
        shardingAlgorithmName: db_modulo #分庫規(guī)則名稱
    # 默認分表規(guī)則
    defaultTableStrategy:
      none:

    # 分片算法配置
    shardingAlgorithms:
      db_modulo:
        type: STANDDARD_DB_MODULO
權限配置

修改/opt/module/shardingsphere-5.1.0-bin/conf下的server.yaml

rules:
  - !AUTHORITY
    users:
      # https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/yaml-config/authentication/
      # 設置賬號密碼
      # - root@:root
      - orders@:123456
    provider:
      # https://shardingsphere.apache.org/document/current/cn/dev-manual/proxy/
      # ALL_PRIVILEGES_PERMITTED
      # SCHEMA_PRIVILEGES_PERMITTED
      type: SCHEMA_PRIVILEGES_PERMITTED
      props:
        # 對賬號指定表名
        user-schema-mappings: orders@=orders 

# https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/yaml-config/props/
props:
  sql-show: false

5. 啟動服務

運行 /opt/module/shardingsphere-5.1.0-bin/bin下的start.sh

cd /opt/module/shardingsphere-5.1.0-bin
bin/start.sh 3080 # 3080為端口號

使用MYSQL客戶端連接試試


image.png

成功

6. 性能調優(yōu)

通過修改start.sh內的JVM參數進行內存的配置

image.png

修改server.yml中props.proxy-frontend-max-connections參數增大并行SQL數

7. 常用的DistSQL

https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/distsql/usage/sharding-rule/
例如:
預覽實際 SQL
語法: PREVIEW SQL
SQL語句: PREVIEW SELECT * FROM t_order

設置屬性值
語法:SET VARIABLE proxy_property_name = xx
SQL語句: SET VARIABLE sql_show = true 設置sql寫入到日志

查詢所有屬性
SHOW ALL VARIABLES
查詢單個屬性
SHOW VARIABLE sql_show
查看當前模式
SHOW INSTANCE MODE

8. 踩得坑

StandardShardingAlgorithm<T>實現這個接口時如果指定了泛型的類型可能會遇到類型轉化的錯

例如:StandardShardingAlgorithm<Long>
當SQL語句為

select * from orderlist where taobao_user_id = 1

會報異常 java.lang.integer cannot be cast to java.lang.long
只有數值超過Integer范圍時才不會報錯

總結

寫這篇文章前,找了很多的資料都沒有說自定義接口的每個方法的作用淳附,完全是靠試出來的议慰,官方文檔寫的對新手太不友好了,很多文檔都得靠一個個目錄去翻奴曙,東西確實不多别凹,但是很多示例不寫就很浪費時間自己去琢磨

擴展閱讀

分片策略可以看下面文章了解
https://zhuanlan.zhihu.com/p/272629526

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洽糟,隨后出現的幾起案子炉菲,更是在濱河造成了極大的恐慌,老刑警劉巖坤溃,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拍霜,死亡現場離奇詭異,居然都是意外死亡薪介,警方通過查閱死者的電腦和手機祠饺,發(fā)現死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汁政,“玉大人道偷,你說我怎么就攤上這事〖桥” “怎么了勺鸦?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長目木。 經常有香客問我换途,道長,這世上最難降的妖魔是什么刽射? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任军拟,我火速辦了婚禮,結果婚禮上柄冲,老公的妹妹穿的比我還像新娘。我一直安慰自己忠蝗,他們只是感情好现横,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般戒祠。 火紅的嫁衣襯著肌膚如雪骇两。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天姜盈,我揣著相機與錄音低千,去河邊找鬼。 笑死馏颂,一個胖子當著我的面吹牛示血,可吹牛的內容都是我干的。 我是一名探鬼主播救拉,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼难审,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亿絮?” 一聲冷哼從身側響起告喊,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎派昧,沒想到半個月后黔姜,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蒂萎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年秆吵,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岖是。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡帮毁,死狀恐怖,靈堂內的尸體忽然破棺而出豺撑,到底是詐尸還是另有隱情烈疚,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布聪轿,位于F島的核電站爷肝,受9級特大地震影響,放射性物質發(fā)生泄漏陆错。R本人自食惡果不足惜灯抛,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望音瓷。 院中可真熱鬧对嚼,春花似錦、人聲如沸绳慎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至靡砌,卻和暖如春已脓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背通殃。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工度液, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人画舌。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓堕担,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骗炉。 傳聞我的和親對象是個殘疾皇子照宝,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容