打造专业开发者指南:针对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: rootsharding:password: shardingauthorizedSchemas: sharding_dbprops:max.connections.size.per.query: 1acceptor.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: LOCALproxy.opentracing.enabled: falseproxy.hint.enabled: falsequery.with.cipher.column: truesql.show: falseallow.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=falseusername: rootpassword: rootconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50
shardingRule:tables:course:actualDataNodes: m1.course_$->{1..2}tableStrategy:inline:shardingColumn: cidalgorithmExpression: course_$->{cid%2+1}keyGenerator:type: SNOWFLAKEcolumn: 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.0Copyright (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_managerinstanceType: zookeeperserverLists: localhost:2181namespace: orchestrationprops:overwrite: falseretryIntervalMilliseconds: 500timeToLiveSeconds: 60maxRetries: 3operationTimeoutMilliseconds: 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后续版本的不断升级优化,这些问题都会得到 不同程度的改善。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多模态大模型Vary:扩充视觉Vocabulary,实现更细粒度的视觉感知

前言 现代大型视觉语言模型(LVLMs)具有相同的视觉词汇- CLIP&#xff0c;它可以涵盖大多数常见的视觉任务。然而&#xff0c;对于一些需要密集和细粒度视觉感知的特殊视觉任务&#xff0c;例如文档级OCR或图表理解&#xff0c;特别是在非英语场景下&#xff0c;clip风格的词汇…

Springboot集成RabbitMq二

接上一篇&#xff1a;Springboot集成RabbitMq一-CSDN博客 1、搭建项目-消费者 与之前一样 2、创建配置类 package com.wym.rabbitmqconsumer.utils;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.spring…

JDK17 - 开发者视角,从 JDK8 ~ JDK17 都增加了哪些新特性

目录 前言 一、站在开发视角&#xff0c;从 JDK8 升级到 JDK17 都有哪些新特性 1.1、JDK8 新特性 1.1.1、Optional 类 a&#xff09;简介 b&#xff09;使用方法 c&#xff09;使用场景 1.2、JDK9 新特性 1.2.1、Optional - ifPresentOrElse 解决 if-else 1.2.2、Opt…

Java程序设计阶段测试1

一、单选题&#xff08;共15题&#xff1b; 共30.0分&#xff09; 2.0分 1、以下哪个是Java应用程序main方法的有效定义? A.public static void main(); B.public static void main( String args ); C.public static void main( String args[] ); D.public static boolea…

Go Lang Fiber介绍

利用GoLang Fiber进行高性能Web开发 在不断发展的Web开发世界中&#xff0c;选择合适的框架至关重要。速度、简洁性和强大的功能集是每个开发者都追求的品质。在使用Go构建Web应用时&#xff0c;“Fiber”作为一个强大且轻量级的框架在众多选择中脱颖而出。在这份全面的指南中…

扩展:键盘录入笔记(next()、nextLine()、nextInt()、nextDouble())

文章目录 一&#xff0c;键盘录入涉及到的方法如下&#xff1a;1&#xff09;next&#xff08;&#xff09;、nextLine&#xff08;&#xff09;&#xff1a;代码示例&#xff1a;代码示例&#xff1a; 2&#xff09;nextInt&#xff08;&#xff09;&#xff1a;代码示例&…

无辅源电压继电器 RWY-D2/3 180-440VAC 导轨安装 josef约瑟

RWY-D1型电压继电器&#xff1b; RWY-D2型电压继电器&#xff1b; 一、 概述 RWY-D系列电压继电器&#xff08;以下简称本继电器&#xff09;用于发电机、变压器和输电线的电器保护装置中&#xff0c;作为过电压保护或低电压闭锁的启动原件。本继电器为集成电路静态型继电器…

设计模式--适配器模式

适配器模式 适配器模式&#xff08;Adapter&#xff09;&#xff0c;将一个类的接口转换为客户希望的另一个接口&#xff0c;Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 系统的数据和行为都正确&#xff0c;但接口不符合时&#xff0c;我们应该…

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 …

使用anaconda创建爬虫spyder工程

1.由于每个工程使用的环境都可能不一样&#xff0c;因此一个好的习惯就是不同的工程都创建属于自己的环境&#xff0c;在anaconda中默认的环境是base&#xff0c;我们现在来创建一个名为spyder的环境&#xff0c;专门用于爬虫工程&#xff1a; //括号中名字&#xff0c;代表当…

森林火灾数据集

野外火灾是全球范围内最致命和危险的天然灾害之一。它不仅对人类的生命安全构成严重威胁&#xff0c;还对动植物的生存环境造成巨大的破坏。预测火灾行为不仅可以帮助消防员更好地应对火情&#xff0c;还可以为未来的火灾预防和应对策略提供有力支持。 随着航空图像技术的不断…

Windows可以ping通ubuntu,但ubuntu无法ping通windows

使用了NAT网卡和桥接网卡&#xff0c;电脑连了WiFi&#xff0c;桥接网卡桥接到WLAN上&#xff0c;Windows可以ping通Ubuntu但反过来不行&#xff01; 1.可能是防火墙的问题&#xff0c;按照如下设置&#xff0c;无果 考虑是不是使用了两个网卡冲突了&#xff0c;取消NAT的链接 …

【笔记】书生·浦语大模型实战营——第一课

群公告 1月3日*更新 第一次课程视频链接&#xff1a;https://www.bilibili.com/video/BV1Rc411b7ns/&#xff0c;第一次课程只需要记笔记&#xff0c;没有作业。第一次课程(1月3日)和第二次课程(1月5日)到本周末(1月7日)截止&#xff0c;笔记记录在 知乎/CSDN/Github 或者任何你…

【操作系统xv6】学习记录--实验1 Lab: Xv6 and Unix utilities--未完

ref:https://pdos.csail.mit.edu/6.828/2020/xv6.html 实验&#xff1a;Lab: Xv6 and Unix utilities 环境搭建 实验环境搭建&#xff1a;https://blog.csdn.net/qq_45512097/article/details/126741793 搭建了1天&#xff0c;大家自求多福吧&#xff0c;哎。~搞环境真是折磨…

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

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

Document对象详解

前言 在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;扮演着重要的角色。它允许我们使用JavaScript来与网页文档进行交互&#xff0c;实现动态的网页效果。DOM的核心部分之一就是Document对象&#xff0c;它代表了整个HTML文档。在本篇博客中&#xff0c;我们…

华媒舍:6个使你的媒体发稿推广更简单的方法!

做为新闻报道媒体从业人员&#xff0c;在宣传发稿上要行走在最前沿&#xff0c;保持竞争力。下面我们就向您介绍六个又简单又实用的方法&#xff0c;帮助你提升新闻报道媒体营销推广发稿效果。 方法一&#xff1a;明确目标群体我们应该明确定义我们自己的目标群体。掌握观众的特…

小H靶场笔记:DC-3

DC-3 January 3, 2024 4:11 PM Tags&#xff1a;Joomla owner&#xff1a;只惠摸鱼 信息收集 探测靶机ip&#xff1a; 192.168.199.133 nmap 扫描端口、 系统版本 漏洞 发现只有80端口开发&#xff0c; 且有cve-2017-8917漏洞存在是Joomla的SQL注入漏洞 Joomla版本为3.7.0…

相关性与P值

相关性与P值 0 FQA&#xff1a;1 相关性与显著性的关系2 相关性分析3 使用medcalc进行相关性分析&#xff1a;参考文章&#xff1a; 0 FQA&#xff1a; 主要描述相关性和p值分别代表什么意义&#xff1f; 以及如何使用medcalc计算相关性和p值。 Q1&#xff1a;p值代表什么意义…

【每日一题】466. 统计重复个数-2024.1.2

题目&#xff1a; 466. 统计重复个数 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如&#xff0c;str ["abc", 3] "abcabcabc" 。 如果可以从 s2 中删除某些字符使其变为 s1&#xff0c;则称字符串 s1 可以从字符串 s2 获得。 例如&…