打造专业开发者指南:针对ShardingProxy分库分表解决策略的深度剖析 – 详解部署、使用、服务治理与优化技巧

一、 ShardingProxy快速使用

        ShardingProxy的功能同样是分库分表,但是他是一个独立部署的服务端,提供 统一的数据库代理服务。注意,ShardingProxy目前只支持MySQL和PostgreSQL。并且,客户端连接ShardingProxy时,最好使用MySQL的JDBC客户 端。下面我们来部署一个ShardingProxy服务。

1、 ShardingProxy部署

        ShardingProxy在windows和Linux上提供了一套统一的部署发布包。我们可以 从ShardingSphere官网下载4.1.1版本的ShardingProxy发布包apache-shardingsphere-4.1.1-sharding-proxy-bin.tar.gz,解压到本地目录。配套资料中已经提供

  注意不要有中文路径

        首先,我们需要把MySQL的JDBC驱动包mysql-connector-java-8.0.20.jar手动 复制到ShardingProxy的lib目录下。ShardingProxy默认只附带了PostgreSQL的   JDBC驱动包,而不包含MySQL的JDBC驱动包。

        然后,我们需要到conf目录下,修改server.yaml,将配置文件中的 authentication和props两段配置的注释打开。

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
  allow.range.query.with.inline.sharding: false

然后,我们修改conf目录下的config-sharding.yaml,这个配置文件就是shardingProxy关于分库分表部分的配置。整个配置和之前我们使用ShardingJDBC 时的配置大致相同,我们在最下面按照自己的数据库环境增加以下配置:

schemaName: sharding_db
dataSources:
  m1:
    url: jdbc:mysql://localhost:3306/userdb?serverTimezone=GMT%2B8&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
shardingRule:
  tables:
    course:
      actualDataNodes: m1.course_$->{1..2}
      tableStrategy:
        inline:
          shardingColumn: cid
          algorithmExpression: course_$->{cid%2+1}
      keyGenerator:
        type: SNOWFLAKE
        column: cid

然后,还一个小问题要注意,我们进入ShardingProxyLib目录,里面会有些jar 包因为名字太长了,导致有些文件的后缀被截断了,我们要手动把他们的文件后缀给修改过来。

        然后,我们就可以启动ShardingProxy的服务了。启动脚本在bin目录下。其中, windows 平台对应的脚本是start.bat,Linux平台对应的脚本是start.shstop.sh

        启动时,我们可以直接运行start.bat 脚本,这时候ShardingProxy 默认占用的  是3307端口。为了不跟我们之前搭建的多个MySQL 服务端口冲突,我们定制下启动 端口,改为3316端口。

  start.bat 3316

启动完成后,可以看到几行关键的日志标识服务启动成功了。

[INFO ] 10:46:53.930 [main] c.a.d.xa.XATransactionalResource - resource-1- m1: refreshed XAResource
[INFO ] 10:46:54.580 [main] ShardingSphere-metadata - Loading 1 logic tables ' meta data.
[INFO ] 10:46:54.717 [main] ShardingSphere-metadata - Loading 8 tables ' meta data.
[INFO ] 10:46:56.953 [nioEventLoopGroup-2-1]
i.n.handler.logging.LoggingHandler - [id: 0xc90e0eef] REGISTERED [INFO ] 10:46:56.958 [nioEventLoopGroup-2-1]
i.n.handler.logging.LoggingHandler - [id: 0xc90e0eef] BIND:
0.0.0.0/0.0.0.0:3316
[INFO ] 10:46:56.960 [nioEventLoopGroup-2-1]
i.n.handler.logging.LoggingHandler - [id: 0xc90e0eef,
L:/0:0:0:0:0:0:0:0:3316] ACTIVE

2、 ShardingProxy使用

这样,我们就可以像连接一个标准MySQL服务一样连接ShardingProxy了

D:\dev-hook\mysql-8.0.20-winx64\bin>mysql.exe -P3316 -uroot -p Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 8.0.20-Sharding-Proxy 4.1.0

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective
owners.

Type 'help; ' or '\h ' for help. Type '\c ' to clear the current input statement.

mysql> show databases;
+-------------+
| Database    |
+-------------+
| sharding_db |
+-------------+
1 row in set (0.03 sec)

mysql> use sharding_db
Database changed
mysql> show tables;
+--------------------+
| Tables_in_coursedb |
+--------------------+
| course             |
| t_dict             |
+--------------------+
2 rows in set (0.16 sec)

mysql> select * from course;
+--------------------+-------+---------+---------+
| cid                  | cname | user_id | cstatus |
+--------------------+-------+---------+---------+

| 545730330389118976 | java | 545730330804355072 | java | 545730330842103808 | java | 545730330879852544 | java | 545730330917601280 | java	1001 | 1
1001 | 1
1001 | 1
1001 | 1
1001 | 1
+--------------------+-------+---------+---------+
5 rows in set (0.08 sec)

3、 ShardingProxy的服务治理

        从ShardingProxy的server.yaml中看到,ShardingProxy还支持非常多的服务治理功能。在server.yaml配置文件中的orchestration部分属性就演示了如何将 ShardingProxy注册到Zookeeper当中。

orchestration:
  orchestration_ds:
    orchestrationType: registry_center,config_center,distributed_lock_manager
    instanceType: zookeeper
    serverLists: localhost:2181
    namespace: orchestration
    props:
      overwrite: false
      retryIntervalMilliseconds: 500
      timeToLiveSeconds: 60
      maxRetries: 3
      operationTimeoutMilliseconds: 500

ShardingSphere在服务治理这一块主要有两个部分:

        一是数据接入以及弹性伸缩。简单理解就是把MySQL或者其他数据源的数据快速 迁移进ShardingSphere的分片库中。并且能够快速的对已有的ShardingShere分片 库进行扩容以及减配。这一块由ShardingSphere-scaling产品来提供支持。只是这  个功能在目前的4.1.1版本中,还处于Alpha测试阶段。

        另一方面,ShardingSphere支持将复杂的分库分表配置上传到统一的注册中心   中集中管理。目前支持的注册中心有Zookeeper和Etcd。而ShardingSphere也提   供了SPI扩展接口,可以快速接入Nacos、Apollo等注册中心。在ShardingProxy的 server.yaml中我们已经看到了这一部分的配置示例。

        另外,ShardingSphere针对他的这些生态功能,提供了一个ShardingSphere-    UI产品来提供页面支持。ShardingSphere-UI是针对整个ShardingSphere的一个简单有用的Web管理控制台。它用于帮助用户更简单的使用ShardingSphere的相关 功能。目前提供注册中心管理、动态配置管理、数据库编排管理等功能。

4、 Shardingproxy的其他功能

影子库

        这部分功能主要是用于进行压测的。通过给生产环境上的关键数据库表配置一个 影子库,就可以将写往生产环境的数据全部转为写入影子库中,而影子库通常会配 置成跟生产环境在同一个库,这样就可以在生产环境上直接进行压力测试,而不会影响生产环境的数据。

        在conf/config-shadow.yaml中有配置影子库的示例。其中最核心的就是下面的 shadowRule这一部分。

#shadowRule:
#  column: shadow
#  shadowMappings:
# 绑定shadow_ds为ds的影子库
#    ds: shadow_ds

数据加密

        在conf/config-encrypt.yaml中还演示了ShardingProxy的另一个功能,数据加  密。默认集成了AES对称加密和MD5加密。还可以通过SPI机制自行扩展更多的加密算法。

5、 ShardingProxy的SPI扩展

        上一部分提到了ShardingSphere保留了大量的SPI扩展接口,对主流程封闭、对 SPI开放。这在ShardingJDBC中还体现不出太大的作用,但是在ShardingProxy中 就能极大程度提高服务的灵活性了。

        在ShardingProxy中,只需要将自定义的扩展功能按照SPI机制的要求打成jar 包,就可以直接把jar包放入lib目录,然后就配置使用了。

        例如如果想要扩展一个新的主键生成策略,只需要自己开发一个主键生成类

package com.roy.shardingDemo.spiextention;

import org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicLong;

public final class MyKeyGenerator implements ShardingKeyGenerator {

    private AtomicLong atom = new AtomicLong(0);
    private Properties properties = new Properties();

    public synchronized Comparable<?> generateKey() {
        // 读取了一个自定义属性
        String prefix = properties.getProperty("mykey-offset", "100");
        LocalDateTime ldt = LocalDateTime.now();
        String timestampS = DateTimeFormatter.ofPattern("HHmmssSSS").format(ldt);
        return Long.parseLong("" + prefix + timestampS + atom.incrementAndGet());
    }

    // 扩展算法的类型
    public String getType() {
        return "MYKEY";
    }

    public Properties getProperties() {
        return this.properties;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }
}

        然后增加一个META-INF\ services\org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator文 ,并在文件中写明自己的实现类。

        com.roy.shardingDemo.spiextention.MykeyGenerator将扩展类和这个SPI 服务文件一起打成jar包,就可以直接放到ShardingProxy lib 目录下。

mysql> select * from course;
+--------------------+-------+---------+---------+
| cid                  | cname | user_id | cstatus |
+--------------------+-------+---------+---------+

|                222 | java2
| 545730330389118976 | java | 545730330804355072 | java | 545730330842103808 | java | 545730330879852544 | java | 545730330917601280 | java	1002 | 1
1001 | 1
1001 | 1
1001 | 1
1001 | 1
1001 | 1
+--------------------+-------+---------+---------+
6 rows in set (0.01 sec)

mysql> insert into course(cname,user_id,cstatus) values ( 'java2 ',1002, '1 '); Query OK, 1 row affected (0.11 sec)

mysql> insert into course(cname,user_id,cstatus) values ( 'java2 ',1003, '1 '); Query OK, 1 row affected (0.01 sec)

mysql> select * from course;
+--------------------+-------+---------+---------+
| cid                  | cname | user_id | cstatus |
+--------------------+-------+---------+---------+

|                222 | java2
|      1001509178012 | java2
| 545730330389118976 | java | 545730330804355072 | java | 545730330842103808 | java | 545730330879852544 | java | 545730330917601280 | java
|      1001509119631 | java2	1002 | 1
1003 | 1
1001 | 1
1001 | 1
1001 | 1
1001 | 1
1001 | 1
1002 | 1
+--------------------+-------+---------+---------+
8 rows in set (0.01 sec)

        从结果可以看到,插入的两条记录,自动生成的CID分别为1001509178012、1001509119631。这样我们就很快的完成了一个自定义的主键生成策略。

二、 ShardingSphere总结

        我们现在已经学完了ShardingSphere除了Sharding-SideCar以外的所有产品了,整个sharding + proxy的所有这些功能,本质上其实都只解决了一个问题,就 是单机数据库容量的问题。在软件层面对硬件资源进行管理,从而便于对数据库的横向扩展。

        但是,我们也要意识到他带来的很多问题。

        例如对业务的侵入大。业务系统写的SQL将不再是纯粹的能在服务器上运行的 SQL了,对大量跨维度的JOIN、聚合、子查询、排序等功能在业务上很难进行验证。这必然会弱化数据库的功能。

        并且,使用ShardingSphere管理后,数据库之间变成了结合非常紧密的依赖关 系,对整个集群的扩容也会带来相当大的难度。

        另外,ShardingSphere这种方式实际上将原本由业务管理SQL的工作方式,转化 成了由业务管理逻辑SQL,而运维管理实际SQL的混合工作模式,再加上一大堆服务的引入,整个服务运维的维护工作量以及工作难度也上升了非常多。

        当然,相信随着ShardingSphere后续版本的不断升级优化,这些问题都会得到 不同程度的改善。

三、 与其他相关产品的对比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/288720.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

主流桌面浏览器Chrome,FireFox和Edge等如何禁用弹出式窗口阻止程序,这里有详细步骤

为什么你想知道如何禁用浏览器中的弹出式窗口阻止程序?毕竟,弹出式窗口是网络的祸害:显示烦人的广告、虚假的安全消息和其他刺激,会分散你的浏览注意力,甚至可能包含恶意代码。 所有主要的桌面浏览器现在都默认阻止弹出式窗口,那么你到底为什么要取消阻止这些害虫呢?事…

人机协同的关键

逻辑和实验是现代科学研究的两个支柱&#xff0c;这是因为科学研究需要不断地进行理论和实践的相互验证和修正&#xff0c;而逻辑和实验则分别代表了这两个方面的重要性和必要性。只有将逻辑和实验有效结合起来&#xff0c;它们相辅相成&#xff0c;互相促进&#xff0c;共同推…

【论文阅读】AADiff: Audio-Aligned Video Synthesis with Text-to-Image Diffusion

AADiff:基于文本到图像扩散的音频对齐视频合成。 code&#xff1a;没开源 paper&#xff1a;[2305.04001] AADiff: Audio-Aligned Video Synthesis with Text-to-Image Diffusion (arxiv.org) 一种新的T2V框架&#xff0c;额外使用音频信号来控制时间动态&#xff0c;使现成的…

快速入门ESP32——点亮你的第一个LCD屏幕

相关文章 快速入门ESP32——开发环境配置Arduino IDE 快速入门ESP32——开发环境配置PlatformIO IDE 快速入门ESP32—— platformIO添加开源库和自己的开发库 快速入门ESP32—— 解决platformIO添加开源库下载失败的问题 快速入门ESP32——点亮你的第一个LCD屏幕 前言一、移植T…

Python 流程控制结构(1)

# 在Python主要分为3大流程结构&#xff1a;顺序结构、分支结构、循环结构 Python顺序结构&#xff1a;从头到尾依次执行每一条 , 不需要判断 Python分支结构&#xff1a;程序会拐弯&#xff0c;有选择性的执行代码 ,到某个节点后&#xff0c;会根据一次判断结果来决定之后走哪…

【损失函数】Cross Entropy Loss 交叉熵损失

1、介绍 主页介绍的几种损失函数都是适用于回归问题损失函数&#xff0c;对于分类问题&#xff0c;最常用的损失函数是交叉熵损失函数 Cross Entropy Loss。它用于测量两个概率分布之间的差异&#xff0c;通常用于评估分类模型的性能。 2、公式 对于二分类问题&#xff0c;交…

DolphinScheduler实际应用

前言 最近公司新启动了一个项目&#xff0c;然后领导想用一下新技术&#xff0c;并且为公司提供多个大数据调度解决方案&#xff0c;我呢就根据领导要求调研了下当前的开源调度工具&#xff0c;最终决定采用DolphinScheduler&#xff0c; 因此研究了一下DolphinScheduler &…

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于头脑风暴优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

QProgressDialog用法及结合QThread用法,四种线程使用

1 QProgressDialog概述 QProgressDialog类提供耗时操作的进度条。 进度对话框用于向用户指示操作将花费多长时间&#xff0c;并演示应用程序没有冻结。此外&#xff0c;QPorgressDialog还可以给用户一个中止操作的机会。 进度对话框的一个常见问题是很难知道何时使用它们;操作…

ASP.NET Core基础之图片文件(一)-WebApi访问静态图片

阅读本文你的收获&#xff1a; 学会在WebApi项目中访问静态图片了解静态文件中间件UseStaticFiles的用法 系统中免不了要去处理图片文件&#xff0c;比如上传商品的图片、显示商品的图片&#xff0c;访问系统中的图片等等&#xff0c;根据微软官网描述&#xff1a; 静态文件&a…

阿里巴巴开源异构数据源离线/全量/增量同步工具 - DataX

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

android——自定义TextView

效果展示&#xff1a; 代码解析&#xff1a; 1、首先设置自定义属性&#xff08;res/values下新建一个attrs.xml文件&#xff09; <?xml version"1.0" encoding"utf-8"?> <resources><!-- name 自定义view的名字 CustomTextView--&…

假期归来必看!2023年9月份,爆款论文总结,了解最新学术进展!

以下文章来源于AINLPer &#xff0c;作者ShuYini 十一假期结束了&#xff0c;十月基本上算是过了一半了&#xff0c;小伙伴们收收心准备开始学习工作吧。按照惯例&#xff0c;月初继续带到家盘一下上个月(九月份)的热点论文。本月论文主要分为大模型微调、大模型发布、大模型应…

jmeter线程组

特点&#xff1a;模拟用户&#xff0c;支持多用户操作&#xff1b;可以串行也可以并行 分类&#xff1a; setup线程组&#xff1a;初始化 类似于 unittest中的setupclass 普通线程组&#xff1a;字面意思 teardown线程组&#xff1a;环境恢复&#xff0c;后置处理

泰国Cafe Racer卖到日本去了还限量150台?

GPX推出日本限定 GTM250R Cafe Racer&#xff0c;复古小车卖到日本去了&#xff0c;限量150台&#xff0c;不得不说这台小车还是挺有味道的。现代的复古风格摩托车也是永远都不会落伍&#xff0c;即使没有什么品牌背书&#xff0c;喜欢这种车型的人&#xff0c;对于配置动力都不…

Uniapp使用wx.getFuzzyLocation()方法,没有超过日调用次数,报错:“此key每日调用已达到上限”

前言&#xff1a; 最近在进行一个小程序项目开发的时候&#xff0c;使用wx.getFuzzyLocation()方法&#xff0c;没有超过日调用次数&#xff0c;但是却出现了报错&#xff1a;“此key每日调用已达到上限”。 解决方案&#xff1a; 打开腾讯位置服务 - 立足生态&#xff0c;连…

学习Go语言Web框架Gee总结--http.Handler(一)

学习Go语言Web框架Gee总结--http.Handler http-base/go.modhttp-base/main.gohttp-base/gee/gee.gohttp-base/gee/go.mod 网站学习来源&#xff1a;Gee 代码目录结构&#xff1a; http-base/go.mod //指定当前模块的名称为 "example" module example//指定当前模…

Python入门学习篇(十七)——封装、继承、多态

1 封装 1.1 理解 属性和方法书写到类里面的操作即为封装 封装可以理解成私有化属性和私有化方法1.2 示例代码 class Person():p_num 0 # 用于统计数量def __init__(self, name, age, sex, job):# __name为私有化属性self.__name nameself.age ageself.sex sexself.job …

一种可扩展的多属性可控文本生成即插即用方法

《An extensible plug-and-play method for multi-aspect controllable text generation》论文解读 文章的主要工作 &#xff08;1&#xff09;提出了一种可扩展的即插即用方法&#xff0c;PROMPT GATING&#xff0c;用于多方面可控文本生成&#xff0c;它能够通过简单地连接…

引导和服务

一、Linux操作系统引导过程 1、引导过程总览图 2、引导过程的详细步骤 1.开机自检&#xff08;BIOS&#xff09; 服务器主机开机以后&#xff0c;将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测&#xff0c;检测成功后根据预设的启动顺序移交系统控制权&a…