shardingsphere 5.1.1 分库分表
1. mysql配置:
application-dubboService = spring-csc-campaign-agent-context.xml
kafka.topics.redisAccessLog = CDC_%s_REDIS_ACCESSLOG_CHG sharding.jdbc.datasource.sharding0.bu-id = 1-4HK8TL
sharding.jdbc.datasource.sharding1.bu-id = 1-4PH8TL
sharding.jdbc.datasource.sharding2.bu-id = 1-30TKK9
sharding.jdbc.datasource.sharding3.bu-id = 1-31DRXE5
sharding.jdbc.datasource.sharding4.bu-id = 1-30TKP7
sharding.jdbc.datasource.sharding5.bu-id = 1-30TKPA
sharding.jdbc.datasource.sharding6.bu-id = 1-30TKKQ
sharding.jdbc.datasource.sharding7.bu-id = 1-ASBI4Z spring.shardingsphere.datasource.names = sharding0,sharding1,sharding2,sharding3,sharding4,sharding5,sharding6,sharding7 #sit--CSC_MBHK_MEMBER spring.shardingsphere.datasource.sharding0.url = jdbc:mysql://10.95.35.226:3306/CSC_MBHK_CAMPAIGN?useUnicode=true&characterEncoding=utf-8&useCursorFetch=true&defaultFetchSize=100&allowMultiQueries=true
spring.shardingsphere.datasource.sharding0.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.sharding0.username = cdcmbsit
spring.shardingsphere.datasource.sharding0.driverClassName = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.sharding0.password = ENC(ZIeuW2I1txJcMPcxG4IjEPOS6uTzm9/O) spring.shardingsphere.datasource.sharding1.url = jdbc:mysql://10.95.35.226:3306/CDC_WTCPH_CAMPAIGN?useUnicode=true&characterEncoding=utf-8&useCursorFetch=true&defaultFetchSize=100&allowMultiQueries=true
spring.shardingsphere.datasource.sharding1.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.sharding1.username = cdcmbphsit
spring.shardingsphere.datasource.sharding1.driverClassName = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.sharding1.password = ENC(ZB1I2sYxgaasEeaccl7Ys/9JuydUdbSP) spring.shardingsphere.datasource.sharding2.url = jdbc:mysql://10.95.35.27:3306/CDC_WTCMY_CAMPAIGN?useUnicode=true&characterEncoding=utf-8&useCursorFetch=true&defaultFetchSize=100&allowMultiQueries=true
spring.shardingsphere.datasource.sharding2.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.sharding2.username = u_cdc_wtcmy_app
spring.shardingsphere.datasource.sharding2.driverClassName = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.sharding2.password = Asia4gCSuL&DA spring.shardingsphere.datasource.sharding3.url = jdbc:mysql://10.95.35.27:3306/CDC_WTCID_CAMPAIGN?useUnicode=true&characterEncoding=utf-8&useCursorFetch=true&defaultFetchSize=100&allowMultiQueries=true
spring.shardingsphere.datasource.sharding3.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.sharding3.username = u_cdc_wtcid_app
spring.shardingsphere.datasource.sharding3.driverClassName = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.sharding3.password = Asia4gCSuL&DA spring.shardingsphere.datasource.sharding4.url = jdbc:mysql://10.95.35.27:3306/CDC_WTCSG_CAMPAIGN?useUnicode=true&characterEncoding=utf-8&useCursorFetch=true&defaultFetchSize=100&allowMultiQueries=true
spring.shardingsphere.datasource.sharding4.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.sharding4.username = u_cdc_wtcsg_app
spring.shardingsphere.datasource.sharding4.driverClassName = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.sharding4.password = Asia4gCSuL&DA spring.shardingsphere.datasource.sharding5.url = jdbc:mysql://10.95.35.27:3306/CDC_WTCTH_CAMPAIGN?useUnicode=true&characterEncoding=utf-8&useCursorFetch=true&defaultFetchSize=100&allowMultiQueries=true
spring.shardingsphere.datasource.sharding5.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.sharding5.username = u_cdc_wtcth_app
spring.shardingsphere.datasource.sharding5.driverClassName = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.sharding5.password = Asia4gCSuL&DA spring.shardingsphere.datasource.sharding6.url = jdbc:mysql://10.95.35.27:3306/CDC_WTCTW_CAMPAIGN?useUnicode=true&characterEncoding=utf-8&useCursorFetch=true&defaultFetchSize=100&allowMultiQueries=true
spring.shardingsphere.datasource.sharding6.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.sharding6.username = u_cdc_wtctw_app
spring.shardingsphere.datasource.sharding6.driverClassName = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.sharding6.password = Asia4gCSuL&DA spring.shardingsphere.datasource.sharding7.url = jdbc:mysql://10.95.35.27:3306/CDC_WWHK_CAMPAIGN?useUnicode=true&characterEncoding=utf-8&useCursorFetch=true&defaultFetchSize=100&allowMultiQueries=true
spring.shardingsphere.datasource.sharding7.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.sharding7.username = u_cdc_wwhk_app
spring.shardingsphere.datasource.sharding7.driverClassName = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.sharding7.password = Asia4gCSuL&DA # 是否开启分表开关,生产要关闭false
sharding.table.switch = true # sharding hint, logic tables config
# notes: 需要配置所有的的逻辑表,不然就不能分库
sharding.hint.logic.tables= CUSTOMER_CAMPAIGN_TREATMENT,CUSTOMER_LOY_MKTG_OFFER,CUSTOMER_POS_SEG_LST,CUSTOMER_CAMPAIGN_CONTACT,CUSTOMER_LOY_CAM_SEG,CUSTOMER_CAMP_LD_WAVE,CUSTOMER_CAMPAIGN,CUSTOMER_CAMPAIGN_DCP,CUSTOMER_CAMPAIGN_GOAL,CUSTOMER_CAMPAIGN_OFFER,CUSTOMER_CAMPAIGN_OPTY,CUSTOMER_COMM_DTL,CUSTOMER_COMMUNICATION,CUSTOMER_MARKETING_OFFER,CUSTOMER_MARKETING_OFFER_PROD,CUSTOMER_MKOFFR_PROMO,CUSTOMER_POSTN,CUSTOMER_LOY_ATTRDEFN # 默认的hint分库算法
spring.shardingsphere.rules.sharding.default-database-strategy.hint.shardingalgorithm-name=byBuHintAlgorithm spring.shardingsphere.props.sql-show=true
# 配置分库的表,因为我们所有的表都需要分库,这里需要配置所有的表 spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN_TREATMENT.actual-data-nodes = sharding$->{0..7}.CUSTOMER_CAMPAIGN_TREATMENT
spring.shardingsphere.rules.sharding.tables.CUSTOMER_LOY_MKTG_OFFER.actual-data-nodes = sharding$->{0..7}.CUSTOMER_LOY_MKTG_OFFER
spring.shardingsphere.rules.sharding.tables.CUSTOMER_POS_SEG_LST.actual-data-nodes = sharding$->{0..7}.CUSTOMER_POS_SEG_LST
spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMP_LD_WAVE.actual-data-nodes = sharding$->{0..7}.CUSTOMER_CAMP_LD_WAVE
spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN.actual-data-nodes = sharding$->{0..7}.CUSTOMER_CAMPAIGN
spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN_DCP.actual-data-nodes = sharding$->{0..7}.CUSTOMER_CAMPAIGN_DCP
spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN_GOAL.actual-data-nodes = sharding$->{0..7}.CUSTOMER_CAMPAIGN_GOAL
spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN_OFFER.actual-data-nodes = sharding$->{0..7}.CUSTOMER_CAMPAIGN_OFFER
spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN_OPTY.actual-data-nodes = sharding$->{0..7}.CUSTOMER_CAMPAIGN_OPTY
spring.shardingsphere.rules.sharding.tables.CUSTOMER_COMM_DTL.actual-data-nodes = sharding$->{0..7}.CUSTOMER_COMM_DTL
spring.shardingsphere.rules.sharding.tables.CUSTOMER_COMMUNICATION.actual-data-nodes = sharding$->{0..7}.CUSTOMER_COMMUNICATION
spring.shardingsphere.rules.sharding.tables.CUSTOMER_MARKETING_OFFER.actual-data-nodes = sharding$->{0..7}.CUSTOMER_MARKETING_OFFER
spring.shardingsphere.rules.sharding.tables.CUSTOMER_MARKETING_OFFER_PROD.actual-data-nodes = sharding$->{0..7}.CUSTOMER_MARKETING_OFFER_PROD
spring.shardingsphere.rules.sharding.tables.CUSTOMER_MKOFFR_PROMO.actual-data-nodes = sharding$->{0..7}.CUSTOMER_MKOFFR_PROMO
spring.shardingsphere.rules.sharding.tables.CUSTOMER_POSTN.actual-data-nodes = sharding$->{0..7}.CUSTOMER_POSTN
spring.shardingsphere.rules.sharding.tables.CUSTOMER_LOY_ATTRDEFN.actual-data-nodes = sharding$->{0..7}.CUSTOMER_LOY_ATTRDEFN #分表配置
spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN_CONTACT.logic-table=CUSTOMER_CAMPAIGN_CONTACT
spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN_CONTACT.actual-data-nodes = sharding$->{0..1}.CUSTOMER_CAMPAIGN_CONTACT,sharding$->{2..7}.CUSTOMER_CAMPAIGN_CONTACT_$->{0..63},sharding$->{2..7}.CUSTOMER_CAMPAIGN_CONTACT spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN_CONTACT.table-strategy.standard.sharding-column=CON_PER_ID
spring.shardingsphere.rules.sharding.tables.CUSTOMER_CAMPAIGN_CONTACT.table-strategy.standard.sharding-algorithm-name=hashModShardingAlgorithm spring.shardingsphere.rules.sharding.tables.CUSTOMER_LOY_CAM_SEG.logic-table=CUSTOMER_LOY_CAM_SEG
spring.shardingsphere.rules.sharding.tables.CUSTOMER_LOY_CAM_SEG.actual-data-nodes = sharding$->{0..1}.CUSTOMER_LOY_CAM_SEG,sharding$->{2..7}.CUSTOMER_LOY_CAM_SEG_$->{0..63},sharding$->{2..7}.CUSTOMER_LOY_CAM_SEG
spring.shardingsphere.rules.sharding.tables.CUSTOMER_LOY_CAM_SEG.table-strategy.standard.sharding-column=CONTACT_ID
spring.shardingsphere.rules.sharding.tables.CUSTOMER_LOY_CAM_SEG.table-strategy.standard.sharding-algorithm-name=hashModShardingAlgorithm # 分片算法配置
spring.shardingsphere.rules.sharding.sharding-algorithms.byBuHintAlgorithm.type= CLASS_BASED
spring.shardingsphere.rules.sharding.sharding-algorithms.byBuHintAlgorithm.props.strategy= HINT
spring.shardingsphere.rules.sharding.sharding-algorithms.byBuHintAlgorithm.props.algorithmClassName= com.aswatson.csc.campaign.conf.HintAlgorithm
spring.shardingsphere.rules.sharding.sharding-algorithms.byBuHintAlgorithm.props.buDbMapping = {"1-4HK8TL":"sharding0","1-4PH8TL":"sharding1","1-30TKK9":"sharding2","1-31DRXE5":"sharding3","1-30TKP7":"sharding4","1-30TKPA":"sharding5","1-30TKKQ":"sharding6","1-ASBI4Z":"sharding7"} # 分片算法配置
spring.shardingsphere.rules.sharding.sharding-algorithms.hashModShardingAlgorithm.type= CLASS_BASED
spring.shardingsphere.rules.sharding.sharding-algorithms.hashModShardingAlgorithm.props.strategy= STANDARD
spring.shardingsphere.rules.sharding.sharding-algorithms.hashModShardingAlgorithm.props.algorithmClassName= com.aswatson.csc.campaign.common.sharding.HashModShardingAlgorithm spring.main.allow-bean-definition-overriding = true
2. 分库的doSharding配置类:
package com.aswatson.csc.campaign.conf; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.util.Properties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingAlgorithm;
import org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingValue;
import org.springframework.context.annotation.Configuration; import java.util.Collection;
import java.util.Collections;
import java.util.Map; @Slf4j
@Configuration
public class HintAlgorithm implements HintShardingAlgorithm{ private Properties props;
private static Map shardingBuMapping = Collections.emptyMap(); public static void setShardingBuMapping(Map<String, String> shardingBuMapping) {
HintAlgorithm.shardingBuMapping = shardingBuMapping;
} @Override
public Collection<String> doSharding(Collection collection, HintShardingValue hintShardingValue) {
for (Object value : hintShardingValue.getValues()) {
String availableTargetName = String.valueOf(shardingBuMapping.get(value.toString()));
if (StringUtils.isNotEmpty(availableTargetName)) {
return Collections.singletonList(availableTargetName);
}
}
log.error("unknown sharding value and datasource mapping,sharding value={},all datasource mapping={}",
hintShardingValue, shardingBuMapping, new IllegalArgumentException());
return Collections.emptyList(); } @Override
public Properties getProps() {
return props;
} @Override public void init(Properties properties) {
this.props = properties;
initShardingBuMapping();
} private void initShardingBuMapping() {
String buDbMapping = props.getProperty("buDbMapping", "");
if (StringUtils.isEmpty(buDbMapping)) {
log.error("initShardingBuMapping fail because apollo config, buDbMapping not exist={}", buDbMapping,
new IllegalArgumentException());
}
JSONObject jsonObject = JSON.parseObject(buDbMapping);
shardingBuMapping = jsonObject.getInnerMap();
} }
3. 分表的doSharding配置类:
package com.aswatson.csc.campaign.common.sharding; import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService; import java.util.Arrays;
import java.util.Collection;
import java.util.Properties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shardingsphere.infra.hint.HintManager;
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; /**
* @Author Tim
* @Date 2022/6/30 11:52
*/
@Slf4j
public class HashModShardingAlgorithm implements StandardShardingAlgorithm { // 通过Apollo client获取是否需要分表开关,不需要分表,通过availableTargetNames 截取 "_num"前的表
public static String shardingTableSwitch = "sharding.table.switch";
public static String nameSpace = "cdc-common"; @Override
public String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) {
Comparable value = shardingValue.getValue();
int hashValue = value.hashCode();
int availableTargetNamesLen = availableTargetNames.size();
// 因为我们配置了是否需要分表的开关,不分表就返回逻辑表,如果availableTargetNames不包含这个逻辑表就会抛异常,
// 因此我们配置这个分表的实际表,最后加了这个逻辑表
if (availableTargetNamesLen > 1) {
availableTargetNamesLen -= 1;
}
int targetNamesIdx = Math.abs(hashValue) % (availableTargetNamesLen);
Object[] availableTargetNamesArr = availableTargetNames.toArray(new Object[0]);
String tableName = String.valueOf(availableTargetNamesArr[targetNamesIdx]);
log.info("doSharding-tableName: {}", tableName);
return getActualTable(tableName);
} private String getActualTable(String tableName) {
Config config = ConfigService.getConfig(nameSpace);
// String tableShardingSwitchBuIds = config.getProperty(shardingTableSwitchBuIds, "");
boolean tableShardingSwitch = Boolean.parseBoolean(config.getProperty(shardingTableSwitch, "false"));
// String[] tableShardingSwitchBuIdArrays = StringUtils.split(tableShardingSwitchBuIds, ",");
if (tableShardingSwitch) {
return tableName;
}
String actualTable = tableName.replaceAll("\\d+","");
log.info("getActualTable-tableName: {}, reason: tableShardingSwitch|{}",
actualTable, tableShardingSwitch);
return actualTable.substring(0, actualTable.length()-1); } // todo
@Override
public Collection<String> doSharding(Collection collection, RangeShardingValue rangeShardingValue) {
return null;
} @Override
public Properties getProps() {
return null;
} @Override
public void init(Properties properties) { }
}
shardingsphere 5.1.1 分库分表的更多相关文章
- 分库分表(2) --- ShardingSphere(理论)
ShardingSphere---理论 ShardingSphere在中小企业需要分库分表的时候用的会比较多,因为它维护成本低,不需要额外增派人手;而且目前社区也还一直在开发和维护,还算是比较活跃. ...
- 分库分表(4) ---SpringBoot + ShardingSphere 实现分表
分库分表(4)--- ShardingSphere实现分表 有关分库分表前面写了三篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论) 3.分库 ...
- 分库分表(5) ---SpringBoot + ShardingSphere 实现分库分表
分库分表(5)--- ShardingSphere实现分库分表 有关分库分表前面写了四篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论) 3. ...
- 分库分表(6)--- SpringBoot+ShardingSphere实现分表+ 读写分离
分库分表(6)--- ShardingSphere实现分表+ 读写分离 有关分库分表前面写了五篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论 ...
- 分库分表(7)--- SpringBoot+ShardingSphere实现分库分表 + 读写分离
分库分表(7)--- ShardingSphere实现分库分表+读写分离 有关分库分表前面写了六篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理 ...
- mysql 分库分表 ~ ShardingSphere生态圈
一 简介 Apache ShardingSphere是一款开源的分布式数据库中间件组成的生态圈二 成员包含 Sharding-JDBC是一款轻量级的Java框架,在JDBC层提供上述核心功能 ...
- 分库分表利器——sharding-sphere
背景 得不到的东西让你彻夜难眠,没有尝试过的技术让我跃跃欲试. 本着杀鸡焉用牛刀的准则,我们倡导够用就行,不跟风,不盲从. 所以,结果就是我们一直没有真正使用分库分表.曾经好几次,感觉没有分库分表(起 ...
- 分库分表(3) ---SpringBoot + ShardingSphere 实现读写分离
分库分表(3)---ShardingSphere实现读写分离 有关ShardingSphere概念前面写了两篇博客: 1.分库分表(1) --- 理论 2. 分库分表(2) --- ShardingS ...
- Springboot2.x + ShardingSphere 实现分库分表
之前一篇文章中我们讲了基于Mysql8的读写分离(文末有链接),这次来说说分库分表的实现过程. 概念解析 垂直分片 按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用. 在拆分之前 ...
- 分库分表框架ShardingSphere入门学习1
背景 传统的将数据集中存储至单一数据节点的解决方案,在性能.可用性和运维成本这三方面已经难于满足互联网的海量数据场景. 从性能方面来说,由于关系型数据库大多采用 B+ 树类型的索引,在数据量超过阈值的 ...
随机推荐
- 明解Java第一章练习题答案
@ 目录 练习1-1 练习1-2 练习1-3 <明解Java>书籍其他章节答案 练习1-1 如果没有表示程序语句末尾的分号,结果会怎么样呢?请编译程序进行确认. 答:编译器报错 练习1-2 ...
- Python 潮流周刊第一季完结(1~30)
你好,我是猫哥.庆祝 Python 潮流周刊在几天前顺利更新到了第 30 期! 我觉得这是一个很有意义的时间节点,不太短也不漫长,很适合作一个小小的总结. 我打算今后每 30 期作为一季,都给大家做一 ...
- MySQL运维7-Mycat水平分表
一.水平分表场景 在业务系统中,有一张日志表,业务系统每天都会产生大量的日志数据,单台服务器的数据存储即处理能力是有限的,可以对数据库表进行拆分,这时候就可以使用水平分表的策略 说明1:水平分表,每个 ...
- Kernel Memory 入门系列: Embedding 简介
Kernel Memory 入门系列: Embedding 简介 在 RAG模式 其实留了一个问题. 我们对于的用户问题的理解和文档的检索并没有提供合适的方法. 当然我们可以通过相对比较传统的方法. ...
- visual studio 2013 汇编环境配置
网上有很多教程,但是第一次运行仍然出现很多问题,后来我发现忽视了几个个重要的点!!!红色字体标注 教程搬自:https://github.com/JunpengCode/Assembly https: ...
- 数字孪生结合GIS能给物流行业带来怎样的改变
随着科技的不断发展和创新,数字孪生技术和地理信息系统(GIS)正日益在各个行业中发挥重要作用.其中,物流行业作为一个复杂而庞大的系统,也能从数字孪生和GIS的结合中获得许多益处和改变. 数字孪生是指通 ...
- 三维GIS渲染引擎盘点,以Cesium为核心的拓展优化
目前,以Cesium为核心的各类产品繁多,本文将挑选一些以Cesium为核心的软件案例,为大家进行介绍. 1. CesiumJS CesiumJS相信凡是GIS行业相关人员都特别熟悉了,CesiumJ ...
- NetSuite Tips —— 发送邮件未被接收或被退回
Background: NS 发送的邮件过于频繁被邮箱系统识别为垃圾邮件,被拒收或被拦截 Solution: 添加以下邮箱地址到白名单 system@sent-via.netsuite.com nlm ...
- 苹果推信群发,苹果推信群发软件,iMessage群发系统
在当今数字化的时代,智能手机的普及率已达到了前所未有的高度,其中,苹果公司的iPhone无疑是市场上最受欢迎的智能手机之一,然而,与手机的广泛应用相伴的是,众多企业对于如何有效地向这些手机用户推送信息 ...
- 红日靶场5-wp
红日靶场5 环境搭建 win7 账密及域 leo@sun 123.com sun\Administrator dc123.com 双网卡模拟内外网 外网网卡:192.168.130.150 内网网卡: ...