基于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
主从复制原理:数据库
经过三个线程来实现。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实现负载均衡,将读写流量分离
我这里引入网站找到的一张图片
三、在读写分离架构下,将多个Slave根据业务进行拆分
在这里引入从网上找到的一张图片
主从搭建配置:
一、修改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的文件,真的没有问题么?应尽量使用最小权限,使用合适的命令,使服务器先运行稳定,才是前提。
至此,本文到此写完了,谨以此文记录本身的点滴成长和学习记录,对于其中笔者的错误之处,望请下方留言指正,不胜感激!