Enhancer + ShardingSphere 分布式数据库应用开发实践

对于大型互联网应用来说,面对持续增长的海量业务数据,分布式数据库架构几乎是标准配置。而如何让业务开发人员在面向分布式数据库开发时如同在同一个库中,让数据分片对应用开发人员透明,将副作用降到最低,是众多优秀程序员持续追求的目标。

sharding-1 (1).png

本文将通过一个简单实例,介绍如何使用 ShardingSphere 分片中间件,实现 Enhancer 应用对后台分布式数据库的操作。希望对您使用 Enhancer 应用管理大型分布式业务数据有所启发。

目标效果

sharding-2 (1).png

实现步骤

1. 准备 4 台 mysql 服务器并创建相关的实验数据库和表

  • 1.1. 创建四个数据库分别命名为 user_db_0, user_db_1, user_db_2, user_db_3
  • 1.2. 在每个库中创建用户表
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(40) DEFAULT NULL,
  `gender` char(1) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 下载并安装 ShardingSphere

  • 2.1.下载。实际上需要使用的是 ShardingSphere 的跨语言中间件产品 ShardingProxy : 下载地址
sharding-3.jpeg
  • 2.2. 解压 tar 包,得到 apache-shardingsphere-xxx-shardingsphere-proxy-bin 目录。
  • 2.3. 下载 mysql 连接器 jar 包: mysql-connector-java-5.1.47.jar,并将该 jar 包放入 apache-shardingsphere-xxx-shardingsphere-proxy-bin/lib 目录中。

3. 配置代理服务器和数据库分片规则

  • 3.1 配置代理服务器 apache-shardingsphere-xxx-shardingsphere-proxy-bin/conf/server.yaml 文件,
    此文件描述了将来用作 Enhancer 工作台配置数据库连接的相关信息。注意配置文件中 [xxxx] (含中括号)为需要自行修改部分:
authentication:
  users:
    root:
      password: [xxx]
    [db_account_xxx]:
      password: [xxx]
      authorizedSchemas: user_db

props:
  max-connections-size-per-query: 1
  acceptor-size: 16  # The default value is available processors count * 2.
  executor-size: 16  # Infinite by default.
  proxy-frontend-flush-threshold: 128  # The default value is 128.
    # LOCAL: Proxy will run with LOCAL transaction.
    # XA: Proxy will run with XA transaction.
    # BASE: Proxy will run with B.A.S.E transaction.
  proxy-transaction-type: LOCAL
  proxy-opentracing-enabled: false
  proxy-hint-enabled: false
  query-with-cipher-column: true
  sql-show: false
  check-table-metadata-enabled: false
  • 3.2 配置分片规则 apache-shardingsphere-xxx-shardingsphere-proxy-bin/conf/config-sharding.yaml 文件,此文件配置了分片数据库源信息和
    t_user 表在分布式数据库中的分片规则信息。注意配置文件中 [xxxx] (含中括号)为需要自行修改部分:
schemaName: user_db

dataSourceCommon:
 connectionTimeoutMilliseconds: 30000
 idleTimeoutMilliseconds: 60000
 maxLifetimeMilliseconds: 1800000
 maxPoolSize: 50
 minPoolSize: 1
 maintenanceIntervalMilliseconds: 30000

dataSources:
  ds_0:
    url: jdbc:mysql://[数据库IP地址0]:3306/user_db_0?serverTimezone=UTC&useSSL=false&characterEncoding=utf8
    username: [xxx]
    password: [xxx]
  ds_1:
    url: jdbc:mysql://[数据库IP地址1]:3306/user_db_1?serverTimezone=UTC&useSSL=false&characterEncoding=utf8
    username: [xxx]
    password: [xxx]
  ds_2:
    url: jdbc:mysql://[数据库IP地址2]:3306/user_db_2?serverTimezone=UTC&useSSL=false&characterEncoding=utf8
    username: [xxx]
    password: [xxx]
  ds_3:
    url: jdbc:mysql://[数据库IP地址3]:3306/user_db_3?serverTimezone=UTC&useSSL=false&characterEncoding=utf8
    username: [xxx]
    password: [xxx]
rules:
- !SHARDING
  tables:
    t_user:
      actualDataNodes: ds_${0..3}.t_user # 配置表的实际数据节点数 0 ... n。
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
  bindingTables:
    - t_user
  defaultDatabaseStrategy:
    standard:
      shardingColumn: id
      shardingAlgorithmName: database_inline
  defaultTableStrategy:
    none:
  
  shardingAlgorithms:
    database_inline:
        type: INLINE
        props:
          algorithm-expression: ds_${id % 4}  # 使用简单的用 t_user 表的 id 字段对数据库节点数 n 求余规则来分片。
          allow-range-query-with-inline-sharding: true
  keyGenerators:
    snowflake:
      type: SNOWFLAKE
      props:
          worker-id: 123
  • 3.3 在 apache-shardingsphere-xxx-shardingsphere-proxy-bin 目录执行 ./bin/start.bat 或者 ./bin/start.sh 启动服务。

4. Enhancer 工作台配置连接 ShardingProxy,后续开发如常

  • 4.1. 在工作台-全局配置-数据库-连接中配置 3.1 所配置的数据库服务连接[用户 db_account_xxx]和[密码 password],地址为 apache-shardingsphere-xxx-shardingsphere-proxy-bin 所在的机器地址,若在本机则填写为 127.0.0.1,端口号为 3307, 库名为 user_db。
sharding-4.jpeg
  • 4.2. 在工作台-页面管理中创建一个页面,添加一个窗口组件 enhancer-jqgrid, 配置绑定 SQL:
SELECT * FROM t_user

至此,保存后可以运行起来查看效果,后续相关开发如常。

结语

本例仅仅是实现了对单一表的分片增、删、改、查操作。在分布式数据库实战业务开发中,对于一些复杂场景,尤其是在金融级数据强完整性、强一致性、强可用性的要求下,分片中间件并不能做到完全对应用开发层透明,比如多个大表跨数据库 join, 分布式事务等等。此时一般需要通过应用层合理设计,来补偿或者规避这些问题(比如支付宝不允许你跨年查账,也不会提供一个界面同时呈现总账和明细账,需要用户分多次多层点开逐步呈现)。对于已经采用 IOE 结构实现的大规模金融级应用来说,在不改动应用层的情况下就实现去 IOE,还有很长的路要走。而对于一般电商、社交级互联网应用使用 Enhancer + ShardingSphere 来实现对分布式数据库的管理,会是一个不错的选择。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容