MySQL读写分离基于Mycat实现

为什么需要读写分离至于为什么需要读写分离,在我之前的文章有介绍过了,相信看到这篇文章的人也知道为什么需要读写分离了,当然如果你也需要了解一下,那么欢迎查看我之前的文章SpringBoot Mybatis 读写分离配置,顺便也可以了解一下怎么通过代码进行读写分离的 MySQL主从复制主从复制是读写分离的关键,不管通过什么方式进行读写分离,前提就是MySQL有主从复制,当前双机主从也行,但是关键的关键,是要能保证2个库的数据能一致(出掉刚写入主库从库还未能及时反应过来的情况),如果2个库的数据不一致,那么读写分离也有没有任何意义了,具体MySQL怎么做主从复制可以查看我之前的文章MySQL主从复制搭建,基于日志(binlog) Mycat是什么一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 一个新颖的数据库中间件产品 以上内容来自Mycat官网,简单来说,Mycat就是一个数据库中间件,对于我们开发来说,就像是一个代理,当我们需要使用到多个数据库和需要进行分库分表的时候,我们只需要在mycat里面配置好相关规则,程序无需做任何修改,只是需要将原本的数据源链接到mycat而已,当然如果以前有多个数据源,需要将数据源切换为单个数据源,这样有个好处就是当我们的数据量已经很大的时候,需要开始分库分表或者做读写分离的时候,不用修改代码(只需要改一下数据源的链接地址) Mycat读写分离设置配置Mycat用户Mycat的用户就跟MySQL用户是同一个意思,主要配置链接到Mycat的用户名以及密码,…

SpringBoot Mybatis 读写分离配置

为什么需要读写分离当项目越来越大和并发越来大的情况下,单个数据库服务器的压力肯定也是越来越大,最终演变成数据库成为性能的瓶颈,而且当数据越来越多时,查询也更加耗费时间,当然数据库数据过大时,可以采用数据库分库分表,同时数据库压力过大时,也可以采用Redis等缓存技术来降低压力,但是任何一种技术都不是万金油,很多时候都是通过多种技术搭配使用,而本文主要就是介绍通过读写分离来加快数据库读取速度 实现方式读写分离实现的方式有多种,但是多种都需要配置数据库的主从复制,当然也许是有不需要配置的,只是我不知道而已 方式一数据库中间件实现,如Mycat等数据库中间件,对于项目本身来说,只有一个数据源,就是链接到Mycat,再由mycat根据规则去选择从哪个库获取数据 方式二代码中配置多数据源,通过代码控制使用哪个数据源,本文也是主要介绍这种方式 读写分离优劣优点1.降低数据库读取压力,尤其是有些需要大量计算的实时报表类应用 2.增强数据安全性,读写分离有个好处就是数据近乎实时备份,一旦某台服务器硬盘发生了损坏,从库的数据可以无限接近主库 3.可以实现高可用,当然只是配置了读写分离并不能实现搞可用,最多就是在Master(主库)宕机了还能进行查询操作,具体高可用还需要其他操作 缺点1.增大成本,一台数据库服务器和多台数据库的成本肯定是不一样的 2.增大代码复杂度,不过这点还比较轻微吧,但是也的确会一定程度上加重 3.增大写入成本,虽然降低了读取成本,…

微信Speex转wav,Speex to wav

前言微信公众号开发,因为需要在页面发送语音和播放,由于公众号页面中录音必须要调用微信js录音,录音完成由前端上传到微信临时素材,再由后端下载到服务器,然后给前端播放,但是因为从微信下载下来的语音智能是speex格式(高清语音)和amr格式,然而这2种格式都是无法直接在HTML中播放的,所以需要对语音进行转码,由于speex格式清晰度较高,所以我选择了下载speex格式的语音进行转码,本文就是记录如果一步一步调用speex官方源码和微信提供部分C代码进行转码,注:本文所有环境和命令是基于Linux的 下载并安装speex环境:Linux Centos Gcc JDK 1.8 speex 1.2.0 步骤:首先下载speex最新的源码,下载地址,解压然后进入源码目录,执行命令 sudo ./configure 验证环境是否有误,如果有问题,则根据具体提示自行安装和配置,如果没有异常,则可以执行命令进行编译安装了 sudo make;sudo make install 如果没有出问题,则会在/usr/local/lib文件夹下面产生libspeex.so等文件,…

Spring Cloud的基本认识和使用Spring Cloud的基本教程

认识Spring CloudSpring Cloud简单来说就是一个微服务相关的框架,至于什么是微服务,简单来说就是一个整体项目由多个单独运行的小项目构成,每个小项目负责一个或多个功能,每个小项目有1个或者1个以上运行实例,项目之间可以相互调用。如果有接触Dubbo,那么就可以很容易理解,Dubbo是一个提供不同项目相互调用的框架,同时Dubbo需要依赖于Zookeeper,所以说Spring Cloud做的事和Dubbo类似,却又有很大不同,但是它们的目的确实相同的,那就是提供不同项目之间的调用和负载均衡 Spring Cloud 常用组件Spring Cloud EurekaSpring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次分装,由两个组件组成:Eureka服务器和Eureka客户端。 Eureka服务器用作服务注册服务器。Eureka客户端是一个Java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支 持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡,其中Eureka Server角色相当于Dubbo的Zookeeper,Eureka Client相当于服务提供者和调用者 Spring Cloud Zookeeper对Zookeeper的封装,…

Java配置maven+jenkins+git(svn)+tomcat自动编译和部署(持续集成)

目的在开发中,需要经常频繁的对测试服务器进行部署,而且在多人协同中开发经常遇到的问题就是别人更新了他的代码,而你去更新你的代码时并没有更新到别人的代码,导致测试环境的代码不是最新,当然这个问题也好解决,那就是每次更新的时候先获取版本控制器上面的代码,然后更新,当然每次这样操作都是耗时耗力的,如果是整个项目更新,一般项目至少3、40M上传到服务器也需要一定的时间,而部分更新,也需要找到指定的文件或者整个代码覆盖,然后重启服务器(Tomcat里面直接覆盖class虽然可以配置热加载,但是容易内存溢出),就我工作中的情况而言,是每次都需要先把代码上传到服务器-解压-找到Tomcat进程id(Linux)-kill线程-启动Tomcat,每次下来就需要最少几分钟时间,而且每天有可能多次部署,所以对整个工作效率是有一定影响的。正是因为以上种种,所以才有了本文,而本文最终的结果就是一旦代码上传到git或者svn的时候,代码能自动部署到服务器上面去,这样我们就只需要吧正确的代码提交的版本控制器,就不用理会服务器的更新了 jenkins部署Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1、持续的软件版本发布/测试项目。 2、监控外部调用执行的工作。 (来自百度百科) Jenkins能做的东西有很多,不过本文只介绍一个简单的自动编译打包部署,首先下载Jenkins,推荐下载war包,下载地址: 下载主页 war包下载 本文是基于war环境部署的,…

简易的后台管理权限设计

前言因为想做一个快速的后台开发模板框架(方便以后直接开发功能而不用纠结环境和页面框架搭建的选择),当时在权限控制方面纠结于spring security和shiro,但是由于对这2个框架理解都不深,只是停留在基础的使用上面,而且一般的后台管理也用不了那么多的功能,所以思前想后还是决定自己做一套权限系统设计,第一方便扩展,第二自己做的也更熟悉,更方便做特定功能的定制。看本文之前可以先看看我做的简易开发模板框架,最好看完之后运行一下,或许更方便理解本文 需求明确做什么事情之前首先要明确需求,以下就是我整理的我所需要的功能 一、控制用户在没有权限访问时,访问了URL会提示没有权限,没有登录时访问会跳转到登录页面二、菜单要根据用户拥有的权限填充菜单(只出现用户有权限的菜单),包括页面三、尽可能的不拦截静态资源,如:css、js、HTML等四、有默认权限功能,用户一旦创建可以拥有默认的权限,而避免没有任何权限无法进入系统五、权限以角色分组,用户可以拥有多个角色,权限累加六、有超级用户,不用授予角色就能访问所有功能,超级用户通过特定标识来识别,标识只能通过修改数据来实现(为什么会有这个功能,是因为一旦权限开启了,默认是没有其他用户的,这时候需要用超级用户来进行创建用户和授权,当然也是方便系统数据错乱时能进入系统调整)七、如果是直接打开的网址,在没有权限时要跳转页面,如果是Ajax请求,那么则需要返回对应没有权限的json数据库设计需求明确后就要开始数据库的设计了,这一步因工程而异,因为我只涉及后台,…

MySQL主从复制搭建,基于日志(binlog)

什么是MySQL主从复制简单来说就是保证主SQL(Master)和从SQL(Slave)的数据是一致性的,向Master插入数据后,Slave会自动从Master把修改的数据同步过来(有一定的延迟),通过这种方式来保证数据的一致性,就是主从复制 MySQL主从能解决什么问题一、高可用因为数据都是相同的,所以当Master挂掉后,可以指定一台Slave充当Master继续保证服务运行,因为数据是一致性的(如果当插入Master就挂掉,可能不一致,因为同步也需要时间),当然这种配置不是简单的把一台Slave充当Master,毕竟还要考虑后续的Salve同步Master,当然本文并不是将高可用的配置,所以这里就不多讲了 二、负载均衡因为读写分离也算是负载均衡的一种,所以就不单独写了,因为一般都是有多台Slave的,所以可以将读操作指定到Slave服务器上(需要代码控制),然后再用负载均衡来选择那台Slave来提供服务,同时也可以吧一些大量计算的查询指定到某台Slave,这样就不会影响Master的写入以及其他查询 三、数据备份一般我们都会做数据备份,可能是写定时任务,一些特殊行业可能还需要手动备份,有些行业要求备份和原数据不能在同一个地方,所以主从就能很好的解决这个问题,不仅备份及时,而且还可以多地备份,保证数据的安全 四、业务模块化可以一个业务模块读取一个Slave,再针对不同的业务场景进行数据库的索引创建和根据业务选择MySQL存储引擎 五、高扩展(硬件扩展)主从复制支持2种扩展方式 1、scale-up向上扩展或者纵向扩展,主要是提供比现在服务器更好性能的服务器,…

全面了解Nginx主要应用场景

前言本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得。所以还请见谅,同时欢迎留言交流 Nginx能做什么1.反向代理2.负载均衡3.HTTP服务器(包含动静分离)4.正向代理以上就是我了解到的Nginx在不依赖第三方模块能处理的事情,下面详细说明每种功能怎么做 反向代理反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。 下面贴上一段简单的实现反向代理的代码 server { listen 80; server_name localhost; client_max_body_size 1024M; location / { proxy_pass http://localhost:8080; proxy_set_header…