下文主要给大家带来搭建基于binlog方式的主从架构详细步骤,希望这些内容能够带给大家实际用处,这也是我编辑搭建基于binlog方式的主从架构详细步骤这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。
基于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 |
主从复制原理图:
主从复制原理:
通过三个线程来实现。
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实现负载均衡,将读写流量分离
我这里引入网站找到的一张图片
3、在读写分离架构下,将多个Slave根据业务进行拆分
在这里引入从网上找到的一张图片
主从搭建配置:
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的文件,真的没有问题么?应尽可能使用最小权限,使用合适的命令,使云服务器先运行稳定,才是前提。
对于以上关于搭建基于binlog方式的主从架构详细步骤,大家是不是觉得非常有帮助。如果需要了解更多内容,请继续关注我们的行业资讯,相信你会喜欢上这些内容的。