会不会有那么一天,生活可以简单到每天清早踏上一辆载着鲜花的脚踏车,微笑着穿过窄窄的街巷,为爱花的人送去芬芳,为需要知识的你送去帮助。
简介
在实际的生产环境中,如果对MySOL数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是不能满足实际需求的。本章将首先讲解MySOL主从复制和MySOL读写分离的原理,然后介绍如何配置MySOL主从复制和MySOL读写分离
本章重点
MySOL主从复制与读写分离原理
MySOL主从复制与读写分离配置方法
理论讲解
一,MySQL主从复制原理
MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
MySOL支持的复制类型
(1)基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
(2)基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
(3)混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
2)复制的工作过程
MySOL复制的工作过程如图所示。
(1)在每个事务更新数据完成之前,Master 在二进制日志记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务。
(2)Slave将Master的Binary log 复制到其中继日志。首先,Slave 开始一个工作线程—I/O线程,I/O线程在Master 上打开一个普通的连接,然后开始Binlog dump process.Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master.它会睡眠并等待Master 产生新的事件。I/O线程将这些事件写入中继日志。
(3)SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件。
并重放其中的事件而更新Slave的数据,使其与Master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作。
二,MySQL读写分离原理
简单来说,读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select 查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库。
目前较为常见的MySOL读写分离分为两种:
基于程序代码内部实现
在代码中根据select、insert进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支:缺点是需要开发人员来实现,运维人员无从下手。
基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数据库,有两个代表性程序。
(1)MySOL-Proxy
MySQL-Proxy为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL 官方并不建议将MySQL-Proxy用到生产环境。
(2)Amoeba(变形虫)。由陈思儒开发,其曾就职于阿里巴巴。该程序用Java 语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。
经过上述简单的比较,通过程序代码实现MySQL读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,例如一些大型复杂的、Java应用,如果在程序代码中实现读写分离对代码改动就较大,所以,像这种大型复杂的应用一般会考虑使用代理层来实现。本章后续案例通过Amoeba实现。
三,搭建mysql主从复制
虚拟主机 | IP地址 | 操作系统 |
centos01/Mysql主服务器 | 192.168.100.10 | CentOS-7.4-x86_64-DVD-1708 |
centos02/Mysql从服务器 | 192.168.100.20 | CentOS-7.4-x86_64-DVD-1708 |
centos03/Mysql从服务器 | 192.168.100.30 | CentOS-7.4-x86_64-DVD-1708 |
centos04/amoeba服务器 | 192.168.100.40 | CentOS-7.4-x86_64-DVD-1708 |
centos05/测试读写分离账户 | 192.168.100.50 | CentOS-7.4-x86_64-DVD-1708 |
1.建立时间同步环境,在主节点上搭建时间同步服务器。
1)安装ntp,Centos7.4默认已经安装好
2)备份ntp主配置文件,并编辑主配置文件
3)重启服务并设置开机自启
2)其余主机全部同步mysql主服务器时间
centos02:
centos03:
centos04:
centos05:
3.三台MySQL服务器全部安装MySQL数据库,并且设置账户密码,具体操作(MySQL数据库系统)
并编辑数据库:
centos01(mysql主服务器):
centos02(mysql从服务器):
centos03(mysql从服务器):
4. 配置主mysql服务器授权指定账户复制数据
5.配置从服务器复制主mysql数据库数据
6.centos03和centos02配置一模一样
7.测试主从复制 主mysql创建benet
测试从mysql服务器是否能够同步
centos01:
centos02:
四,搭建MySQL读写分离
Amoeba项目开源框架于2008年发布一款Amoeba for MySOL软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要为应用层访问MySQL的时候充当SQL路由功能,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库。通过Amoeba能够完成多数据源的高可用.负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上使用,其版本可在官网进行下载。
1.在主机Amoeba上安装Java环境。
因为Amoeba是基于jdk1.5开发的,所以官方推荐使用jdk1.5或1.6版本,高版本不建议使用。
1)创建安装目录,将amoeba解压到安装目录下
2)复制jdk
3)安装jdk
4)配置环境变量
2.编写各主机hosts文件 5台主机编写hosts文件过程百分百相同,这里只编写一台供参考。
3.授权读写分离账户
4.修改amoeba配置文件
5.修改amoeba配置文件访问mysql数据库
启动amoeba
6.测试读写分离
创建class数据库,在库中创建stu表,插入数据(注意是centos05)
这个时候查询数据:
是可以查到的,如果关掉从mysql服务器,再试 (两台都关)
测试成功
至此,结束~
故事很短,道理很长,学无止境,不忘初心,砥砺前行
微信搜索 “徐阿马” 关注公众号,期待你的关注!