当前位置: 首页 > news >正文

InnoDB Cluster集群Mysql Router代理层最佳实践

InnoDB Cluster 集群 & Mysql-Router 代理层

前言

Mysql是现今最常用的关系型数据库之一,高可用一直是我们对软件服务的要求。常见的Mysql高可用是主从配置,在主节点挂掉后需要依赖监控脚本进行主从切换将从节点升级,后台服务代码层面也需要进行相关配置。那有没有更简约的办法做到后台代码零侵入呢,答案是有的,本文就采用 Mysql 官方的集群模式加官方的 Router 代理层实现 Mysql 对后台服务的隐藏,后台服务只需要像连接普通 Mysql 服务一样连接到 Router 即可。

这种方案优势非常明显:

  1. MySQL Router 是官方出品,是轻量级代理程序,后台应用不可见。
  2. Router 可自己实现读写分离。
  3. 数据库服务器故障,业务可以正常运行。由MySQL Router来进行自动下线不可用服务器和替换主节点。
    在这里插入图片描述
    现在直接把全套最佳实践正文发布如下(Docker版本三节点)。

1、InnoDB Cluster集群

1.1、Mysql8.0 standalone(建议至少3个节点才能保证高可用)

使用Mysql8.0镜像启动3个节点(一主两从),除server_idreport_host外其他配置均一致。

# docker-compose
services:mysql-server:# container_name: mysql-serverimage: mysql/mysql-server:8.0restart: always# volumes:# - /data/mysql-server:/var/lib/mysqlnetwork_mode: hostenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_ROOT_HOST: '%'command: ["mysqld","--server_id=1","--report_host=$HOSTNAME", # 通信的ip地址"--report_port=3306", # 通信的端口"--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve","--default_authentication_plugin=mysql_native_password","--binlog_transaction_dependency_tracking=WRITESET"]

1.2、使用mysql-shell建立集群

# 手动方式
mysqlsh --uri "root@mysql-server-1"
// init.js
var password = "root"
var clusterName = "mysqlCluster"try {print('Setting up InnoDB cluster...\n');shell.connect('root@127.0.0.1:3306', password)var cluster = dba.createCluster(clusterName);print('Adding instances to the cluster.');cluster.addInstance({user: "root", host: "127.0.0.1", port: 3307, password: password}, {recoveryMethod:'clone'})print('.');cluster.addInstance({user: "root", host: "127.0.0.1", port: 3308, password: password}, {recoveryMethod:'clone'})print('.\nInstances successfully added to the cluster.');print('\nInnoDB cluster deployed successfully.\n');
} catch(e) {print('\nThe InnoDB cluster could not be created.\n\nError: ' + e.message + '\n');
}

1.3、使用docker自动建立集群

1.3.1、docker-entrypoint.sh

#!/bin/bash
set -eif [ -n "$1" ]; thenexec "$@"
fiif [ -z "$MYSQL_HOST" ]; thenecho "-e MYSQL_HOST is required."exit 1
fi
if [ -z "$MYSQL_PORT" ]; thenecho "-e MYSQL_PORT is required."exit 1
fi
if [ -z "$MYSQL_USER" ]; thenecho "-e MYSQL_USER is required."exit 1
fi
if [ -z "$MYSQL_PASSWORD" ]; thenecho "-e MYSQL_PASSWORD is required."exit 1
fimax_tries=10
attempt_num=0
until (echo > "/dev/tcp/$MYSQL_HOST/$MYSQL_PORT") >/dev/null 2>&1; doecho "Waiting for mysql server $MYSQL_HOST ($attempt_num/$max_tries)"sleep $(( attempt_num++ ))if [ attempt_num -eq max_tries ]; thenexit 1fi
doneif [ -n "$MYSQLSH_SCRIPT" ]; thenmysqlsh "$MYSQL_USER@$MYSQL_HOST:$MYSQL_PORT" --password="$MYSQL_PASSWORD" -f "$MYSQLSH_SCRIPT" || true
fi
if [ -n "$MYSQL_SCRIPT" ]; thenmysqlsh "$MYSQL_USER@$MYSQL_HOST:$MYSQL_PORT" --password="$MYSQL_PASSWORD" --sql -f "$MYSQL_SCRIPT" || true
fi

1.3.2、Dockerfile

FROM alpine:3.18 as downloadARG pkg='mysql-shell-8.0.33-linux-glibc2.12-x86-64bit'
RUN wget "https://dev.mysql.com/get/Downloads/MySQL-Shell/$pkg.tar.gz"###
FROM debian:bullseye-slimARG pkg='mysql-shell-8.0.33-linux-glibc2.12-x86-64bit'
COPY --from=download "/$pkg.tar.gz" /opt
COPY docker-entrypoint.sh /bin/
RUN cd /opt && \tar -xzf "$pkg.tar.gz" && \ln -s "/opt/$pkg/bin/mysqlsh" /bin/ && \rm -f "/$pkg.tar.gz" && \chmod 755 /bin/docker-entrypoint.sh
ENTRYPOINT ["docker-entrypoint.sh"]
CMD []

1.3.3、docker-compose

services:mysql-shell:container_name: mysql-shellimage: mysql-shell:8.0build: ./mysql-shell-builderrestart: on-failurevolumes:- ./scripts/:/scripts/environment:- MYSQL_HOST=mysql-server-1- MYSQL_PORT=3306- MYSQL_USER=root- MYSQL_PASSWORD=root- MYSQLSH_SCRIPT=/scripts/init.js- MYSQL_SCRIPT=/scripts/init.sqldepends_on:- mysql-server-1- mysql-server-2- mysql-server-3

2、Mysql Router代理层

# docker-compose
services:mysql-router:container_name: mysql-routerimage: mysql/mysql-router:8.0restart: alwaysports:- 3306:6446environment:- MYSQL_HOST=mysql-server-1- MYSQL_PORT=3306- MYSQL_USER=root- MYSQL_PASSWORD=root- MYSQL_INNODB_NUM_MEMBERS=3 #Wait for this number of cluster instances to be online.- MYSQL_CREATE_ROUTER_USER=0depends_on:- mysql-server-1- mysql-server-2- mysql-server-3- mysql-shell

3、整合

3.1、目录结构

- <PROJECT_DIRECTORY>- mysql-shell-builder* docker-entrypoint.sh    * Dockerfile- scripts* init.js* init.sql [optional]* docker-compose.yaml

3.2、docker-compose.yaml

version: '3'services:mysql-server-1:container_name: mysql-server-1image: mysql/mysql-server:8.0restart: alwaysvolumes:- /data/mysql-server-1:/var/lib/mysql# ports:# - 3301:3306environment:MYSQL_ROOT_PASSWORD: rootMYSQL_ROOT_HOST: '%'command: ["mysqld","--server_id=1","--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve","--default_authentication_plugin=mysql_native_password","--binlog_transaction_dependency_tracking=WRITESET"]mysql-server-2:container_name: mysql-server-2image: mysql/mysql-server:8.0restart: alwaysvolumes:- /data/mysql-server-2:/var/lib/mysql# ports:# - 3302:3306environment:MYSQL_ROOT_PASSWORD: rootMYSQL_ROOT_HOST: '%'command: ["mysqld","--server_id=2","--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve","--default_authentication_plugin=mysql_native_password","--binlog_transaction_dependency_tracking=WRITESET"]mysql-server-3:container_name: mysql-server-3image: mysql/mysql-server:8.0restart: alwaysvolumes:- /data/mysql-server-3:/var/lib/mysql# ports:# - 3303:3306environment:MYSQL_ROOT_PASSWORD: rootMYSQL_ROOT_HOST: '%'command: ["mysqld","--server_id=3","--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve","--default_authentication_plugin=mysql_native_password","--binlog_transaction_dependency_tracking=WRITESET"]mysql-shell:container_name: mysql-shellimage: mysql-shell:8.0build: ./mysql-shell-builderrestart: on-failurevolumes:- ./scripts/:/scripts/environment:- MYSQL_HOST=mysql-server-1- MYSQL_PORT=3306- MYSQL_USER=root- MYSQL_PASSWORD=root- MYSQLSH_SCRIPT=/scripts/init.js# - MYSQL_SCRIPT=/scripts/init.sqldepends_on:- mysql-server-1- mysql-server-2- mysql-server-3mysql-router:container_name: mysql-routerimage: mysql/mysql-router:8.0restart: alwaysports:- 3306:6446environment:- MYSQL_HOST=mysql-server-1- MYSQL_PORT=3306- MYSQL_USER=root- MYSQL_PASSWORD=root- MYSQL_INNODB_NUM_MEMBERS=3 #Wait for this number of cluster instances to be online.- MYSQL_CREATE_ROUTER_USER=0depends_on:- mysql-server-1- mysql-server-2- mysql-server-3- mysql-shell

后台启动

docker compose up -d

后记

官方平台,对服务透明,自动故障处理,想要的功能它都有。就是首次配置可能需要多花点时间,但是参考本文,相信你可以对这套实践有更快的理解,欢迎点赞收藏!

相关文章:

InnoDB Cluster集群Mysql Router代理层最佳实践

InnoDB Cluster 集群 & Mysql-Router 代理层 前言 Mysql是现今最常用的关系型数据库之一&#xff0c;高可用一直是我们对软件服务的要求。常见的Mysql高可用是主从配置&#xff0c;在主节点挂掉后需要依赖监控脚本进行主从切换将从节点升级&#xff0c;后台服务代码层面也…...

RabbitMQ系列-概念及安装

1. 消息队列 消息队列是指利用队列这种数据结构进行消息发送、缓存、接收&#xff0c;使得进程间能相互通信&#xff0c;是点对点的通信 而消息代理是对消息队列的扩展&#xff0c;支持对消息的路由&#xff0c;是发布-订阅模式的通信&#xff0c;消息的发送者并不清楚消息的…...

进程间通信之共享内存

进程间通信之共享内存 1.共享内存机制2.两种常用共享内存方式3.补充一下:linux中shm与shmm的区别4.IPC通信System V版本的共享内存shm5.存储映射共享I/O(mmap函数)1.共享内存机制 是允许两个或多个进程(不相关或有亲缘关系)访问同一个逻辑内存的机制。它是共享和传递数据的一…...

网络连接中的舔狗协议

舔狗网络协议 &#xff08;discard protocol) 最近互联网上&#xff0c;“舔狗” 这个词语很火&#xff0c;也衍生出来很多梗&#xff08;快速说出互联网 4 大舔狗&#xff01;&#xff01;&#xff01;&#xff09;。然后今天偶然间看到了一个 RFC 文档&#xff0c; 发现了一…...

一分钟了解乐观锁、悲观锁、共享锁、排它锁、行锁、表锁以及使用场景

大家好&#xff0c;我是冰点&#xff0c;今天给大家带来&#xff0c;关于MySQL中的锁的使用。 我首先提个问题&#xff0c;大家知道什么是 乐观锁、悲观锁、共享锁&#xff0c;、排它锁、行锁、表锁&#xff0c;以及每种锁的使用场景吗&#xff1f; !! 背景&#xff1a;最近在各…...

【C++】C++ 中的 IO 流

文章目录 一、C语言的输入输出二、什么是流三、C IO 流1、C 标准 IO 流2、C 文件 IO 流 四、stringstream 介绍 一、C语言的输入输出 在C语言中我们使用最频繁的输入输出方式是 scanf () 与 printf()&#xff1a; scanf()&#xff1a;从标准输入设备 (键盘) 读取数据&#xf…...

QFuture的使用

QFuture 是 Qt 提供的一个类&#xff0c;用于表示异步操作的返回值或状态。异步操作指的是那些不会阻塞主线程的操作&#xff0c;例如文件读写、网络请求、计算等等。 在执行异步操作时&#xff0c;可以使用 QtConcurrent 模块提供的函数 (QFuture<T> QtConcurrent::run…...

通过dockerfile将nginx、前端和后端封装成一个镜像

1、内容如下 2、dist文件 就是vue项目的打包文件 3、jar包文件 就是springboot的打包文件 4、编写Dockerfile #引用 jdk1.8作为基础镜像,这个jdk1.8是我自己用linux版本的jdk打包的,具体操作可以看 #https://blog.csdn.net/qq_38639813/article/details/129384923中将jd…...

如何利用CiteSpace快速锁定领域内最新研究热点并制作精美的可视化专题图?

【基于Citespace和vosviewer文献计量学相关论文 】 ​ 01 文献计量学方法与应用 1. 文献计量学方法基本介绍 2. 与其他综述方法区别联系 3. 各学科领域应用趋势近况 4. 主流分析软件优缺点对比 5. 经典高分10SCI思路复盘 6. 软件安装与Java环境配置 02 主题确定、数据检…...

嵌入式开发从入门到精通之第二十二节:蓝牙芯片CC254x ADC 电压测量

目录 1. CC254x ADC原理 参考电压 采样通道 采样率 采样时间...

北邮22信通:二叉树显示路径的两种方法 递归函数保存现场返回现场的实例

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 一.讲解 要想实现二叉树的路径显示&#xff0c;我们要按照…...

vue 3 第二十八章:组件十二(组件的v-model、多v-model)

文章目录 1. 基本使用2. 使用conputed实现3. v-model 的参数4. 多 v-model 的使用5. v-model 修饰符 在 Vue 3 中&#xff0c; v-model 指令的使用更加灵活&#xff0c;可以绑定任意属性和事件。例如&#xff0c;我们可以使用 v-model:checked 指令来绑定单选框或复选框的 c…...

LCD 显示

概述 LCD显示控制模块接收 MCU 送过来的数据&#xff0c;按一定规律储存在显示 RAM 中&#xff0c;并根据显示 RAM 中的数据驱动 LCD 显示屏来实现期望的字符显示功能。 主要特点&#xff1a; ⚫ 最大支持 840 、 642 、 444 的显示段数 ⚫ 1/3bias 、 1/4bia s ⚫ 16 级灰度可…...

互联网医院开发|在线问诊系统架构设计功能有哪些?

互联网医院会增加更多的医疗业务&#xff0c;电话问诊、视频问诊、个性化的医疗套餐等&#xff0c;未来互联网医院会建成围绕健康主题的深度大数据平台和多元化医疗服务生态体系&#xff0c;丰富人工智能、物联网等应用场景&#xff0c;为用户提供更好的服务体验、更低的成本、…...

数据安全运营有效管理-数据安全复合治理框架和模型解读(1)

数据治理,数据安全治理行业在发展,在实践,所以很多东西是实践出来的,哪有什么神仙理论指导,即使有也是一家之说,但为了提高企业投产比,必要的认知是必须的,落地运营管理水平差异直接决定产品和项目是否可持续性,当前和未来更需要专业和有效创新。数据安全治理要充分考…...

【刷题之路】LeetCode 面试题 03.02. 栈的最小值

【刷题之路】LeetCode 面试题 03.02. 栈的最小值 一、题目描述二、解题1、方法1——“辅助栈”1.1、思路分析1.2、代码实现 一、题目描述 原题连接&#xff1a; 面试题 03.02. 栈的最小值 题目描述&#xff1a; 请设计一个栈&#xff0c;除了常规栈支持的pop与push函数以外&am…...

如何处理图片排重(精准排重,相似排重)

图片相似度对比 1、需求 假如有一个图片池&#xff0c;存有1亿图片。给一张目标图片&#xff0c;在图片池中做匹配。 判断一张图片是否在图片池中出现过。&#xff08;完全一样&#xff09;判断有没有相似的出现过。比如两张图相似度90&#xff0c;两张图片是在描述一件事情。 …...

盐城北大青鸟“北大青鸟杯”IT精英挑战赛设中心评审隆重开赛

为积极响应北大青鸟总部开展第十届“北大青鸟杯”全国IT精英挑战赛的号召&#xff0c;成就学员们的IT梦想&#xff0c;“北大青鸟杯”IT精英挑战赛&#xff08;设计组&#xff09;盐城卓晨中心评审于2023年5月25日下午1:00在人才大厦306教室正式开赛&#xff01; ​ 赛前&a…...

Pluma 插件管理框架

1. 概述 Pluma 是一个用 C 开发的可用于管理插件的开源架构&#xff0c;其官网地址为&#xff1a;http://pluma-framework.sourceforge.net/。该架构是个轻量级架构&#xff0c;非常易于理解。 Pluma 架构有以下基本概念&#xff1a; 1&#xff09;插件的外在行为体现为一个…...

Leetcode11 盛最多水的容器

Leetcode11 盛最多水的容器 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/container-with-most-water/description 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给定一个长度为 n…...

基于LSTM与SmolVLA的时序多模态数据分析

基于LSTM与SmolVLA的时序多模态数据分析 想象一下&#xff0c;你面前有一段监控视频&#xff0c;画面里有人正在行走、停留、再行走。如果只看其中一帧&#xff0c;你只能知道“这里有个人”&#xff1b;但如果把连续几帧连起来看&#xff0c;你就能判断出“这个人正在从A点走…...

别再手动调了!用Visio这个隐藏的字体设置窗口,一键切换泳道图标题横竖排

Visio高效技巧&#xff1a;解锁泳道图标题排版的隐藏技能 每次在Visio中调整泳道图标题方向时&#xff0c;你是否还在反复右键点击、寻找格式选项&#xff1f;其实Visio内置了一个被多数用户忽略的高效设置窗口——"字体"对话框。这个看似普通的设置面板&#xff0c;…...

PingFangSC字体:跨平台专业中文排版的终极开源解决方案

PingFangSC字体&#xff1a;跨平台专业中文排版的终极开源解决方案 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件&#xff0c;包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 在当今数字化时代&#xff0c;跨平台字…...

基于YOLOv8深度学习的花卉识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)

一、项目介绍 随着计算机视觉技术的快速发展&#xff0c;基于深度学习的图像识别技术在植物分类与识别领域展现出巨大的应用潜力。本系统基于先进的YOLOv8目标检测算法&#xff0c;构建了一个高效准确的花卉识别检测系统&#xff0c;能够实现对13种不同花卉的实时检测与识别。…...

OpenAI推出Safety Bug Bounty计划:聚焦AI滥用与安全风险

OpenAI正式启动公共Safety Bug Bounty&#xff08;安全漏洞赏金计划&#xff09;&#xff0c;旨在鼓励全球研究人员识别其产品中存在的AI滥用行为和安全风险。该计划托管于Bugcrowd平台&#xff0c;是对现有Security Bug Bounty的重要补充&#xff0c;专门处理那些虽不符合传统…...

Hunyuan-MT-7B开源大模型落地:Pixel Language Portal在海关报关单多语种智能填单系统中的集成

Hunyuan-MT-7B开源大模型落地&#xff1a;Pixel Language Portal在海关报关单多语种智能填单系统中的集成 1. 项目背景与挑战 海关报关单处理一直是国际贸易中的关键环节&#xff0c;传统方式面临两大核心挑战&#xff1a; 语言障碍&#xff1a;报关单涉及33种以上语言&…...

3分钟夺回你的数字音乐资产:Unlock Music浏览器解密全攻略 [特殊字符]

3分钟夺回你的数字音乐资产&#xff1a;Unlock Music浏览器解密全攻略 &#x1f3b5; 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web…...

资源获取的技术突围:res-downloader的跨平台解决方案

资源获取的技术突围&#xff1a;res-downloader的跨平台解决方案 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数字内容爆…...

ComfyUI翻译节点终极指南:如何选择最适合你的AI创作翻译工具

ComfyUI翻译节点终极指南&#xff1a;如何选择最适合你的AI创作翻译工具 【免费下载链接】ComfyUI_Custom_Nodes_AlekPet Custom nodes that extend the capabilities of Comfyui 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_Custom_Nodes_AlekPet 在AI图像生…...

数字图像处理核心算法手撕实现 (一)

1. 数字图像处理基础概念 数字图像处理就像给照片做美容手术&#xff0c;只不过操作对象是像素矩阵。我第一次接触这个概念是在大学实验室&#xff0c;当时对着一个512x512的灰度图矩阵发呆了半小时&#xff0c;才明白那些0-255的数字代表着什么。 空间分辨率相当于照片的&qu…...