MySQL主从复制原理:MySQL的主从复制和读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离
MySQL支持的复制类型:
1 基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高
2 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍
3 混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制
MySQL读写分离原理:读写分离就是只在主服务器上写,只在从服务器上读,基本原理是让主数据库处理事务性查询,而从数据库执行select查询。数据库复制被用来把事务性查询导致的变更同步群集中的从服务器
该服务一般基于中间代理层实现,代理一般位于客户端和服务器之间,代理服务器接到客户端请求通过判断后转发到后端数据库。
Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for Mysql软件;
这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发;位于 Client、DB Server(s)之间,对客户端透明;
下面我基于上面的拓扑图来做一下MySQL的主从复制和读写分离
实验环境:Master CentOS 7 IP:192.168.159.129
Slave1 CentOS 7 IP:192.168.159.130
Slave2 CentOS 7 IP:192.168.159.131
Amoeba CentOS 7 IP:192.168.159.128
客户端 CentOS 7 IP:192.168.159.132 #5台服务器的MySQL均为5.5版本
一、实现主从同步
1 想要执行主从复制首先要能保证主和从的服务器时间能保持一致,虽然不会完全一致,但也要保证差别不大
1)在主从服务器上安装NTP包
2)在主服务器配置NTP的主配置文件,将本地设为时间源,时间层级设为8,完成之后便开启NTP服务,最后关闭防火墙
3)在两台节点服务器上安装ntpdate进行时间同步,同步对象为主服务器,接着开启NTP服务,最后同样要关闭防火墙
2 接着对主服务器的MySQL主配置文件进行配置
1)定义主服务器的二进制文件名,允许从服务器进行同步更新
2)定义主服务器的ID值,这里的ID值具有唯一性,所以每台服务器的ID值不能相同
3)重启数据库
4)登录MySQL,授权给从服务器
5)查看主服务器状态
3 对两台节点服务器的MySQL主配置文件进行配置
1)定义第一台从服务器的ID值和中继日志
2)配置与主服务器的同步功能,并且开启该功能
3)在第二台从服务器上执行相同的配置
4 对主从复制服务进行测试
1)在主服务器上建立一个库
2)在从服务器上查看是否有该数据库,如果有说明服务成功
二、执行读写分离(在Amoeba服务器上进行操作)
1 在安装Amoeba软件之前需要先安装java环境,不然Amoeba无法运行
1)挂载软件包
2)将java软件包放到/usr/local目录下
3)执行该文件,按回车和yes即可执行完成
4)在etc/profile目录下配置所需要的环境变量,具体操作已在图中写出
5)最后执行source命令使环境变量立即生效
2 安装Amoeba,将MySQL群集开放给Amoeba访问权限
1)在/usr/local目录下创建amoeba工作目录,并且将软件包安装在此目录下
2)amoeba安装完成后便赋予其执行权限,接着执行图中命令检测是否安装成功
3)在三台MySQL服务器上开放给Amoeba访问权限
3 对amoeba.xml进行配置
1)指定客户机访问时所用的用户名和密码
2)分配给主服务器的默认权限和写入权限
3)分配给从服务器的读取权限
4 对dbServers.xml文件进行配置
1)指定Amoeba访问MySQL服务器时所用的用户名和密码
2)指定主服务器的名称和地址
3)指定从服务器的名称和地址
4)指定从服务器池和池下的从服务器
5)配置完成后开启服务
5 最后便是测试了,先测试从服务器的只读功能
1)用客户端远程登录Amoeba服务器
2)在主服务器的school数据库中创建class表,此时两台从服务器也会有class表
3)这里为了显示测试效果需要先关闭两台从服务器的同步功能
4)在主从三台服务器上分别插入三条不同的数据,在用客户端进行访问,可以看到在客户机上只能看到两台从服务器的信息而看不到主服务器的信息,说明主服务器不具备读的功能
6 接着测试主服务器的写入功能
1)用客户端在class表中插入一条信息
2)分别查看主从服务器的class表信息,可以看到新插入的这条信息只出现在了主服务器上,而两台节点服务器并没有,由此可以指明两台从服务器并不具备写入功能,只有读取的功能,至此可以看到主服务器只具备写入功能,从服务器只具有读取功能