应用场景
- 读写分离,提高查询访问性能,有效减少主数据库访问压力。
- 实时灾备,主数据库出现故障时,可快速切换到从数据库。
- 数据汇总,可将多个主数据库同步汇总到一个从数据库中,方便数据统计分析
概述
数据库随着数据的增加面临压力,性能下降,达不到预期的效果,配置从数据库,主数据库处理数据写入,从数据库查询数据,从而分担主数据库压力。
mysql异步复制
主数据库写入数据执行,数据记录到binlog提交,用户提交数据,写到硬盘,不依赖从数据库。从数据库通过relay log到主数据库的binlog读取日志,进行同步。
存在问题:从数据库存在延迟,写入频繁,有可能丢失数据。
mysql半异步复制
在主数据库执行数据写入到binlog之后,停止提交数据,从数据库通过relay log读取到主数据库的bin log日志,开始写入到自己的relay log。在这过程中,主数据库接收到从数据库的确认信息才会提交,从而确保数据的一致性。
前提
- 主服务器一定要打开二进制日志
- 必须两台服务器(或者是多个实例)
- 从服务器需要一次数据初始化
- 如果主从服务器都是新搭建的话,可以不做初始化
- 如果主服务器已经运行了很长时间了,可以通过备份将主库数据恢复到从库。
- 主库必须要有对从库复制请求的用户。
- 从库需要有relay-log设置,存放从主库传送过来的二进制日志 show variables like ‘%relay%’;
- 在第一次的时候,从库需要change master to 去连接主库。
- change master信息需要存放到 master.info 中 show variables like ‘%master_info%’;
- 从库怎么知道,主库发生了新的变化?通过relay-log.info记录的已经应用过的relay-log信息。
在复制过程中涉及到的线程 - 从库会开启一个IO thread(线程),负责连接主库,请求binlog,接收binlog并写入relaylog。
- 从库会开启一个SQL thread(线程),负责执行relay-log中的事件。
- 主库会开启一个dump thrad(线程),负责响应从IO thread的请求。
主从数据库的实现
- 通过二进制日志
- 至少两台(主、从)
- 主服务器的二进制日志“拿”到从服务器上再运行一遍。
- 通过网络连接两台机器,一般都会出现延迟的状态。也可以说是异步的。
- 从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件 user、password、port、ip
- 并且让从库知道,二进制日志的起点位置(file名 position号)
- 启动从库同步服务 start slave
- 从库的IO和主库的dump线程建立连接
- 从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求
- 主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程
- 从库IO线程接收binlog evnets,并存放到本地relay-log中,传送过来的信息,会记录到master.info中。
- 从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info,默认情况下,已经应用过的relay会自动被清理purge。
操作过程
环境部署
主从库配置环境
wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
yum -y install mysql57-community-release-el7-11.noarch.rpm
yum -y install mysql-community-server mysql
systemctl start mysqld.service
启用默认密码登录数据库
grep 'password' /var/log/mysqld.log
登录修改密码
alter user 'root'@'localhost' identified by 'As123.com';
主数据库配置文件修改
[root@master-mysql ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-storage-engine=innodb
symbolic-links=0
server_id=6
log_bin=/var/log/mysql/mysql-bin
从数据库配置文件修改
[root@slave-mysql ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-storage-engine=innodb
symbolic-links=0
server_id=8
log_bin=/var/log/mysql/mysql-bin
relay_log=/var/log/mysql/mysql-relay
都要设置(主从数据库配置环境)
mkdir -p /var/log/mysql
chown -R mysql.mysql /var/log/mysql
systemctl restart mysqld
登录主数据库,创建主从同步账号
mysql> create user 'slave'@'192.168.%.%' identified by 'Slave123.com';
Query OK, 0 rows affected (0.00 sec)
授权
mysql> grant replication slave on *.* to 'slave'@'192.168.%.%';
Query OK, 0 rows affected (0.00 sec)
已创建同步账号
mysql> select user,host from mysql.user;
+---------------+-------------+
| user | host |
+---------------+-------------+
| slave | 192.168.%.% |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-------------+
4 rows in set (0.00 sec)
查看从库权限
mysql> show grants for 'slave'@'192.168.%.%';
+---------------------------------------------------------+
| Grants for slave@192.168.%.% |
+---------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.%.%' |
+---------------------------------------------------------+
1 row in set (0.00 sec)
从数据库登录同步账号测试
[root@slave-mysql ~]# mysql -h192.168.1.132 -uslave -p'Slave123.com'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.35-log MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
在主库上对全部数据库进行备份到本地目录
[root@master-mysql ~]# mysqldump -u root -p'As123.com' --master-data --all-databases > Ascom-master.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@master-mysql ~]# ls
anaconda-ks.cfg Ascom-master.sql
将本地的备份数据库复制到从库
[root@master-mysql ~]# scp Ascom-master.sql 192.168.1.133:/root/
The authenticity of host '192.168.1.133 (192.168.1.133)' can't be established.
ECDSA key fingerprint is SHA256:/ewRKkyT/gQ+0+N7yrSd5tdDT+B+jyLVGwsG7enNVCc.
ECDSA key fingerprint is MD5:70:ab:5a:6b:7b:40:3a:af:5f:6b:bb:8b:23:6d:99:a6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.133' (ECDSA) to the list of known hosts.
root@192.168.1.133's password: 系统的root登录密码
Ascom-master.sql 100% 853KB 8.2MB/s 00:00
从库查看已有主库的备份
[root@slave-mysql ~]# ls
anaconda-ks.cfg Ascom-master.sql
从库还原数据
[root@slave-mysql ~]# mysql -p'As123.com' < Ascom-master.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
同步账户也传到了从库
mysql> select user,host from mysql.user;
+---------------+-------------+
| user | host |
+---------------+-------------+
| slave | 192.168.%.% |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-------------+
4 rows in set (0.00 sec)
主库查看状态信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
从库上配置主库信息
mysql> change master to
-> master_host='192.168.1.132', #主库ip地址
-> master_port=3306,
-> master_user='slave', #主库的同步账号
-> master_password='Slave123.com', #同步账号密码
-> master_log_file='mysql-bin.000001', #日志文件
-> master_log_pos=154; #二进制日志的起点位置
Query OK, 0 rows affected, 2 warnings (0.02 sec)
查看状态信息
若出现报错,经排查
解决办法:
[root@slave-mysql ~]# vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=a504f186-068a-11ec-9a12-000c293d1fd5
随意更改一个数字
测试
主库创建一个数据库
mysql> create database test_slave;
Query OK, 1 row affected (0.00 sec)
从库查看是否备份成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_slave |
+--------------------+
5 rows in set (0.00 sec)
作者:月光染衣袂
转发请加上该地址 : https://blog.csdn.net/weixin_46860149/article/details/119945716
如果笔记对您有用,请帮忙点个赞!