Mysql双机热备配置方案原理及实战

目录

1 基本概念

2 MySQL热备原理 

3 配置步骤

3.2 A(主服务器)配置

3.3 B(从服务器)配置

4 验证


1 基本概念

双机热备特指基于高可用系统中的两台服务器的热备(或高可用),双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式)。

主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状态),另一台服务器处于该业务的备用状态(即Standby状态)。

而双主机方式即指两种不同业务分别在两台服务器上互为主备状态(即Active-Standby和Standby-Active状态)

2 MySQL热备原理 

双机热备就是使用MySQL提供的一种主从备份机制实现。所谓双机热备其实是一个复制的过程,复制过程中一个服务器充当主服务器,一个或多个服务器充当从服务。

这个复制的过程实质上是从服务器复制主服务器上MySQL的二进制日志(bin-log),并在从服务器上还原主服务器上的sql语句操作,这样只要两个数据库的初态是一样的,就能一直同步。

双机热备的实现需要MySQL的版本高于 3.2 。另外由于这种备份是基于MySQL二进制日志实现,所以主从服务器上的MySQL版本最好能够一样,至少从服务器的MySQL版本不可以低于主服务器的数据库版本。

因为MySQL不同的版本之间二进制日志可能不一样。 当然这种复制和重复都是MySQL自动实现的,我们只需要配置即可。

 

 

上图中有两个服务器, 演示了从一个主服务器(master) 把数据同步到从服务器(slave)的过程。

这是一个主-从复制的例子。 主-主互相复制只是把上面的例子反过来再做一遍。 所以我们以这个例子介绍原理。

对于一个mysql服务器, 一般有两个线程来负责复制和被复制。当开启复制之后。作为主服务器Master,会把自己的每一次改动都记录到 二进制日志 Binarylog 中。 (从服务器会负责来读取这个log, 然后在自己那里再执行一遍。)

作为从服务器Slave, 会用master上的账号登陆到 master上, 读取master的Binarylog,  写入到自己的中继日志 Relaylog, 然后自己的sql线程会负责读取这个中继日志,并执行一遍。  到这里主服务器上的更改就同步到从服务器上了。

3 配置步骤

前提依赖

  • 保证A和B能够ping通
  • 分别为A和B安装相同版本的mysql,client和server都需要安装
  • MySQL的版本要高于3.2
服务器角色IP
A(主服务器)192.168.1.3
B(从服务器)192.168.1.4

3.2 A(主服务器)配置

# 1 进入mysql数据库,在A上面创建专门用于备份的用户。其中meiya是用户名,192.168.1.4是B(从服务器)的ip地址,密码为’meiya@123 ’;这个等会在B(从服务器)上要用;
mysql> grant replication slave on *.* to 'meiya'@'192.168.1.4' identified by 'meiya@123';   

# 2 创建数据库 'meiya'  注意:A、B都要手动创建相同名称的数据库
mysql> create database meiya;

# 3 开启 A 的 binarylog
vim /etc/my.cnf
-----
bind-address=192.168.1.3   //设定为A(主服务器)的IP
server-id =1               //表示A的id
log_bin = mysql-bin.log    //binlog日志文件, 也可以指定自定义路径 例: /data/mysql/mysql-bin.log 
 binlog-do-db =meiya         //用来表示只把指定的数据库的改动,记录到binary日志中,如果有多个数据库可以用‘,’分割 例如: binlog-do-db =meiya,db1,db2,...dbn  
auto-increment-increment = 10      //假设将来可能需要10台服务器做备份就设置为10,如果100台就设置为100
auto-increment-offset = 1    //表示这台服务器的序号,从1开始,不超过auto-increment-increment设定的值
-----
保存配置后,重启MySQL服务(必须要重启mysql!!!!!)
[root@hadoop01 mysql_softs]# service mysqld restart

# 4 获取主服务器状态和同步状态
mysql> use meiya;   //进入到指定需要热备的数据库meiya

mysql> FLUSH TABLES WITH READ LOCK;  //锁定meiya数据库

# 5 退出mysql,导出meiya数据库 
[root@hadoop01 mysql_softs]# mysqldump -uroot -proot meiya > meiya.sql

# 6 重新登录mysql,查看A服务器的binary日志位置
mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 343
     Binlog_Do_DB: meiya
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
-----------------------------------------------------------------------
!!!记住File和Position对应的值,接下来在设置B(从服务器)的时候需要用到。
-----------------------------------------------------------------------
# 7 解除锁定
mysql> use meiya ;
mysql> unlock tables ;

3.3 B(从服务器)配置

# 1 设置从服务器的文件配置
vim /etc/my.cnf
-----
server-id = 2              //表示B的id,必须保证每个服务器不一样,防止进入死循环.
binlog_format = mixed      //binlog的复制模式有三种,statement(基于sql语句的复制)/row(基于行的复制)/mixed(混合模式复制)
log_bin = mysql-bin.log    //binlog日志文件, 也可以指定自定义路径 例: /data/mysql/mysql-bin.log  

replicate-do-db = meiya    //指定需要复制的数据库,如果有多个数据库可以用‘,’分割 例如: binlog-do-db =meiya,db1,db2,...dbn  
relay_log = mysql-relay-bin   //中继日志的名字
log-slave-updates = ON        //中继日志执行之后,这些变化是否需要计入自己的binarylog,双主互相备份,因此要打开.

expire_logs_days = 10         //binlog过期清理时间
max_binlog_size  = 100M      //binlog每个日志文件大小 
-----
保存配置后,重启MySQL服务(必须要重启mysql!!!!!)
[root@hadoop02 mysql_softs]# service mysqld restart

# 2 导入数据库,开始同步(将刚才A导出的数据库文件 meiya.sql 传到B服务上)
[root@hadoop02 ~]# mysql -uroot -proot meiya < meiya.sql     // ‘ meiya '待导入的数据库名称,A导出的数据库文件 ‘meiya.sql’

# 3 登录mysql
mysql> CHANGE MASTER TO
    ->   MASTER_HOST='192.168.1.3',    // 此处是A主服务器的IP
    ->   MASTER_USER='meiya',          // 刚上面A主服务器mysql创建的用户名
   ->  MASTER_PASSWORD='meiya@123',  // 刚上面A主服务器mysql创建的meiya用户对应的密码
   ->  MASTER_LOG_FILE='mysql-bin.000001', //详见上3.2第6步获得的值
   ->  MASTER_LOG_POS=343;             //详见上3.2第6步获得的值

Query OK, 0 rows affected (0.00 sec)

# 4 重启MySQL服务(必须要重启mysql!!!!!)
[root@hadoop02 mysql_softs]# service mysqld restart

# 5 重新登录mysql,查看slave线程是否开启
mysql> show slave status\G
......
Slave_IO_Running: Yes   // yes状态代表成功启动
Slave_SQL_Running: Yes  // yes状态代表成功启动
......
[如果其中一个是No,那就说明不成功,需要查看mysql的错误日志...有时候密码填错了,有时候防火墙的3306没有打开,ip地址不对等等..都会导致失败。

# 到这里就全部配置完成了!

4 验证

# 1 在A服务器的meiya数据库中的mytable表(随便哪个表都可以,此处只是选择mytable做测试表)添加一条数据

 

# 2 上图对比可以发现 A和B的初态是一样的。现在往A里面插入一条数据,输入命令:
mysql> insert into mytable values(‘test’,’f’,’1900-01-01’,’china’);
Query OK, 1 rows affected (0.00 sec)

 

 

可以发现,B表数据已经自动同步了,这个动作是同时的,几乎没有什么间隔。

后面又造了10W数据,发现同步延时大概5-10分钟。(这个要看具体网卡配置)

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢子墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值