mysql高级知识之集群

一、安装

        源码编译MySQL,若需要MySQLtar包可私信我

#创建数据目录
mkdir /data/mysql -p#安装相关依赖
yum install libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm
yum install cmake gcc-c++ openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 -y#解压MySQL包,并进入其目录
tar zxf mysql-boost-5.7.44.tar.gz
cd mysql-5.7.44/#进行源码安装
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/#有几个核就j几
make -j2#安装
make install#拷贝启动文件
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/#修改配置文件
vim /etc/my.cnf
[mysqld]	
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0#设置环境变量
vim ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
source ~/.bash_profile#建立mysql用户
useradd -s /sbin/nologin -M mysql#将mysql数据目录归属于mysql用户
chown mysql.mysql -R /data/mysql/#清空数据目录,注意非实验环境需先备份其中内容
rm -rf /data/mysql/*#MySQL初始化,注意初始化之后会产生一个临时密码,在第一次登陆后需改密码
mysqld --user mysql --initialize#登录MySQL,并修改root密码,第一次登录不修改密码使用不了
mysql -uroot -p'j;t/EZJ*g1y7'
alter user root@localhost identified by 'Mysql@123';#设置MySQL开机自启动
yum install chkconfig -y
chkconfig mysqld on ###不设定启动级别,默认2345
chkconfig --list

在三台主机上安装MySQL,具体如下 

主机主机名角色
192.168.220.10node1
192.168.220.20node2
192.168.220.30node3

 二、主从复制

1、干净数据库主从复制

步骤如下

        1)分别在主库从库设定不同的server-id以区分不同的数据库
        注:设定server-id后从机设定了read_only=1也可以写入,在设定server-id之后不让从机写入需设定super_read_only=on

        2)设定数据库开始二进制日志

        3)在主库上创建主从复制的用户,并给予权限

        4)配置从库

#主库node1--配置server-id和开启二进制日志(注,修改完配置文件需要重启数据库)
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=1            #server-id
log-bin=mysql-bin      #二进制日志#主库--创建用户并授权(登录数据库自己解决)
create user repl@'%' identified by 'Mysql@123';        #创建用户
grant replication slave on *.* to repl@'%';            #授权#配置完成之后可查看master状态
mysql> show master status ;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      595 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)#从库node2--配置server-id和开启二进制日志(注,修改完配置文件需要重启数据库)
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=2            #server-id
log-bin=mysql-bin      #二进制日志#从库node2--配置主从
change master to master_host='192.168.220.10',master_user='repl',master_password='Mysql@123',master_log_file='mysql-bin.000001',master_log_pos=595;
start slave;#可以查看slave状态
mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.220.10Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 595Relay_Log_File: node2-relay-bin.000002Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: Yes        #看到IO线程YesSlave_SQL_Running: Yes        #看到SQL线程Yes则说明主从配置成功

2、有数据的数据库主从复制

步骤如下

        1)分别在主库从库设定不同的server-id以区分不同的数据库
        注:设定server-id后从机设定了read_only=1也可以写入,在设定server-id之后不让从机写入需设定super_read_only=on

        2)设定数据库开始二进制日志

        3)在主库上创建主从复制的用户,并给予权限

        4)导出主库数据,传到从库做还原

        注:在企业搭建主从复制拉平数据时,需要先将主库锁起来

        5)配置从库

#主库node1--配置server-id和开启二进制日志(注,修改完配置文件需要重启数据库)
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=1            #server-id
log-bin=mysql-bin      #二进制日志#主库--创建用户并授权(登录数据库自己解决)
create user repl@'%' identified by 'Mysql@123';        #创建用户
grant replication slave on *.* to repl@'%';            #授权#配置完成之后可查看master状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1481 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)#主库和从库之间拉平数据,主库要先锁表
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)#验证表是否锁住
mysql> insert into db1.tb1 values('3','力迅');
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock#导出主库数据(注:企业中不能将数据库密码显示输入)
mysqldump -uroot -p'Mysql@123' -B db1 > mysql.sql#将sql传至新的node节点
scp /root/mysql.sql root@node3:/root#从库node3--配置server-id和开启二进制日志(注,修改完配置文件需要重启数据库)
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=3            #server-id
log-bin=mysql-bin      #二进制日志#从库导入主库数据(注:需要先登录数据库)
mysql> source /root/mysql.sql#从库node3--配置主从
change master to master_host='192.168.220.10',master_user='repl',master_password='Mysql@123',master_log_file='mysql-bin.000001',master_log_pos=595;
start slave;#可以查看slave状态
mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.220.10Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 1481Relay_Log_File: node3-relay-bin.000002Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: YesSlave_SQL_Running: Yes            #看到两个线程双Yes则配置成功#主从搭建好之后把主库解表
mysql> unlock tables;

3、SQL_delay(延迟复制,给主库上一个保险)

        延迟复制时用来控制sql 线程的,和 i/o 线程无关
        这个延迟复制不是i/o 线程过段时间来复制, i/o 是正常工作的
        是日志已经保存在slave 端了,那个 sql 要等多久进行回放

步骤如下

        1)先停止从库SQL线程

        2)设置master_delay

        3)重新启动SQL线程 

#将node3配置为延迟复制从库
#停止SQL线程
STOP SLAVE SQL_THREAD;#修改master_delay时间
CHANGE MASTER TO MASTER_DELAY=60;#开启SQL线程
START SLAVE SQL_THREAD;#在show slave status;内容里看到以下内容就配置成功SQL_Delay: 60

4、慢查询日志

  •  慢查询,顾名思义,执行很慢的查询
  • 当执行 SQL 超过 long_query_time 参数设定的时间阈值(默认 10s )时,就被认为是慢查询,这个 SQL语句就是需要优化的
  • 慢查询被记录在慢查询日志里
  • 慢查询日志默认是不开启的
  • 如果需要优化 SQL 语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。
#慢查询日志默认不开启
mysql> show variables like "slow%";
+---------------------+----------------------------+
| Variable_name       | Value                      |
+---------------------+----------------------------+
| slow_launch_time    | 2                          |
| slow_query_log      | OFF                        |
| slow_query_log_file | /data/mysql/node1-slow.log |
+---------------------+----------------------------+
3 rows in set (0.00 sec)#慢查询默认查询时间为10s
mysql> show variables like "long%";
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)#开启慢查询日志,两种方法,一种通过命令行,一种通过修改配置参数,以下是命令行
set global slow_query_log=on#验证慢查询日志是否开启
mysql> show variables like "slow%";
+---------------------+----------------------------+
| Variable_name       | Value                      |
+---------------------+----------------------------+
| slow_launch_time    | 2                          |
| slow_query_log      | ON                         |
| slow_query_log_file | /data/mysql/node1-slow.log |
+---------------------+----------------------------+
3 rows in set (0.00 sec)#慢查询日志记录在slow_query_log_file所对应的位置/data/mysql/node1-slow.log里

5、并行复制

        默认情况下slave 中使用的是 sql 单线程回放 ,在master 中时多用户读写,如果使用 sql 单线程回放那么会造成组从延迟严重,开启MySQL 的多线程回放可以解决上述问题
#查看默认情况下slave的线程情况
mysql> show processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| Id | User        | Host      | db   | Command | Time | State                                                  | Info             |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
|  2 | root        | localhost | db1  | Query   |    0 | starting                                               | show processlist |
|  5 | system user |           | NULL | Connect | 4022 | Waiting for master to send event                       | NULL             |
|  7 | system user |           | NULL | Connect | 2911 | Slave has read all relay log; waiting for more updates | NULL             |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
3 rows in set (0.00 sec)#将node2设定为多线程回放
slave-parallel-type=LOGICAL_CLOCK  #基于组提交
slave-parallel-workers=16          #开启的线程数量
master_info_repository=TABLE       #将master信息记录在表中,默认记录/data/mysql/master_info
relay_log_info_repository=TABLE    #将回放日志信息记录在表中,默认记录在/data/mysql目录下
relay_log_recovery=ON              #日志回放恢复功能开启#查看修改过后slave的线程情况
mysql> show processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| Id | User        | Host      | db   | Command | Time | State                                                  | Info             |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
|  1 | system user |           | NULL | Connect |    5 | Waiting for master to send event                       | NULL             |
|  2 | system user |           | NULL | Connect |    5 | Slave has read all relay log; waiting for more updates | NULL             |
|  3 | system user |           | NULL | Connect |    5 | Waiting for an event from Coordinator                  | NULL             |
|  4 | system user |           | NULL | Connect |    5 | Waiting for an event from Coordinator                  | NULL             |
|  5 | system user |           | NULL | Connect |    5 | Waiting for an event from Coordinator                  | NULL             |
|  7 | system user |           | NULL | Connect |    5 | Waiting for an event from Coordinator                  | NULL             |
|  8 | system user |           | NULL | Connect |    5 | Waiting for an event from Coordinator                  | NULL             |
|  9 | system user |           | NULL | Connect |    5 | Waiting for an event from Coordinator                  | NULL             |
| 10 | system user |           | NULL | Connect |    5 | Waiting for an event from Coordinator                  | NULL             |
| 11 | system user |           | NULL | Connect |    5 | Waiting for an event from Coordinator                  | NULL             |
| 12 | root        | localhost | NULL | Query   |    0 | starting                                               | show processlist |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
11 rows in set (0.00 sec)

6、gtid模式

        思维引导:为什么需要gtid模式?

        在master 端的写入时多用户读写,在slave端的复制时单线程日志回放,所以slave端与master端一定会延迟, 这种延迟在 slave 端的延迟可能会不一致,当 master 挂掉后 slave 接管,一般会挑选一个和master延迟日志最接近的充当新的master,其余的slave主机重新指向新的master主机, 这时候按照之前的配置我们需要知道新的 master 上的 pos id ,但是我们无法确定新的 master slave 间差多少,于是我们就需要一个全局的日志,gtid

配置过程

  1. 在所有节点上开启gtid模式
  2. 停止所有的slave
  3. 重新配置从库change master to
  4. 启动所有slave节点
#在所有节点上开启gtid
[root@node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin
server-id=1
gtid-mode=on                #以下两行内容,开始gtid
enforce-gtid-consistency=on#从库操作皆以node2为例
mysql> stop slave;
mysql> change master to master_host='192.168.220.10',master_user='repl',master_password='Mysql@123',master_auto_position=1;
mysql> start slave;#检验
mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.220.10Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000003Read_Master_Log_Pos: 154Relay_Log_File: node2-relay-bin.000002Relay_Log_Pos: 367Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: YesSlave_SQL_Running: Yes            #出现双Yes代表主从没问题Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 154Relay_Log_Space: 574Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: 7ead7e03-687d-11ef-8256-000c298c629aMaster_Info_File: /data/mysql/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 1            #出现这个则表示gtid模式成功开启Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 
1 row in set (0.00 sec)

7、异步主从架构

        实际上主从同步的原理就是基于 binlog 进行数据同步的。在主从复制过程中,会基于3 个线程来操作, 一个主库线程,两个从库线程。

三个线程
  • 二进制日志转储线程( Binlog dump thread )是一个主库线程。当从库线程连接的时候, 主库可以将二进制日志发送给从库,当主库读取事件(Event )的时候,会在 Binlog 上加锁,读取完成之后,再将锁释放掉。
  • 从库 I/O 线程会连接到主库,向主库发送请求更新 Binlog 。这时从库的

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

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

相关文章

安防视频综合管理系统EasyCVR视频汇聚平台集群部署出现状态不同步的情况是什么原因?

随着视频监控技术的快速发展,各类视频资源的整合、管理与分发成为了安防行业的重要挑战。视频综合管理系统EasyCVR视频汇聚平台通过集群部署,实现了视频资源的高效整合与管理。集群部署不仅能够提升系统的处理能力和稳定性,还能有效避免单点故…

JVM面试(四)类加载器和双亲委派机制

什么是类加载器? 简单来说的话,是用于实现“类加载动作”的加载器 “通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器…

Ollama拉起本地模型以及rag系统部署。

什么是 Ollama ? Ollama 是一个简明易用的本地大模型运行框架。能在本地启动并运行 Llama、qwen、Gemma 及其他大语言模型,没有GPU资源照样可以拉起模型,和LocalAI 比较类似,但是加载模型更容易。 1.安装 安装后运行&#xff0c…

解剖学上合理的分割:通过先验变形显式保持拓扑结构|文献速递--基于深度学习的医学影像病灶分割

Title 题目 Anatomically plausible segmentations: Explicitly preserving topology through prior deformations 解剖学上合理的分割:通过先验变形显式保持拓扑结构 01 文献速递介绍 进行环向应变或壁厚度的计算,这些测量通常用于诊断肥厚性心肌病…

Vue前端路由详解——以Ruoyi框架为案例学习

Vue路由 Vue路由详解_vue 页面路由-CSDN博客 路由模式 Vue 的路由模式:hash 模式和 history 模式的区别_vue路由history和hash的区别-CSDN博客 URL格式: Hash模式:URL中包含#号,用于区分页面部分,实际请求的页面地址…

【深度学习与NLP】——词嵌入Embedding技术

目录 1.词嵌入的作用 2.嵌入矩阵的计算 3.Embedding层的代码实验 词嵌入(Embedding)技术是一种将词汇映射到低维连续向量空间的方法。将离散的单词数据处理成连续且固定长度的向量,使模型可以学习和处理语义信息。 假设需要将["Are&…

【MySQL00】【 杂七杂八】

文章目录 一、前言二、MySQL 文件1. 参数文件2. 日志文件3. 套接字文件4. pid 文件5. 表结构定义文件6. InnoDB 存储引擎文件 二、BTree 索引排序三、InnoDB 关键特性1. 插入缓冲1.1 Insert Buffer 和 Change Buffer1.1 缓冲合并 2. 两次写2. 自适应哈希索引3. 异步IO4. 刷新邻…

关于武汉芯景科技有限公司的A/D转换芯片XJ3021开发指南(兼容MCP3021)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、时序(IIC通信) 四、程序代码 XJ3021.C /** XJ3021.c** Created on: 2024年8月23日* Author: Administrator*/ #include "softiic.h" #include "XJ3021.h" #inc…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 09部署OSPF

本章的目的是帮助网络工程师确定网络的理想 OSPF 配置。本章将回答以下问题 应何时在数据中使用OSPF ?配置 OSPF 的关键设计原则是什么?OSPFv2 和 OSPFv3 之间有什么区别,应如何使用?如何在路由协议栈中配置 OSPF ?如何在服务器上配置 OSPF,例如为容…

【MySQL08】【死锁】

文章目录 一、前言二、查看事务加锁情况1. 使用 information_schema 数据库中表获取锁信息1.1 INNODB_TRX1.2 INNODB_LOCKS1.3 INNODB_LOCK_WAITS 2. 使用 SHOW ENGIN INNODB STATUS 获取锁信息 三、死锁四、参考内容 一、前言 最近在读《MySQL 是怎样运行的》、《MySQL技术内…

Android之Handler的post方法和sendMessage的区别

目录 post 方法方法特点 sendMessage 方法方法特点 使用场景区别总结 Handler 类在 Android 中用于在不同线程之间传递消息和执行代码。它提供了两种主要的方式来执行任务:通过 post 方法和通过 sendMessage 方法。这两种方法有不同的使用场景和特点。 post 方法 方…

浅谈架构实战

目录 背景 1 架构演变 2 如何实现高层的复用 2 中台产生案例 3 技术架构的核心要点 4 技术架构的高可用案例 背景 业务架构、数据架构、应用架构和技术架构它们是相互关联和相互支持的,共同构成了企业的总体架构,业务架构是源头,然后才…

自动生成对话视频!如何使用Captions的AI视频生成与编辑API工具?

Captions公司最近发布了一套AI驱动的视频生成和编辑API工具,为创作者和开发者提供了一个强大的视频创作生态系统。这个系统包含AI Creator、AI Twin、AI Edit、和AI Translate四大核心功能,每个工具都针对不同的创作需求进行优化。下面我们就一起来详细测…

第九周:机器学习

目录 摘要 Abstract 一、RNN 1、引入 2、RNN的分类 二、LSTM 1、基本结构 2、具体步骤 3、举例说明 4、原理理解 总结 摘要 本周主要围绕RNN进行探讨,从为什么需要这类”循环网络“入手,提到了”slot filling“技术,接着又对R…

AT3340:支持BDS/GPS双模授时板数据手册

AT3340采用ATGM331C-5T31授时模块,是高授时精度的BDS/GPS双模接收机板卡,包含32个跟踪通道,支持GPS和BDS的单系统授时定位和双系统联合授时定位,可以通过上位机命令切换。其中的射频前端芯片和基带芯片全部由杭州中科微独立研发&a…

RAG数据集自动构造探索, 附prompt

从文档中手动创建数百个 QA(问题-上下文-答案)样本可能非常耗时且劳动密集。此外,人工生成的问题可能难以达到全面评估所需的复杂程度,最终影响评估的质量。通过使用合成数据生成,开发人员在数据聚合过程中的时间可以减…

嵌入式Linux:常见信号的默认行为

信号是一种软件中断,用于通知进程发生了某种异步事件。信号可以由用户、其他进程或操作系统内核产生。进程可以选择捕获并处理这些信号,或者忽略它们,让系统执行默认操作。 不可靠信号(非实时信号):编号为 …

观测云核心技术解密:eBPF Tracing 实现原理

前言 eBPF 是一种强大的内核技术,允许在内核中安全地执行自定义代码。通过 eBPF,开发者可以在不修改内核源码的情况下,对内核功能进行扩展和监控。eBPF Tracing 利用这一技术,对系统调用、内核函数等进行跟踪,从而实现…

【IPV6从入门到起飞】2-1 获取你的IPV6(手机、CPE等)

【IPV6从入门到起飞】2-1 获取你的IPV6(手机、CPE等) 1 IPV6就在身边2 手机IPV62.1 查看IPV62.2 IPV6 ping包测试2.3 IPV6入站测试 3 电脑通过CPE获取IPV63.1 拉不起宽带的打工人3.2 开始部署IPV6环境3.2.1 刷系统3.2.2 激活IPV63.2.3 设置防火墙入站&am…