一篇學會 Sharding 垂直分庫分表
之前的幾篇文章,阿粉已經(jīng)說了這個SpringBoot整合 Sharding-JDBC 實現(xiàn)了水平的分庫分表,也是我們在日常的業(yè)務中最經(jīng)常用到的,把數(shù)據(jù)進行水平分庫,比如按照日期分庫,按照奇偶性用戶ID來水平分庫,今天阿粉來說說如何使用 Sharding-JDBC 進行垂直切分表和數(shù)據(jù)庫。
前情回顧之什么是垂直切分
什么是垂直切分,垂直分庫是指按照業(yè)務將表進行分類,分布到不同的數(shù)據(jù)庫上面,每個庫可以放在不同的服務器上,它的核心理念是專庫專用,也就是說,我們需要把不同之間的業(yè)務進行分庫,比如,支付業(yè)務我們可以創(chuàng)建一個庫,而訂單業(yè)務我們可以再用另外的一個庫保存數(shù)據(jù),說起來是簡單,實現(xiàn)起來也并沒有想象的那么難辦。我們看看如何實現(xiàn)。
垂直分表
垂直分表就是將一個表細分,且在同一個庫里,正常操作即可。
這種相對來說就壓根沒必要用sharding-sphere,數(shù)據(jù)一部分在一個表,和數(shù)據(jù)存儲在另外一個表,那就意味著,這就是兩個表存了不同的數(shù)據(jù),比如商品服務,我們把商品基本信息放在一張表,商品詳情放在一張表,這就相當于是垂直分表了,但是看起來總是這么的奇怪,奇怪歸奇怪,他還就是這樣的。而垂直分庫就不是這樣的了。我們來看看如何實現(xiàn)。
垂直分庫
第一步
我們還是需要去創(chuàng)建數(shù)據(jù)庫
然后創(chuàng)建我們的指定的表
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id BIGINT(20) PRIMARY KEY,
username VARCHAR(20) ,
phone VARCHAR(11),
STATUS VARCHAR(11) );
第二步
接下來我們就要和之前一樣了,開始配置我們的配置數(shù)據(jù)。
spring:
application:
name: sharding-jdbc-simple
http:
encoding:
enabled: true
charset: UTF-8
force: true
main:
allow-bean-definition-overriding: true
#定義數(shù)據(jù)源
shardingsphere:
datasource:
names: db1,db2,db3
db1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/order?characterEncoding=UTF-8&useSSL=false
username: root
password: 123456
db2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ordersharding?characterEncoding=UTF-8&useSSL=false
username: root
password: 123456
#配置user的數(shù)據(jù)源
db3:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/user?characterEncoding=UTF-8&useSSL=false
username: root
password: 123456
## 分庫策略,以user_id為分片鍵,分片策略為user_id % 2 + 1,user_id為偶數(shù)操作db1數(shù)據(jù)源,否則操作db2。
sharding:
tables:
#配置db3的數(shù)據(jù)節(jié)點
users:
actual-data-nodes: db$->{3}.users
table-strategy:
inline:
sharding- column: id
algorithm-expression: users
orderinfo:
actual-data-nodes: db$->{1..2}.orderinfo
key-generator:
column: order_id
type: SNOWFLAKE
database-strategy:
inline:
sharding-column: user_id
algorithm-expression: db$->{user_id % 2 + 1}
props:
sql:
show: true
server:
servlet:
context-path: /sharding-jdbc
mybatis:
configuration:
map-underscore-to-camel-case: true
=接下來就是去寫一組插入語句,然后我們把數(shù)據(jù)插入到數(shù)據(jù)庫測試一下。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RunBoot.class)
public class UsersDaoTest {
@Autowired
UsersDao usersDao;
@Test
public void testInsert(){
for (int i = 0; i < 10; i++) {
Long id = i+100L;
usersDao.insertUser(id,"大佬"+i, "17458236963","1");
}
}
}
/**
* 新增用戶
* */
@Insert("insert into users(id,username,phone,status) values(#{id},#{username},#{phone},#{status})")
int insertUser(@Param("id") Long id, @Param("username") String username, @Param("phone") String phone,@Param("status") String status);
看著截圖的樣子,阿粉感覺是沒啥問題,我們再去數(shù)據(jù)庫驗證一下。
也確定了數(shù)據(jù)保存進去了,這就是垂直分庫
俺么我們什么時候垂直分庫呢?答案是根據(jù)業(yè)務邏輯進行分割。比如我們可以把用戶表和用戶相關的表分配到用戶數(shù)據(jù)庫中,而把商品表和商品相關的數(shù)據(jù)分配到商品數(shù)據(jù)庫中。
阿粉覺得這種垂直分庫分表,實際上就是通過不同的數(shù)據(jù)源來進行操作的,而通過給mybatis的mapper配置不同的數(shù)據(jù)源也是能實現(xiàn)的,但是還是看個人選擇吧。
大家學會如何使用 Sharding-JDBC 進行分庫分表了么?