在高并发情况下数据库会存在一定的性能瓶颈,多数情况下一个系统80%的性能问题都在读上面,这种情况我们可以使用Mysql主从来分担读的压力。
主从的含义是:所有的写操作在主库上,读操作在一个或者多个从库上,当然主库也可以承担读请求,而从库的数据则通过主库复制而来,Mysql自带主从复制的功能。原理如下图
主从复制步骤:
基于这样一个原理,那么我们的项目就可以实现读写分离了。如下:
Mysql可以自动实现主从复制,那么我们项目发起的写操作就走主库,而读操作就走从库。我们今天讲的内容主要是如何实现Mysql的主从复制功能。
第一步
我机器上已经安装好了一个Mysql,版本是 5.7,在此基础上我们来演示Mysql主从的安装和配置(Linux也是一样的)。首先找到Mysql的安装目录,我的安装在 C:\Program Files\MySQL ,复制一份,重命名:Mysql-slav
第二步:
然后找到Mysql的数据目录,默认在 C:\ProgramData\MySQL ,复制一份,重命名:MySQL-slave
第三步
然后进入到 master主mysql的数据目录中修改my.ini ,开启master的bin-log 同步功能,我的是 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
[mysqld]
#lower_case_table_names=1 #忽略大小写
#服务器id ,不可重复
server-id=1
#打开log-bin日志
log-bin=mysql-bin
#要给从机同步的库,如果是多个库,可以写多个命令
binlog-do-db=baidu-student
#binlog-do-db=xxxx
#不给从机同步的库(多个写多行)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#自动清理 7 天前的log文件,可根据需要修改
expire_logs_days=7
第四步
主Mysql配置修改好了,直接重启即可,接下来修改slave的配置 C:\ProgramData\MySQL\MySQL-slave\my.ini ,内容如下
[mysqld]
#lower_case_table_names = 1
#不可以与主数据库的ID相同
server-id = 2
#跳过出现的错误,继续执行复制
slave_skip_errors = 1146,2003
#slave_skip_errors = 2003
port=3307
# Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Program Files/MySQL/MySQL-slave/"
# Path to the database root
datadir=C:/ProgramData/MySQL/MySQL-slave/Data
从Mysql就配置就改好了,多说一句:从Mysql也可以开启log-bin 。
第五步
另外,去从库的数据目录\data 目录中把auto.cnf 文件删除,因为该文件中存在一个UUID,我们使用的是复制主库,UUID会重复导致从启动不了。
第六步
现在我们来依次启动两个Mysql。主mysql直接重启即可,从mysql我还需要安装一个服务,CMD进入到从库的安装目录下的bin目录 : C:\Program Files\MySQL\MySQL-slave\bin ,然后执行下面命令安装从的服务:
C:\Program Files\MySQL\MySQL-slave\bin>mysqld.exe --install MysqlSlave --defaults-file="C:\ProgramData\MySQL\MySQL-slave\my.ini"
安装成功提示:Service successfully installed
如果提示没有权限,就在任务管理器里面启动从MysqlSlave
第一步
使用navicat工具连上2个Mysql,从Mysql是复制的主Mysql所以密码也是一样的
从mysql需要从主mysql同步数据,那么首先需要在主mysql创建一个用作数据复制的账号
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%' IDENTIFIED BY '密码';
FLUSH PRIVILEGES;
然后可以通过 show master status; 命令查看主Mysql的状态
第二步
到这说明master就已经准备好了 , 接下来配置Slave 数据库, 一定要在Slave去执行下面命令来建立主从同步关系。
# 先停掉slave
stop slave ;
# 建立主从关系
change master to master_host='127.0.0.1' , master_user='slaveuser',master_password='密码',master_log_file='master-bin.000002',master_log_pos=1876;
#启动同步,如有报错执行 reset slave;
start slave;
#显示从的状态
show slave status
#确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程
注意:master_log_file 和 master_log_pos 的值要与Master查询的一致,要填写你自己的值,不要直接拷贝文章中的内容。
如果 Slave_IO_Running = no 可以检查数据这几个点:
最后一步就是测试了。只需要主mysql去修改该库表中的任何一个数据,从mysql中的数据都会跟着变化。