shardingsphere-proxy 实现mysql单库分表

news2024/12/24 11:26:52

1、docker安装mysql5.7版本

  1. 拉取mysql的镜像
docker pull mysql:5.7
  1. 创建mysql的配置目录,日志目录,数据存储的目录
mkdir -p /home/sunyuhua/docker/mysql/conf
mkdir -p /home/sunyuhua/docker/mysql/logs
mkdir -p /home/sunyuhua/docker/mysql/data
  1. 启动mysql的容器
docker run -p 3306:3306 --name mysql  --restart=always -v /home/sunyuhua/docker/mysql/conf:/etc/mysql/conf.d -v /home/sunyuhua/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  1. 修改 mysql的配置
/home/sunyuhua/docker/mysql/conf/my.cnf

[client]
port =3306
socket =/var/run/mysqld/mysqld.sock
[mysql]
socket =/var/run/mysqld/mysqld.sock
[mysql_safe]
socket =/var/run/mysqld/mysqld.sock
nice =0


[mysqld]
server-id = 1
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
log-bin=mysql-bin
binlog-format=row
binlog-row-image=full
max_connections=600
  1. 重新mysql
docker restart mysql
  1. 链接mysql,测试
docker exec -it mysql /bin/bash
mysql -uroot -proot

2、docker 安装zookeeper

  1. 拉取zookeeper镜像
docker pull zookeeper
  1. 运行zookeeper
docker run -d -e TZ="Asia/Shanghai"  -p 2181:2181 -v /home/sunyuhua/docker/zookeeper:/data --name zookeeper --restart always zookeeper
  1. 检查zookeeper安装成功
docker exec -it zookeeper bash

./bin/zkCli.sh

3、docker安装shardingsphere-proxy

  1. 获取镜像中的配置到挂载目录下
docker run -d --name tmp --entrypoint=bash apache/shardingsphere-proxy

docker cp tmp:/opt/shardingsphere-proxy/conf /home/sunyuhua/docker/shardingsphere-proxy/conf

docker rm tmp
  1. 启动shardingsphere-proxy
docker run -d -v /home/sunyuhua/docker/shardingsphere-proxy/conf:/opt/shardingsphere-proxy/conf -v /home/sunyuhua/docker/shardingsphere-proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib -v /home/sunyuhua/docker/shardingsphere-proxy/logs:/opt/shardingsphere-proxy/logs -e PORT=3308 -p3308:3308  --restart always  --name sharding-proxy apache/shardingsphere-proxy
  1. 验证是否安装成功
 docker exec -it sharding-proxy /bin/bash

4、配置分库分表的准备mysql的表结构

create database demo_ds;

show databases;

use demo_ds;


CREATE TABLE `t_order_0` (
  `order_id` bigint(20) unsigned NOT NULL COMMENT '主键ID',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
  `total_money` int(10) unsigned NOT NULL COMMENT '订单总金额',
  PRIMARY KEY (`order_id`),
  KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单总表';


CREATE TABLE `t_order_1` (
  `order_id` bigint(20) unsigned NOT NULL COMMENT '主键ID',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
  `total_money` int(10) unsigned NOT NULL COMMENT '订单总金额',
  PRIMARY KEY (`order_id`),
  KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单总表';




CREATE TABLE `t_order_item_0` (
  `order_item_id` bigint(20) unsigned NOT NULL COMMENT '子订单ID',
  `order_id` bigint(20) unsigned NOT NULL COMMENT '主键ID',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
  `money` int(10) unsigned NOT NULL COMMENT '子订单金额',
  PRIMARY KEY (`order_item_id`),
  KEY `idx_order_id` (`order_id`) USING BTREE,
  KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单子表';




CREATE TABLE `t_order_item_1` (
  `order_item_id` bigint(20) unsigned NOT NULL COMMENT '子订单ID',
  `order_id` bigint(20) unsigned NOT NULL COMMENT '主键ID',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
  `money` int(10) unsigned NOT NULL COMMENT '子订单金额',
  PRIMARY KEY (`order_item_id`),
  KEY `idx_order_id` (`order_id`) USING BTREE,
  KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单子表';



5、配置shardingsphere-proxy分库分表的策略

修改server.xml文件,文件地址:/home/sunyuhua/docker/shardingsphere-proxy/conf

mode:
  type: Cluster
  repository:
    type: ZooKeeper
    props:
      namespace: governance_ds
      server-lists: 127.0.0.1:2181
      retryIntervalMilliseconds: 500
      timeToLiveSeconds: 60
      maxRetries: 3
      operationTimeoutMilliseconds: 500
#  overwrite: false
#
rules:
  - !AUTHORITY
    users:
      - root@%:root
      - sharding@:sharding
    provider:
      type: ALL_PRIVILEGES_PERMITTED
#  - !TRANSACTION
#    defaultType: XA
#    providerType: Atomikos

props:
#  max-connections-size-per-query: 1
#  kernel-executor-size: 16  # Infinite by default.
#  proxy-frontend-flush-threshold: 128  # The default value is 128.
#  proxy-opentracing-enabled: false
#  proxy-hint-enabled: false
  sql-show: true
#  check-table-metadata-enabled: false
#  show-process-list-enabled: false
#    # Proxy backend query fetch size. A larger value may increase the memory usage of ShardingSphere Proxy.
#    # The default value is -1, which means set the minimum value for different JDBC drivers.
#  proxy-backend-query-fetch-size: -1
#  check-duplicate-table-enabled: false
#  sql-comment-parse-enabled: false
#  proxy-frontend-executor-size: 0 # Proxy frontend executor size. The default value is 0, which means let Netty decide.
#    # Available options of proxy backend executor suitable: OLAP(default), OLTP. The OLTP option may reduce time cost of writing packets to client, but it may increase the latency of SQL execution
#    # if client connections are more than proxy-frontend-netty-executor-size, especially executing slow SQL.
#  proxy-backend-executor-suitable: OLAP
#  proxy-frontend-max-connections: 0 # Less than or equal to 0 means no limitation.
#  sql-federation-enabled: false

修改config-sharding.yaml 文件,文件地址/home/sunyuhua/docker/shardingsphere-proxy/conf


schemaName: sharding_db

dataSources:
  ds_0:
    url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  ds_1:
    url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1

rules:
- !SHARDING
  tables:
    t_order:
      actualDataNodes: ds_${0..1}.t_order_${0..1}
      tableStrategy:
        standard:
          shardingColumn: order_id
          shardingAlgorithmName: t_order_inline
      keyGenerateStrategy:
        column: order_id
        keyGeneratorName: snowflake
    t_order_item:
      actualDataNodes: ds_${0..1}.t_order_item_${0..1}
      tableStrategy:
        standard:
          shardingColumn: order_id
          shardingAlgorithmName: t_order_item_inline
      keyGenerateStrategy:
        column: order_item_id
        keyGeneratorName: snowflake
  bindingTables:
    - t_order,t_order_item
  defaultDatabaseStrategy:
    standard:
      shardingColumn: user_id
      shardingAlgorithmName: database_inline
  defaultTableStrategy:
    none:
  
  shardingAlgorithms:
    database_inline:
      type: INLINE
      props:
        algorithm-expression: ds_${user_id % 2}
    t_order_inline:
      type: INLINE
      props:
        algorithm-expression: t_order_${order_id % 2}
    t_order_item_inline:
      type: INLINE
      props:
        algorithm-expression: t_order_item_${order_id % 2}
  
  keyGenerators:
    snowflake:
      type: SNOWFLAKE
      props:
        worker-id: 123

重新启动shardingsphere

docker restart sharding-proxy

检查shardingsphere-proxy是不是启动

docker logs sharding-proxy

或者查看日志

 /opt/shardingsphere-proxy/logs/stdout.log

[INFO ] 2023-06-28 05:46:54.015 [main-SendThread(host.docker.internal:2181)] org.apache.zookeeper.ClientCnxn - Session establishment complete on server host.docker.internal/192.168.65.2:2181, session id = 0x100000045ca0001, negotiated timeout = 40000
[INFO ] 2023-06-28 05:46:54.024 [main-EventThread] o.a.c.f.state.ConnectionStateManager - State change: CONNECTED
[INFO ] 2023-06-28 05:46:54.052 [main-EventThread] o.a.c.framework.imps.EnsembleTracker - New config event received: {}
[INFO ] 2023-06-28 05:46:54.052 [main-EventThread] o.a.c.framework.imps.EnsembleTracker - New config event received: {}
Thanks for using Atomikos! Evaluate http://www.atomikos.com/Main/ExtremeTransactions for advanced features and professional support
or register at http://www.atomikos.com/Main/RegisterYourDownload to disable this message and receive FREE tips & advice
[INFO ] 2023-06-28 05:46:56.075 [main] o.apache.curator.utils.Compatibility - Using org.apache.zookeeper.server.quorum.MultipleAddresses
[INFO ] 2023-06-28 05:46:56.093 [main] o.a.s.p.i.BootstrapInitializer - Database name is `MySQL`, version is `5.7.42-log`
[INFO ] 2023-06-28 05:46:56.283 [main] o.a.s.p.frontend.ShardingSphereProxy - ShardingSphere-Proxy start success

6、插入和查询数据,检查分库分表策略是不是生效

INSERT INTO t_order(user_id,total_money) VALUES(1001,1000);
INSERT INTO t_order(user_id,total_money) VALUES(1002,1000);
INSERT INTO t_order(user_id,total_money) VALUES(1003,1000);
INSERT INTO t_order(user_id,total_money) VALUES(1004,1000);
INSERT INTO t_order(user_id,total_money) VALUES(1005,1000);
INSERT INTO t_order(user_id,total_money) VALUES(1006,1000);
INSERT INTO t_order(user_id,total_money) VALUES(1007,1000);
INSERT INTO t_order(user_id,total_money) VALUES(1008,1000);

在这里插入图片描述

7、检查物理库是不是已经插入成功

在这里插入图片描述

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

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

相关文章

微信小游戏:超大数值计算

测试代码: import {large_number} from "./large_number";const {ccclass, property} cc._decorator;ccclass export default class NewClass extends cc.Component {property(cc.Label)label: cc.Label null;propertytext: string hello;// LIFE-CYCL…

操作符重载的概念

下面的复数解决方案是否可行? Add 函数可以解决 Complex 对象相加的问题,但是 Complex 是现实世界中确实存在的复数,并且复数在数学中的地位和普通的实数相同 为什么不能让 操作符也支持复数相加呢? 操作符重载 C 中的重载能够…

四、OkHttp_连接池

预备知识 通常我们进行HTTP连接网络的时候我们会进行TCP的三次握手,然后传输数据,然后再释放连接。 大量的连接每次连接关闭都要三次握手四次分手的很显然会造成性能低下, 因此http有一种叫做keep-alive connections的机制(HTTP1…

【每日一题】Leetcode - 10. 正则表达式匹配

题目 Leetcode - 10. 正则表达式匹配 解题思路 预处理正则表达式,合并同项,比如: "a * b * c * . * " -> " . * "更加预处理后的正则表达式,构建NFA通过NFA状态转移条件一个一个匹配字符串字符不匹配的状态要回退匹…

【统一安全管控平台】4A解析

文章目录 一、统一帐号(Account)二、统一认证(Authentication)三、统一授权(Authorization)四、统一审计(Audit)参考&感谢 4A是指帐号(Account)、认证(Authentication)、授权(Authorization…

mysql8.0新特性详解

一、my.ini或my.cnf的全局参数 一个连接最少占用内存是256K,最大是64M,如果一个连接的请求数据超过64MB(比如排序),就会申请临时空间,放到硬盘上。 #最大连接数 max_connections3000 #最大用户连接数 max_…

智能饮品机器人的市场现状与前景未来,点赋科技与您共同期待

引言: 近年来,智能饮品机器人行业迅猛发展,成为引人瞩目的新兴市场。然而,这个行业的市场现状到底如何?它的前景又将如何发展?让点赋科技带大家一起来看看。 市场现状: 智能饮品机器人市场在过去…

解锁高效部署!快速搭建Kubernetes集群,提升团队生产力!

1 MacOS 1.1 下载 docker-desktop 从 docker 下载 docker-desktop (opens new window),并完成安装 1.2 启用 k8s 集群 启动 docker-desktop,打开preference 面板 切换到 Kubernetes 标签页,并勾选启动 Enable Kubernetes,点击…

nginx 入门 (b站IT楠老师学习笔记)

文章目录 Nginx 入门 (b站IT楠老师学习笔记)一 基础了解1、下载nginx安装包2. nginx 可以提供的服务3. nginx 的优点4. 应用场景 二 实战2.1 基础检查以及配置文件结构了解2.2 main全局配置2.3 events模块2.4 http服务器配置2.5虚拟主机配置详解2.5.1 ht…

el-pagination分页查询封装

需求&#xff1a;因为需要用到表单查询的地方太多了&#xff0c;所以为了避免每个页面都写分页组件&#xff0c;直接封装好调用就完事了&#xff0c;简简单单 1.创建Pigination.vue公用组件 <template><div :class"{hidden:hidden}" class"paginatio…

AD中修改一个元器件的所有焊盘大小

1.首先&#xff0c;选中其中一个焊盘。 2.查找相似对象 3.修改component为same 4.修改X size和Y size为same 5.确定 6.修改Pad Stack中的x/y 注&#xff1a;component可以不用改为same&#xff0c;用any就是查找和这个焊盘大小类似的对象。

力扣1768.交替合并字符串(java模拟法)

题目描述&#xff1a; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 问题分析&#xff1a; 我们可以直…

servlet 监听器

做法: 在web.xml中: 或

矩形中的正方形:探究力扣最大正方形问题的奥秘

本篇博客会讲解力扣“1725. 可以形成最大正方形的矩形数目”的解题思路&#xff0c;这是题目链接。 本题的思路是&#xff1a;对于每一个矩形&#xff0c;切分出来的最大正方形的边长是矩形的长和宽的较小值。我们需要维护最大的正方形边长&#xff0c;并统计数目。 我们可以写…

Verilog基础之十、计数器实现

目录 一、前言 二、工程设计 2.1 设计代码 2.2 综合结果 ​2.3 仿真结果 一、前言 计数器是较为基础的逻辑&#xff0c;很多其他逻辑可依靠计数器实现&#xff0c;如控制器&#xff0c;分频。原理为通过统计时钟脉冲的个数来输出计数值。 二、工程设计 2.1 设计代码 工…

实验 09 线性回归与波士顿房价预测

文章目录 实验 09 线性回归与波士顿房价预测一、实验目的二、实验设备三、实验内容3.1 了解数据3.2 分析数据3.3 建立模型&#xff08;一&#xff09;使用一个变量进行预测&#xff08;二&#xff09;使用多元线性回归分析进行预测 实验 09 线性回归与波士顿房价预测 一、实验…

Dubbo【Dubbo实战(整合Mybaits-plus配置、接口、集成Thymeleaf) 】(五)-全面详解(学习总结---从入门到深化)

目录 ​编辑 Dubbo实战_整合Mybaits-plus配置 Dubbo实战_创建添加用户接口 Dubbo实战_查询用户业务接口 Dubbo实战_更新用户业务接口 Dubbo实战_删除用户业务接口 Dubbo实战_集成Thymeleaf Dubbo实战_用户添加业务消费者实现 Dubbo实战_用户查询业务消费者实现 Dubbo实战_…

R带参数运行

rm(listls()) suppressPackageStartupMessages({library(getopt) })# getopt(),是getopt包的函数&#xff0c;需要先按照getopt包 # # getopt(spec NULL, opt commandArgs(TRUE),command get_Rscript_filename(), usage FALSE,debug FALSE) # # spec&#xff1a;一个4或…

linux suse12 安装mysql

1.下载mysql https://dev.mysql.com/downloads/mysql/ 2.选中mysql版本 对选中的版本进行下载 也可以在linux服务器上直接下载&#xff1a;wget -c https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz 3.把下载好的文件放到/usr/local…

mac上的vscode设置用滚轮来调节编辑页面大小

mac上的vscode设置用滚轮来调节编辑页面大小 问题背景 今天在mac上安装了vscode&#xff0c;刚想编写代码&#xff0c;但是突然发现无法用ctrl鼠标的滚轮来进行控制 代码编辑区域字体的大小。 解决方法 经过查找资料&#xff0c;发现在设置的配置文件中&#xff0c;有一个配…