apache/sharding-proxy 分库分表
https://shardingsphere.apache.org/document/current/en/overview/ (官方文档)
sharding主要有三种接入方式
- Sharding-JDBC:通过程序代码实现Sharding的介入,只是多种数据库。但是使用微服务需要多服务配置。
- Sharding-proxy:通过官方提供的程序,相当于中间件实现。当做Mysql/PostgreSQL下载或通过docker在本地启动。
- Sharding-Sidecar:更注重于服务网格化。
1.apache/sharding-proxy
-
去官方文档选择需要下载的文件
-
连接mysql的话需要在lib文件夹中添加mysql连接jar
链接:https://pan.baidu.com/s/11iuw7N_XyTmuuqmRaJhOFA
提取码:flmd
-
修改conf/server.yaml文件
authentication: users: root: password: root sharding: password: sharding authorizedSchemas: sharding_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
-
修改conf/config-sharding.yaml文件
#sharding数据库名
schemaName: sharding_db
#需要分库分表的数据库信息
dataSourceCommon:
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
maintenanceIntervalMilliseconds: 30000
#需要分库分表的连接方式(需要创建好两个库,表不用创建)
dataSources:
ds_0:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
#分库分表规则
rules:
- !SHARDING
#数据库表
tables:
#表名
t_order:
#数据节点 :数据库名.表名
actualDataNodes: ds_${0..1}.t_order_${0..1}
#分表策略
tableStrategy:
#策略
standard:
#列名
shardingColumn: order_id
#分表算法名称(在下边有定义)
shardingAlgorithmName: t_order_inline
#主键生成策略
keyGenerateStrategy:
#列名
column: order_id
#生成算法名称(雪花算法)
keyGeneratorName: snowflake
#绑定表
bindingTables:
- t_order
#分库策略
defaultDatabaseStrategy:
#标准
standard:
#列名
shardingColumn: user_id
#分库算法名称(在下边有定义)
shardingAlgorithmName: database_inline
defaultTableStrategy:
none:
#算法定义
shardingAlgorithms:
#算法名称
database_inline:
#类型
type: INLINE
props:
#分库算法表达(ds_${拿user_id取余2就可得到0101})随之进入该库
algorithm-expression: ds_${user_id % 2}
t_order_inline:
type: INLINE
props:
#分表算法表达(t_order_${拿order_id取余2就可得到0101})随之进入该表
algorithm-expression: t_order_${order_id % 2}
#主键生成器
keyGenerators:
snowflake:
type: SNOWFLAKE
props:
worker-id: 123
- 启动Sharding-proxy
-
通过nacvat连接(版本有可能导致连接不上)
-
根据文件的表名定义进行表创建定义
-
CREATE TABLE if not EXISTS t_order (order_id BIGINT NOT NULL,user_id INT NOT NULL,status VARCHAR(50),PRIMARY KEY (order_id))
-
创建语句执行后代理库中会多出一张表
-
随之在配置文件配置好的两个库中就会生成表
-
使用insert语句进行测试
使用user_id为奇数的值进行测试
INSERT INTO t_order( `user_id`, `status`) VALUES ( 1, '1');
由于在配置文件设置了主键为雪花算法生成,所以主键会自动生成
主键是随机生成的我们无法判断在哪个库,但是分表的策略是根据user_id,而user_id为奇数。所以数据肯定被分到了后缀为奇数的表中。
生成的主键ID为奇数,所以分库的应该也是奇数库
使用user_id为偶数的值进行测试
INSERT INTO t_order( `user_id`, `status`) VALUES ( 2, '1');
-