Mysql主从复制:
Mysql主从复制原理:
Mysql的主从复制和mysql的读写分离有着紧密的联系,首先要先部署主从复制,才能部署读写分离,因为读写分离就是建立在主从复制的基础上。
Mysql主从同步定义:主从服务器使得数据库可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器。
Mysql主从同步机制:服务器之间同步是基于二进制日志机制,主服务器使用二进制机制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主从服务器的数据一致。在使用二进制日志文时,主服务器的所有操作都会被记录下来,然后从服务器会收到该日志的一个副本,从服务器可以执行该日志中的任何操作,默认会执行日志中的所有语句。
Mysql支持的复制类型:
基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。这是mysql默认采用的复制类型,效率较高;简称(SBR),其优点是binlog文件较小,binlog文件可以用于实时的还原,而不是仅仅用于复制。
基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍;简称(RBR),其优点是任何情况下都可以被复制,和其他大多数数据库的复制技术一样。
混合类型的复制:默认采取基于语句的复制,一旦发现基于语句无法精确复制时,就会采取基于行的复制;简称(MBR)
mysql复制过程:好几个
在每个事务更新数据完成之前,master在二进制日志记录这些改变,写入二进制日志完成后master通知存储引擎提交事务。
Slave将master的Binary log复制到其中继日志。
首先slave开始一个工程线程----I/O线程,I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,他就会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
注:I/O线程主要用于复制。
SQL slave thread(SQL线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重新放其中的事件而更新slave的数据,使其与master中的数据一致。只要I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在slave上的串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
注:SQL线程主要用于重读。
案例实施:搭建MySQL主从复制
安装MySQL。部署三台,选其中一台作为主服务器(master)
- 建立时间同步环境,在住节点上搭建时间同步服务器:
安装NTP:
编辑配置文件,添加以下两行选项:
重启服务并设置为开机自启动:
在节点服务器上也进行时间同步
更新时间:在ntpdate命令后面输入主服务器IP地址。
安装MySQL数据库:
首先检查一下本机是否已经安装了mariadb数据库:如果存在,就马上卸载。因为Mariadb数据已存在的话,MySQL数据就无法进行安装了。
然后是安装MySQL需要的一些依赖软件包:
这里的cmake使用编译安装:
编译安装mysql:
优化调整:
创建运行用户并初始化数据库:
启动MySQL服务并修改登录MySQL的root密码:
设置登录密码;登录用户为root;密码为‘cloud’
- 配置MySQL主从服务器(Master)
设置主从服务器是需要在MySQL的配置文件里面添加以下内容即可:
重启MySQL服务:
登录MySQL程序,给从服务器授权:
授权并添加一个公共用户;用户名:tom
更新一下缓存
查看master表
配置从服务器(slave):
注:slave上的server_id一定不能和主服务器上的一样。(包括其他的slave服务器)
重启MySQL服务器:
登录MySQL,配置与主服务器同步:
按照服务器的结果改下面命令中,master_log_file和master_log_pos参数
启动同步:
查看Slave状态,确保状态表中有两个值为YES。
…………..省略部分内容
验证主从复制效果:
在主、从服务器上登录MySQL,查看是否相同:
在主服务器上新建一个数据库名为db_test
然后在slave数据库上查看:
在主服务器上无论做修改、删除、添加、移动等操作,从服务器上都会自动执行同样的操作。
Server_id详解:
- MySQL的同步的数据中包含server_id的,用于表示该语句最初是从哪个server写入的,所以server_id一定得存在。
- 每一个同步中的slave在master上都有对应一个master线程,该线程就是通过slave的server_id来标识的;每个slave在master端只能有一个master线程,如果有两个slave其他们的server_id也相同,则后一个连接成功时,前一个将会被踢掉,这也就导致两台slave无法同时连接master。
- 在MySQL做主从同步时,多个主需要构成一个环状,但是同步时需要保证一条数据都不会陷入死循环,这里就是靠server_id来实现的。
MySQL读写分离:
Mysql读写分离原理:
简单的来说就是在主服务器上写,在从服务器上读取。
基本的原理是让主服务器处理事务性查询,而从服务器处理select查询。数据库复制被用来把事务性查询导致的变更同步在群集中的从服务器数据库。
读写分离原来示意图:
Mysql读写分离的类型:
基于程序代码内部的实现:在代码中根据select,insert进行路由分发,这类方法也是目前生产环境应用最广泛的,其优点就是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点就是需要开发人员来实现,运维人员无法做到。
基于中间层代理实现:代理一般位于客户端和服务端中间,代理服务器将客户端的请求进行判断并转发给后台数据库。
MySQL的代理程序有许多,现在主流的两款分别为:MySQL-Proxy和Amoeba
- MySQL-Proxy:MySQL的开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL
的官网产品,但是MySQL官网并不建议使用在生产环节。
- Amoeba:由陈思儒开发,改程序由Java语言进行开发,曾用于阿里巴巴的生产环境,
但是这个程序唯一缺陷就是不支持事物和存储过程。
案例实施:搭建MySQL读写分离:
这里我们使用amoeba部署读写分离。
- 在主机amoeba上安装Java环境:
因为Amoeba是基于jdk1.5版本开发的,所以官网推荐使用jdk1.5或jdk1.6版本。高版本不建议使用。
添加以下内容
Java环境配置完成
安装并配置Amoeba软件:
配置Amoeba读写分离,两个slave读在均衡:
分别在master、slave1、slave2中开发权限给Amoeba访问。这里我们单独创建一个账号并赋予权限。
编辑amoeba.xml配置文件:
………….省略部分内容
编辑dbServers.xml配置文件:
………….省略部分内容
………….省略部分内容
按照上面的配置案例,最后保证配置无误之后,便可启动Amoeba服务了
启动Amoeba服务,其默认端口为TCP 8066
查看端口和启动情况
在Cilent主机上测试:
注:-P是指定端口。-h是指定IP地址。
在master上创建一个表,同步到各从服务器上,然后关掉各从服务器的slave功能,再插入别的语句,这样做是为了以便区分:
创建一个表,名为G
然后分别在两台从服务器上关闭slave功能并添加各一行类容:
Slave1:
Slave2:
测试读取操作:
第一次读:
测试写操作:
这里写进去的类容在两台从服务器上是无法读取的。只能在主服务器上能够看见:
由此验证。已经实现了MySQL读写分离,目前所有的写操作都全部在master(主服务器)上,用来避免数据的不同步,所有的读操作都分给了slave(从服务器),用来分担数据库压力。