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

文章目录

  • 一、ShardingSphere
    • 1.1、官网地址说明
    • 1.2、为什么分库分表
  • 二、官网整合说明
    • 1.1、下载sharding-proxy
    • 1.2、sharding-proxy集成注册中心
    • 1.3、查看配置手册
      • 1.3.1、官网数据分片说明
      • 1.3.2、配置文件说明
  • 三、开始整合
    • 1. 引入mysql的驱动
    • 2. 配置认证授权信息 server.yaml
    • 3. 配置分库分表 config-sharding.yaml
    • 4. 配置读写分离 config-master_slave.yaml
    • 5、mysql的主从同步加入demo_ds_0,demo_ds_1库
    • 6、主mysql创建出demo_ds_0,demo_ds_1库
    • 7、启动Sharding-proxy
    • 8、navicat连接Sharding-proxy操作数据库
      • 8.1、建表测试
      • 8.2、插入数据测试
  • 四、mysql集群的高可用

一、ShardingSphere

1.1、官网地址说明

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

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

Sharding-proxy官网手册地址

mysql高可用分库分表ShardingSphere之Sharding-proxy_第1张图片

1.2、为什么分库分表

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

架构图:


二、官网整合说明

1.1、下载sharding-proxy

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

Sharding-Proxy下载地址
mysql高可用分库分表ShardingSphere之Sharding-proxy_第2张图片
mysql高可用分库分表ShardingSphere之Sharding-proxy_第3张图片

1.2、sharding-proxy集成注册中心

  1. 这个默认使用zk
  2. 这个就看文档搞就可用了
    mysql高可用分库分表ShardingSphere之Sharding-proxy_第4张图片

1.3、查看配置手册

mysql高可用分库分表ShardingSphere之Sharding-proxy_第5张图片

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、配置文件说明

mysql高可用分库分表ShardingSphere之Sharding-proxy_第6张图片

三、开始整合

1. 引入mysql的驱动

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

如图:
mysql高可用分库分表ShardingSphere之Sharding-proxy_第7张图片
mysql高可用分库分表ShardingSphere之Sharding-proxy_第8张图片

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

如图:
mysql高可用分库分表ShardingSphere之Sharding-proxy_第9张图片
mysql高可用分库分表ShardingSphere之Sharding-proxy_第10张图片

6、主mysql创建出demo_ds_0,demo_ds_1库

如图:
mysql高可用分库分表ShardingSphere之Sharding-proxy_第11张图片

7、启动Sharding-proxy

mysql高可用分库分表ShardingSphere之Sharding-proxy_第12张图片
指定端口启动:
mysql高可用分库分表ShardingSphere之Sharding-proxy_第13张图片

启动成功:
mysql高可用分库分表ShardingSphere之Sharding-proxy_第14张图片

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

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

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

如图:
mysql高可用分库分表ShardingSphere之Sharding-proxy_第15张图片

mysql高可用分库分表ShardingSphere之Sharding-proxy_第16张图片

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这些分成的库

如图:
mysql高可用分库分表ShardingSphere之Sharding-proxy_第17张图片
mysql高可用分库分表ShardingSphere之Sharding-proxy_第18张图片

8.2、插入数据测试

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

mysql高可用分库分表ShardingSphere之Sharding-proxy_第19张图片
效果:
mysql高可用分库分表ShardingSphere之Sharding-proxy_第20张图片
会发现数据自动分到了2个库里面的不同表
这个是根据我们指定的规则,取余数计算出来的

如图:
mysql高可用分库分表ShardingSphere之Sharding-proxy_第21张图片

mysql高可用分库分表ShardingSphere之Sharding-proxy_第22张图片


四、mysql集群的高可用

  1. 不推荐使用多主模式选举,例如MHA 他是小日子开发的…
  2. 使用主从复制+分库分表(多分库就可以。数据源多配置几个)
  3. 高可用也可以配置上 1个keeplived+2个Sharding-proxy来保证高可用
  4. mysql本身就很稳定,除非你超负载了
  5. 多主模式带来的问题,个人感觉会更大,个人不推荐使用。

你可能感兴趣的:(数据库,ShardingSphere,Sharding-proxy,分库分表,mysql,高可用)