我是靠谱客的博主 会撒娇汽车,最近开发中收集的这篇文章主要介绍负载均衡相关问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

负载均衡:

1,nginx来做负载均衡

如何实现负载均衡

nginx的负载均衡有4种模式:

负载均衡配置方法

数据库层面优化:

带来的问题:

2,选择同步器(自己程序)

(1) OGG

(2) Canal

(3) otter

(4) DataX

(5) kettle

(6) FlinkX

(7) Porter


负载均衡:

1,nginx来做负载均衡

如何实现负载均衡

        在nginx里面配置一个upstream,然后把相关的服务器ip都配置进去。然后采用轮询的方案,然后在nginx里面的配置项里,proxy-pass指向这个upstream,这样就能实现负载均衡。

nginx的负载均衡有4种模式:

1)、轮询(默认) 

        每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 

2)、weight 

        指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 

3)、ip_hash 

        每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 

4)、fair , url_hash(第三方) 

按后端服务器的响应时间来分配请求,响应时间短的优先分配。 

负载均衡配置方法

        打开nginx.conf文件,在http节点下添加upstream节点:

     

upstream webname {    
    server 192.168.0.1:8080;
    server 192.168.0.2:8080;  
    }  

        其中webname是自己取的名字,最后会通过这个名字在url里访问的,像上面这个例子一样什么都不加就是默认的轮询,第一个请求过来访问第一个server,第二个请求来访问第二个server。依次轮着来。

     

upstream webname {    
    server 192.168.0.1:8080 weight 2;    
    server 192.168.0.2:8080 weight 1;  
    }  

        这个weight也很好理解,权重大的被访问的概率就大,上面这个例子的话,访问2次server1,访问一次server2

upstream webname {    
    ip_hash;    
    server 192.168.0.1:8080;
        server 192.168.0.2:8080; 
         }  

p_hash的配置也很简单,直接加一行就可以了,这样只要是同一个ip过来的都会到同一台server上

然后在server节点下进行配置: 

location /name {      
      proxy_pass http://webname/name/;      proxy_http_version 1.1;      proxy_set_header Upgrade $http_upgrade;      proxy_set_header Connection "upgrade";  }  

proxy_pass里面用上面配的webname代替了原来的ip地址。

这样就基本完成了负载均衡的配置。

下面是主备的配置:

还是在upstream里面

upstream webname {    
    server 192.168.0.1:8080;
    server 192.168.0.2:8080 backup; 
     }

设置某一个节点为backup,那么一般情况下所有请求都访问server1,当server1挂掉或者忙的的时候才会访问server2 

upstream webname {    
    server 192.168.0.1:8080;    
    server 192.168.0.2:8080 down;  
    }  

设置某个节点为down,那么这个server不参与负载。

2,k8s+docker(运维团队)

3,zookeeper

前端资源主要是一些静态资源。


数据库层面优化:

1,并发(怎么满足一秒钟1000万)

2,数据量(表里有上亿的数据)

保证主库和从库之间数据同步

1,mysql支持,mysql内部有个配置,监听binlog(原理)

2,靠java程序来做,每次发生增删改,所有库都执行一遍。(都不会用,要是并发高,主从数据同步时间不一致导致出错)

3,依靠框架

带来的问题:

1,主库和从库之间同步是需要时间的(没有解决方法),强制读取主库数据(通过程序控制的)。

2,主库和缓存怎么保证数据一致性。:

1,双删策略(用的最多的)

1、在谈延时双删之前我们先来了解一下一般场景下数据库和redis的同步机制

2、上面这种同步机制会有什么问题?

        在我们访问redis时,redis中的数据可能不是热点数据,即此时数据库的更新操作已经完成,但是还没有同步到redis中。

3、解决方案,延时双删

延时双删方案执行步骤

  • 删除redis
  • 更新数据库
  • 延时500毫秒
  • 删除redis

问题一:为何要延时500毫秒?

这是为了我们在第二次删除redis之前能完成数据库的更新操作。

        假象一下,如果没有第三步操作时,有很大概率,在两次删除redis操作执行完毕之后,数据库的数据还没有更新,此时若有请求访问数据,便会出现我们一开始提到的那个问题。

问题二: 为何要两次删除redis?

        如果我们没有第二次删除操作,此时有请求访问数据,有可能是访问的之前未做修改的redis数据,删除操作执行后,redis为空,有请求进来时,便会去访问数据库,此时数据库中的数据已是更新后的数据,保证了数据的一致性。

2,选择同步器(自己程序)

(1) OGG

        Oracle GoldenGate 是一款实时访问、基于日志变化捕捉数据,并且在异构平台之间迚行数据传输的产品。GoldenGate TDM是一种基于软件的数据复制方式,它从数据库的日志解析数据的变化(数据量只有日志的四分之一左右)。GoldenGate TDM将数据变化转化为自己的格式,直接通过TCP/IP网络传输,无需依赖于数据库自身的传递方式,而且可以通过高达10:1的压缩率对数据迚行压缩,可以大大降低带宽需求。在目标端,GoldenGate TDM可以通过交易重组,分批加载等技术手段大大加快数据投递的速度和效率,降低目标系统的资源占用,可以在亚秒级实现大量数据的复制,并且目标端数据库是活动的。

优点:牛逼

缺点:好像不开源;

(2) Canal

        canal是由Alibaba开源的一个基于binlog的增量日志组件,其核心原理是canal伪装成Mysql的slave,发送dump协议获取binlog,解析并存储起来给客户端消费。

优点:可以同步任何非查询类操作。DDL和DML语句(除了数据查询语句select)。增量+全量都可以

缺点:数据源只支持MySQL,因为利用了MySQL的binlog特性

项目地址:https://github.com/alibaba/canal

(3) otter

        otter是一款基于Java且免费、开源基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库的解决方案

优点:

  • 单向同步, mysql –> oracle互相同步
  • 双向同步,无冲突变更
  • 文件同步,本地/aranda文件
  • 双A同步,冲突检测&冲突补救
  • 数据迁移,中间表/行记录同步

缺点:同canal,因其是利用canal来进行同步的,canal作为其数据源组件

项目地址:https://github.com/alibaba/otter

(4) DataX

        DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。

优点:支持非常多数据库同步,原理是通过查询语句select同步的

缺点:不支持ddl同步

项目地址:https://github.com/alibaba/DataX

(5) kettle

        Kettle是一款国外开源的ETL工具,用java编写,可以在视窗、Linux和Unix上运行,数据抽取高效稳定,中文称水壶。这个项目的主要程序员MATT想把各种数据放进一个水壶,然后以指定的格式流出。它是一个ETL工具集,允许你管理来自不同数据库的数据,并通过提供一个图形用户环境来描述你想做什么,而不是你想怎么做。Kettle中有两个脚本文件,转换和作业。转换完成了数据的基本转换,而作业完成了对整个工作流的控制。

优点:功能强大,支持几乎所有数据库;

缺点: 需要用户自己一步步配置,学习成本高;通过查询语句select同步的;

项目地址:https://github.com/pentaho/pentaho-kettle

(6) FlinkX

        FlinkX是在是袋鼠云内部广泛使用的基于flink的分布式离线和实时的数据同步框架,实现了多种异构数据源之间高效的数据迁移。FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,比如MySQL,HDFS等,也可以采集实时变化的数据,比如MySQL binlog,Kafka等。

项目地址:https://github.com/DTStack/flinkx

缺点: 通过查询语句select同步的

(7) Porter

        Porter是一款随行付开源的数据同步中间件,主要用于解决同构/异构数据库之间的表级别数据同步问题。

项目地址:https://github.com/sxfad/porter

3,监听binlog


 

最后

以上就是会撒娇汽车为你收集整理的负载均衡相关问题的全部内容,希望文章能够帮你解决负载均衡相关问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部