基于binlog方式搭建MySQL主从

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


环境:

主机 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


主从复制原理图:

1.jpg


主从复制原理:

通过三个线程来实现。

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

Slave,IO thread,将Master的binary log复制到自己的relay log中

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


主从复制的应用场景:

1、Slave作为Master的数据备份

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

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

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

11.png

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

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

11.png


主从搭建配置:

1、修改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


2、授权复制连接用户

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

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


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

如果我们的业务数据拆分到了各个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


4、准备复制数据

在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)


5、开启数据复制

先进行数据导入

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


6、数据同步测试:

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的文件,真的没有问题么?应尽可能使用最小权限,使用合适的命令,使服务器先运行稳定,才是前提。

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




猜你喜欢

转载自blog.51cto.com/20131104/2386101
今日推荐