11_MySQL笔记-主从复制-延迟备份-读写分离
Posted mycpen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11_MySQL笔记-主从复制-延迟备份-读写分离相关的知识,希望对你有一定的参考价值。
文章目录
个人博客
https://blog.csdn.net/cPen_web
主从复制
集群cluster:多台mysql服务器
集群:很多台服务器做一样的事情
如何保证数据库里的内容是一样的?
如何分工?
从服务器是如何知道主服务器上更新了哪些数据?
答:二进制日志(binlog)
主从复制:其实就是复制的是主服务器的二进制日志,从服务器然后再重新根据日志操作一遍,从而达到和主服务器里的数据一样,但是时间上会有延迟
如何解决延迟的问题?
中间件 middleware --> WebLogic (oracle和java)、mysql-router、onekey (第三方公司)
负载均衡器 (load balancer)
读写分离:read、write
主从复制的环境准备:
硬件:CPU、内存相同
2~4个核心
内存:4G
系统:centos7
软件:MySQL版本要一样
5.7.32
编译安装 --> 推荐
yum安装 (rpm)
二进制安装 --> 下载好别人已经编译好的二进制包,解压就可以使用了 --> 免安装
问题:
1 .到底是主服务器主动通知从服务器来取二进制日志,还是从服务器每隔一段时间来拿二进制日志?
主服务器主动通知从服务器过来拿二进制日志
2 .主服务器如何知道从服务器上已经有哪些数据了,需要从哪里开始给数据给从服务器?
3 .是否任何一台机器都可以充当从服务器,不需要验证就可以去拿主服务器的二进制日志?
4 .从服务器如何知道谁是它的主服务器呢?
master-info文件
5 .master-info文件的作用?
a)记录取日志结束的pos位置号,日志文件的名字
6.relay-log.info文件的作用?
异步复制
配置
操作步骤: (异步复制)
步骤1 .修改MySQL的配置文件,启动二进制日志功能
#步骤1.1:在主服务器上开启二进制日志,server_id=1
[root@mysql-master ~]# vim /etc/my.cnf
[mysqld]
#binary log
log_bin
server_id = 1
[root@mysql-master ~]# killall -9 mysqld_safe
[root@mysql-master ~]# killall -9 mysqld
[root@mysql-master ~]# service mysqld start
#步骤1.2:在从服务器上也可以开启二进制日志,server_id=2
[root@mysql-slave ~]# vim /etc/my.cnf
[mysqld]
#binary log
log_bin
server_id = 2
[root@mysql-slave ~]# killall -9 mysqld_safe
[root@mysql-slave ~]# killall -9 mysqld
[root@mysql-slave ~]# service mysqld start
---------------------------------------------------------------------------------------------------------------------------------
步骤2 .在主服务器上新建并且授权一个用户,用于复制二进制日志
[root@mysql-master ~]# mysql -uroot -p'Sanchuang123#'
root@(none) mysql>grant replication slave on *.* to 'oudi'@'192.168.31.181' identified by 'Sanchuang123#';
---------------------------------------------------------------------------------------------------------------------------------
步骤3 .备份出主服务器上的数据,然后导入到从服务器上
[root@mysql-master ~]# mysqldump -uroot -p'Sanchuang123#' --all-databases > /backup/all_db.sql
[root@mysql-master backup]# scp /backup/all_db.sql root@192.168.31.181:/root/
在从服务器上导入数据
[root@mysql-slave ~]# mysql -uroot -p'Sanchuang123#' <all_db.sql
---------------------------------------------------------------------------------------------------------------------------------
步骤4 .在从服务器上配置master的信息
#注:在主服务器上查看当前的二进制日志的文件和位置号
root@(none) mysql>show master status;
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
| mysql-master-bin.000002 | 450 | | | |
#注:刷新二进制日志文件
root@(none) mysql>flush logs;
root@(none) mysql>show master status;
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
| mysql-master-bin.000003 | 154 | | | |
------------------------------------------------------------------------------------------
#注:在从服务器上配置master的信息
[root@mysql-slave ~]# mysql -uroot -p'Sanchuang123#'
root@(none) mysql>CHANGE MASTER TO MASTER_HOST='192.168.31.179' ,
-> MASTER_USER='oudi',
-> MASTER_PASSWORD='Sanchuang123#',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mysql-master-bin.000003',
-> MASTER_LOG_POS=154;
CHANGE MASTER TO MASTER_HOST='192.168.31.179' ,
MASTER_USER='oudi',
MASTER_PASSWORD='Sanchuang123#',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-master-bin.000003',
MASTER_LOG_POS=154;
------------------------------------------------------------------------
#注:查看slave的状态信息
root@(none) mysql>show slave status \\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.31.180
Master_User: oudi
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-master-bin.000003
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-slave-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-master-bin.000003
Slave_IO_Running: No
Slave_SQL_Running: No
……
#注:从服务器的IO线程和SQL线程没有起来
---------------------------------------------------------------------------------------------------------------------------------
步骤5 .在master和slave上关闭防火墙和selinux
#注:主服务器
[root@mysql-master ~]# service firewalld stop
[root@mysql-master ~]# getenforce
Disabled
#注:从服务器
[root@mysql-slave ~]# service firewalld stop
[root@mysql-slave ~]# getenforce
Disabled
---------------------------------------------------------------------------------------------------------------------------------
解决UUID一样的问题
下面步骤报错:原因 虚拟机克隆时,主从两台数据库的UUID相同
https://blog.csdn.net/t1anyuan/article/details/78117672
解决方法:data目录下的 auto.cnf 中的 server-uuid值相同了找个字母随便改一下就行 比如把 9改成8 ,重启数据库
[root@mysql-slave ~]# vim /data/mysql/auto.cnf
[auto]
server-uuid=65d10cce-6c25-11eb-b2d5-000c29c71e05 #注:修改几个字符就可以,和主服务器里的不一样就可以
[root@mysql-slave ~]# service mysqld restart
---------------------------------------------------------------------------------------------------------------------------------
步骤6 .在slave上启动复制功能
[root@mysql-slave ~]# mysql -uroot -p'Sanchuang123#'
root@(none) mysql>start slave;
root@(none) mysql>show slave status \\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.179
Master_User: oudi
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-master-bin.000003
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-slave-relay-bin.000007
Relay_Log_Pos: 381
Relay_Master_Log_File: mysql-master-bin.000003
Slave_IO_Running: Yes --> 是yes
Slave_SQL_Running: Yes --> 是yes 表示主从复制已经配置成功了
……
---------------------------------------------------------------------------------------------------------------------------------
步骤7 .验证主从复制的效果
#注:在master上新建库
[root@mysql-master ~]# mysql -uroot -p'Sanchuang123#'
root@(none) mysql>create database zouweicheng;
root@(none) mysql>use zouweicheng;
root@zouweicheng mysql>create table t1(id int);
root@zouweicheng mysql>insert into t1 values(1),(2);
#注:slave上查看
[root@mysql-slave ~]# mysql -uroot -p'Sanchuang123#'
root@(none) mysql>show databases;
| Database |
| zouweicheng |
……
root@(none) mysql>use zouweicheng;
root@zouweicheng mysql>select * from t1;
| id |
| 1 |
| 2 |
---------------------------------------------------------------------------------------------------------------------------------
步骤8 .到slave上去看master.info和relay-log.info
[root@mysql-slave ~]# cd /data/mysql/ #注:到数据目录下查看
[root@mysql-slave mysql]# ls |egrep "master.info|relay-log.info"
master.info
relay-log.info
[root@mysql-slave mysql]# cat master.info
……
[root@mysql-slave mysql]# cat relay-log.info
……
---------------------------------------------------------------------------------------------------------------------------------
相关问题解决方案
#示例:清空原来配置错误的master信息
清除从服务器上填写的主服务器的信息
root@(none) mysql>stop slave;
root@(none) mysql>reset slave all; #注:清除所有的master信息
#注:重新输入master的信息
CHANGE MASTER TO MASTER_HOST='192.168.31.179' ,
MASTER_USER='oudi',
MASTER_PASSWORD='Sanchuang123#',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-master-bin.000003',
MASTER_LOG_POS=154;
半同步复制
半同步 semi-sync
https://www.cnblogs.com/ivictor/p/5735580.html
配置
半同步的配置
启用半同步复制
---------------------------------------------------------------------------------------------------------------------------------
步骤1:在主服务器上执行安装
root@(none) mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';
root@(none) mysql>show plugins; #注:查看插件
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
……
#注:启用半同步
root@(none) mysql>set global rpl_semi_sync_master_enabled=1;
root@(none) mysql>show global variables like '%rpl_semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 | #注:超时参数10s,如果超时没回复,半同步切换到异步
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.20 sec)
---------------------------------------------------------------------------------------------------------------------------------
步骤2:在从服务器上执行安装插件
root@(none) mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
#注:从库上启用半同步功能
root@(none) mysql>set global rpl_semi_sync_slave_enabled=1;
root@(none) mysql>show global variables like '%rpl_semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.00 sec)
---------------------------------------------------------------------------------------------------------------------------------
步骤3:半同步测试
从库停止复制以后在主库建表测试
#注:半同步目前是好的
root@(none) mysql>use zouweicheng; #注:master上
root@zouweicheng mysql>insert into t1 values(3),(4);
#注:如何知道当前主从复制的状态是半同步还是异步?
root@zouweicheng mysql>show status like 'Rpl_semi_sync_master_status'; #注:master上敲
| Variable_name | Value |
| Rpl_semi_sync_master_status | ON | #注:ON 表示是半同步
在主服务器上执行数据插入或者建表、数据修改等操作,触发半同步,如果半同步失败,主服务器会切换到异步
---------------------------------------------------------------------------
#步骤3.1:在从服务器上stop slave;
root@(none) mysql>stop slave;
root@zouweicheng mysql>insert into t1 values(3),(4);#注:master上敲
Query OK, 2 rows affected (10.00 sec) #注:所花费的时间超过10秒
root@zouweicheng mysql>CREATE TABLE T2(id int);
root@zouweicheng mysql>show status like 'Rpl_semi_sync_master_status'; #注:master上敲
| Variable_name | Value |
| Rpl_semi_sync_master_status | OFF | #注:半同步关闭
---------------------------------------------------------------------------
#步骤3.2:在从服务器那边启用start slave ;
root@(none) mysql>start slave;
root@(none) mysql>use zouweicheng;
root@zouweicheng mysql>show tables; #注:查看同步情况
| Tables_in_zouweicheng |
| T2 | #注:同步了
| t1 |
---------------------------------------------------------------------------
#步骤3.3:在主服务器上查看状态
root@zouweicheng mysql>show status like 'Rpl_semi_sync_master_status';
| Variable_name | Value |
| Rpl_semi_sync_master_status | ON | #注:ON 表示是半同步
同步复制
https://blog.csdn.net/bmengmeng/article/details/98742927
https://dev.mysql.com/doc/refman/5.7/en/group-replication-enterprise-backup.html
延迟备份
https://dev.mysql.com/doc/refman/5.7/en/replication-delayed.html
https://www.cnblogs.com/yangxiaochu/p/9323118.html
为什么需要延迟备份?
可以快速的恢复数据
比使用全备 + 二进制日志恢复更加快些
登陆到slave数据库服务器
#注:前面的slave要先配好
[root@mysql-slave ~]# mysql -uroot -p'Sanchuang123#'
root@(none) mysql>show slave status \\G;
……
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
……
root@(none) mysql>stop slave;
root@(none) mysql>CHANGE MASTER TO MASTER_DELAY = 600; #注:延迟备份 10min
root@(none) mysql>start slave;
……
SQL_Delay: 600
……
GTID的主从复制
步骤参考 https://blog.51cto.com/13434336/2178937
https://blog.csdn.net/wzy0623/article/details/91047395
有点优势
比binlog + pos的传统方式,在恢复的时候,以前做过的不再执行,可以节约时间
原理
GTID(全局事务标识符)的全称为Global Transaction Identifier
是在整个复制环境中对一个事务的唯一标识
全局唯一,一个事务对应一个GTID
log_slave_updates=ON 有什么作用?
http://blog.itpub.net/12679300/viewspace-1319263
通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志。该选项告诉从服务器将其SQL线程执行的更新记入到从服务器自己的二进制日志。为了使该选项生效,还必须用--logs-bin选项启动从服务器以启用二进制日志。如果想要应用链式复制服务器,应使用--logs-slave-updates。例如,可能你想要这样设置:
A -> B -> C
也就是说,A为从服务器B的主服务器,B为从服务器C的主服务器。为了能工作,B必须既为主服务器又为从服务器。你必须用--logs-bin启动A和B以启用二进制日志,并且用--logs-slave-updates选项启动B
基于日志点复制的缺点:
1 .故障转移时重新获取master的日志点信息比较困难。基于日志点复制是从master的binlog的偏移量进行增量同步。如果指定错误会造成遗漏或者重复,造成主从不一致
基于GTID复制的优点是:
1 .可以很方便的进行故障转移,记录master最后事务的GTID值。比如master:A,slave:B,C。当A挂了后,B执行了所有A传过来的事务。当C连接到B后,在自己的binlog找到最后一次A传过来的GTID。然后C将这个GTID发送给B,B获取到这个GTID,就开始从这个GTID的下一个GTID开始发送事务给C。这种自我寻找复制位置的模式减少事务丢失的可能性以及故障恢复的时间
2 .slave不会丢失master的任何修改 (开启了log_slave_updates)
核心步骤参考 https://blog.51cto.com/13434336/2178937
GTID主从配置
配置master
vim /etc/my.cnf
[mysqld]
gtid-mode=ON
enforce-gtid-consistency=ON
server-id=1
binlog_format=row
配置slave
vim /etc/my.cnf
[mysqld]
gtid-mode=ON
enforce-gtid-consistency=ON
server-id=2
binlog_format=ROW
log_slave_updates=ON
master授权配置
略
slave配置同步
mysql> change master to master_host='10.0.0.132', master_user='rep',master_password='123',master_port=3306,master_auto_position=1;
===============================================================================
配置
gtid_mode=on
enforce_gtid_consistency=on
MySQL的集群架构
主主复制
主+从+从+从 --> 一主多从
双机热备
双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。这样做的好处多
1 .可以做灾备,其中一个坏了可以切换到另一个
2 .可以做负载均衡,可以将请求分摊到其中任何一台上,提高网站吞吐量
主主复制 (异步复制)
2台主机都是master,业务数据同时往2台机器上写
要避免数据冗余
主主复制主键冲突问题解决方案 https://www.jianshu.com/p/469279c1ad39
读写分离
读写分离的控制问题
主要是用户权限的控制,有写权限的用户走读的通道也可以写
前提是在后端的MySQL数据库服务器里创建读和写分开的用户
日志
/var/log/messages
/var/log/mysqlrouter/mysqlrouter.log
middleware:中间件软件
中间件:MySQLrouter、mycat、weblogic、oneproxy
mycat 开源的 http://www.mycat.org.cn/
MySQLrouter 官方
weblogic oracle数据库的
oneproxy https://www.cnblogs.com/youge-OneSQL/articles/4208583.html
图解 https://www.cnblogs.com/f-ck-need-u/p/9276639.html
中间件服务器只需要安装mysql-router,不需要安装mysql软件
MySQLrouter安装步骤:
1 .到mysql的官方网站下载
官方 --> 注意下系统的版本 centos7 / centos8
https://dev.mysql.com/downloads/router/
https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-community-8.0.23-1.el7.x86_64.rpm
https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-community-8.0.23-1.el8.x86_64.rpm
[root@mysql-router-1 ~]# ls |grep mysql-router-community-8.0.23-1.el8.x86_64.rpm #注:上传
mysql-router-community-8.0.23-1.el8.x86_64.rpm
[root@mysql-router-1 ~]# rpm -ivh mysql-router-community-8.0.23-1.el8.x86_64.rpm #注:安装
[root@mysql-router-1 ~]# rpm -qpl mysql-router-community-8.0.23-1.el8.x86_64.rpm #注:知道它装哪了
/etc/mysqlrouter/mysqlrouter.conf
……
---------------------------------------------------------------------------------------------------------------------------------
[root@mysql-router-1 ~]# vim /etc/mysqlrouter/mysqlrouter.conf #注:修改配置文件
[routing:read以上是关于11_MySQL笔记-主从复制-延迟备份-读写分离的主要内容,如果未能解决你的问题,请参考以下文章