本章节主要介绍MySQL的主从复制。MySQL主从架构集群模式不仅可以解决高并发的读写,提高数据库的读写性能,还能起到数据备份的作用。
在如今互联网的高并发访问量下,即使我们的SQL语句优化的再好,单机版数据库也已经很难抗住压力,一旦数据库被压垮,不仅数据丢失,整个网站都会崩溃,后果相当严重。
MySQL主从复制是指在多台服务器上都部署mysql数据库,将其中一台设置为主数据库,其他设置为从数据库。主数据库主要负责数据的写入,从数据库主要负责数据的读取,而主从数据库之间通过主从复制进行数据同步。
MySQL 主从复制原理
MySQL主从复制主要就是通过binlog,就是binary log(二进制日志文件),该文件用于记录用户对数据库操作的SQL语句。通过binlog日志我们可以做数据恢复,主从复制。
主从复制整个过程共有三个线程,Binglog Dump运行在主节点,I/O和 SQL运行在从节点。
1、Binglog Dump线程
当有从节点连接到主节点上时,主节点会创建对应的Binlog Dump线程,用于给从节点发送bin-log的内容。
2、 I/O线程
当在从节点上启动slave时(start slave),从节点会创建一个I/O线程用来连接到主节点,用来接收主节点上发送的binn-log内容。I/O线程在接收到主节点Binlog Dump线程发来的更新之后,保存在当前节点的relay-log中。
3、SQL线程
SQL线程负责读取relay-log中的内容,解析成具体的操作并执行,从而达到主从复制的效果。
MySQL主从搭建
1,master主数据库的配置
(1)修改MySQL的配置文件my.cnf的server_id(可以修改为任意数值,但不能重复),window环境下好像是my.ini。
修改:server_id=5;
开启binlog:log-bin=/var/lib/mysql/binlog;
(2)登录mysql,创建用户,让从数据库同步数据使用。
grant replication slave on *.* to 'root'@'192.168.56.2' identified by '123456';
其中,root指用户名,192.168.56.2指从数据库的ip,123456指用户密码。
(3)查看主数据库的状态。
show master status;
上图圈中的File和Position两个值很重要,从数据库中会用到。
2、Slave从数据库的配置
(1)修改从数据库的MySQL配置文件my.cnf的server_id(确保和其他的server_id不相同)。
修改:server_id=6;
(2)登录mysql,执行连接语句,连接master主数据库。
change master to master_host='48.95.13.3',master_port=3306,master_user='root',
master_password='123456',master_log_file='binlog.000034',master_log_pos=1164;
其中,48.95.13.3指主数据库的ip,3306指主数据库的端口,root指主数据库创建的用户名,123456指主数据库创建的密码,binlog.000034指上述查询主数据库状态所得的File值,1164指上述查询主数据库状态所得的Position值。
(3)启动slave数据同步。
start slave;
(4)查看slave状态。
show slave status\G;
其中,Slave_IO_Running和Slave_SQL_Running都为Yes时,才表示同步成功。
3、最后,我们可以进行测试。
(1)首先查询一下主库和从库的表数据,主数据库表是空的,如下图:
从数据库表也是空的,如下图:
(2)我们往主数据库中插入一条语句,再次查询主数据库如下图:
我们再次查询从数据库,如下图:
我们发现从数据中也存在同一条记录,同步数据成功,我们的MySQL的主从复制已经完成。
总结:
MySQL主从复制以及搭建完成,读写分离一般由中间件(如mycat),或者自己业务层代码控制。当网站壮大,网站压力过大,业务之间耦合度过高时,我们需要对服务进行拆分,对数据库进行分库,分表。建议根据业务进行垂直分库,在对数据量大的表进行水平分表。MySQL读写分离就可完成分库,根据自身业务对userId取模(mycat也是类似方法)或者时间进进行分表。后续会在Spring Boot系列之多数据源配置一文中进行代码演示。
MySQL性能调优还涉及到一些mysql参数配置,硬件等等,本系列文章只是给想调优而找不到方向的人指条道路,当然用于面试回答也已经足够,虽然系列文中的SQL优化也只讲了索引优化,但通过本系列文章的学习,也足以抗住中小型企业的数据库压力。
有意见或者建议的朋友可以在下方留言,我们一起学习,共同进步。