Mysql/Mariadb主从复制

概念

什么是·Mysql/Mariadb主从复制?    

Mysql/Mariadb主从复制:当Master(主)数据库发生变化的时候,变化实时会同步到slave(从)数据库中;类似于:Samba共享文件(C/S)、NFS网络文件共享(C/S),当服务端(Server)发生变化时,客户端(client)数据内容会根据服务端进行改变;

好处

  • 水平扩展数据库的负载能力,后备数据库,主数据库服务器故障后,可切换到从数据库继续工作;
  • 容错、高可用,从数据库可用来做备份、数据统计等工作,这样不影响主数据库的性能;
  • 数据分布;
  • 数据备份;

实现原理

在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);

主从同步事件有3种形式:statement、row、mixed。

statement:会将对数据库操作的sql语句写入到binlog中。 row:会将每一条数据的变化写入到binlog中。 mixed:statement与row的混合。Mysql决定什么时候写statement格式的,什么时候写row格式的binlog。

整体上来说,复制有3个步骤:

  • master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
  • slave将master的binary log events拷贝到它的中继日志(relay log);
  • slave重做中继日志中的事件,将改变反映它自己的数据。

下面这章图可以详细解释其原理:

说的简单一些就是:

当对Master数据库不管做了增、删、改还是创建了数据库、表等操作时,Slave就会快速的接受这些数据以及对象的操作,从而实现主从数据复制,保证数据的一致性。  

读写分离操作请查看:https://www.cnblogs.com/kuiyajia/p/11909757.html

实战

我记得我学PHP开发的时候,教员经常说的一句话就是:学习半小时,实战一分钟;
好了,接下来到我们实战的时刻了,认真听讲哟!!!

环境介绍

系统环境:系统基本上都差不多,一般多数都是Linux平台和Windows平台比较多,不管什么样的系统环境对这次实战的操作都影响不大,我在这里使用的是Docker虚拟出来的CentOS操作系统,当然您可以选用Ubuntu、RedHat以及Windows系统,这些都不会影响到大的操作;

我这里使用的系统版本:

[root@master /]# cat /etc/redhat-releaseCentOS Linux release 8.0.1905 (Core)

这里会用到两台服务器:其中一台MasterIP172.18.0.2,另外一个slaveIP172.18.0.3
数据库版本:(我这里使用的Mariadb,你可以使用mysql数据库)

[root@master /]# mysql --versionmysql  Ver 15.1 Distrib 10.3.11-MariaDB, for Linux (x86_64) using readline 5.1

配置Master数据库

  1.更改Master配置文件
    找到下面文件:

mysql数据库:/etc/mysql/mysql,conf.d/mysqld.cnfmariadb数据库:/etc/my.cnf.d/mariadb.cnf

注意:我这里是使用yum进行安装的所以默认配置文件是在/etc下面,建议在修改上面两个文件时要先将配置文件进行备份 

修改以下配置: 

bind-address=172.18.0.2\\指定Master地址server-id = 1\\指定唯一的serverid部分版本没有需手动写入log_bin = /var/log/mariadb/mariadb-bin.log\\开启binlog部分版本没有需手动写入

注意:log_bin这个字段需根据实际情况来定,需找到数据库的日志文件,默认实在 /var/log

  2.重新启动数据库

[root@master my.cnf.d]# systemctl restart mariadb\\centos7、centos8、ubuntu重新启动方式[root@master my.cnf.d]# server  mariadb  restart\\centos6及以下版本使用这个重新启动方式

  mysql重新启动:

[root@master my.cnf.d]# systemctl restart mysqld\\centos7、centos8、ubuntu重新启动方式[root@master my.cnf.d]# server  mysqld  restart\\centos6及以下版本使用这个重新启动方式

  3.初始化数据库

[root@master my.cnf.d]# mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!In order to log into MariaDB to secure it, we'll need the currentpassword for the root user.  If you've just installed MariaDB, andyou haven't set the root password yet, the password will be blank,so you should just press enter here.Enter current password for root (enter for none): //这里敲回车OK, successfully used password, moving on...Setting the root password ensures that nobody can log into the MariaDBroot user without the proper authorisation.Set root password? [Y/n] y//这里是设置root密码,可不进行设置New password: //新密码Re-enter new password: //旧密码Password updated successfully!Reloading privilege tables.. ... Success!By default, a MariaDB installation has an anonymous user, allowing anyoneto log into MariaDB without having to have a user account created forthem.  This is intended only for testing, and to make the installationgo a bit smoother.  You should remove them before moving into aproduction environment.Remove anonymous users? [Y/n] y ... Success!Normally, root should only be allowed to connect from 'localhost'.  Thisensures that someone cannot guess at the root password from the network.Disallow root login remotely? [Y/n] y ... Success!By default, MariaDB comes with a database named 'test' that anyone canaccess.  This is also intended only for testing, and should be removedbefore moving into a production environment.Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success!Reloading the privilege tables will ensure that all changes made so farwill take effect immediately.Reload privilege tables now? [Y/n] y ... Success!Cleaning up...All done!  If you've completed all of the above steps, your MariaDBinstallation should now be secure.Thanks for using MariaDB![root@master my.cnf.d]#

  4.创建主从同步的用户

[root@master ~]# mysql -u root -p\\登陆数据库Enter password: \\输入root密码Welcome to the MariaDB monitor.  Commands end with ; or \g.Your MariaDB connection id is 18Server version: 10.3.11-MariaDB-log MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> GRANT REPLICATION SLAVE on *.* to 'slave'@'%' IDENTIFIED BY 'redhat';\\创建用户,并设置相应的权限\\此处%表示允许从任何地方(除本地外)使用此账号进行登陆使用,在正式环境建议具体到某台主机IPQuery OK, 0 rows affected (0.000 sec)\\表示sql语句执行成功

  5.更新Slave用户权限

MariaDB [(none)]> flush privileges;\\每次修改用户权限,都要使用这个sql语句进行更新Query OK, 0 rows affected (0.000 sec)

  6.导出数据库中所有数据(此步骤取决于slave的权限)

[root@master ~]# mysqldump -u root -p --all-databases --master-data > mariadb.bat.sql--all-databases\\此参数表示备份所有数据库--master-data\\此参数表示将二进制的信息写入到输出文件中,在这里是写入到备份的sql文件中Enter password:

  7.查看MASTERr REPLICATION LOG位置

MariaDB [(none)]> show master status;+--------------------+----------+--------------+------------------+| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |+--------------------+----------+--------------+------------------+| mariadb-bin.000002 |     1974 |              |                  |+--------------------+----------+--------------+------------------+1 row in set (0.000 sec)

配置Slave数据库

  1.更改Slave配置文件

   文件位置与Master位置一致

mysql数据库:/etc/mysql/mysql,conf.d/mysqld.cnfmariadb数据库:/etc/my.cnf.d/mariadb.cnf

   注意:我这里是使用yum进行安装的所以默认配置文件是在/etc下面,建议在修改上面两个文件时要先将配置文件进行备份

  修改以下配置:

bind-address=172.18.0.3\\指定Master地址server-id = 2\\指定唯一的serverid部分版本没有需手动写入log_bin = /var/log/mariadb/mariadb-bin.log\\开启binlog部分版本没有需手动写入

  注意:log_bin这个字段需根据实际情况来定,需找到数据库的日志文件,默认实在 /var/log

  2.重新启动数据库

[root@master my.cnf.d]# systemctl restart mariadb\\centos7、centos8、ubuntu重新启动方式[root@master my.cnf.d]# server  mariadb  restart\\centos6及以下版本使用这个重新启动方式

  mysql重新启动:

[root@master my.cnf.d]# systemctl restart mysqld\\centos7、centos8、ubuntu重新启动方式[root@master my.cnf.d]# server  mysqld  restart\\centos6及以下版本使用这个重新启动方式

  3.初始化数据库

[root@master my.cnf.d]# mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!In order to log into MariaDB to secure it, we'll need the currentpassword for the root user.  If you've just installed MariaDB, andyou haven't set the root password yet, the password will be blank,so you should just press enter here.Enter current password for root (enter for none): //这里敲回车OK, successfully used password, moving on...Setting the root password ensures that nobody can log into the MariaDBroot user without the proper authorisation.Set root password? [Y/n] y//这里是设置root密码,可不进行设置New password: //新密码Re-enter new password: //旧密码Password updated successfully!Reloading privilege tables.. ... Success!By default, a MariaDB installation has an anonymous user, allowing anyoneto log into MariaDB without having to have a user account created forthem.  This is intended only for testing, and to make the installationgo a bit smoother.  You should remove them before moving into aproduction environment.Remove anonymous users? [Y/n] y ... Success!Normally, root should only be allowed to connect from 'localhost'.  Thisensures that someone cannot guess at the root password from the network.Disallow root login remotely? [Y/n] y ... Success!By default, MariaDB comes with a database named 'test' that anyone canaccess.  This is also intended only for testing, and should be removedbefore moving into a production environment.Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success!Reloading the privilege tables will ensure that all changes made so farwill take effect immediately.Reload privilege tables now? [Y/n] y ... Success!Cleaning up...All done!  If you've completed all of the above steps, your MariaDBinstallation should now be secure.Thanks for using MariaDB![root@master my.cnf.d]#

  4.从Master将数据库备份复制到slave服务器

[root@slave my.cnf.d]# scp jia@172.18.0.2:/opt/mariadb.bat.sql /opt/jia@172.18.0.2's password: mariadb.bat.sql

  5.将备份数据恢复到slave数据库

[root@slave my.cnf.d]# mysql -u root -p < /opt/mariadb.bat.sql  Enter password:

  6.使slave与master建立连接

[root@slave my.cnf.d]# mysql -u root -pEnter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)[root@slave my.cnf.d]# mysql -u root -pEnter password: Welcome to the MariaDB monitor.  Commands end with ; or \g.Your MariaDB connection id is 22Server version: 10.3.11-MariaDB-log MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> stop slave;Query OK, 0 rows affected, 1 warning (0.000 sec)MariaDB [(none)]> CHANGE MASTER TO    -> MASTER_HOST = '172.18.0.2',\\指定Master数据库地址    -> MASTER_USER = 'slave',\\指定主从复制用户名    -> MASTER_PASSWORD = 'redhat',\\指定主从复制用户密码    -> MASTER_LOG_FILE = 'mariadb-bin.000002',\\指定Master数据库的binlog文件名    -> MASTER_LOG_POS=1974;Query OK, 0 rows affected (0.290 sec)MariaDB [(none)]> start slave;\\开启复制功能Query OK, 0 rows affected (0.019 sec)MariaDB [(none)]>

  注意:lMASTER_LOG_FILE='mariadb-bin.000002与MASTER_LOG_POS=1974的值,是从上面的 SHOW MASTER STATUS 得到的。

  到这里已经可以做到主从复制了下面让我们测试一下吧

验证数据库是否同步

测试方法很简单,只需要在主数据库上面创建数据库或者增加一条记录就可以测试是否主从复制配置成功

MariaDB [(none)]> show  databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema |+--------------------+3 rows in set (0.018 sec)MariaDB [(none)]> create database a;\\在主数据库创建a数据库Query OK, 1 row affected (0.063 sec)MariaDB [(none)]> show databases;+--------------------+| Database           |+--------------------+| a                  || information_schema || mysql              || performance_schema |+--------------------+4 rows in set (0.000 sec)

  下面我们来看看从数据库上面有没有a这个数据库吧

MariaDB [(none)]> show databases;+--------------------+| Database           |+--------------------+| a                  || information_schema || mysql              || performance_schema |+--------------------+4 rows in set (0.075 sec)

  我们会发现已经有了a这个数据库

(0)

相关推荐

  • Linux搭建MySQL主从

    实现目标 搭建两台MySQL服务器(一主一从),一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作. 工作流程概述 主服务器: 开启二进制日志 配置唯一的server-id 获 ...

  • MySQL主从复制配置步骤如何操作?linux运维

    MySQL的主从复制是一个异步的复制过程,数据将从一个MySQL数据库(Master)复制到另一个MySQL数据库(Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完 ...

  • 什么是MySQL主从复制读写分离,看这篇就够了

    思维导图 文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 前言 在很多项目,特别是互联网项目,在使用MySQL时都会 ...

  • 从零搭建mysql的主从复制

    原创 kevinying 互联网专栏 3月25日 一.centos7安装mysql 1. 先检查系统是否装有mysql rpm -qa | grep mysql 2. 下载mysql的repo源 wg ...

  • MySQL之主从复制

    复制的基本原理 (1)slave会从master读取binlog来进行数据同步 (2)三步骤 原理图 MySQL复制过程分成三步: master将改变记录到二进制日志(binary log).这些记录 ...

  • 面试被问MySQL 主从复制,怎么破?

    一.前言 随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作. 此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求 ...

  • MySQL主从复制应用场景有哪些?怎样才能学好linux

    MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,同时有效地保护了物理服务器宕机场景的数据备份.那么MySQL主从复制的企业应用场景有哪些?Linux运维工作人员要注意什么? ...

  • 一文搞懂MySQL兄弟数据库MariaDB的安装和使用

    linux入门系列19--数据库管理系统(DBMS)之MariaDB 前面讲完Linux下一系列服务的配置和使用之后,本文简单介绍一款数据库管理系统(MySQL的兄弟)MariaDB. 如果你有MyS ...

  • MySQL主从复制集群—gtid实现详解

    老哥唠叨 上一篇发了MySQL主从复制集群搭建流程,不过好像小伙伴们对这个文章并不感兴趣,但是老哥出于对技术的热爱,和对小伙伴们的负责,我还是要写主从复制另一种实现方式:GTID.这些技术真的蛮重要的 ...

  • MySQL主从复制集群搭建—binlog二进制文件方式

    老哥絮叨 上篇文章我们大致介绍了什么是MySQL主从复制,主从复制的几种集群架构图大概都有哪几种,今天我们就来讲讲如何实现MySQL集群的搭建.主从复制有两种方式可以实现,binlog和GTID,这期 ...

  • MySQL主从复制架构介绍

    老哥有话说 你们的老哥又来啦,前几天发了很多 MySQL 优化方面的文章,优化玩腻了,我们来点 MySQL 高可用方面的知识.今天我们来讲讲主从复制咋样,同意的小赞点起来,在看刷起来.如果你觉得通过老 ...