Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上
1.1 目的
部署MysqlCluster集群环境
1.2 MySQL集群Cluster原理
1 数据分片
MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上,提高系统的性能和可扩展性。
2. 数据同步
MySQL集群Cluster使用多个服务器来存储数据,因此需要确保数据在不同的服务器之间同步。MySQL集群Cluster使用多种同步机制,如异步复制、半同步复制和全同步复制等,来确保数据的一致性和可靠性。
3. 负载均衡
MySQL集群Cluster使用负载均衡算法来分配客户端请求到不同的服务器上。这样可以避免单个服务器过载,提高系统的性能和可用性。
4. 自动故障转移
MySQL集群Cluster可以自动检测服务器的故障,并将故障服务器上的数据转移到其他服务器上。这样可以确保系统的高可用性和可靠性。
1.3 NDB引擎介绍
在MySQL实现集群Cluster架构中,存储节点使用的存储引擎为NDB引擎。NDB引擎是一种分布式的基于内存的引擎,因此作为MySQL集群Cluster架构中的存储节点,内存一定要足够大。
使用NDB引擎有以下优点:
1、基于内存存储,没有磁盘I/O瓶颈,速度快。
2、扩展性好,增加节点即可实现数据库集群Cluster的扩展。
3、冗余性好,单个节点故障,集群还可以提供服务。
同时,NDB引擎也有以下缺点:
1、由于存储基于内存,因此在设备断电后数据即丢失。
2、存储空间大小受内存大小限制。
3、多个节点分布式架构整体速度受会网络速度影响
1.4 InnoDB存储引擎
InnoDB是一种支持事务和行级锁的崇尚ACID特性的储存引擎。它是MySQL5.5版本后的默认引擎。InnoDB非常适合那些需要频繁进行更新操作的应用,比如在线事务处理系统(OLTP)。
使用InnoDB引擎有以下优点:
1、支持事务:InnoDB储存引擎具有事务处理的能力,能够保证数据的完整性和一致性。
2、行级锁:InnoDB通过行级锁来控制并发读写操作,提高了多用户环境下的并发性能。
3、外键约束:InnoDB支持外键约束,保证数据的完整性。
4、适合OLTP:InnoDB引擎特别适合处理大量的并发读写操作,如OLTP系统。
5、Crash Recovery:InnoDB具备崩溃恢复的功能,能够在异常退出后将数据恢复到一致的状态。
同时,InnoDB引擎也有以下缺点:
1、 读写效率较差。
2、 占用的数据空间相对较大。
1.5 MyISAM存储引擎
MyISAM是MySQL早期的默认储存引擎,它采用表级锁,适合处理大量的读操作。然而,它不支持事务和外键约束。
使用MyISAM引擎有以下优点:
1、表级锁:MyISAM采用表级锁,对于大量更新操作的并发性能较差。
2、不支持事务:MyISAM不支持事务处理,因此可能存在数据不一致的风险。
3、全文索引:MyISAM支持全文索引,适合处理搜索引擎和全文搜索等应用。
4、插入性能:MyISAM在插入性能方面较好,对于大量的插入操作,性能较高。
同时,MyISAM引擎也有以下缺点:
1、不支持事务的完整性和并发性。
1.6 引擎对比选择
InnoDB适用于大量的并发读写操作、需要事务处理和外键约束的应用;MyISAM适用于大量的读操作、不需要事务处理和外键约束的应用;NDB适用于高并发、实时性要求高的应用。
2. 部署程序
2.1 部署环境
服务器作用 服务器名 服务器IP 系统版本
管理节点 master 192.168.186.128 Centos7
数据节点 slave1 192.168.186.129 Centos7
SQL节点 slave2 192.168.186.130 Centos7
SQL节点 slave3 192.168.186.130 Centos7
2.2.1 修改四台主机名和添加hosts
#关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
#时间同步
yum install ntpdate -y
ntpdate time.windows.com
hostnamectl set-hostname master && bash #192.168.186.128上操作
hostnamectl set-hostname slave1 && bash #192.168.186.129上操作
hostnamectl set-hostname slave2 && bash #192.168.186.130上操作
hostnamectl set-hostname slave3 && bash #192.168.186.131上操作
#四台服务器同时添加内容
cat >> /etc/hosts << EOF
192.168.186.128 master
192.168.186.129 slave1
192.168.186.130 slave2
192.168.186.131 slave3
EOF
#所有机器上都操作
ssh-keygen -t rsa #一路回车,不输入密码
###把本地的ssh公钥文件安装到远程主机对应的账户
for i in master slave1 slave2 slave3;do ssh-copy-id -i .ssh/id_rsa.pub $i ;done
2.3 管理节点部署
2.3.1 管理节点原理
顾名思义,管理节点用来对其它节点进行管理。实际操作中,是通过对一个叫做config.ini的配置文件进行维护而起到管理的作用。该文件可以用来配置有多少需要维护的副本、需要在每个数据节点上为数据和索引分配多少内存、数据节点的位置、在每个数据节点上保存数据的磁盘位置、SQL节点的位置等信息。管理节点只能有一个,配置要求不高。
#关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
#时间同步
yum install ntpdate -y
ntpdate time.windows.com
mkdir -p /var/log/mysql-cluster
mkdir -p /etc/mysql-cluster
mkdir -p /usr/local/mysql && cd /usr/local/mysql #上传安装包到此路径下
wget https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster-8.0.25-linux-glibc2.12-x86_64.tar.gz --no-check-certificate
tar -zxvf mysql-cluster-8.0.25-linux-glibc2.12-x86_64.tar.gz #解压
mv mysql-cluster-8.0.25-linux-glibc2.12-x86_64 mysql-cluster #重命名
touch /etc/mysql-cluster/config.inicat > /etc/mysql-cluster/config.ini << EOF
[ndbd default]
#数据写入数量。1表示一份,1个数据节点
NoOfReplicas=1[ndb_mgmd]
nodeid=1
#管理结点的日志
datadir=/var/log/mysql-cluster
#管理结点的IP地址。本机IP
HostName=192.168.186.128###### data node options: #存储结点
[ndbd]
HostName=192.168.186.129
DataDir=/data/mysql
#mysql数据存储路径
nodeid=2# SQL node options: #关于SQL结点
[mysqld]
HostName=192.168.186.130
nodeid=3[mysqld]
HostName=192.168.186.131
nodeid=4
EOF
#初始化管理节点
/usr/local/mysql/mysql-cluster/bin/ndb_mgmd -f /etc/mysql-cluster/config.ini
#查看集群状态
/usr/local/mysql/mysql-cluster/bin/ndb_mgm
ndb_mgm> show
#发现管理节点已经启动,当数据节点以及SQL节点未启动时显示的是not connected。

2.4 数据节点部署
2.4.1 数据节点原理
用来存放Cluster里面的数据,可以有多个数据节点。每个数据节点可以有多个镜像节点。任何一个数据节点发生故障,只要它的镜像节点正常,Cluster就可以正常运行。
这3种逻辑上不同的节点物理上可以存放在不同的服务器上,也可以在同一台 服务器上。通过架构中各个节点的介绍,可以总结一下MySQL Cluter的访问过程:前台应用利用一定的负载均衡算法将对数据库的访问分散到不同的SQL节点上,然后SQL节点对数据节点进行数据访问并从数据节点返回结果,最后SQL节点将收到的结果返给前台应用。而管理节点并不参与访问过长,它只用来对SQL节点和数据节点进行配置管理。
#关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
#时间同步
yum install ntpdate -y
ntpdate time.windows.com
mkdir -p /usr/local/mysql && cd /usr/local/mysql
wget https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster-8.0.25-linux-glibc2.12-x86_64.tar.gz --no-check-certificate
tar -zxvf mysql-cluster-8.0.25-linux-glibc2.12-x86_64.tar.gz #解压
mv mysql-cluster-8.0.25-linux-glibc2.12-x86_64 mysql-cluster #重命名
useradd -M -s /sbin/nologin mysql
mkdir -p /etc/mysql
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql/
cat > /etc/my.cnf << EOF[mysqld]
#mysql数据存储路径
datadir=/data/mysql
#启动ndb引擎
ndbcluster
#管理节点IP地址
ndb-connectstring=192.168.186.128[mysql_cluster]
#管理节点IP地址
ndb-connectstring=192.168.186.128
EOF
#启动数据节点
/usr/local/mysql/mysql-cluster/bin/ndbd –initial

#检查数据节点是否启动
/usr/local/mysql/mysql-cluster/bin/ndb_mgm
ndb_mgm> show

2.5 SQL节点部署(2台 SQL服务器同样的部署方式)
SQL节点可以理解为应用和数据节点之间的一个桥梁。应用不能直接访问数据节点,只能先访问SQL节点,然后SQL节点再去访问数据节点来返回数据。Cluster中可以有多个SQL节点,通过每个SQL节点查询到的数据都是一直的,通常来说,SQL节点越多,分配到每个SQL节点的负载就越少,系统的整体性能就越好。
#关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
#时间同步
yum install ntpdate -y
ntpdate time.windows.com
mkdir -p /usr/local/mysql
mkdir -p /etc/mysql
mkdir -p /data/mysql && cd /usr/local/mysql
wget https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster-8.0.25-linux-glibc2.12-x86_64.tar.gz --no-check-certificate
tar -zxvf mysql-cluster-8.0.25-linux-glibc2.12-x86_64.tar.gz #解压
mv mysql-cluster-8.0.25-linux-glibc2.12-x86_64 mysql-cluster #重命名chown -R mysql:mysql /data/mysql/
useradd -M -s /sbin/nologin mysql
#创建SQL节点配置文件
cat > /etc/my.cnf << EOF[mysqld]
user=mysql
#启动ndb引擎
ndbcluster
#管理节点IP地址
ndb-connectstring=192.168.186.128[mysql_cluster]
#管理节点IP地址
ndb-connectstring=192.168.186.128
EOF
#配置mysql服务
cp /usr/local/mysql/mysql-cluster/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
#编辑mysqld服务
vim /etc/init.d/mysqld

#图片中的代码如下:
# Set some defaults
mysqld_pid_file_path=
if test -z "$basedir"
thenbasedir=/usr/local/mysql/mysql-clusterbindir=/usr/local/mysql/mysql-cluster/binif test -z "$datadir"thendatadir=/data/mysqlfisbindir=/usr/local/mysql/mysql-cluster/binlibexecdir=/usr/local/mysql/mysql-cluster/bin
elsebindir="$basedir/bin"if test -z "$datadir"thendatadir="$basedir/data"fisbindir="$basedir/sbin"libexecdir="$basedir/libexec"
fi
#初始化mysql数据库
cd /usr/local/mysql/mysql-cluster/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/mysql-cluster --datadir=/data/mysql/

#启动mysql
systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld#两台SQL节点操作相同。
#检查SQL节点是否启动
/usr/local/mysql/mysql-cluster/bin/ndb_mgm
ndb_mgm> show
#2台 SQL服务器同样的部署后,截图如下:

cp /usr/local/mysql/mysql-cluster/support-files/mysql.server /etc/init.d/mysqld
ln -s /usr/local/tools/mysql/bin/mysql /usr/bin
#登录数据库
mysql -uroot -p #初始化时候的密码
alter user user() identified by "Mysql@123"; #修改为新的密码
flush privileges;
3. 验证集群
#192.168.5.130上执行
mysql -uroot -pMysql@123 #利用修改后的密码登录
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| ndbinfo |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.11 sec)mysql> create database mqq;
Query OK, 1 row affected (0.17 sec)mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mqq |
| mysql |
| ndbinfo |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)mysql>
192.168.5.131上验证
mysql -uroot -pMysql@123 #利用修改后的密码登录
mysql> show databases;

可以看到数据完成同步。
至此MysqlCluster集群部署完成
4. 集群命令操作
4.1 管理节点操作
管理节点关闭(关闭管理节点后会一起关闭数据节点)
/usr/local/mysql/mysql-cluster/bin/ndb_mgm -e shutdownrm /usr/local/mysql/mysql-cluster/ndb_1_config.bin.1 #如果集群配置有更新了
4.2 数据节点操作
数据节点(NDB)关闭
cd /usr/local/mysql/mysql-cluster/bin
./ndbd stop
4.3 SQL节点操作
SQL节点关闭
systemctl stop mysqld
参考地址:https://blog.csdn.net/hanyuce/article/details/134684116?app_version=6.2.2&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22134684116%22%2C%22source%22%3A%22qq_14910065%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app
相关文章:
Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上
1.1 目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1 数据分片 MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上,提高系统的性能和可扩展性。 2. 数据同步 MySQL集群Cluster使…...
身份认证技术
身份认证是对系统的用户进行有效性、真实性验证。 1.口令认证方式 使用口令认证方式,用户必须具有一个唯一的系统标识,并且保证口令在系统的使用和存储过程中是安全的,同时口令在传输过程中不能被窃取、替换。另外特别要注意的是在…...
Centos7、Mysql8.0 load_file函数返回为空的终极解决方法--暨selinux的深入理解
零、问题背景 最近想换房,为了方便自己对比感兴趣的房子,因此决定将目标房源的基本信息放在表里,特别是要一目了然的看到众多房子的各种图纸和照片,因此决定要在Mysql8.0.34数据库中以二进制形式保存图片(抛开合理性和…...
基于Spring Boot的水产养殖管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot的水产养殖管理系统,jav…...
LCR 090. 打家劫舍 II(leetcode)动态规划
文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中,我们将要详细介绍一下LeetcodeLCR 090. 打家劫舍 II。采用动态规划解决,这是一道经典的多状态dp问题 一、题目分析…...
【小沐学Python】Python实现语音识别(Whisper)
文章目录 1、简介1.1 whisper简介1.2 whisper模型 2、安装2.1 whisper2.2 pytorch2.3 ffmpeg 3、测试3.1 命令测试3.2 代码测试:识别声音文件3.3 代码测试:实时录音识别 结语 1、简介 https://github.com/openai/whisper 1.1 whisper简介 Whisper 是…...
Nginx负载均衡实战
🎵负载均衡组件 ngx_http_upstream_module https://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过多种方式去定义服务器组 样例: upstream backend {server back…...
Redis skiplist源码解析(支持范围查询)
跳表是一个多层的有序链表,在跳表中进行查询操作时,查询代码可以从最高层开始查询。层数越高,结点数越少,同时高层结点的跨度会比较大。因此,在高层查询结点时,查询一个结点可能就已经查到了链表的中间位置…...
MVSNeRF:多视图立体视觉的快速推广辐射场重建(2021年)
MVSNeRF:多视图立体视觉的快速推广辐射场重建(2021年) 摘要1 引言2 相关工作3 MVSNeRF实现方法3.1 构建代价体3.2 辐射场的重建3.3 体渲染和端到端训练 3.4 优化神经编码体 Anpei Chen and Zexiang Xu and Fuqiang Zhao et al. MVSNeRF: Fast…...
华为OD机试真题-CPU算力分配-2023年OD统一考试(C卷)
题目描述: 现有两组服务器A和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能力,B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换,求两组服务器中,用于交换的CPU的算力,…...
校验数据是否重叠(各种操作符>,<,>=,<=,or,and)
最近接到一个需求,其中部分功能涉及到数据的重叠校验,并且录入的数据需要包含各种操作符。如果只通过java代码来查询并进行循环判断的话,判断情况会很复杂,幸好有同事的帮忙提供了一个用sql查询重叠部分的方法,现在分享…...
大一C语言作业 12.8
1.C 对一维数组初始化时,如果全部元素都赋了初值,可以省略数组长度。 这里没有指定数组长度,编译器会根据初始化列表的元素个数来确定数组长度。 2.C 在C语言中,字符数组是不能用赋值运算符直接赋值的。 3.C 在二维数组a中&#x…...
ELasticsearch:什么是语义搜索?
语义搜索定义 语义搜索是一种解释单词和短语含义的搜索引擎技术。 语义搜索的结果将返回与查询含义匹配的内容,而不是与查询中的单词字面匹配的内容。 语义搜索是一组搜索引擎功能,其中包括根据搜索者的意图及其搜索上下文理解单词。 此类搜索旨在通过…...
ooTD I 女儿是自己的,尽情打扮尽情可爱
分享女宝的时尚穿搭 奶乎乎的黄色也太好看了 超足充绒量+优质面料 柔软蓬松上身体验感超赞 怎么穿都好看系列 轻轻松松打造时尚造型!!...
第62天:django学习(十一)
cookie和session 发展史 一开始,只有一个页面,没有登录功能,大家看到东西都一样。 时代发展,出现了需要登录注册的网站,要有一门技术存储我们的登录信息,于是cookie诞生了。 cookie: - 存储形式:k:v键值对…...
Rust测试字符串的移动,Move
代码创建了一个结构体,结构体有test1 字符串,还有指向字符串的指针。一共创建了两个。 然后我们使用swap 函数 交换两个结构体内存的内容。 最后如上图。相同的地址,变成了另外结构体的内容。注意看指针部分,还是指向原来的地址…...
vue+electron问题汇总
1. Vue_Bug Failed to fetch extension, trying 4 more times 描述:项目启动时报错 解决:注释图片中内容 2. Module not found: Error: Can’t resolve ‘fs’ in 描述:项目启动报错 解决:vue.config.js中添加图中数据 3.导入…...
Linux中的网络时间服务器
本章主要介绍网络时间的服务器 使用chrony配置时间服务器配置chrony客户端服务器同步时间 1.1 时间同步的重要性 一些服务对时间要求非常严格,例如如图所示的由三台服务器搭建的ceph集群 这三台服务器的时间必须保持一致,如果不一致,就会显…...
fastadmin打印页面
如下图选中订单号进行打印 html中增加代码 <div id"toolbar" class"toolbar"><a href"javascript:;" class"btn btn-primary btn-refresh" title"{:__(Refresh)}" ><i class"fa fa-refresh">&l…...
Java 将word转为PDF的三种方式和处理在服务器上下载后乱码的格式
我这边是因为业务需要将之前导出的word文档转换为PDF文件,然后页面预览下载这样的情况。之前导出word文档又不是我做的,所以为了不影响业务,只是将最后在输出流时转换成了PDF,当时本地调用没什么问题,一切正常…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
