谷粒商城のMySQL集群分库分表

文章目录

  • 前言
  • 一、MySQL的集群架构
  • 二、MySQL主从同步实践
    • 1.创建主节点实例
    • 2.创建从节点实例
    • 3.修改配置
    • 4.开始同步
    • 4.测试主从同步效果
    • 5.小结
  • 三、MySQL分库分表
    • 1.配置sharding-proxy
    • 2.测试sharding-proxy
    • 3.小结


前言

  本篇是谷粒商城集群部署篇,搭建MySQL集群以及分库分表实践的个人笔记,采用主从架构,以及sharding-proxy


一、MySQL的集群架构

  MySQL的集群架构,简单来说可以分为主从架构,主主架构,主备架构。

  • 主从架构是最常见的一种,通常是集群中有一个主节点,多个从节点,主节点负责数据的写入,从节点负责读取。这样做可以实现读写分离。主从之间的数据也需要同步。
  • 主主架构则是两个 MySQL 服务器相互作为主数据库,既可以接收写请求,也可以向对方同步数据。但是两台主机都有写入操作时,可能会导致数据不一致,需要额外的冲突解决机制。
  • 主备架构是,备节点是主节点的副本,会复制主节点的数据,主节点宕机后,立刻切换备用节点作为主节点。

  关于各类中间件集群如何保证高可用性,是面试中几乎必问的问题,以及MySQL如何进行主从复制?保证主从数据的一致性?这些衍生问题都会放在 MySQL的面试题总结中。

二、MySQL主从同步实践

1.创建主节点实例

docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql/master/log:/var/log/mysql \
-v /mydata/mysql/master/data:/var/lib/mysql \
-v /mydata/mysql/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

2.创建从节点实例

docker run -p 3317:3306 --name mysql-slaver-01 \
-v /mydata/mysql/slaver/log:/var/log/mysql \
-v /mydata/mysql/slaver/data:/var/lib/mysql \
-v /mydata/mysql/slaver/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

在这里插入图片描述

3.修改配置

  首先进入主节点的conf目录,创建my.cnf文件:

vi /mydata/mysql/master/conf/my.cnf

在这里插入图片描述  编辑内容:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init_connect='SET collation_connection = utf8mb4_unicode_ci; SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

server_id=1
log-bin=mysql-bin
read-only=0

# 需要同步的库
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin

# 忽略同步的库(系统自带)
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

  从节点同理,配置文件如下,区别主节点在于server_id,以及read-only=1,从节点是只读的。

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init_connect='SET collation_connection = utf8mb4_unicode_ci; SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

server_id=2
log-bin=mysql-bin
read-only=1

binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin

replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

  然后重启主从节点:

docker restart mysql-master mysql-slaver-01

在这里插入图片描述

4.开始同步

  使用如下命令进入主节点mysql实例,并输入密码:

docker exec -it mysql-master bash
mysql -uroot -p

在这里插入图片描述
  授权root用户可以远程访问,方便使用可视化工具连接

grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;

  创建一个从节点用于同步的用户

GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';

  查看主节点状态

show master status

在这里插入图片描述  然后同样的方式进入从节点,同样授权远程访问,然后执行以下命令设置主节点链接:

CHANGE MASTER TO 
    MASTER_HOST = '你自己的虚拟机地址',
    MASTER_USER = 'backup',
    MASTER_PASSWORD = '123456',
    MASTER_LOG_FILE = 'mysql-bin.000001',
    MASTER_LOG_POS = 0,
    MASTER_PORT = 3307;

  启动主从同步:

start slave;

  查看主从同步的状态,如图代表成功:

show slave status\G;

在这里插入图片描述

4.测试主从同步效果

  在主节点中创建一个数据库(注意,创建的数据库必须是在主库my.cnf中配置的同步数据库),这里创建的是gulimall_oms
在这里插入图片描述  刷新从节点,gulimall_oms被同步创建。
在这里插入图片描述  向主节点的表中添加一条数据:
在这里插入图片描述  刷新从节点,数据被同步更新:
在这里插入图片描述

5.小结

  在主从节点的配置中,必须指定有哪些数据库是需要同步的。后续如果有新的数据库需要同步,需要修改配置文件。在主从同步之前,主节点需要创建一个从节点用于同步的用户,从节点需要使用该用户设置主节点链接

三、MySQL分库分表

1.配置sharding-proxy

  MySQL的分库分表,使用sharding-proxy,官网上下载后,需要将MySQL的jar包复制到lib目录下:
在这里插入图片描述  修改server.yaml配置信息:
在这里插入图片描述

authentication:
  users:
    root:
      password: root
    sharding:
      password: sharding 
      authorizedSchemas: sharding_db
#
props:
#  max.connections.size.per.query: 1
#  acceptor.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: LOCAL
#  proxy.opentracing.enabled: false
#  query.with.cipher.column: true
  sql.show: false

  再修改config-sharding.yaml分库分表代理的配置信息:
在这里插入图片描述
  配置文件中有几个关键的点:

  1. 需要设置物理数据库逻辑数据库的映射关系。即请求先到达设置的逻辑数据库,再根据规则转发到绑定的物理数据库上。
  2. 分库分表后,主键不能使用自增,因为这样会存在主键重复的问题。需要采用分布式的唯一ID。
schemaName: sharding_db #将demo_ds_0和demo_ds_1 数据库映射到 sharding_db 上	sharding_db 在 ShardingSphere 中代表一个逻辑数据库,它将应用程序的数据库访问请求转发到多个物理数据库(或数据源)上
#
dataSources:
	# 定义第一个物理数据库
  ds_0:
    url: jdbc:mysql://192.168.101.128:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  # 定义第二个物理数据库
  ds_1:
    url: jdbc:mysql://192.168.101.128:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
# 指定分库分表规则
shardingRule:
  tables:
    t_order:
      actualDataNodes: ds_${0..1}.t_order_${0..1} #ds_0 和 ds_1 数据源下分为两个表:t_order_0 和 t_order_1
      tableStrategy:
        inline:
          shardingColumn: order_id # 用来做分片的列
          algorithmExpression: t_order_${order_id % 2} # 分片算法表达式,根据 order_id 对 2 取余来选择 t_order_0 或 t_order_1
      keyGenerator:
        type: SNOWFLAKE #指定主键规则为雪花算法
        column: order_id #雪花算法生成的主键将存储在 order_id 列
    t_order_item:
      actualDataNodes: ds_${0..1}.t_order_item_${0..1} #ds_0 和 ds_1 数据源下分为两个表:t_order_item_0 和 t_order_item_1
      tableStrategy:
        inline:
          shardingColumn: order_id # 用来做分片的列
          algorithmExpression: t_order_item_${order_id % 2}  # 分片算法表达式,根据 order_id 对 2 取余来选择 t_order_item_0 或t_order_item_1
      keyGenerator:
        type: SNOWFLAKE #指定主键规则为雪花算法
        column: order_item_id #雪花算法生成的主键将存储在 order_id 列
  bindingTables:
    - t_order,t_order_item #这两个表在分片时会使用相同的分片策略
  defaultDatabaseStrategy:
    inline:
      shardingColumn: user_id  # 用来做数据库分片的列
      algorithmExpression: ds_${user_id % 2}  # 分片算法表达式,根据 user_id 对 2 取余来选择 ds_0 或 ds_1 数据源
  defaultTableStrategy:
    none:

  依据上述配置文件的逻辑,首先请求先到达设置的逻辑数据库,再根据规则转发到绑定的物理数据库上,根据 user_id 对 2 取余来选择 ds_0 或 ds_1 数据库。在ds_0 或 ds_1 数据库中,又会根据order_id 对 2 取余来选择 走哪张

  最后修改config-master_slave.yaml读写分离的配置文件,这里的demo_ds_0,demo_ds_1都在同一个主节点,从节点的连接上。

schemaName: sharding_db_1
#
dataSources: 
  master_0_ds: #数据库1的主节点
    url: jdbc:mysql://192.168.101.128:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  slave_ds_0: #数据库1的从节点
    url: jdbc:mysql://192.168.101.128:3317/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
masterSlaveRule:
 name: ms_ds
 masterDataSourceName: master_0_ds
 slaveDataSourceNames:
   - slave_ds_0

  需要再复制一份config-master_slave.yaml

schemaName: sharding_db_2
#
dataSources:
  master_1_ds: #数据库2的主节点
    url: jdbc:mysql://192.168.101.128:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  slave_ds_1: #数据库2的从节点
    url: jdbc:mysql://192.168.101.128:3317/demo_ds_1?serverTimezone=UTC&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
masterSlaveRule:
  name: ms_ds_1
  masterDataSourceName: master_1_ds
  slaveDataSourceNames:
    - slave_ds_1
  #  - slave_ds_1
  #  - slave_ds_1

  如果lib目录下的jar包后缀.jar不全,需要手动替换:
在这里插入图片描述  同时因为需要加入demo_ds_0demo_ds_1两个库,主节点和从节点需要修改my.cnf

docker stop mysql-slaver-01 mysql-master

在这里插入图片描述  重启主从节点:

docker start mysql-slaver-01 mysql-master

  然后去主节点中创建两个数据库(从节点会自动同步):

在这里插入图片描述  双击bin目录的start.bat启动(注意,路径下不能有中文,我重新换了位置):
在这里插入图片描述  如下图就是启动成功:
在这里插入图片描述

2.测试sharding-proxy

  在启动时指定一个端口号:
在这里插入图片描述  可以用远程连接工具连接sharding-proxy:
在这里插入图片描述  三个虚拟库对应的就是在config-master_slave.yaml配置文件里的,下面在sharding_db中创建测试表:

在这里插入图片描述

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;

  在主节点和从节点上已经进行了分表(在demo_ds_1 和 demo_ds_0 中都一样)
在这里插入图片描述在这里插入图片描述  当进行数据操作时,请求实际上是通过sharding_db去根据规则路由到不同的数据库,表的,向sharding_db的t_order插入三条数据:

insert INTO t_order(user_id,status) VALUES(1,1);
insert INTO t_order(user_id,status) VALUES(2,1);
insert INTO t_order(user_id,status) VALUES(3,1);

在这里插入图片描述  但是在实际的物理数据库已经根据规则进行了分库分表,userId % 2 = 0的被分在了demo_ds_0中,userId % 2 != 0的被分在了demo_ds_1中,根据order_id也决定了数据落入demo_ds_0或是demo_ds_1库的哪张表里。
在这里插入图片描述在这里插入图片描述

3.小结

  使用sharding-proxy进行分库分表,首先需要修改配置文件,包括数据库的主从信息,连接信息,以及分库分表的规则。在开发中,只需要连接sharding-proxy的虚拟数据库,在创建表时,就会对物理数据库进行分表。操作其中的表时,sharding-proxy根据配置好的规则,将数据实际路由到真正的业务表中。


下一篇:谷粒商城のRedis集群

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理对于学习嵌入式开发的意义

计算机组成原理对于学习嵌入式开发的意义 前言 最近有位同学向我咨询,问学习嵌入式开发需不需要学习硬件?进而引申到了需不需要学习计算机组成原理呢? 正文 首先计算机组成原理是计算机科学与技术专业的一门核心基础课程,它深入…

npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)

您提供的命令 npm list -g --depth0 是在 Node Package Manager (npm) 的上下文中使用的,用来列出全局安装的所有 npm 软件包而不显示它们的依赖项。 这是它的运作方式: npm list -g --depth0-g: 指定列表应包括全局安装的软件包。--depth0: 限制树形结…

SpringBoot 2.2.10 无法执行Test单元测试

很早之前的项目今天clone现在,想执行一个业务订单的检查,该检查的代码放在test单元测试中,启动也是好好的,当点击对应的方法执行Test的时候就报错 tip:已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…

多表查询综合归纳

目录 1. 多表关系 1.1 一对多(多对一) 1.2 多对多 1.3 一对一 2. 多表查询概述 2.1 熟悉表 2.2 笛卡尔积 2.3 消除笛卡尔积 2.4 多表查询分类 3. 内连接 3.1 隐式内连接 3.2 显式内连接 4. 外连接 4.1 左外连接 4.2 右外连接 5. 自连接 …

python爬虫(二)爬取国家博物馆的信息

import requests from bs4 import BeautifulSoup# 起始网址 url https://www.chnmuseum.cn/zx/xingnew/index_1.shtml # 用于存储所有数据 all_data [] page 1 global_index 1 # 定义全局序号变量并初始化为1 while True:html_url requests.get(url).textif requests.get…

基于NI Vision和MATLAB的图像颜色识别与透视变换

1. 任务概述 利用LabVIEW的NI Vision模块读取图片,对图像中具有特征颜色的部分进行识别,并对识别的颜色区域进行标记。接着,通过图像处理算法检测图像的四个顶点(左上、左下、右上、右下),并识别每个顶点周…

Qt_day7_文件IO

目录 文件IO 1. QFileDialog 文件对话框(熟悉) 2. QFileInfo 文件信息类(熟悉) 3. QFile 文件读写类(掌握) 4. UI操作与耗时操作(掌握) 5. 多线程(掌握)…

[论文笔记]An LLM Compiler for Parallel Function Calling

引言 今天带来一篇优化函数调用的论文笔记——An LLM Compiler for Parallel Function Calling。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 当前的函数(工具)调用方法通常需要对每个函数进行顺序推理和操作&…

网络性能测试

一、iperf网络性能测试工具 测试udp丢包率 在服务器启动 iperf 服务端 iperf -p 9000 -s -u -i 1参数说明: -p : 端口号 -s : 表示服务端 -u : 表示 udp 协议 -i : 检测的时间间隔(单位,秒) 在客户端,启动 iperf 客户端 iperf -c xxx.xxx.14…

Rust语言在系统编程中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…

1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)

文章目录 AbstractIntroduction问题表述Methodology多智能体位置编码公平上下文编码训练方案ExperimentsmTSP的性能评估mPDP的性能评估Related WorkConclusionAbstract 最小最大路由问题旨在通过智能体合作完成任务来最小化多个智能体中最长行程的长度。这些问题包括对现实世界…

数字后端教程之Innovus report_property和get_property使用方法及应用案例

数字IC后端实现Innovus中使用report_property可以报告出各种各样object的属性,主要有cell,net,PG Net,Pin,时钟clock,时序库lib属性,Design属性,timing path,timin arc等…

【Vitepress报错】Error: [vitepress] 8 dead link(s) found.

原因 VitePress 在编译时,发现 死链接(dead links) 会构建失败!具体在哪我也找不到… 解决方案 如图第一行蓝色提示信息,设置 Vitepress 属性 ignoredeadlinks 为 true 可忽略报错。 .vuepress/config.js export default defineConfig(…

【开源风云】从若依系列脚手架汲取编程之道(七)

📕开源风云系列 本篇文字量巨大,甚至在发表编辑之时造成编辑器卡顿,哈哈,最近在忙人生的另一项规划,文章更新就逐渐缓慢了,希望我们都逐渐走向自己的道路呀! 🍊本系列将从开源名将若…

Docker+Django项目部署-从Linux+Windows实战

一、概述 1. 什么是Docker Docker 是一个开源的应用容器引擎,支持在win、mac、Linux系统上进行安装。可以帮助我们在一台电脑上创建出多个隔离的环境,比传统的虚拟机极大的节省资源 。 为什么要创建隔离的环境? 假设你先在有一个centos7.…

[项目代码] YOLOv5 铁路工人安全帽安全背心识别 [目标检测]

YOLOv5是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv5具有更高的…

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d:如果是两位数,将会在前面添上一位0 %.2f:会保留两位小数 如果是long,必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制: 十进制转任意进制时&#xff…

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…

使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行

electron-egg一个入门简单、跨平台、企业级桌面软件开发框架https://www.kaka996.com/electron-egg 跳转地址 1,使用 git下载代码到本地,如果没有git需要进行安装 # gitee git clone https://gitee.com/dromara/electron-egg.git # github git clone https://github.com/dro…