环境:MySQL5.7,VMware-Workstation-12-Pro,Windows-10,CentOS-7.5,Xshell5

1. 基本概念和操作思路

主从复制能做什么

数据库的主从复制,是一台主数据库机器(Master)把自己的数据,复制到一台或多台从机器(Slaves)上。主从机器的通信方式是基于TCP/IP协议的。数据库最简单,也是直接就能实现的功能就是对数据库进行实时备份,如果不额外配置情况下没有其它功能,主数据库挂了,集群还是直接瘫痪除非手动把数据库连接信息切换到从数据库机器上,也就是说不能实现故障切换。不额外配置对数据库性能也没有提升,读写操作都用的是主数据库的计算资源,从数据库仅仅是增量同步主数据库。

但是数据库的高可用(故障切换)和读写分离(写走主,读负载到多台从),是基于数据库主从复制之上才能搭建起来的,本文介绍的是数据库主从复制的实现。

基本实现原理

数据库的主从复制有几种实现方案,这里介绍的基于二进制日志(binary log)来实现主从复制,原理很简单,就是主数据库开启日志记录功能,这样在主数据库上进行的操作都会被记录到这个日志里,然后从数据库通过网络连接到数据库,利用这份二进制日志,把相关操作在从机器上再执行一遍,从而实现数据库同步。

操作步骤概况

首先考虑一下实际环境,假设我们已经有一台数据库机器,这台数据库机器是对外提供WEB服务的,比如是LAMP架构里的一员。我们知道数据库是非常重要的,代码丢了还能重写,用户数据丢了,公司距离倒闭也就不远了,因此为了稳妥我们有必要考虑下数据库的安全性问题。只有一台数据库机器时,基本上重点考虑数据不能丢,但是部署主从复制时,至少需要两台机器,也就是还需要考虑数据一致性的问题。

力求稳妥,我们在搭建数据库主从复制时,尽可能避免在这期间操作主数据库,尤其时不能进行写相关操作,搭建完毕之后,最好不要单独对从数据库做写相关操作,以防数据不一致的问题。从数据库只能用来读,比如对数据进行统计分析时,我们就可以到从数据库读数据,从而缓解主数据库的压力。

搭建数据库主从复制,具体步骤如下:

  1. 启用主数据库二进制日志记录功能
  2. 在主数据库上创建用户以供从数据库远程连接
  3. 备份主数据库数据
  4. 把数据库备份导入到从数据库上
  5. 配置从数据库连接主数据库
  6. 启用从数据库,使其进入SLAVE状态

下面我启两台虚拟机,分别作为主数据库(172.16.1.51)和从数据库(172.16.1.52),演示如何搭建数据库主从复制。具体环节如下:

[root@master ~]# hostname -I
10.0.0.51 172.16.1.51
[root@slave ~]# hostname -I
10.0.0.52 172.16.1.52

51机器是LAMP架构的一员,上面已有供给其它WEB集群使用的数据,而52是全新机器。

2. MASTER-配置

  1. 启用Master二进制日志记录功能

    [root@master ~]# systemctl stop mysqld
    [root@master ~]# /etc/my.cnf
    [root@master ~]# egrep -v '^$|^#' /etc/my.cnf
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    symbolic-links=0
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    log-bin=mysql-bin #+
    server-id=1 #+
    [root@master ~]# systemctl start mysqld

    更改数据库配置文件,最好先停后启。/etc/my.cnf是MySQL的配置文件,在其中的mysqld区块中增加如上最后两行内容,即可启用二进制日志记录功能,=mysql-bin是可以省略不写的,mysql-bin是表示日志文件名的前缀,可换成其它。只要涉及到多台MySQL机器协同工作,那么每台机器都需要一个ID来标识,server-id就是这个作用,不能重复。

  2. 为从机器创建远程连接用户

    [root@master ~]# mysql -uroot -pAs4k.top
    mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'As4k.top';
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

    上述操作就是,授权rpel用户,密码为As4k.top,对所有数据库都具有REPLICATION权限。

  3. 拿到Master状态信息(从连接主时用)

    从这一步开始,最好不要再动主数据库了,但是还不能把mysqld服务直接停掉,可以把数据库的表锁定只能读取,我还把WEB集群上的nginx和php都停掉,彻底杜绝任何操作数据库的可能性。

    mysql> FLUSH TABLES WITH READ LOCK;
    mysql> SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+-------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 | 154 | | | |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    File表示当前二进制文件名,Position表示位置,在进行数据库写入操作时,这两个值都是会变化的,就是用来告诉从数据库从什么位置开始复制。

  4. 使用mysqldump备份整个数据库

    [root@master ~]# mysqldump -uroot -pAs4k.top --all-databases --master-data > /root/dbdump.db
    [root@master ~]# scp /root/dbdump.db root@172.16.1.52:/root

    --all-databases备份所有数据库,--master-data给slave机器识别用的。

  5. 解锁数据库

    [root@master ~]# mysql -uroot -pAs4k.top -e "UNLOCK TABLES;"

3. SLAVE-配置

  1. MySQL5.7社区版并改密码(官方源)

    [root@slave ~]# yum install mysql-community-server -y
    [root@slave ~]# systemctl start mysqld
    [root@slave ~]# systemctl enable mysqld
    [root@slave ~]# mysql -uroot -p$(awk '/temporary password/ {print $NF}' /var/log/mysqld.log) \
    --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'As4k.top'";
  2. 设置一个ID(显然需要"与众不同")

    [root@slave ~]# systemctl stop mysqld
    [root@slave ~]# vim /etc/my.cnf
    [root@slave ~]# egrep -v '^$|^#' /etc/my.cnf
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    symbolic-links=0
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    server-id=2 #+
    [root@slave ~]# systemctl start mysqld
  3. 设置Slave连接Master

    mysql> CHANGE MASTER TO
    MASTER_HOST='172.16.1.51',
    MASTER_USER='repl',
    MASTER_PASSWORD='As4k.top',
    MASTER_LOG_FILE='mysql-bin.000003',
    MASTER_LOG_POS=154;

    IP,账号,密码这都是显而易见的,FILE和POS是在主机器上使用SHOW MASTER STATUS得到的。

  4. 把Master数据导入Slave

    [root@slave ~]# mysql -uroot -pAs4k.top < /root/dbdump.db
  5. 启动Slave线程

    [root@slave ~]# mysql -uroot -pAs4k.top -e "START SLAVE"

    暂停使用STOP SLAVE

4. 检查与测试

查看主从的状态

查看主

[root@master ~]# mysql -uroot -pAs4k.top -e "SHOW MASTER STATUS"

查看从

[root@slave ~]# mysql -uroot -pAs4k.top -e "SHOW SLAVE STATUS\G"
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.51
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 154
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.......

除了IP,端口,账号这些要和主数据库对上,位置信息也要对上,这样才能保证数据的一致性。

测试效果

测试很简单,在Master上做一些写入数据库的操作,然后到Slave机器上查看是否正确同步即可。这里不在赘述。

作者:阿胜4K

出处:https://www.cnblogs.com/asheng2016/p/replication-for-backup.html

MySQL主从复制(Replication for Backup)的更多相关文章

  1. MySQL主从复制(Replication)(MySQL数据同步)配置

    MySQL是开源的关系型数据库系统.复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程. 配置主服务器(mast ...

  2. Linux MySQL主从复制(Replication)配置

    MySQL是开源的关系型数据库系统.复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程. 配置主服务器(mast ...

  3. mysql主从复制replication的一些相关命令

    主服务器上的相关命令:show master status; mysql> show master status\G . row *************************** Posi ...

  4. centos5.4下mysql主从复制

    centos5.4下mysql主从复制配置分享. 本文转自:http://www.jbxue.com/article/771.html 安装环境:centos 5.4 mysql版本:mysql 5. ...

  5. 搭建mysql主从复制---Mysql Replication

    主从复制原理 Mysql的Replication是一个异步的复制过程,从一个Mysql Instance(master)复制到另一个Mysql Instance(slave).中间需要三个线程slav ...

  6. 配置MySQL主从复制报错Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work

    配置MySQL主从复制报错 ``` Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave ha ...

  7. mysql主从复制操作步骤

    注: .做主从复制的两台服务器server-id不能相同 .主从的字符集要一样,不然数据导入会报错 .开启db01的log-bin功能 [root@db01 mysql]# vim /etc/my.c ...

  8. mysql主从复制配置

    使用mysql主从复制的好处有: 1.采用主从服务器这种架构,稳定性得以提升.如果主服务器发生故障,我们可以使用从服务器来提供服务. 2.在主从服务器上分开处理用户的请求,可以提升数据处理效率. 3. ...

  9. [转]MySQL主从复制原理介绍

    MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...

随机推荐

  1. vue笔记 - 组件间通信 之 中央事件总线bus

    中央事件总线 - 就是一个名字可以叫做bus的vue空实例,里边没有任何内容: var bus = new Vue(); 人如其名,她就像一个公交车一样,来回输送人,将a站点的A输送到b站点,再将b站 ...

  2. |和||、&&和&

    |和||.&&和& | : 会检查每一个 条件的真伪,再做“或”运算 ||: 按照条件写的顺序,直到一个为true时,后面的条件则不再检查,直接进入条件 & : 会检查 ...

  3. Android JNI与多线程

    Java通过JNI调用本地C++代码是在同一个线程中的同步调用. JNI中如果新建的线程调用java的代码,那么java代码是运行在JNI线程中的:但是,如果调用UI相关的代码时需要与java主线程通 ...

  4. win7 开机自启动控制

    直接用win+r运行 --- 输入 msconfig 去除“OneNote”开机自启动方法:取消勾选,点击 “应用” ,然后点击“确定” 即可

  5. LeetCode 19 Remove Nth Node From End of List (移除距离尾节点为n的节点)

    题目链接 https://leetcode.com/problems/remove-nth-node-from-end-of-list/?tab=Description   Problem: 移除距离 ...

  6. UVA 1335 Beijing Guards(二分答案)

    入口: https://cn.vjudge.net/problem/UVA-1335 [题意] 有n个人为成一个圈,其中第i个人想要r[i]种不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物.如果两个 ...

  7. HDU 2199 Can you solve this equation(二分答案)

    Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  8. Visual Studio 2012创建SQL Server Database Project提示失败解决方法

    新建一个SQL Server Database Project,提示: Unable to open Database project This version of SQL Server Data ...

  9. 【CF687D】Dividing Kingdom II 线段树+并查集

    [CF687D]Dividing Kingdom II 题意:给你一张n个点m条边的无向图,边有边权$w_i$.有q个询问,每次给出l r,问你:如果只保留编号在[l,r]中的边,你需要将所有点分成两 ...

  10. 【CF819C】Mister B and Beacons on Field 数学

    [CF819C]Mister B and Beacons on Field 题意:外星人盯上了Farmer Jack的农场!我们假设FJ的农场是一个二维直角坐标系,FJ的家在原点.外星人向FJ的农场上 ...