mysql的主从复制及读写分离

应用场景

  • 读写分离,提高查询访问性能,有效减少主数据库访问压力。
  • 实时灾备,主数据库出现故障时,可快速切换到从数据库。
  • 数据汇总,可将多个主数据库同步汇总到一个从数据库中,方便数据统计分析

概述

数据库随着数据的增加面临压力,性能下降,达不到预期的效果,配置从数据库,主数据库处理数据写入,从数据库查询数据,从而分担主数据库压力。

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
如果笔记对您有用,请帮忙点个赞!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值