暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql 实现主从复制

工具人进阶日记 2022-02-15
374

在数据飞快增长的时代,单机的MySQL数据库已经满足不了日常需求了。

所以需要建立多台MySQL数据库进行主从复制,从而实现读写分离。


前言:

本文主要介绍基于二进制日志记录进行主从复制
需要准备两台服务器,操作系统为CentOS
各自进行安装MySQL, 建议数据版本保持一致,避免出现奇怪的问题
修改对应主数据库配置 my.cnf,创建从库的账号
修改对应从数据库配置 my.cnf, 检查连接状态
总结: 主从复制优点,主从复制方法,主从复制原理


服务器的初始化和MySQL的安装就不在本文说明了哦,环境准备好之后进入下面步骤


修改主数据库my.cnf配置文件

修改数据库配置文件

// 编辑Master的my.cnf或my.ini文件
[mysqld]
log-bin=mysql-bin // 启用二进制日志记录
server-id=1 // 建立唯一的服务器ID

 登录mysql 创建Slave的账号

// Slave的账号 :: 创建一个名为slave1 ,它可以从’127.0.0.1‘IP范围中的任何主机进行连接以进行复制
mysql > CREATE USER 'slave1'@'127.0.0.1' IDENTIFIED BY 'slaveAdmin1!';


// 授权这个账号只能进行主从复制
mysql > GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'127.0.0.1';


// 刷新所有表和阻止写语句
mysql > FLUSH TABLES WITH READ LOCK;


// 确定当前的二进制日志文件名称和位置 二进制文件为:mysql-bin.000001,位置是759
mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 759 | | | |
+------------------+----------+--------------+------------------+-------------------+

如果从已在运行的数据库切换成主从,需要执行下面步骤:

MySQL 官方提供两种迁移数据的方法:

// 摘要MySQL官方文档
// 使用mysqldump工具创建要复制的所有数据库的转储。这是推荐的方法,尤其是在使用InnoDB时。
Use the mysqldump tool to create a dump of all the databases you want to replicate. This is the recommended method, especially when using InnoDB.


// 如果数据库存储在二进制可移植文件中,则可以将原始数据文件复制到从属数据库。
// 这比使用mysqldump并在每个slave上导入文件更有效,因为它会在重放INSERT语句时跳过更新索引的开销。
// 对于InnoDB等存储引擎,不建议这样做。
If your database is stored in binary portable files, you can copy the raw data files to a slave.
This can be more efficient than using mysqldump and importing the file on each slave, because it skips the overhead of updating indexes as the INSERT statements are replayed.
With storage engines such as InnoDB this is not recommended.


// 也可以直接用MySQL客户端工具直接转存为sql文件进行备份

使用官方推荐的方法:

// 参数说明:
// 1: --all-databases 转储所有数据库中的所有表
// 2: --databases 指定 databases
// 3: --master-data 它会使dump输出包含CHANGE MASTER TO语句,标记dump源的二进制日志坐标(文件名和位置)
shell > mysqldump -u --all-databases --master-data > dbdump.db


// 做完主数据库备份动作记得执行释放锁
mysql > UNLOCK TABLES;

修改从数据库的my.cnf配置文件

添加从数据库的server-id值,修改完之后进行重启

[mysqld]
server-id=2

添加主数据库的配置

mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name', // 主数据库ip
    ->     MASTER_USER='replication_user_name'// 用于连接主数据库的账号名(slave1)
    ->     MASTER_PASSWORD='replication_password'// 用于连接主数据库的密码
-> MASTER_LOG_FILE='recorded_log_file_name', // 二进制日志文件名称
    ->     MASTER_LOG_POS=recorded_log_position; // 二进制日志文件的位置

从主数据库导入数据到从数据库,如果没有数据,跳过此步骤

// 导入主数据库备份到从数据库
shell> mysql -uroot -ppassword < dbdump.db

启动从数据库复制进程

mysql> START SLAVE;

检查状态

mysql > show slave status \G
// 观察以下两个状态为Yes。
// Slave_IO_Running: 从主库读取二进制日志并写到从库中继日志
// Slave_SQL_Running: 将中继日志转换SQL后执行
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

总结:

主从复制的优点:

  1. 可以缓解单机数据库的压力,再结合程序做读写分离,读写用主库,纯读用从库,更好的提高读写性能,使得在读取比较多的场景下,能够提供更快的读取速度。


  2. 数据安全性,因为有从库,可以针对从库进行备份,从而不会影响主库读写。


  3. 分析, 可以在主库创建实时数据,信息分析在从库进行,而不会影响主库的性能。


主从复制方法:

  1. MySQL5.7支持不同的复制方法,传统的方法是基于主库的二进制日志复制,要求主库和从库之间同步日志文件及其位置。


  2. 基于全局事务标识复制(global transaction identifiers (GTIDs)),因为是基于事务的,所有不需要处理日志文件及其位置,当使用GTID时,每个事务都可以被识别和跟踪,所以使用GTID进行复制可以保证主库和从库之间的一致性,只要主库上提交的所有事务也应用于从库上。


主从复制原理:

  1. 从库是通过I/O读取主库的二进制日志文件。


  2. 从库是基于主库的二进制日志进行来跟踪对数据的(UPDATE,DELETE),而二进制日志文件是用作从数据库启动到修改数据库结构或数据的所有事件的记录。


  3. 每一个从库会从主库加载一份二进制日志文件的副本,也就是说从库是在主库上提取,而不是主库进行推送到从库,从库从提取的二进制日志文件中执行对应的事件,这样就可以重复主库的更改事件(表结构更改,数据更新,删除),以此达到数据同步,但是有时会因为网络问题而导致从库更新出现延迟。



小编的第二篇文章,因为公司业务发展的需要,把原有的单机数据库进行扩展主从复制,以此文来记录&总结探索的过程。希望大家多多支持,有不足的地方多多提意见。谢谢🌹

文章转载自工具人进阶日记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论