MySQL主从复制和读写分离

一、前言

MySQL使用主从复制与读写分离的原因:

1、在企业应用中,成熟的业务通常数据量都比较大
2、单台MySQL在安全性、高可用性和高并发方面都无法满足实际的需求
(myisam基于表级锁定;innodb基于行级锁定 --存储引擎不能满足并发读、写的需求)
3、配置多台主从数据库服务器以实现读写分离

一、MySQL主从复制原理

1、MySQL的复制类型

基于语句的复制
基于行的复制
混合类型的复制(语句、行、日志文件)

2、MySQL主从复制的工作过程

在这里插入图片描述

二、MySQL读写分离原理

1、只在主服务器上写,只在从服务器上读
2、主数据库处理事务性查询,从数据库处理select查询
3、数据库复制用于将事务性查询的变更同步到集群中的从数据库
读写分离原理示意图
在这里插入图片描述
4、复制的基本过程如下:
4.1、Master将用户对数据库更新的操作以二进制格式保存到Binary Log日志文件中;
4.2、Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
4.3、Master接收来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;
4.4、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清除的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
4.5、SlaveSql进程检测到relay-log中新增了内容后,会马上解析relay-log的内容称为在Master端真实执行时候的那些可执行的内容,并在自身执行。

三、配置MySQL读写分离

三台装有MySQL5.7版本的服务器,角色分配如下:
master:192.168.73.10
slave01:192.168.73.20
slave02:192.168.73.30
一台Amoeba代理服务器
Amoeba:192.168.73.40

四、MySQL读写分离步骤

先把服务器的防火墙和核心防护全部关闭。
systemctl stop firewalld.service
setenforce 0

4.1、时间同步

[root@master ~]# ntpdate ntp.aliyun.com
[root@master ~]# crontab -e
*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com
[root@master ~]# yum -y install ntp
[root@master ~]# vi /etc/ntp.conf
 17 restrict 192.168.73.0 mask 255.255.255.0 nomodify notrap
 21 #server 0.centos.pool.ntp.org iburst
 22 #server 1.centos.pool.ntp.org iburst
 23 #server 2.centos.pool.ntp.org iburst
 24 #server 3.centos.pool.ntp.org iburst ###注释
server 127.127.1.0
fudge 127.127.1.0 stratum 8 ###设置服务器层级是8级,顶级是0

[root@master ~]# systemctl restart ntpd
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0

4.2、主从同步

主服务器配置

1.修改主服务器的主配置文件参数

[root@master ~]# vi /etc/my.cnf
[mysqld]
...省略
server-id=1 ###mysql服务器id,每个服务器不能相同
log_bin=master-bin ###主服务器日志文件
log_slave_updates=true ###允许中继日志读取主服务器的二进制日志

[root@master ~]# systemctl restart mysqld
[root@master ~]# cd /usr/local/mysql/data
[root@master data]# ll
总用量 122924
-rw-r-----. 1 mysql mysql       56 10月 20 15:16 auto.cnf
-rw-r-----. 1 mysql mysql      285 10月 26 15:59 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 10月 26 16:00 ibdata1
-rw-r-----. 1 mysql mysql 50331648 10月 26 16:00 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 10月 20 15:16 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 10月 26 16:00 ibtmp1
-rw-r-----. 1 mysql mysql      154 10月 26 16:00 master-bin.000001
-rw-r-----. 1 mysql mysql       20 10月 26 16:00 master-bin.index
drwxr-x---. 2 mysql mysql     4096 10月 20 15:16 mysql
drwxr-x---. 2 mysql mysql     8192 10月 20 15:16 performance_schema
drwxr-x---. 2 mysql mysql     8192 10月 20 15:16 sys

2、登陆主服务器,给从服务器授权

[root@master ~]# mysql -u root -p
mysql> grant replication slave on *.* to 'myslave'@'192.168.73.%' identified by 'abc123'; ###为所有从服务器授权所有数据库
mysql> flush privileges;
mysql> show grants for myslave@'192.168.73.%';
+------------------------------------------------------------+
| Grants for myslave@192.168.73.%                            |
+------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.73.%' |
+------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show master status; ###记下position的值
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      863 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

从服务器配置

设置时间同步

[root@slave1 ~]# crontab -e
*/30 * * * * /usr/sbin/ntpdate 192
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值