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

MySQL高可用性实践指南

一 、Mysql 在服务器中的部署方法

1、安装依赖性

yum install libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm -y
yum install ncurses-devel.x86_64 -y
yum install gcc-c++ -y
yum install openssl-devel -y
yum install cmake -y

2、下载并解压源码包

tar zxf mysql-boost-5.7.44.tar.gz

3、源码编译安装mysql

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/

make -j2

make install

4、部署mysql

生成启动脚本、

mkdir /data/mysql -p
useradd -s /sbin/nologin -M mysql
chown mysql.mysql -R /data/mysql
cd /usr/local/mysql/support-files/
cp mysql.server /etc/init.d/mysqld

生成配置文件

vim /etc/my.cnf

修改环境变量 

vim ~/.bash_profile

数据库初始化建立mysql基本数据

mysqld --initialize --user=mysql

/etc/init.d/mysqld start
chkconfig mysqld on

数据库安全初始化

 mysql_secure_installation

测试:

mysql -uroot -p

mysql> show databases;

二 mysql的组从复制

1、配置mastesr

vim /etc/my.cnf

/etc/init.d/mysqld restart

mysql -p123

配置用户权限

2、配置salve

vim /etc/my.cnf

/etc/init.d/mysqld restart
mysql> change master to MASTER_HOST='172.25.254.10',MASTER_USER='repl',MASTER_PASSWORD='123',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;

mysql> start slave;
mysql> show slave status\G;

测试:

在master中创建数据库

在slave中查看

注:master  :  172.25.254.10   mysql-node1

       slave1   :  172.25.254.20   mysql-node2

       slave2   :  172.25.254.30   mysql-node3

3、当有数据时添加slave2

vim /etc/my.cnf

从master节点备份数据

 mysqldump -uroot -p hao > hao.sql

scp hao.sql root@172.25.254.30:/mnt/

利用master节点中备份出来的hao.sql在slave2中拉平数据

mysql -uroot -p -e "create database hao"
mysql -uroot -p hao < hao.sql

配置slave2的slave功能

先查看master的状态

mysql> change master to master_host='172.25.254.10',master_user='repl',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=797;
mysql> start slave;
mysql> show slave status\G;

在master添加用户

mysql> insert into hao.userlist values ('user','666');

在slave2中查看

 mysql> select * from hao.userlist;

4、延迟复制

当master端误操作,可以在slave端进行数据备份

mysql> stop slave sql_thread;
mysql> change master to master_delay=60;
mysql> start slave sql_thread;
mysql> show slave status\G;

5、慢查询日志

开启慢查询日志

mysql> set global slow_query_log=on;
mysql> show variables like "slow%";

测试慢查询:

mysql> select sleep (10);
cat /data/mysql/localhost-slow.log

6、mysql的并行复制

查看slave中的线程信息

默认情况下slave中使用的是sql单线程回放

mysql> show processlist;

 vim /etc/my.cnf

 /etc/init.d/mysqld restart
mysql> show processlist;

三 半同步模式

MySQL 的半同步复制(Semi-Synchronous Replication)是一种介于异步和全同步复制之间的复制模式。它提供了一种平衡点,使得主从复制的延迟时间得以降低,同时提高了数据的一致性。

1、半同步复制的工作原理

  • 主库写入: 在半同步模式下,当主库执行写操作(如INSERTUPDATEDELETE)时,它会在本地提交事务到存储引擎,但不会立即返回给客户端。

  • 从库确认: 主库会等待至少一个半同步模式下的从库接收到该事务,并将其写入到从库的relay log中。然后,从库会向主库发送确认(ACK)。

  • 主库响应: 收到至少一个从库的确认后,主库才会将事务提交结果返回给客户端。

2、半同步的特点

  • 数据一致性: 通过这种模式,可以确保在主库提交事务之前,至少有一个从库持有该事务的副本,从而增强数据的安全性和一致性。

  • 性能折中: 由于主库在等待从库确认的过程中会有短暂的延迟,因此半同步模式下的性能可能会比异步模式略低。

  • 故障恢复: 在主库发生故障时,从库已经有了最新的事务日志,切换到从库作为新主库时,数据丢失的风险会降低。

3、设置gtid

在master端开启gtid模式

 vim /etc/my.cnf

 /etc/init.d/mysqld restart

开启slave端的gtid

 vim /etc/my.cnf

mysql> change master to master_host='172.25.254.10',-> master_user='repl',-> master_password='123',-> master_auto_position=1;

注:重置从服务器的复制状态

mysql> RESET SLAVE ALL;

4、启用半同步模式

在master端配置启用半同步模式

vim /etc/my.cnf

安装半同步插件

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

查看插件情况

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

查看半同步功能状态

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

在slave端开启半同步功能

vim /etc/my.cnf

安装半同步插件

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

测试:

在slave端

mysql> stop slave io_thread;

在master端写入数据

mysql> insert into hao.userlist values ('user4','123');

mysql> start slave IO_THREAD;

四 mysql高可用之组复制 (MGR)

1、组复制的概述

MySQL 高可用的组复制(MySQL Group Replication, MGR)是一种官方的高可用解决方案,允许在多个 MySQL 实例之间实现数据的自动复制和故障转移,从而确保系统的高可用性和数据一致性。

组复制的基本概念

  • 组成员 (Group Members):每个参与组复制的 MySQL 实例称为一个组成员。所有成员之间相互通信,共享数据变更。
  • 主备模式 (Single-Primary Mode):在这种模式下,组中只有一个主节点,负责所有的写操作。其余节点为备份节点,负责读取操作并从主节点复制数据。
  • 多主模式 (Multi-Primary Mode):在这种模式下,组中所有节点都可以进行写操作,数据会在所有节点间同步。

组复制的特点

  • 自动故障转移:如果组中某个节点发生故障,其他节点会自动接管其任务,确保服务的连续性。
  • 强一致性:组复制支持两种一致性模型,强一致性和最终一致性。强一致性通过 quorum 机制确保所有写操作的持久化。
  • 数据冲突处理:在多主模式下,组复制通过冲突检测和处理机制来解决并发写入冲突。

2、实现mysql组复制

在master中

rm -fr /data/mysql/
vim /etc/my.cnf

mysqld --user=mysql --initialize
/etc/init.d/mysqld start
mysql> alter user root@localhost identified by '123';

 3、创建复制用户

mysql> create user rpl_user@'%' identified by 'hao';
mysql> grant replication slave on *.* to rpl_user@'%';
mysql> flush privileges;


 配置并启动组复制

mysql> change master to master_user='rpl_user', master_password='hao' for channel'group_replication_recovery';  
mysql> set global group_replication_bootstrap_group=on;  
mysql> start group_replication;

禁用组复制的引导模式

mysql> set global group_replication_bootstrap_group=off;  

查询组复制成员的信息

mysql> select * from performance_schema.replication_group_members;

复制配置文件到slave

scp /etc/my.cnf root@172.25.254.20:/etc/my.cnf
scp /etc/my.cnf root@172.25.254.30:/etc/my.cnf

修改slave中的配置文件

 vim /etc/my.cnf

mysqld --user=mysql --initialize
/etc/init.d/mysqld start

mysql> alter user root@localhost identified by '123';

 创建复制用户, 配置并启动组复制,查询组复制成员的信息

mysql> select * from performance_schema.replication_group_members;

测试:

master中

mysql> create database hao;
mysql> create table hao.userlist(-> username varchar(10) primary key not null,-> password varchar(50) not null-> );
mysql> insert into hao.userlist values ('user1','111');
mysql> select * from hao.userlist;

salve1中

mysql> insert into hao.userlist values ('user2','222');
mysql> select * from hao.userlist;

salve2中

mysql> insert into hao.userlist values ('user3','333');
mysql> select * from hao.userlist;

注:vim /etc/hosts

五 mysql-router(mysql路由)

1、mysql-router概述

MySQL Router 是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载均衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性,用户可以编写应用程序来连接到路由器,并令路由器使用相应的路由策略 来处理连接,使其连接到正确的MySQL数据库服务器。

2、Mysql route的部署方式

rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm
/etc/init.d/mysqld stop
vim /etc/mysqlrouter/mysqlrouter.conf

 systemctl start mysqlrouter.service

测试:

在其他mysql中建立测试用户

mysql> create user root@'%' identified by 'hao';
mysql> grant all on *.* to root@'%';

mysql-router中

mysql -uroot -phao -h172.25.254.30 -P7001

重新登录

六 mysql高可用之MHA

1、MHA概述

MHA(Master High Availability)是一款专为MySQL设计的开源高可用解决方案,主要用于实现MySQL数据库的故障转移和主从复制管理,从而提高数据库服务的可靠性与可用性。

MHA 的组成

  • MHA由两部分组成:MHAManager (管理节点) MHA Node (数据库节点),
  • MHA Manager 可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台 slave 节点上。
  • MHA Manager 会定时探测集群中的 master 节点。
  • 当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。

MHA 的特点

  • 自动故障切换过程中,MHA从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
  • 使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日 志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数 据一致性
  • 目前MHA支持一主多从架构,最少三台服务,即一主两从

2、MHA部署实施

2.1、搭建主两从架构

/etc/init.d/mysqld stop
rm -fr /data/mysql/*
vim /etc/my.cnf

mysqld --user mysql --initialize
/etc/init.d/mysqld start
mysql_secure_installation

master中

mysql> create user 'repl'@'%' identified by 'hao';
mysql> grant replication slave on *.* to 'repl'@'%';
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> set global rpl_semi_sync_master_enabled = 1;

mysql> show variables like 'rpl_semi_sync%';

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

slave中

mysql> change master to master_host='172.25.254.10',master_user='repl',master_password='hao',master_auto_position=1;
mysql> start slave;
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> set global rpl_semi_sync_master_enabled = 1;
mysql> show status like 'rpl_semi_sync%';

2.2、安装MHA所需要的软件

新建虚拟机

unzip MHA-7.zip

 ssh-keygen

ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.10
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.20
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.30
cd /root/.ssh/
scp id_rsa root@172.25.254.10:/root/.ssh/
scp id_rsa root@172.25.254.20:/root/.ssh/
scp id_rsa root@172.25.254.30:/root/.ssh/

yum install *.rpm -y

scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.10:/root
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.20:/root
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.30:/root

mysql-node中

mysql> create user root@'%' identified by 'hao';
mysql> grant all on *.* to root@'%';
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y

2.3、配置MHA 的管理环境

2.3.1、生成配置目录和配置文件
mkdir /etc/masterha
tar zxf mha4mysql-manager-0.58.tar.gz

cat masterha_default.cnf app1.cnf > /etc/masterha/app1.cnf

vim /etc/masterha/app1.cnf

2.3.2、检测配置

检测网络及ssh免密

masterha_check_ssh --conf=/etc/masterha/app1.cnf

masterha_check_repl --conf=/etc/masterha/app1.cnf

2.4、MHA的故障切换

master未出现故障手动切换

masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.254.20 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

查看:

2.5、为MHA添加VIP功能

上传脚本

cp master_ip_failover master_ip_online_change /usr/local/bin/
chmod +x /usr/local/bin/master_ip_*

修改脚本中的vip

vim /usr/local/bin/master_ip_failover

vim /usr/local/bin/master_ip_online_change

vim /etc/masterha/app1.cnf

masterha_check_repl --conf=/etc/masterha/app1.cnf

启动监控程序

masterha_manager --conf=/etc/masterha/app1.cnf

在master中添加VIP

ip a a 172.25.254.100/24 dev eth0

模拟故障:

关闭主节点服务

/etc/init.d/mysqld stop

mha中

cat /etc/masterha/manager.log

查看vip变化

恢复故障主机

/etc/init.d/mysqld start
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.20',MASTER_USER='repl',MASTER_PASSWORD='hao',MASTER_AUTO_POSITION=1;

mha中手动切换后查看vip变化

rm -rf app1.failover.complete manager.log
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.254.10 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

查看:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Efficient LoFTR论文阅读(特征匹配)
  • RabbitMQ练习(Routing)
  • graphviz安装仍报错 | 路径问题 | 已解决
  • 前端项目运行汇总
  • mysql优化升级
  • C++学习/复习补充记录 --- 图论(深搜,广搜)
  • uniapp使用tki-qrcode插件生成二维码,并且可以分享给微信好友
  • 千云物流 -低代码平台MySQL在linux安装
  • 深入理解计算机系统阅读笔记-第三章
  • 【NLP自然语言处理】文本处理的基本方法
  • stm32的内部时钟源 | RC震荡电路
  • h5适配iOS——window.open失效
  • win10使用系统自带照片查看器的步骤
  • 电路笔记(信号) : 一个极简的DDS信号发生器
  • 巨魔商店2安装教程,支持最新iOS 17.0的所有型号
  • JS 中的深拷贝与浅拷贝
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [nginx文档翻译系列] 控制nginx
  • [译]如何构建服务器端web组件,为何要构建?
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • CSS 三角实现
  • Django 博客开发教程 8 - 博客文章详情页
  • es6--symbol
  • Python学习笔记 字符串拼接
  • Redis 中的布隆过滤器
  • SQLServer插入数据
  • Swift 中的尾递归和蹦床
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 爱情 北京女病人
  • 百度小程序遇到的问题
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 聊聊redis的数据结构的应用
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 移动端 h5开发相关内容总结(三)
  • 源码安装memcached和php memcache扩展
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 阿里云API、SDK和CLI应用实践方案
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​补​充​经​纬​恒​润​一​面​
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #include
  • (02)vite环境变量配置
  • (1)常见O(n^2)排序算法解析
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)二分查找 超详细
  • (NSDate) 时间 (time )比较
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (第二周)效能测试
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (四)事件系统
  • (万字长文)Spring的核心知识尽揽其中
  • (一)Docker基本介绍