MySQL主从复制与读写分离数据库
前言
在实际的生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不能满足实际需求的。因此,一般通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
一、什么是主从复制
将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。
1.1:MySQL主从复制原理
1.11:MySQL的复制类型
-
基于语句的复制
-
基于行的复制
-
混合类型的复制
1.12:主从复制的作用
-
主数据库出现的问题,可以切换到从数据库
-
可以进行数据层层面的读写分离
-
可以在从数据库上进行日程备份
1.2:MySQL主从复制的工作过程
Binary log:主数据库的二进制日志
Relay log:从服务器的中继日志
- 第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。
- 第二步:salve开启一个I/O
Thread,该线程在master打开一个普通连接,主要工作是binlog dump
process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。 - 第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。
二:案列实施:MySQL主从复制搭建
- 配置环境
操作系统:五台Centos 7.6的Linux系统
数据库版本:MySQL 5.7
一台做主服务器(master)IP:20.0.0.41)
两台做从服务器(shuai01 IP:20.0.0.42)(shuai02 IP: 20.0.0.43)
一台客户端client(20.0.0.45)
2.1:配置前提
-
1.需要保证3306端口开启或关闭防火墙
-
2.三台服务器之间可以互相pingtong
#在主服务器ping从服务器shuai01 shuai02
[root@master ~]# ping 20.0.0.42
[root@master ~]# ping 20.0.0.43
#在shuai01ping主服务器跟另一个从服务器
[root@shuai01 ~]# ping 20.0.0.41
[root@shuai01 ~]# ping 20.0.0.43
#从服务器shuai02一样
2.2:实验目的:
-
通过配置,实现主从配置
-
首先配置主服务器(master)
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
-
配置时间同步环境
-
在主服务器上安装NTP时间同步服务器
#安装NTP服务
[root@localhost ~]# yum install ntp -y
- 修改ntp.conf 设置主服务器为时间同步
[root@master ~]# vim /etc/ntp.conf
...省略内容
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
'//添加一下两段'
server 127.127.195.0 //本地是时钟源//
fudge 127.127.195.0 stratum 8 //设置时间层级为8//
...省略内容
#重启服务
[root@master ~]# systemctl start ntpd
#进行时间同步
[root@master ~]# /usr/sbin/ntpdate 20.0.0.41
-
配置主服务器(master)
-
开启二进制日志选项,增加服务器id
#在[mysqld]选项中添加
server-id = 11 #标识唯一id(必填) 注意不能与从服务器id一样
log-bin=master-bin #主服务器日志文件
log-slave-updates=true #从服务器更新二进制日志
#重启服务
[root@master ~]# systemctl restart mysqld
如果你按照上面的正确安装mysql了,这里是可以正常重启的。如果启动不正常出现如下报错:
The server quit without updating PID file…
你需要使用如下命令查看是否还存在mysqld进程
ps -ef|grep mysqld
如果有,可以使用命令:kill -9 mysqld的进程号 结束它,然后重新启动mysqld
- 登录MySQL数据库允许从库获得主服务器日志
[root@master ~]# mysql -uroot -p
- 进入后做如下配置
#给从库放权限
replication:复制 slave:从服务器 *.*:所有数据库所有表 'mysql':身份
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by'123456';
#刷新权限
mysql> flush privileges;
- 重启MySQL服务,登录MySQL,查看主库信息
[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -uroot -p
mysql> show master status;
- 显示内容如下
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000004 | 154 | | | |
+-------------------+----------+--------------+------------------+-------------------