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

Mysql 的高可用详解

Mysql 高可用

复制

复制是解决系统高可用的常见手段。其思路就是:不要把鸡蛋都放在一个篮子里。

复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主库和备库之 间可以有多种不同的组合方式。

MySQL 支持两种复制方式:基于行的复制和基于语句的复制。这两种方式都是通过在主库上记录 bin log、在备库重放日志的方式来实现异步的数据复制。这意味着:复制过程存在时延,这段时间内,主从数据可能不一致。

复制如何工作

在 Mysql 中,复制分为三个步骤,分别由三个线程完成:

  • binlog dump 线程 - 主库上有一个特殊的 binlog dump 线程,负责将主服务器上的数据更改写入 binlog 中。
  • I/O 线程 - 备库上有一个 I/O 线程,负责从主库上读取 binlog,并写入备库的中继日志(relay log)中。 SQL
  • 线程 - 备库上有一个 SQL 线程,负责读取中继日志(relay log)并重放其中的 SQL 语句。
    在这里插入图片描述
    这种架构实现了数据备份和数据同步的异步解耦。但这种架构也限制了复制的过程,其中最重要 的一点是在主库上并发运行的查询在备库只能串行化执行,因为只有一个 SQL 线程来重放 中继日志中的事件

主备配置

假设需要配置一对 Mysql 主备节点,环境如下:

  • 主库节点:192.168.8.10
  • 备库节点:192.168.8.11

主库上的操作

(1)修改配置并重启

执行 vi /etc/my.cnf ,添加如下配置:

[mysqld]
server-id=1
log_bin=/var/lib/mysql/binlog
  • server-id - 服务器 ID 号。在主从架构中,每台机器的 ID 必须唯一。
  • log_bin - 同步的日志路径及文件名,一定注意这个目录要是 mysql 有权限写入的;

修改后,重启 mysql 使配置生效:

systemctl restart mysql

(2)创建用于同步的用户

进入 mysql 命令控制台:

$ mysql -u root -p
Password:

执行以下 SQL:

-- a. 创建 slave 用户
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
-- 为 slave 赋予 REPLICATION SLAVE 权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';-- b. 或者,创建 slave 用户,并指定该用户能在任意主机上登录
-- 如果有多个备库,又想让所有备库都使用统一的用户名、密码认证,可以考虑这种方式
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';-- 刷新授权表信息
FLUSH PRIVILEGES;

注意:在 Mysql 8 中,默认密码验证不再是 password。所以在创建用户时,create user ‘username’@‘%’ identified by ‘password’; 客户端是无法连接服务的。所以,需要加上 IDENTIFIED WITH mysql_native_password BY ‘password’

补充用户管理 SQL:

-- 查看所有用户
SELECT DISTINCT CONCAT('User: ''', user, '''@''', host, ''';') AS query
FROM mysql.user;-- 查看用户权限
SHOW GRANTS FOR 'root'@'%';-- 创建用户
-- a. 创建 slave 用户,并指定该用户只能在主机 192.168.8.11 上登录
CREATE USER 'slave'@'192.168.8.11' IDENTIFIED WITH mysql_native_password BY '密码';
-- 为 slave 赋予 REPLICATION SLAVE 权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.8.11';-- 删除用户
DROP USER 'slave'@'192.168.8.11';

(3)加读锁

为了主库与从库的数据保持一致,我们先为 mysql 加入读锁,使其变为只读。

mysql> FLUSH TABLES WITH READ LOCK;

(4)查看主库状态

mysql> show master status;
+------------------+----------+--------------+---------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            | Executed_Gtid_Set |
+------------------+----------+--------------+---------------------------------------------+-------------------+
| mysql-bin.000001 |     4202 |              | mysql,information_schema,performance_schema |                   |
+------------------+----------+--------------+---------------------------------------------+-------------------+
1 row in set (0.00 sec)

注意:需要记录下 File 和 Position,后面会用到。

(5)导出 sql

mysqldump -u root -p --all-databases --master-data > dbdump.sql

(6)解除读锁

mysql> UNLOCK TABLES;

(7)将 sql 远程传送到备库上

scp dbdump.sql root@192.168.8.11:/home

备库上的操作

(1)修改配置并重启

执行 vi /etc/my.cnf ,添加如下配置:

[mysqld]
server-id=2
log_bin=/var/lib/mysql/binlog
  • server-id - 服务器 ID 号。在主从架构中,每台机器的 ID 必须唯一。
  • log_bin - 同步的日志路径及文件名,一定注意这个目录要是 mysql 有权限写入的;

修改后,重启 mysql 使配置生效:

systemctl restart mysql

(2)导入 sql

mysql -u root -p < /home/dbdump.sql

(3)在备库上建立与主库的连接

进入 mysql 命令控制台:

$ mysql -u root -p
Password:

执行以下 SQL:

-- 停止备库服务
STOP SLAVE;-- 注意:MASTER_USER 和
CHANGE MASTER TO
MASTER_HOST='192.168.8.10',
MASTER_USER='slave',
MASTER_PASSWORD='密码',
MASTER_LOG_FILE='binlog.000001',
MASTER_LOG_POS=4202;
  • MASTER_LOG_FILE 和 MASTER_LOG_POS 参数要分别与 show master status 指令获得的 File 和 Position 属性值对应。
  • MASTER_HOST 是主库的 HOST。
  • MASTER_USER 和 MASTER_PASSWORD 是在主节点上注册的用户及密码。

(4)启动 slave 进程

mysql> start slave;

(5)查看主从同步状态

mysql> show slave status\G;

说明:如果以下两项参数均为 YES,说明配置正确。

  • Slave_IO_Running
  • Slave_SQL_Running
    (6)将备库设为只读
mysql> set global read_only=1;
mysql> set global super_read_only=1;
mysql> show global variables like "%read_only%";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_read_only      | OFF   |
| read_only             | ON    |
| super_read_only       | ON    |
| transaction_read_only | OFF   |
+-----------------------+-------+

注:设置 slave 服务器为只读,并不影响主从同步。

复制的原理

读写分离

主服务器用来处理写操作以及实时性要求比较高的读操作,而从服务器用来处理读操作。

读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器。

MySQL 读写分离能提高性能的原因在于:

主从服务器负责各自的读和写,极大程度缓解了锁的争用;
从服务器可以配置 MyISAM 引擎,提升查询性能以及节约系统开销;
增加冗余,提高可用性。
在这里插入图片描述

相关文章:

  • day10_日志模块AOP
  • JavaWeb HTTP 请求头、请求体、响应头、响应体、响应状态码
  • 升级 Vue版本从 2.5.x 到 2.6.x
  • c++ - pointer convert - class member function‘s pointer <==> void*
  • 包管理工具之npm也慌了?
  • mTLS: openssl创建CA证书
  • python毕设选题 - 大数据商城人流数据分析与可视化 - python 大数据分析
  • OpenHarmony Docker移植实践
  • react useMemo 用法
  • 跨境知识分享:什么是动态IP?和静态IP有什么区别?
  • uni-app 页面跳转动画
  • 前端学习第三天-css基础
  • 了解处理器
  • leetcode-字符串相加
  • Unity - SerializeReference特性
  • JavaScript-如何实现克隆(clone)函数
  • Facebook AccountKit 接入的坑点
  • rabbitmq延迟消息示例
  • Vim 折腾记
  • Vue全家桶实现一个Web App
  • 将 Measurements 和 Units 应用到物理学
  • 前端
  • 全栈开发——Linux
  • 线上 python http server profile 实践
  •  一套莫尔斯电报听写、翻译系统
  • PostgreSQL之连接数修改
  • ​ArcGIS Pro 如何批量删除字段
  • ​你们这样子,耽误我的工作进度怎么办?
  • #define
  • (1) caustics\
  • (175)FPGA门控时钟技术
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (vue)页面文件上传获取:action地址
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (一)Java算法:二分查找
  • **PHP二维数组遍历时同时赋值
  • .NET Core 版本不支持的问题
  • .Net Winform开发笔记(一)
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .Net7 环境安装配置
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @DataRedisTest测试redis从未如此丝滑
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [].slice.call()将类数组转化为真正的数组
  • [AIGC 大数据基础]hive浅谈
  • [Android]使用Retrofit进行网络请求
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [C++] Windows中字符串函数的种类