ITPub博客

首页 > 数据库 > MySQL > Mysql5.7 主从搭建实战

Mysql5.7 主从搭建实战

原创 MySQL 作者:波仔strong 时间:2018-07-04 10:50:22 0 删除 编辑












一:MySQL Replication



什么是MySQL Replication


  • Replication可以实现将数据从一台数据库服务器(master)复制到一或多台数据库服务器(slave)
  • 默认情况下属于异步复制,无需维持长连接










  • 通过配置,可以复制所有的库或者几个库,甚至库中的一些表
  • 是MySQL内建的,本身自带的


Replication的原理

简单的说就是master将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志进行数据操作


DML:SQL操作语句,update, insert,delete

Relay log :中继日志


Replication的作用


1、Fail Over 故障切换

2、Backup Server 备份服务,无法对SQL语句执行产生的故障恢复,有限的备份

3、High Performance高性能,可以多台slave,实现读写分离


Replication如何工作


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

(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

(2) slave将master的binary log events拷贝到它的中继日志(relay log);

(3) slave重做中继日志中的事件,修改salve上的数据。




























mysql
主从复制中:

第一步:master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。第二步:slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经执行完master产生的所有文件,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。 第三步:SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。 


二:部署MySQL主从同步



环境准备:


主机名

IP

系统/MySQL版本

角色

xuegod63

192.168.1.63

CentOS7.4/5.7.20

Master

xuegod64

192.168.1.64

CentOS7.4/5.7.20

slave

模式:C/S

端口:3306



配置主数据库服务器xuegod63


  1. 创建需要同步的数据库:

mysql> create database HA;

mysql> use HA;

mysql> create table T1(id int,name varchar(20));

  1. 配置my.cnf:

vim /etc/my.cnf

log-bin=mysql-bin-master #启用二进制日志

server-id=1 #本机数据库ID 标示

binlog-do-db=HA #可以被从服务器复制的库, 二进制需要同步的数据库名

binlog-ignore-db=mysql #不可以被从服务器复制的库

  1. 重启mysql

( 如果重启卡死现象,kill掉再启动)

systemctl restart mysqld

主服务器上为从服务器设置一个连接账户并授予REPLICATION SLAVE权限。:

mysql> grant replication slave on *.* to slave@192.168.1.64 identified by "123456";


  1. 查看状态信息:

mysql> show master status;

+-------------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------------+----------+--------------+------------------+

| mysql-bin-master.000001 | 259 | HA | mysql |

+-------------------------+----------+--------------+------------------+

  1. 查看二进制日志:

ls /var/lib/mysql    








mysql> show binlog events\G












  1. 将导出的数据库传给从服务器

备份master上一份完整的数据复制前要保证同步的数据库一致

mysqldump -uroot -p123456 HA >HA.sql #可以导出数据库

方法:scp HA.sql 192.168.1.64:/root



配置从数据库服务器xuegod64


  1. 两台数据库服务器mysql版本要一致











mysql> show variables like '%version%';


  1. 测试连接到主服务器是否成功

mysql -uslave -p123456 -h 192.168.1.63

只有复制的权限, 是看不到其他库的。正常

导入数据库,和主数据库服务器保持一致,登陆到从机的服务器,创建数据库并导入

mysql –uroot –p123456

mysql> create database HA;

mysql -uroot -p123456 HA<ha.sql </ha.sql


  1. 修改从服务器配置文件:

从服务器没必要开启bin-log日志

service mysqld stop

vim /etc/my.cnf

server-id = 2 #从服务器ID号,不要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。

文本框是mysql 5.1的配置


  1.     重启mysql

( 如果重启卡死现象,kill掉再启动)

systemctl restart mysqld


  1. 停止从库,并配置主从参数,打开从库。

mysql>stop slave; #停止slave

mysql> change master to master_host='192.168.1.63',master_user='slave',master_password='123456';

mysql> start slave; #启动slave

mysql> show slave status\G 查看状态


Slave_IO_Running :一个负责与主机的io通信

Slave_SQL_Running:负责自己的slave mysql进程

两个为YES 就成功了!


  1. 查看master、slave相关进程

master Binlog Dump线程:

mysql> show processlist \G



slave IO/SQL线程:



插入数据测试同步:


mysql> insert into T1 values (1,'man');

从数据库上查看:



排错:


如果遇到主从不同步,看一下主从bin-log的位置,然后再同步。


在主服务器上看二进制日志事件列表

mysql> show binlog events \G

从服务器执行MySQL命令下:

mysql> stop slave; #先停止slave服务

mysql> change master to master_log_file='mysql-bin-master.000001',master_log_pos=1164;

#根据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果

mysql>slave start; #启动从服务器同步服务

mysql> show slave status\G; #用show slave status\G;看一下从服务器的同步情况

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

如果都是yes,那代表已经在同步


重启从服务器,再查看状态:

停止从服务器slave stop;

开启从服务器slave start;

排错思路:

1、二进制日志没有开启

2、IPTABLES 没有放开端口

3、对应的主机 IP地址写错了

SQL线程出错

1、主从服务器数据库结构不统一

出错后,数据少,可以手动解决创建插入,再更新slave状态。

注:如果主上误删除了。那么从上也就误删除了。 #因此主上要定期做mysqldump备份。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31485142/viewspace-2157295/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2017-08-25

  • 博文量
    87
  • 访问量
    91908