mysql-主从同步与读写分离

一、mysql主从同步原理

mysql主从是用于数据灾备。也可以缓解服务器压力(读写分离),即为主数据库服务器增加一个备服务器,
两个服务器之间通过mysql主从复制进行同步,这样一台服务器有问题的情况下可以切换到另一台服务器继续使用。
如何想实现mysql主从自动切换,需要增加高可用,比如MHA

注意:
1、主库挂了,从库可以继续对外提供服务(需要研发把连接主库的ip改为从库)
2、主库起来后主从环境会自动恢复,如果从库写入了数据不会同步到主库,也不会影响主从同步但是会导致主从数据不一致,所以从库最好只读。
3、主从同步是主库往从库单项同步的。
4、如果想把从库升级为主库,需要再配置一遍主从同步的过程并把旧的从库的同步功能关闭stop slave(实测)
5、主从和主备其实是一个东西,唯一区别就是主备环境中备机不对外提供服务只做备份, 主从环境中主挂了备机可以对外提供读或读写服务。
6、当后期出现不同步的时候只需要锁主库并记住master当前pos值,然后从库再执行一遍同步命令再解锁从库即可,实在不行再备份/还原数据。

在这里插入图片描述
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

主从同步原理:

主库写入数据到binlog日志,从库通过IO线程将主库的binlog日志读取到从库的中级日志(relaylog)中,从库再通过自己的SQL线程将中级日志中的数据写入到数据库,来完成主从同步。

在从库使用show slave status;查看Read_Master_Log_Pos: 和 Exec_Master_Log_Pos: 的值如果不一样说明数据同步不一致
Seconds_Behind_Master: 0 #和主库比同步延迟的秒数

二、配置mysql主库

  1. MySQL主服务器配置
1.编辑配置文件/etc/my.cnf                       #其余参数保持默认
[mysqld]                                        #必须在【mysqld】这个模块下
server-id=1                                     #主从服务器的server-id 不能相同
log-bin=mysql-bin                               #开启二进制同步日志
expire_logs_days = 7                      # binlog保持7天
#binlog-do-db=test2                             #设置需要同步的数据库
binlog-ignore-db=performacen_schema,mysql       #设置不需要同步的数据库
------------------------
mysql5.7.8以后expire_logs_days已经被弃用,改为binlog_expire_logs_seconds = 30240,单位秒

2.建立用户

mysql>  grant replication slave on *.* to rep@'192.168.1.121' identified by 'Clouddeep@8890';
允许rep用户通过192.168.1.121服务器登录并读取本地mysql的权限
mysql>flush privileges;           #刷新权限// 可在Slave上做连接测试: mysql -h 192.168.1.200  -u  wenqiang  –pmysql8改为这样了
mysql> create user 'test'@'172.17.0.3' identified by '123456';  # 创建用户
ERROR 1396 (HY000): Operation CREATE USER failed for    # 这个报错是之前这个用户创建过可能之前的用户没删干净导致的
mysql> grant replication slave on *.* to 'test'@'172.17.0.3';  # 授权用户主从复制权限
mysql> alter user 'slave'@'172.17.0.3' identified with mysql_native_password by '123456';  # 把加密方式也改了防止后期出现Last_IO_Errno: 2061问题。
mysql> grant all privileges on *.* to 'root'@'192.168.1.%'; # 授权所有与权限

3.锁主库表(锁定数据库中所有表)

mysql> FLUSH TABLES WITH READ LOCK;mysql> flush logs;

4.显示主库信息(记下来)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
| mysql-bin.000007 |      371 | test2        | mysql            |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

5.另开一个终端,备份(导出)需要复制的数据库,这一步是为了防止两边数据不一致导致同步不成功。同步时必须保证两边数据一致。

# mysqldump -u root --opt --default-character-set=utf8 -p --events --all-databases >/server/backup/master.sql
#用mysqldump命令导出字符集为(utf8)的所有数据库,导出到目录/tmp下的master.sql主从同步时主库为什么要锁库?
同步数据时mysql-bin.xxxx和Position的值必须和当前数据量能对的上,mysql-bin.xxx和Postion相当于当前数据量内容的标签,所以同步之前先锁主库并记住mysql-bin和postition值以及备份出与之对应的数据量内容,然后再把备份的数据还原到从库中,从库再根据当前的数据量内容和对应的2个标签(mysql-bin.xxx和Position)进行同步。
比如:
mysql-bin.00007 132   10M数据量内容
mysql-bin.00028 155   30M数据量内容

6、解锁主库表,此时主库可以运行了

mysql> UNLOCK TABLES;

三、MySQL从服务器配置

1.、将主数据库的master.sql传输到从服务器的 /tmp目录下

# yum -y install openssh-clients                      #安装scp#scp -pr /tmp/master.sql 192.168.1.121:/tmp

2、导入数据库

# mysql  -u root  -p --default-character-set=utf8   < /server/backup/master.sql

3、编辑从库配置

#vi /etc/my.cnf(其余参数保持默认)[mysqld]                                                 #必须在【mysqld】这个模块下
server-id=2                                              #不能与master的id相同
log-bin=mysql-bin                                        #开启二进制日志/etc/init.d/mysql restat                            重启从库

4、在SLAVE上设置同步

mysql> stop slave;                                       #关闭slave 同步服务
mysql> reset slave all;                                  #清除之前同步的残留数据
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.200',MASTER_USER='rep',MASTER_PASSWORD='Clouddeep@8890',MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=371;
-----------------------
从库通过用户rep去同步192.168.1.200上的数据,并根据mysql-bin.000007和position值完成同步。

5、启动SLAVE服务

mysql>start slave;

6、查看SLAVE状态

mysql> SHOW SLAVE STATUS\G;
其中 Slave_IO_Running 和 Slave_SQL_Running 两列的值都为 "Yes",表明 Slave 的 I/O 和 SQL 线程都在正常运行

7、如果需要的话设置从库对普通用户只读(不影响主从同步)

# 设置只读模式
mysql> set global read_only=1;    # 1只读,0读写,对super用户无效
mysql> flush privileges;# 也可以通过配置文件添加
[mysqld]
read_only=ON# 查看是否开启只读
mysql> show variables like '%read_only%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_read_only      | OFF   |
| read_only             | ON    |
| super_read_only       | OFF   |
| transaction_read_only | OFF   |
+-----------------------+-------+# 查看哪些用户具有super权限
mysql> select user,host,Super_priv from mysql.user;# mysql5创建普通用户
mysql> grant select,insert,update,delete on s18.* to 'test'@'127.0.0.1' identifi
ed by '123456';
# mysql8创建普通用户
create user "wen"@"%" identified by '123456';  # 创建用户
grant insert,update on *.* to "wen"@"%";       # 授权
alter user "wenqiang2"@"%"  identified with mysql_native_password by '123456';  # 修改加密方式# 查看用户权限
mysql> show grants for "wen"@"%";
+----------------------------------------------------------------+
| Grants for wen@%                                         |
+----------------------------------------------------------------+
| GRANT INSERT, UPDATE ON *.* TO `wen`@`%` |
+----------------------------------------------------------------+
1 row in set (0.00 sec)

一主多从,多个从的server-id 不能设置一样

状态参数解释:2. Master_Host: 10.1.8.62Master_User: rep_userMaster_Port: 3306这3条信息,显示了slave连接master时,使用的master的主机---master_host、连接master用的用户---master_user、连接master的端口---master_port。3. Connect_Retry: 10连接中断后,重新尝试连接的时间间隔。默认值是60秒。4. Master_Log_File: binlog.000026Read_Master_Log_Pos: 446这两条信息,显示了与master相关的日志的信息。master_log_file:当前I/O线程正在读取的master 二进制日志的文件名;read_master_log_pos:当前I/O线程正在读取的二进制日志的位置(主库Position值)5.  Relay_Log_File: relay.000008Relay_Log_Pos: 589Relay_Master_Log_File: binlog.000026这3条信息,显示了与relay log相关的信息。relay_log_file:当前SQL线程正在读取并执行的relay log的文件名;relay_log_pos:当前SQL线程正在读取并执行的relay log文件的位置;relay_master_log_file:master 二进制日志的文件名。该文件包含当前SQL执行的事物6.  Slave_IO_Running: YesSlave_SQL_Running: Yes显示了当前I/O线程和SQL线程的状态7.  Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table:这部分显示的是关于复制DB和table的信息。8.  Last_Errno: 0Last_Error: laster_errno和laster_error是 Last_SQL_Errno和Last_SQL_Error的同义词。9.  Skip_Counter: 0系统参数sql_slave_skip_counter的值。sql_slave_skip_counter:slave应该跳过的事件数10. Exec_Master_Log_Pos: 446sql线程当前执行的事件,在master 二进制日志中的position(从库的Position值)11. Relay_Log_Space: 878所有存在relay log的大小12. Seconds_Behind_Master: 0这个值是时间戳的差值。是slave当前的时间戳和master记录该事件时的时间戳的差值13. Replicate_Ignore_Server_Ids: slave当前会跳过的事件号14. Master_Server_Id: 2211master的server-id;如果master和slave的server-id相同,在启动slave时,会报错在从库使用show slave status\;查看Read_Master_Log_Pos:   和  Exec_Master_Log_Pos:  的值如果不一样说明数据同步不一致

相关命令

(1)查看主从同步状态
show slave status\G;
(2)启动从库开始同步数据
start slave;

四、mysql读写分离

(1)mysql读写分离必须依赖mysql主从同步,开发将数据写入mysql主库,然后mysql主库的数据会自动同步到mysql从库,当需要读取数据的时候从mysql从库读取数据,一般主库负责写,从库负责读,(2)mysql读写分离多由开发控制,当然也可以交由运维实现:常见现象运维工作中会经常维护MySQL主从服务器,当然Slave我们只是用于读操作。
一般权限开通也只授权只读账号,但是有时候维护工作可能不是一个人在做,你不能保证其他同事都按照这个标准操作。
有同事可能会授权Slave库MySQL账号为all或者select,update,insert,delete。还有一种情况是主从做了对所有数据的同步(包括用户信息),在Master库上面授权的账号也同步到了Slave库上面,当然Master账号中肯定会有select,update,insert,delete权限。存在的问题那么问题来了,当运维人员或者开发人员程序错误的连接了Mysql把Slave当成了Master等情况,那么就悲催了所有的数据修改就到Slave了,也会直接影响到主从的同步。为了避免上述问题,我们需要给MySQL的Slave设置为只读模式,当然不会影响到主从同步,从库只读对super账户无效。解决方法
演示如下:
mysql> set global read_only=1; 
Query OK, 0 rows affected (0.00 sec)
#set global read_only=0读写模式,1只读模式# 查看哪些用户具有super权限
mysql> select user,host,Super_priv from mysql.user;
+------------------+------------+------------+
| user             | host       | Super_priv |
+------------------+------------+------------+
| root             | %          | Y          |
| wenqiang         | %          | Y          |
| root             | 127.0.0.1  | Y          |
| slave2           | 172.17.0.2 | N          |
| slave            | 172.17.0.3 | N          |
| mysql.infoschema | localhost  | N          |
| mysql.session    | localhost  | Y          |
| mysql.sys        | localhost  | N          |
+------------------+------------+------------+
8 rows in set (0.00 sec)授权普通MySQL测试账号,创建普通用户不能用 grant all privileges 
mysql> grant select,insert,update,delete on s18.* to 'test'@'127.0.0.1' identifi
ed by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
用测试账号登陆进行删除等操作,会提示--read-only错误
复制代码
复制代码
mysql> delete from student where sid=14;
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so i
t cannot execute this statementmysql> insert class values(5,三年级十班);
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so i
t cannot execute this statement
复制代码
复制代码
注意:set global read_only=1 对拥有super权限的账号是不生效的,所以在授权账号的时候尽量避免添加super权限那么我们在做数据迁移的时候不想发生任何数据的修改,包括super权限修改也要限制。
可以用锁表:mysql> flush tables with read lock;
Query OK, 0 rows affected (0.18 sec)
使用root账号测试:
mysql>  delete from student where sid=13;
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read
lock
解锁测试:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql>  delete from student where sid=13;
Query OK, 0 rows affected (0.00 sec)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工具】通过js获取chrome浏览器扩展程序列表id及名称等

【工具】通过js获取chrome浏览器扩展程序列表id及名称等 第一步 打开扩展程序页面 chrome://extensions/ 第二部 注入js获取 let 扩展字典 {} document.querySelector("body > extensions-manager").shadowRoot.querySelector("#items-list").shadow…

GO--堆(have TODO)

堆 堆&#xff08;Heap&#xff09;是一种特殊的数据结构。它是一棵完全二叉树&#xff08;完全二叉树是指除了最后一层外&#xff0c;每一层上的节点数都是满的&#xff0c;并且最后一层的节点都集中在左边&#xff09;&#xff0c;结放在数组&#xff08;切片&#xff09;中…

springboot根据租户id动态指定数据源

代码地址 码云地址springboot根据租户id动态指定数据源: springboot根据租户id指定动态数据源,结合mybatismysql多数源下的事务管理 创建3个数据库和对应的表 sql脚本在下图位置 代码的执行顺序 先设置主数据库的数据源配置目标数据源和默认数据源有了主库的数据源&#xff…

ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用

在这篇文章《ShardingSphereProxy:快速入门》中&#xff0c;我们介绍了如何通过 Navicat 连接 ShardingSphere-Proxy。 实际上&#xff0c;ShardingSphere-Proxy 兼容标准的 SQL 和原生数据库协议&#xff0c;因此你可以使用任何 MySQL 客户端与其进行连接&#xff0c;包括 Go…

接口测试Day-02-安装postman项目推送Gitee仓库

postman安装 下载 Postman&#xff08;已提供安装包&#xff0c;此步可以跳过&#xff09; https://www.postman.com/downloads/安装 Postman 安装Postman插件newman 要想给 postman 安装 newman 插件&#xff0c;必须 先 安装 node.js。 这是前提&#xff01; 安装node.js 可能…

《PCI密码卡技术规范》题目

单选1 在《PCI密码卡技术规范》中,下列哪项不属于PCI密码卡的功能()。 A.密码运算功能 B.密钥管理功能 C.物理随机数产生功能 D.随主计算机可信检测功能 正确答案:D. <font style="color:#DF2A3F;">解析:</font> 单选 2 在《PCI密码卡技术规…

vscode 快速切换cangjie版本

前言 目前阶段cangjie经常更新&#xff0c;这就导致我们可能会需要经常在不同的版本之间切换。 在参加训练营时从张老师那学到了如何使用 vscode 的配置文件来快速进行cangjie版本的切换。 推荐一下张老师的兴趣组 SIGCANGJIE / 仓颉兴趣组 这里以 windows 下&#xff0c;配置…

PromptGIP:Unifying lmage Processing as Visual Prompting Question Answering

“Unifying Image Processing as Visual Prompting Question Answering” 文章提出了一种名为 PromptGIP 的通用模型&#xff0c;将图像处理任务统一为视觉提示问答范式&#xff0c;在多个图像处理任务上展现出良好性能&#xff0c;为通用图像处理提供了新的思路和方法。 confe…

深入理解 Linux wc 命令

文章目录 深入理解 Linux wc 命令1. 基本功能2. 常用选项3. 示例3.1 统计文件的行、单词和字符数3.2 仅统计行数3.3 统计多个文件的总和3.4 使用管道统计命令输出的行数 4. 实用案例4.1 日志分析4.2 快速统计代码行数4.3 统计单词频率 5. 注意事项6. 总结 深入理解 Linux wc 命…

Spring常见问题

Spring常见问题 1.什么是Spring,对Spring的理解? Spring是一个轻量级的,IOC和AOP的一站式框架,为简化企业级开发而生的. Spring会管理对象,需要使用的时候直接注入即可,还可以对对象的功能进行增强,使得耦合度降低. 2.解释IOC和AOP IOC (控制反转)将生成对象控制权反转给…

JAVA:组合模式(Composite Pattern)的技术指南

1、简述 组合模式(Composite Pattern)是一种结构型设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构。它使客户端对单个对象和组合对象的使用具有一致性。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什么是组合模式 组合模式…

使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。

以下代码来自Let’s Go further节选。具体说明均为作者本人理解。 编辑邮件模版 主要包含三个template: subject&#xff1a;主题plainBody&#xff1a; 纯文本正文htmlBody&#xff1a;超文本语言正文 {{define "subject"}}Welcome to Greenlight!{{end}} {{def…

基于深度学习多图像融合的屏幕缺陷检测方案

公司项目&#xff0c;已申请专利。 深度学习作为新兴技术在图像领域蓬勃发展&#xff0c;因其自主学习图像数据特征的性能避免了人工设计算法的繁琐&#xff0c;精准的检测性能、高效的检测效率以及对各种不同类型的图像任务都有比较好的泛化性能&#xff0c;使得深度学习技术在…

【数据库】Redis—Java 客户端

一、常见的几种 Java 客户端 Jedis&#xff1a;以 Redis 命令作为方法的名称&#xff0c;便于学习&#xff0c;简单实用&#xff0c;但其实例是线程不安全的&#xff0c;多线程下需要基于连接池来使用。lettce&#xff1a;基于 Netty 实现&#xff0c;支持同步、异步和响应式编…

重拾设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行…

SAP抓取外部https报错SSL handshake处理方法

一、问题描述 SAP执行报表抓取https第三方数据,数据获取失败。 报错消息: SSL handshake with XXX.COM:449 failed: SSSLERR_SSL_READ (-58)#SAPCRYPTO:SSL_read() failed##SapSSLSessionStartNB()==SSSLERR_SSL_READ# SSL:SSL_read() failed (536875120/0x20001070)# …

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用&#xff0c;今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;广泛用于分类和回归问题。 它的核心思想是通过…

信奥赛四种算法描述

#include <iostream> #include <iomanip> using namespace std;// 使用unsigned long long类型来尽量容纳较大的结果&#xff0c;不过实际上这个数值极其巨大&#xff0c;可能最终仍会溢出 // 更好的方式可以考虑使用高精度计算库&#xff08;如GMP等&#xff09;来…