分库分表sharding-jdbc

左手的ㄟ右手 2022-11-28 13:39 241阅读 0赞

一、为什么要分库分表
图示为垂直分库
在这里插入图片描述
二、分库分表的方式
分库分表有4种方式,垂直分库/垂直分表,水平分库/水平分表
1.垂直分库
把原本的单库拆成多库,一般是根据表来分库。如把用户表分成单独的用户库。
2.垂直分表
把原来的单表拆成多表,一般是把一些大数据高量查询的字段,独立成一个新表。如把商品表中的商品详情字段拆成一张新的商品详情表。

垂直分库/分表本质上,只是把单一数据库,数据表,进行优化。把各个表的查询压力,由原来的单一数据库,分流到个每个表拆分后的数据库中。数据量大了之后,拆分后的数据库也不能高效工作了,这时就要把库中的数据进行分散。也就是水平分库。

3.水平分库
把单库中的数据,分散到多个库中,如把用户库分成用户库_0,用户库_1。
4.水平分表
把单表中的数据,分散到多个表中,如把用户表分成用户表_0,用户表_1。

水平分库/分表,一般都是要设置分库键,和分表键的。不设置的话会查询所有分库节点,产生多余的查询。

三、使用sharding-jdbc实现水平分库分表
垂直分库分表不概述,因为一般使用微服务方式开发,就是使用垂直分库了。垂直分表则是一个表的设计问题了。
因此,只讨论一下怎么sharding-jdbc水平主从复制分库分表

一、确定数据库节点
声明所有数据库节点,我这里是2个业务节点order_db_0(m0),order_db_1(m1),但做了主从复制,所以有2个是从节点。2个主节点,负责写。2个从节点负责读,实现了读写分离,总共4个节点。
在这里插入图片描述
在这里插入图片描述

二、设置主从关系
一个主从关系,对应一个名称。2个业务节点那就是有两个主从关接在这里插入图片描述
三、设置业务节点分库逻辑
有2个业务节点,就直接user_id%2了,因为取值为0-1嘛。
在这里插入图片描述
四、设置业务节点分表逻辑
有3个逻辑表。在这里插入图片描述
五、选配公共表
在这里插入图片描述
六、真实场景注意
一般最少设3个节点3个分表。也就是分库逻辑,分表逻辑要最少%3。
因为, 一般项目的并发不会很高,基本不会在同一毫秒内产生多个并发,那么每个不同毫秒产生的第一个nextId雪花值,都为偶数。那么%2值,百分百为0。这样的话所有数据都在一个库中了,就不能上平均分到每个节点上了。

  1. spring:
  2. redis:
  3. host: 127.0.0.1
  4. port: 6379
  5. shardingsphere:
  6. datasource:
  7. # names: m$->{0..2}
  8. names: m$->{0}
  9. m0:
  10. type: com.zaxxer.hikari.HikariDataSource
  11. driverClassName: com.mysql.jdbc.Driver
  12. jdbc-url: jdbc:mysql://localhost:3306/task_chat_task_0?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
  13. username: root
  14. password: root
  15. # m1:
  16. # type: com.zaxxer.hikari.HikariDataSource
  17. # driverClassName: com.mysql.jdbc.Driver
  18. # jdbc-url: jdbc:mysql://localhost:3306/task_chat_task_1?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
  19. # username: root
  20. # password: root
  21. # m2:
  22. # type: com.zaxxer.hikari.HikariDataSource
  23. # driverClassName: com.mysql.jdbc.Driver
  24. # jdbc-url: jdbc:mysql://localhost:3306/task_chat_task_2?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
  25. # username: root
  26. # password: root
  27. sharding:
  28. tables:
  29. task:
  30. # actualDataNodes: m$->{0..2}.task
  31. actualDataNodes: m$->{0}.task
  32. database-strategy:
  33. inline:
  34. shardingColumn: task_id
  35. algorithmExpression: m$->{task_id%1}
  36. chat:
  37. # actualDataNodes: m$->{0..2}.chat
  38. actualDataNodes: m$->{0}.chat
  39. database-strategy:
  40. inline:
  41. shardingColumn: chat_id
  42. algorithmExpression: m$->{chat_id%1}
  43. list:
  44. # actualDataNodes: m$->{0..2}.list
  45. actualDataNodes: m$->{0}.list
  46. database-strategy:
  47. inline:
  48. shardingColumn: list_id
  49. algorithmExpression: m$->{list_id%1}
  50. props:
  51. sql:
  52. show: true
  53. server:
  54. port: 1003
  55. seata:
  56. enabled: true
  57. service:
  58. vgroup-mapping: default
  59. grouplist:
  60. default: 127.0.0.1:8091
  61. disable-global-transaction: false
  62. dubbo:
  63. registry:
  64. address: spring-cloud://127.0.0.1
  65. protocol:
  66. name: dubbo
  67. port: -1
  68. scan:
  69. base-packages: springcloud
  70. spring:
  71. shardingsphere:
  72. datasource:
  73. names: m0
  74. m0:
  75. type: com.zaxxer.hikari.HikariDataSource
  76. driverClassName: com.mysql.jdbc.Driver
  77. jdbc-url: jdbc:mysql://localhost:3306/taskchat_user_0?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
  78. username: root
  79. password: root
  80. sharding:
  81. tables:
  82. user:
  83. # 不分表,2020。10。5认为分表没必要
  84. # actualDataNodes: m0.user_$->{0..2}
  85. actualDataNodes: m0.user
  86. # tableStrategy:
  87. # inline:
  88. # shardingColumn: user_id
  89. # algorithmExpression: user_$->{user_id%3}
  90. database-strategy:
  91. inline:
  92. shardingColumn: phone
  93. algorithmExpression: m$->{phone%1}
  94. props:
  95. sql:
  96. show: true
  97. redis:
  98. host: 127.0.0.1
  99. port: 6379
  100. server:
  101. port: 1001
  102. seata:
  103. enabled: true
  104. service:
  105. vgroup-mapping: default
  106. grouplist:
  107. default: 127.0.0.1:8091
  108. disable-global-transaction: false
  109. sms:
  110. id: LTAI4G1SPA3fPuZBHESLZzVz
  111. sercret: ck4fY3W4pkSwEHR4XF0qDky0hS2OWO

发表评论

表情:
评论列表 (有 0 条评论,241人围观)

还没有评论,来说两句吧...

相关阅读