基于binlog方式搭建MySQL主从

基于binlog方式的主从架构,也可称为传统的异步复制方式。html


环境:mysql

主机 IP
操做系统 MySQL版本
Master 192.168.32.3 CentOS release 6.5 (Final) 5.6.16-log
Slave 192.168.32.2 CentOS release 6.5 (Final) 5.6.16-log


主从复制原理图:sql

1.jpg


主从复制原理:数据库

经过三个线程来实现。vim

Master,经过dump thread,将数据更改操做记录到binary log(这些记录叫作binary log events)安全

Slave,IO thread,将Master的binary log复制到本身的relay log中服务器

Slave,SQL thread,从Slave的realy log中读取并重放这些记录架构


主从复制的应用场景:负载均衡

一、Slave做为Master的数据备份异步

当Master出现问题时,人工或自动切换到Slave主机,保证服务不间断

二、Master和Slave作读写分离,Slave实现负载均衡,将读写流量分离

我这里引入网站找到的一张图片

11.png

三、在读写分离架构下,将多个Slave根据业务进行拆分

在这里引入从网上找到的一张图片

11.png


主从搭建配置:

一、修改my.cnf配置

Master主机配置:

cat /home/data/mysql3306/my.cnf

server_id = 2

log_bin = /home/data/mysql3306/mysql-bin

上面两个是必须配置的,其余参数根据本身的MySQL安装目录和业务状况自行配置


Slave主机配置:

cat /home/data/mysql3306/my.cnf

server_id = 1

Slave主机的binlog不是必须开启的,其余参数根据本身的MySQL安装目录和业务状况自行配置,若是有级联复制的需求,才进行开启,通常主从架构不开启,以节省磁盘I/O


二、受权复制链接用户

mysql> grant replication slave on *.*to repliter@'192.168.32.2' identified by PASSWORD ' *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';

推荐先将密码进行加密(password()函数)后,再进行受权的方式,这样明文密码就不会记录到binglog中,减小风险


三、配置主从复制过滤规则

若是咱们的业务数据拆分到了各个Slave上,好比:Slave1主机只须要复制论坛(bbs)的数据,Slave2只须要复制在线课堂(edusoho_e)的数据等等,这种状况下,咱们就须要配置主从复制的过滤规则,只选择Slave主机须要复制的数据。有两种过滤规则能够进行配置。固然了,也能够不进行配置,直接同步全部的数据至Slave


Master主机上配置主从复制过滤规则:

cat /home/data/mysql3306/my.cnf

binlog-do-db=bailidb(更多过滤规则请阅读MySQL官网


注意:须要重启MySQL


更新数据前,先看看position位置

mysql> show master status\G;

*************************** 1. row ***************************

             File: mysql-bin.000006

         Position: 120

     Binlog_Do_DB: bailidb


插入一条非过滤规则数据库的数据:

INSERT INTO `backup`.`vip_1` (`sname`) VALUES ('Python');

mysql> show master status\G;

*************************** 1. row ***************************

             File: mysql-bin.000006

         Position: 120

     Binlog_Do_DB: bailidb

position位置没有变更


更新一条符合过滤规则数据库的数据:

UPDATE `bailidb`.`bl_admin` SET `username` = 'heihei' WHERE `userid` = '40';

mysql> show master status\G;

*************************** 1. row ***************************

             File: mysql-bin.000006

         Position: 562

     Binlog_Do_DB: bailidb

position位置变更,说明配置已经生效了


说明:

虽然Master支持这么作主从过滤规则,可是配置以后,就只能是配置的库写入或配置的库不能写入binlog中了,随着业务变更,一些原来不须要复制同步的库,如今也须要进行复制同步,那么就须要重启Master数据库,若是以后业务再变更,还须要重启Master数据库,显然,这么作不够灵活,并且重启Master的代价确定也比重启Slave大的多的;另外一方面,除非十分肯定,Master的全部数据变动操做都应该记录到binlog中,出了问题还可以据此进行恢复,而不该该对Master作过滤,因此,通常状况下,选择配置Slave的主从复制过滤规则。


Slave主机上配置主从复制过滤规则:

如今业务需求是,如今的Slave主机上只须要论坛(bbs)、和在线课堂的数据(edusoho_e)的数据

cat /home/data/mysql3306/my.cnf

replicate_do_db=bbs

replicate_do_db=edusoho_e(更多过滤规则请阅读MySQL官网


注意:须要重启MySQL


四、准备复制数据

在Master主机上将bbs、edusoho_e数据备份后,传输到Slave主机,进行数据导入,使之和Master数据库一致

笔者使用的是MySQL自带的mysqldump工具,此工具,属于温备方式,即:备份过程当中会锁库表,对业务会形成必定的影响,数据量越大,影响越大。笔者比较赞成网上同行的经验,50G如下仍是能够用mysqldump工具,50G以上就应该考虑使用如:Xtrabackup等物理备份工具了



mysqldump -uroot -p --single-transaction --master-data=2 --databases bbs edusoho_e > `date +%F`.sql

--single-transaction 保证数据的读一致性

--master-data=2 将CHANGE MASTER TO信息注释

参数的具体含义,请mysqldump --help自行查阅


上传到Slave主机:

能够采用scp、ftp、sz等方式,这里很少说了

 

建立同名数据库:

mysql> create database bbs;

Query OK, 1 row affected (0.03 sec)

 

mysql> create database edusoho_e;

Query OK, 1 row affected (0.00 sec)


五、开启数据复制

先进行数据导入

mysql -uroot -p < 2019-04-28.sql


再判断从Master主机的哪里开始进行复制,还记得以前mysqldump的--master-data=2选项吗,它记录了咱们须要从Master的哪里开始进行复制

more 2019-04-28.sql(注意:千万别使用vim,若是sql文件大的话,足够把你内存吃完,使用more分页查看就已经足够)

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=120(这是一个注释信息的样本)



查看CHANGE MASTER TO语法选项

mysql> help change master to;(不建议背命令,由于没有必要)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.32.3',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=120;

Query OK, 0 rows affected (0.08 sec)

 

mysql> start slave user='repliter' password='123456';

 

这里可能会有人会有疑问,你为何不在CHANGE MASTER TO的时候加入user和password直接链接呢?分开写,不是画蛇添足吗?

缘由就是:为了安全。

在CHANGE MASTER TO的时候,I/O thread负责维护master.info文件的更新,I/O thread会将Master主机的binlog file和position,还有其余信息,这其中就包括,Slave链接Master主机的用户名和密码,以此来实现主从数据同步,那么问题来了,若是CHANGE MASTER TO的时候直接写user和password,那么一样会写进master.info文件中去,这样大大增长了帐户泄露的风险,由于此类的帐户密码只能是DBA知道,因此,为了帐户安全,在start slave的时候才指定用户密码,这样user和password信息就不会保存到master.info文件之中了


查看Slave的复制状态:

mysql> show slave status\G;(对于参数项的具体含义,必定要看MySQL官网,由于网上不少资料都是人家按照本身理解翻译的,难以有理解出入)这里只看I/O、SQL thread运行状态

Slave_IO_State: Waiting for master to send event

                  xxx

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

                 xxx

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

                 xxx


六、数据同步测试:

Master主机变动两条数据:

INSERT INTO `bbs`.`myhash_0` (`c1`, `c2`, `c5`) VALUES ('1', '2', '3');

UPDATE `edusoho_e`.`biz_targetlog` SET `target_type` = 'trade.sucessfull' WHERE `id` = '5';

而后去看数据同步过来没有。


题外:

虽然是在作测试,可是笔者认为测试的目的可不只仅为了测试,测试的目的应该是为了应用到线上作的探路者、前锋军,因此,作测试的时候,应该尽量的考虑,这么作,可否应用到线上?

而不该该图省事,将过程简化,如:受权复制链接用户的时候,笔者见过 root@'%'的复制链接用户,请问线上也是这么作的么?还有:mysqldump的时候,真的能够在命令行输入明文密码么?vim 一个几十G的文件,真的没有问题么?应尽量使用最小权限,使用合适的命令,使服务器先运行稳定,才是前提。

至此,本文到此写完了,谨以此文记录本身的点滴成长和学习记录,对于其中笔者的错误之处,望请下方留言指正,不胜感激!

相关文章
相关标签/搜索