mysql高可用分库分表ShardingSphere之Sharding-proxy

一、ShardingSphere

1.1、官网地址说明

官网地址: https://shardingsphere.apache.org/index_zh.html

本文采用Sharding-proxy代理方式进行分库分表

Sharding-proxy官网手册地址

在这里插入图片描述

1.2、为什么分库分表

  1. 单纯的主从模式,无法保证mysql的高可用
  2. 在单表大数据的情况下,会让mysql的检索性能大幅度下降
  3. 分库分表会减轻压力,提高检索速度
  4. 分库分表,读写分离

架构图:


二、官网整合说明

1.1、下载sharding-proxy

  1. 我用的版本是4.0.0
  2. 官网目前最新版本5.1.0

Sharding-Proxy下载地址
在这里插入图片描述
在这里插入图片描述

1.2、sharding-proxy集成注册中心

  1. 这个默认使用zk
  2. 这个就看文档搞就可用了
    在这里插入图片描述

1.3、查看配置手册

在这里插入图片描述

1.3.1、官网数据分片说明

Sharding-Proxy支持多逻辑数据源每个以config-前缀命名的yaml配置文件,即为一个逻辑数据源。以下是config-xxx.yaml的配置配置示例。

其他的也一样,看官网

官网配置说明:

schemaName: sharding_db

dataSources: #定义数据源
  ds0: #数据源1
    url: jdbc:postgresql://localhost:5432/ds0
    username: root
    password: 
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 65
  ds1: #数据源2
    url: jdbc:postgresql://localhost:5432/ds1
    username: root
    password: 
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 65

shardingRule: #配置分片规则
  tables:
    t_order: #需要分片的表-订单表
      # 真实数据节点。 ds${0..1}.t_order${0..1} 表示 分成2个库ds0,ds1,2张表t_order0,t_order1
      actualDataNodes: ds${0..1}.t_order${0..1} 
      databaseStrategy:#数据库的分库策略
        inline:
          shardingColumn: user_id #按 user_id 这一列来分
          algorithmExpression: ds${user_id % 2} #指定算法 user_id对2取余,余数0取ds0库,余数1取ds1库
      tableStrategy: #分表策略
        inline:
          shardingColumn: order_id #用order_id 这个列来分
          algorithmExpression: t_order${order_id % 2} # 指定算法
      keyGenerator: #id自动生成
        type: SNOWFLAKE # 雪花算法
        column: order_id #雪花算法的id存在order_id
        
    t_order_item: #需要分片的表-订单项表
      actualDataNodes: ds${0..1}.t_order_item${0..1}
      databaseStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: ds${user_id % 2}
      tableStrategy:
        inline:
          shardingColumn: order_id
          algorithmExpression: t_order_item${order_id % 2}
      keyGenerator:
        type: SNOWFLAKE
        column: order_item_id
        
  bindingTables:#指定关联表
    - t_order,t_order_item
  defaultTableStrategy: #默认分表规则
    none:

1.3.2、配置文件说明

在这里插入图片描述

三、开始整合

1. 引入mysql的驱动

  1. 4.0版本需要引入
  2. 5.0版本不需要了,看配置文件的注解就行

如图:
在这里插入图片描述
在这里插入图片描述

2. 配置认证授权信息 server.yaml

server.yaml

#服务治理模块的配置
#orchestration:
#  name: orchestration_ds
#  overwrite: true
#  registry:
#    type: zookeeper
#    serverLists: localhost:2181
#    namespace: orchestration
#

#配置2个用户  用户1[账号密码都是:root]   用户2[账号密码都是:sharding]
authentication:
  users: 
    root:
      password: root 
    sharding:
      password: sharding 
      #用户sharding的权限只能操作 sharding_db 
      authorizedSchemas: sharding_db 

#配置属性 线程数、sql打印、最大连接...     
props:
#  max.connections.size.per.query: 1
  acceptor.size: 16 
  executor.size: 16  
#  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
#  query.with.cipher.column: true
  sql.show: false

3. 配置分库分表 config-sharding.yaml

config-sharding.yaml

######################################################################################################
#
# If you want to connect to MySQL, you should manually copy MySQL driver to lib directory.
#
######################################################################################################

#数据库名称-随便叫【前提环境MySQL主从同步的配置已经搞好了】
schemaName: sharding_db
#配置数据源
dataSources:
  ds_0: #第一个主mysql,连接 demo_ds_0库
    url: jdbc:mysql://192.168.56.10:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50 
  ds_1: #第2个主mysql[因为没搞第二个主,就连同一个主了] 连接 demo_ds_1 库
    url: jdbc:mysql://192.168.56.10:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
#==============================================

#定义规则
shardingRule:
  tables: 
    #订单表
    t_order: 
      # ds_${0..1}和上面配置的数据源(ds_0,ds_1)对应。表划分成t_order_1、t_order_2 ,一个库里面2张表
      actualDataNodes: ds_${0..1}.t_order_${0..1}
      # 分表策略
      tableStrategy:
        inline:
          # 用order_id来分表
          shardingColumn: order_id
          # 算法->求余
          algorithmExpression: t_order_${order_id % 2}
      # order_id生成的算法,用雪花算法
      keyGenerator:
        type: SNOWFLAKE
        column: order_id
        
#-------------------------     
    #订单项表
    t_order_item:
      #分成2个库,2张表
      actualDataNodes: ds_${0..1}.t_order_item_${0..1}
      #指定分表策略
      tableStrategy:
        inline:
          #用order_id来分
          shardingColumn: order_id
          #算法-->求余
          algorithmExpression: t_order_item_${order_id % 2}
      # order_item_id 自动生成用雪花算法
      keyGenerator:
        type: SNOWFLAKE
        column: order_item_id
#-------------------------  

  #绑定表(表有关系)-好处:省得跨库找,不会产生笛卡儿积,速度快,效率高
  bindingTables:
    - t_order,t_order_item
#-------------------------

   
  #数据库策略-分库策略====>流程:先用user_id进行了分库。然后在根据order_id来分表
  defaultDatabaseStrategy:
    inline:
      # 用user_id 列来分
      shardingColumn: user_id
      # 算法 -->求余数
      algorithmExpression: ds_${user_id % 2}
      
  #默认的分表策略。共用部分
  defaultTableStrategy:
    none:

4. 配置读写分离 config-master_slave.yaml

config-master_slave.yaml

######################################################################################################
#
# If you want to connect to MySQL, you should manually copy MySQL driver to lib directory.
#
######################################################################################################

#这个名称在配置里面必须唯一,不能相同
schemaName: sharding_db_1
#配置数据源
dataSources:
  #第一个库的主从--连接demo_ds_0库
  #主节点数据源
  master_0_ds:
    url: jdbc:mysql://192.168.56.10:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  #从节点数据源
  slave_0_ds:
    url: jdbc:mysql://192.168.56.10:3317/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
#--------------------------------- 
 
  #第2个库的主从--连接demo_ds_1库
  #主节点数据源
  master_1_ds:
    url: jdbc:mysql://192.168.56.10:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  #从节点数据源
  slave_1_ds:
    url: jdbc:mysql://192.168.56.10:3317/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50

#配置数据库的主从规则  
shardingRule: 
  masterSlaveRules:
    ms_ds0:
      masterDataSourceName: master_0_ds
      slaveDataSourceNames:
        - slave_0_ds
      loadBalanceAlgorithmType: ROUND_ROBIN
    ms_ds1:
      masterDataSourceName: master_1_ds
      slaveDataSourceNames: 
        - slave_1_ds
      loadBalanceAlgorithmType: ROUND_ROBIN

5、mysql的主从同步加入demo_ds_0,demo_ds_1库

mysql主从同步看==> mysql集群主从复制1主多从 (一)

停止mysql容器

docker stop mysql-master01 mysql-slaver01

编辑主mysql文件

#切换到数据挂载目录
cd /mydata/mysql/master01/conf/

# 编辑
vi my.cnf

# 内容
#Sharding-proxy测试的库
binlog-do-db=demo_ds_0
binlog-do-db=demo_ds_1

编辑从mysql文件

#切换到数据挂载目录
cd /mydata/mysql/master01/conf/

# 编辑
vi my.cnf

# 内容
#Sharding-proxy测试的库
binlog-do-db=demo_ds_0
binlog-do-db=demo_ds_1

启动mysql容器

#启动
docker start mysql-master01  mysql-slaver01 

#查看
docker ps

如图:
在这里插入图片描述
在这里插入图片描述

6、主mysql创建出demo_ds_0,demo_ds_1库

如图:
在这里插入图片描述

7、启动Sharding-proxy

在这里插入图片描述
指定端口启动:
在这里插入图片描述

启动成功:
在这里插入图片描述

8、navicat连接Sharding-proxy操作数据库

  1. 端口上面指定的13777
  2. 账号的server.yaml里面配置的
  3. 账号root
  4. 密码root

这边不能使用navicat15来连接不然会报错

如图:
在这里插入图片描述

在这里插入图片描述

8.1、建表测试

运行sql-刷新

#订单
CREATE TABLE `t_order` (
`order_id` bigint(20) NOT NULL, `user_id` int(11) NOT NULL, `status` varchar(50) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

#订单项
CREATE TABLE `t_order_item` (
`order_item_id` bigint(20) NOT NULL, `order_id` bigint(20) NOT NULL, `user_id` int(11) NOT NULL, `content` varchar(255) COLLATE utf8_bin DEFAULT NULL, `status` varchar(50) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`order_item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

连接Sharding-proxy后台会屏蔽0.1这些分成的库

如图:
在这里插入图片描述
在这里插入图片描述

8.2、插入数据测试

流程 根据user_id取余,选择库,在根据,生成的order_id取余选择表

在这里插入图片描述
效果:
在这里插入图片描述
会发现数据自动分到了2个库里面的不同表
这个是根据我们指定的规则,取余数计算出来的

如图:
在这里插入图片描述

在这里插入图片描述


四、mysql集群的高可用

  1. 不推荐使用多主模式选举,例如MHA 他是小日子开发的…
  2. 使用主从复制+分库分表(多分库就可以。数据源多配置几个)
  3. 高可用也可以配置上 1个keeplived+2个Sharding-proxy来保证高可用
  4. mysql本身就很稳定,除非你超负载了
  5. 多主模式带来的问题,个人感觉会更大,个人不推荐使用。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Sharding-Proxy 是一个开源的分库分表中间件,它可以帮助应用程序实现无感知的分库分表操作。下面是一个简单的步骤来利用 Sharding-Proxy 进行分库分表: 1. 安装和配置 Sharding-Proxy:首先,你需要下载 Sharding-Proxy 的安装包,并解压到你的服务器上。然后,根据你的需求修改配置文件,配置数据源和分片规则等信息。 2. 创建数据库和表:在进行分库分表之前,你需要创建相应的数据库和表结构。你可以选择手动创建,或者使用 Sharding-Proxy 提供的自动建表功能。 3. 配置分片规则:在 Sharding-Proxy 的配置文件中,你需要定义分片规则,指定如何将数据分散到不同的数据库和表中。可以使用基于范围、哈希、精确等多种分片算法。 4. 连接到 Sharding-Proxy:在应用程序中,需要修改数据库连接信息,将原来连接数据库的地址改为连接 Sharding-Proxy 的地址。这样应用程序就可以通过 Sharding-Proxy 访问分片后的数据。 5. 进行分库分表操作:现在你可以在应用程序中执行正常的数据库操作,而无需关心具体的分库分表细节。Sharding-Proxy 会根据配置的规则自动将数据路由到正确的库和表中。 需要注意的是,使用 Sharding-Proxy 进行分库分表操作需要仔细考虑数据一致性、事务处理、跨库查询等问题。在配置和使用过程中,建议参考官方文档和示例来确保正确性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suqinyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值