ShardingSphere 数据库中间件

农民  金牌会员 | 2024-12-5 18:22:39 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 873|帖子 873|积分 2619

数据库中的数据量猛增,访问性能也变慢了,优化迫不及待   ?       1.   关系型数据库本身比较轻易成为系统瓶颈:单机存储容量、数据库连接数、处理本领都有限。        2.   当单表的数据量到达   1000W   或   100G   以后,由于查询维度较多,即使做了优化索引等操作, 查询性能仍下降严重。        方案   1   :        通过提升服务器硬件本领来进步数据处理本领,比如增加存储容量 、   CPU   等,这种方案成本很高,并且如果瓶颈在MySQL   本身那么进步硬件也是有很的。        方案   2   :        把数据分散在不同的数据库中,使得单一数据库的数据量变小来缓解单一数据库的性能问题,从而到达提升数据库性能的目的;    一、分库分表概述

     
       分库分表就是为了解决由于数据量过大而导致数据库性能低落的问题    ;           1.    将原来独立的数据库拆分成若干数据库组成    ;           2.    将原来的大表    (    存储近千万数据的表    )    拆分成若干个小表;           目的:使得单一数据库、单一数据表的数据量变小,从而到达提升数据库性能的目的       二、 数据库拆分策略


 

 
   1.   垂直分割     垂直分割是将一个表按照列的方式拆分成多个表,减少单个表的记载数和列数,进步查询性能。垂直分割一般     分为两种: 基于功能分割和基于范式分割。例如,将一个用户表拆分为登录信息表、用户信息表和账户信息表。     2.   水中分割     水中分割是将一个表按照行的方式拆分成多个表,将数据存储到多个服务器上,进步查询性能。水中分割一般按照主键或按照特定的列进行分割。例如,将一个订单表按照订单号拆分成多个表。     4.   读写分离     读写分离是将对数据库的读操作和写操作拆分到不同的服务器上,减轻单个数据库的负载压力,进步查询性能。例如,将一个电商网站的读取操作分配到从数据库上,将写操作分配到主数据库上。     5.   分片     分片是将一个大型数据表按照某个维度拆分成多个小的数据表,并将数据存储到多个服务器上。分片一般按照分片键进行分割,例如,将一个电商网站的订单表按照某个地理位置分割成多个子表。   三、本机安装多个mysql

   复制  mysql  安装目次下文件夹到某盘    

 修改my.ini文件
  1. [mysqld]
  2. # 设置3306端口
  3. port=3381
  4. # 设置mysql的安装目录
  5. basedir=D:\\mysql-8.0.39-winx64-3381
  6. # 设置mysql数据库的数据的存放目录
  7. datadir=D:\\mysql-8.0.39-winx64-3381\mysqldata
  8. #开启慢日志
  9. slow_query_log=1
  10. long_query_time=2
  11. # 允许最大连接数
  12. max_connections=200
  13. # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
  14. max_connect_errors=10
  15. sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_
  16. ZERO,NO_ENGINE_SUBSTITUTION
  17. server-id=101
  18. # 服务端使用的字符集默认为UTF8
  19. character-set-server=utf8mb4
  20. # 创建新表时将使用的默认存储引擎
  21. default-storage-engine=INNODB
  22. # 默认使用“mysql_native_password”插件认证
  23. default_authentication_plugin=caching_sha2_password
  24. [mysql]
  25. # 设置mysql客户端默认字符集
  26. default-character-set=utf8
  27. [client]
  28. # 设置mysql客户端连接服务端时默认使用的端口
  29. port=3381
  30. # 设置默认字符集为UTF8MB4
  31. default-character-set=utf8mb4
复制代码
  留意修改文件路径:  basedir  与  datadir  ,端标语,  server-id=  唯一     cmd  打开  dos  命令,以管理员身分运行   
   执行   mysqld --defaults-file=D:\mysql-8.0.39-winx64-3381\my.ini --initialize --console   目次改为本身     的,初始化数据库存储目次    留意修改路径   
    记住临时生成的暗码,例如:  2O/2ARj9mv)7     使用命令创建服务,  mysqld install MySQL3381 --defaults-file=D:\mysql-8.0.39-winx64-3381\my.ini    留意修改端标语和路径       如果服务安装有问题   ,   删除服务命令:        mysqld    -   remove    服务名        使用命令进入   mysql -uroot -p -P   端标语    ,   进入控制台修改暗码        ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';    修改暗码        刷新   flush privileges;   即可使用        安装完成后启动服务   ,   使用工具连接测试   :      
     四、MYSQL实现读写分离


   3381  为主,  3382  为从     修改  3381  中  my.ini  文件信息     添加如下代码     log-bin=D:\mysql8.0log\mysql-bin     binlog-do-db=smbms         =后是数据库名
  1. [mysqld]
  2. # 设置3306端口
  3. port=3381
  4. # 设置mysql的安装目录
  5. basedir=D:\\mysql-8.0.39-winx64-3381
  6. # 设置mysql数据库的数据的存放目录
  7. datadir=D:\\mysql-8.0.39-winx64-3381\mysqldata
  8. #开启慢日志
  9. slow_query_log=1
  10. long_query_time=2
  11. # 允许最大连接数
  12. max_connections=200
  13. # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
  14. max_connect_errors=10
  15. sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_
  16. ZERO,NO_ENGINE_SUBSTITUTION
  17. server-id=101
  18. # 服务端使用的字符集默认为UTF8
  19. character-set-server=utf8mb4
  20. # 创建新表时将使用的默认存储引擎
  21. default-storage-engine=INNODB
  22. # 默认使用“mysql_native_password”插件认证
  23. default_authentication_plugin=caching_sha2_password
  24. #log-bin需要在D盘下创建文件夹mysql8.0log用于存储日志文件信息
  25. log-bin=D:\\mysql8.0log\mysql-bin
  26. #binlog-do-db 为要主从的数据库名
  27. binlog-do-db=smbms
  28. [mysql]
  29. # 设置mysql客户端默认字符集
  30. default-character-set=utf8
  31. [client]
  32. # 设置mysql客户端连接服务端时默认使用的端口
  33. port=3381
  34. # 设置默认字符集为UTF8MB4
  35. default-character-set=utf8mb4
复制代码
    重启服务并输入命令检察日志信息        show master status;      
     
   000002  最新的版本信息     位置默认到  563     留意:可以另外在创建一个新的用户以供连接使用,此处我使用  root       修改   3382   中的   my.ini   文件   ,   并重启服务        添加如下代码                log-bin     =     D     :     \\mysql8.0log\mysql-bin              replicate-do-db     =     smbms              log-slave-updates            使用dos命令进入3382数据库,并进行信息绑定
  1. mysql -uroot -p -P3382
  2. stop slave;
  3. # 127.0.0.1为主数据库IP 3381为主数据库端口 用户,密码为主数据库 000001要与主数据库log版本
  4. 相同 157也一样
  5. change master to
  6. master_host='127.0.0.1',master_port=3381,master_user='root',master_password='roo
  7. t',master_log_file='mysql-bin.000001',master_log_pos=157;
  8. start slave;
  9. show slave status\G; #查看是否连接 若使用Navicat 使用show slave status;
复制代码

 
 如果失败,尝试修改uuid

   成功后进行测试     修改主库  3381  数据信息  ,3382  也会改变  五、ShardingSphere简介

 
      Apache ShardingSphere   是一款开源的分布式数据库中间件组成的生态圈,它由   Sharding       JDBC   、   Sharding-Proxy   和   Sharding-Sidecar   (规划中)这   3   款相互独立的产品组成。        ShardingSphere   定位为关系型数据库中间件,旨在充实合理地在分布式的场景下利用关系型数据库的 计算和存储本领,而并非实现一个全新的关系型数据库。       1  )   Sharding-JDBC  :被定位为轻量级  Java  框架,在  Java  的  JDBC  层提供的额外服务,以  jar  包情势使用。     2  )   Sharding-Proxy  :被定位为透明化的数据库署理端,提供封装了数据库二进制协议的服务端版 本,用于完成对异构语言的支持。     3  )   Sharding-Sidecar  :被定位为  Kubernetes  或  Mesos  的云原生数据库署理,以  DaemonSet  的情势署理所有对数据库的访问。  六、ShardingSphere-JDBC


   ShardingSphere-JDBC   是   ShardingSphere   的第一个产品,也是   ShardingSphere   的前身, 我们经常 简称之为:sharding-jdbc   。 它定位为轻量级   Java   框架,在   Java   的   JDBC   层提供的额外服务。它使用 客户端直连数据库,以 jar   包情势提供服务,无需额外摆设和依赖,可明白为增强版的   JDBC   驱动,完 全兼容 JDBC   和各种   ORM   框架。     适用于任何基于  Java  的  ORM  框架,如:  JPA, Hibernate, Mybatis, Spring JDBC Template  或直接使用 JDBC。 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP  等。     支持任意实现  JDBC  规范的数据库。如今支持  MySQL  ,  Oracle  ,  SQLServer  和  PostgreSQL  。    sharding-jdbc   的本质上就是实现   JDBC   的焦点接口。   
  七、 ShardingSphere-JDBC+mybatisplus

1.读写分离(水平拆分库)


   3381  中  smbms  为主库,  3382  中  smbms  为从库     2  个库中都需同时存在  smbms_user  表,要求结构相同     引入  jar  包   
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <!--驱动包-->
  6. <dependency>
  7.     <groupId>com.mysql</groupId>
  8.     <artifactId>mysql-connector-j</artifactId>
  9.     <version>8.0.33</version>
  10. </dependency>
  11. <dependency>
  12.     <groupId>org.apache.shardingsphere</groupId>
  13.     <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  14.     <version>4.0.0-RC1</version>
  15. </dependency>
  16. <!-- mybatis-plus -->
  17. <dependency>
  18.     <groupId>com.baomidou</groupId>
  19.     <artifactId>mybatis-plus-boot-starter</artifactId>
  20.     <version>3.4.0</version>
  21. </dependency>
  22. <!--阿里数据库连接池 -->
  23. <dependency>
  24.     <groupId>com.alibaba</groupId>
  25.     <artifactId>druid-spring-boot-starter</artifactId>
  26.     <version>1.1.10</version>
  27. </dependency>
复制代码
    编写   yml   文件   (   留意缩进   )      
  1. server:
  2.   port: 8080
  3. mybatis-plus:
  4.   type-aliases-package: com.hz.pojo
  5.   configuration:
  6.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  7.     map-underscore-to-camel-case: false
  8. spring:
  9.   shardingsphere:
  10.     masterslave:
  11.       load-balance-algorithm-type: round_robin #从库负载均衡轮询
  12.       name: ds
  13.       master-data-source-name: db1 #主库
  14.       slave-data-source-names: db2 #从库,多个可以使用,隔开
  15.     datasource:
  16.       names: db1,db2
  17.       db1:
  18.         type: com.alibaba.druid.pool.DruidDataSource
  19.         driver-class-name: com.mysql.cj.jdbc.Driver
  20.         url: jdbc:mysql://127.0.0.1:3381/smbms
  21.         username: root
  22.         password: root
  23.       db2:
  24.         type: com.alibaba.druid.pool.DruidDataSource
  25.         driver-class-name: com.mysql.cj.jdbc.Driver
  26.         url: jdbc:mysql://127.0.0.1:3382/smbms
  27.         username: root
  28.         password: root
  29.     props:
  30.       sql:
  31.         show: true #打印SQL语句
  32.   main:
  33.     allow-bean-definition-overriding: true #允许覆盖bean
复制代码
      编写代码,新增与查询进行测试       2.分库分表(水平拆分)

       分表:在同一数据库下创建两张订单表,要求结构相同,让    id    为奇数数据放入    smbms_bill_1    中    ,id    为偶数 数据放入smbms_bill_2    中,分开存储数据,查询是归并在一起。           分库分表:在    3381    与    3382    下创建    smbms02    数据库,在    3381    下创建    smbms_bill_1    ,在    3382    下创建           smbms_bill_2      
  1. spring:
  2.   main:
  3.     allow-bean-definition-overriding: true #就是允许定义相同的bean对象 去覆盖原有的
  4.   shardingsphere:
  5.     datasource:
  6.       names: ds0,ds1 # 一主一从
  7.       ds0:
  8.         type: com.alibaba.druid.pool.DruidDataSource
  9.         driver-class-name: com.mysql.cj.jdbc.Driver
  10.         url: jdbc:mysql://127.0.0.1:3381/smbms02
  11.         username: root
  12.         password: root
  13.       # 从数据源
  14.       ds1:
  15.         type: com.alibaba.druid.pool.DruidDataSource
  16.         driver-class-name: com.mysql.cj.jdbc.Driver
  17.         url: jdbc:mysql://127.0.0.1:3382/smbms02
  18.         username: root
  19.         password: root
  20.     sharding:
  21.       tables:
  22.         smbms_bill: # 指定表名,此名必须和model中 @TableName(value = "my_table") 一致
  23.           actual-data-nodes: ds$->{0..1}.smbms_bill_$->{1..2} # 创建了两个表,下标0和1 如果在同一数据库下,只做分表 ds0.smbms_bill_$->{1..2}
  24.           key-generator:
  25.           column: id # 主键ID
  26.           type: SNOWFLAKE # 生成策略雪花id
  27.         databaseStrategy: #如果只分表,可不设置
  28.           inline: # 指定表的分片策略
  29.           shardingColumn: id #参与分片运算的列名
  30.           algorithmExpression: ds$->{id % 2} #分片算法
  31.          # 分表策略
  32.         table-strategy:
  33.           inline: # 指定表的分片策略
  34.             sharding-column: id
  35.             algorithm-expression: smbms_bill_$->{id % 2 + 1} #分片规则
  36.     props:
  37.       sql:
  38.         show: true
  39. mybatis-plus:
  40.   type-aliases-package: com.hz.pojo
  41.   configuration:
  42.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  43.     map-underscore-to-camel-case: false #驼峰映射
复制代码
 
3.读写分离+分库分表(水平拆分)

   创建数据库smbms01与smbms02
  分别在smbms01与02中创建表smbms_user,smbms_bill_1,smbms_bill_2
  1. spring:
  2.   main:
  3.     allow-bean-definition-overriding: true #就是允许定义相同的bean对象 去覆盖原有的
  4.   shardingsphere:
  5.     datasource:
  6.       names: ds0,ds1 # 一主一从
  7.       ds0:
  8.         type: com.alibaba.druid.pool.DruidDataSource
  9.         driver-class-name: com.mysql.cj.jdbc.Driver
  10.         url: jdbc:mysql://127.0.0.1:3381/smbms01
  11.         username: root
  12.         password: root
  13.       # 从数据源
  14.       ds1:
  15.         type: com.alibaba.druid.pool.DruidDataSource
  16.         driver-class-name: com.mysql.cj.jdbc.Driver
  17.         url: jdbc:mysql://127.0.0.1:3382/smbms02
  18.         username: root
  19.         password: root
  20.     sharding:
  21.       tables:
  22.         smbms_bill: # 指定表名,此名必须和model中 @TableName(value = "my_table") 一致
  23.           actual-data-nodes: ds0.smbms_bill_$->{1..2} # 创建了两个表,下标0和1
  24.           key-generator:
  25.             column: id # 主键ID
  26.             type: SNOWFLAKE # 生成策略雪花id
  27.             分库分表(垂直拆分)
  28.             # 分表策略
  29.           table-strategy:
  30.             inline: # 指定表的分片策略
  31.               sharding-column: id
  32.               algorithm-expression: smbms_bill_$->{id % 2 + 1} #分片规则
  33.   master-slave-rules:
  34.       ds0:
  35.         master-data-source-name: ds0
  36.         slave-data-source-names: ds2
  37.         load-balance-algorithm-type: round_robin
  38.   props:
  39.     sql:
  40.       show: true
  41. mybatis-plus:
  42.   type-aliases-package: com.hz.pojo
  43.   configuration:
  44.      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  45.      map-underscore-to-camel-case: false #驼峰映射
复制代码
4.分库分表(垂直拆分)

     分别创建数据库   smbms01   与   smbms02        smbms01   中创建表   smbms_user        smbms02   中创建表   smbms_bill(   订单表)      
  1. spring:
  2.   main:
  3.     allow-bean-definition-overriding: true #就是允许定义相同的bean对象 去覆盖原有的
  4.   shardingsphere:
  5.     datasource:
  6.       names: ds0,ds1
  7.       ds0:
  8.         type: com.alibaba.druid.pool.DruidDataSource
  9.         driver-class-name: com.mysql.cj.jdbc.Driver
  10.         url: jdbc:mysql://127.0.0.1:3381/smbms01
  11.         username: root
  12.         password: root
  13.       ds1:
  14.         type: com.alibaba.druid.pool.DruidDataSource
  15.         driver-class-name: com.mysql.cj.jdbc.Driver
  16.         url: jdbc:mysql://127.0.0.1:3381/smbms02
  17.         username: root
  18.         password: root
  19.     sharding:
  20.       tables:
  21.         smbms_user:
  22.           actual-data-nodes: ds0.smbms_user #指定关联的数据库
  23.         smbms_bill:
  24.           actual-data-nodes: ds1.smbms_bill #指定关联的数据库
  25.     props:
  26.       sql:
  27.         show: true #打印SQL
  28. mybatis-plus:
  29.    type-aliases-package: com.hz.pojo
  30.    configuration:
  31.      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  32.      map-underscore-to-camel-case: false #驼峰映射
复制代码
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表