1. 程式人生 > >分庫分表框架Sharding-jdbc以及分散式worker:Elastic-job的使用與踩坑

分庫分表框架Sharding-jdbc以及分散式worker:Elastic-job的使用與踩坑

一、為什麼要使用Sharding

      在當今網際網路企業中,資料成倍增長是一個很頭疼的問題。由於資料庫中一張表存入的資料越多,對資料庫操作的資料就越慢。但是我們如果根據指定的分庫分表策略,將資料分散的到不同的表上,我們查詢時,根據全域性主鍵,只掃某個庫的某一張表,這樣即減少了單個庫的壓力,又可以加快我們的查詢速度。就好像JDK中ConcurrentHashMap似的。將大的問題分治到小的問題上,以提高效率問題。

二、使用sharding要確定的要素

   2.1、 全域性主鍵的方式

            2.1.1  根據業務自己選擇主鍵

                 在本教程中我們只是使用了sharding簡單的分庫分表的方式,分庫的策略就是取模。可以根據業務區選擇全域性主鍵,  只要其全域性唯一,並且儘可能的隨機Hash就好。

           2.1.2  使用sharding生成全域性主鍵

                 sharding官方文件中對主鍵生成的文件如下:http://shardingjdbc.io/docs/02-guide/key-generator/

   2.2、 多資料來源配置

      在傳統的ORM專案中,我們只需要配置一個DataBase(只考慮最基本的情況,不包括動態資料來源,讀寫分類等),但是在分庫分表中,我們將資料存入多個不同的庫上,這個時候我們就需要配置多個分資料來源,再將多個數據源集中到一個總資料來源上。當我們進行處理時,我們根據分片策略和全域性主鍵,動態就將操作分配到多個數據源上。

   2.3、 分片演算法

   我們已經擁有了全域性的主鍵,和多個數據庫。那怎麼根據主鍵分配到不同的資料庫上呢,我們就需要分片演算法,使得sharding-jdbc知道如何分配資料的處理。sharding提供了多種不同的分庫分表策略以便於我們去實現。

官方文件如下:

”Sharding-JDBC提供了5種分片策略。由於分片演算法和業務實現緊密相關,因此Sharding-JDBC並未提供內建分片演算法,而是通過分片策略將各種場景提煉出來,提供更高層級的抽象,並提供介面讓應用開發者自行實現分片演算法。

  • StandardShardingStrategy

標準分片策略。提供對SQL語句中的=, IN和BETWEEN AND的分片操作支援。StandardShardingStrategy只支援單分片鍵,提供PreciseShardingAlgorithm和RangeShardingAlgorithm兩個分片演算法。PreciseShardingAlgorithm是必選的,用於處理=和IN的分片。RangeShardingAlgorithm是可選的,用於處理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND將按照全庫路由處理。

  • ComplexShardingStrategy

複合分片策略。提供對SQL語句中的=, IN和BETWEEN AND的分片操作支援。ComplexShardingStrategy支援多分片鍵,由於多分片鍵之間的關係複雜,因此Sharding-JDBC並未做過多的封裝,而是直接將分片鍵值組合以及分片操作符交於演算法介面,完全由應用開發者實現,提供最大的靈活度。

  • InlineShardingStrategy

Inline表示式分片策略。使用Groovy的Inline表示式,提供對SQL語句中的=和IN的分片操作支援。InlineShardingStrategy只支援單分片鍵,對於簡單的分片演算法,可以通過簡單的配置使用,從而避免繁瑣的Java程式碼開發,如: tuser${user_id % 8} 表示t_user表按照user_id按8取模分成8個表,表名稱為t_user_0到t_user_7。

  • HintShardingStrategy

通過Hint而非SQL解析的方式分片的策略。

  • NoneShardingStrategy

不分片的策略。”

   2.4    事務處理

由於我們本文目的是完成最基礎的sharding的使用,沒有主從同步等設定,因此我們像處理單表那樣處理事務就好。當進行insert,delete,uodate等操作時。我們在Service上加事務,當其進行處理時,會根據你傳入的值得全域性主鍵去操作。這樣,就會使操作對映在某一個庫的某一個表上。

三、程式碼實現