一篇學(xué)會(huì) Sharding 垂直分庫分表
之前的幾篇文章,阿粉已經(jīng)說了這個(gè)SpringBoot整合 Sharding-JDBC 實(shí)現(xiàn)了水平的分庫分表,也是我們?cè)谌粘5臉I(yè)務(wù)中最經(jīng)常用到的,把數(shù)據(jù)進(jìn)行水平分庫,比如按照日期分庫,按照奇偶性用戶ID來水平分庫,今天阿粉來說說如何使用 Sharding-JDBC 進(jìn)行垂直切分表和數(shù)據(jù)庫。
前情回顧之什么是垂直切分
什么是垂直切分,垂直分庫是指按照業(yè)務(wù)將表進(jìn)行分類,分布到不同的數(shù)據(jù)庫上面,每個(gè)庫可以放在不同的服務(wù)器上,它的核心理念是專庫專用,也就是說,我們需要把不同之間的業(yè)務(wù)進(jìn)行分庫,比如,支付業(yè)務(wù)我們可以創(chuàng)建一個(gè)庫,而訂單業(yè)務(wù)我們可以再用另外的一個(gè)庫保存數(shù)據(jù),說起來是簡(jiǎn)單,實(shí)現(xiàn)起來也并沒有想象的那么難辦。我們看看如何實(shí)現(xiàn)。
垂直分表
垂直分表就是將一個(gè)表細(xì)分,且在同一個(gè)庫里,正常操作即可。
這種相對(duì)來說就壓根沒必要用sharding-sphere,數(shù)據(jù)一部分在一個(gè)表,和數(shù)據(jù)存儲(chǔ)在另外一個(gè)表,那就意味著,這就是兩個(gè)表存了不同的數(shù)據(jù),比如商品服務(wù),我們把商品基本信息放在一張表,商品詳情放在一張表,這就相當(dāng)于是垂直分表了,但是看起來總是這么的奇怪,奇怪歸奇怪,他還就是這樣的。而垂直分庫就不是這樣的了。我們來看看如何實(shí)現(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
## 分庫策略,以u(píng)ser_id為分片鍵,分片策略為user_id % 2 + 1,user_id為偶數(shù)操作db1數(shù)據(jù)源,否則操作db2。
sharding:
tables:
#配置db3的數(shù)據(jù)節(jié)點(diǎn)
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ù)庫測(cè)試一下。
@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);
看著截圖的樣子,阿粉感覺是沒啥問題,我們?cè)偃?shù)據(jù)庫驗(yàn)證一下。
也確定了數(shù)據(jù)保存進(jìn)去了,這就是垂直分庫
俺么我們什么時(shí)候垂直分庫呢?答案是根據(jù)業(yè)務(wù)邏輯進(jìn)行分割。比如我們可以把用戶表和用戶相關(guān)的表分配到用戶數(shù)據(jù)庫中,而把商品表和商品相關(guān)的數(shù)據(jù)分配到商品數(shù)據(jù)庫中。
阿粉覺得這種垂直分庫分表,實(shí)際上就是通過不同的數(shù)據(jù)源來進(jìn)行操作的,而通過給mybatis的mapper配置不同的數(shù)據(jù)源也是能實(shí)現(xiàn)的,但是還是看個(gè)人選擇吧。
大家學(xué)會(huì)如何使用 Sharding-JDBC 進(jìn)行分庫分表了么?