负载均衡作为一个处理高并发,大流量的访问的业务场景,已经几乎是常识性的知识了。

  而本文的意义在于需求:由于大流量请求,导致服务无法正常响应,在不增加购买机器成本的场景下,如何提高服务器的业务处理能力?提示为:某个服务访问频率比其他服务的访问频率要高很多,服务是用JAVA语言编写的。

  一般情况下,我们有两种可供选择的负载均衡方式,一是买别人的服务,别人给你提供好,你只需界面上操作下就行了;二是自己搭建负载均衡服务。当然了,这个层面的分类是会被喷的。咱们说点先靠谱的。

  负载均衡分为软件负载均衡和硬件负载均衡; 百度百科解释如下: 软件负载均衡解决方案是指在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。  硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。

  说得再多,其实也就是用后面许多机器支撑起前端的大流量请求。也就是说,在这种场景下,只要你足够有钱,哪怕你一台机器只能处理1、2个并发,那么你通过购买足够多的机器,也是可以应对大流量问题的。 

  回到本文的出发点,怎样在不增加后端机器的情况下,提高业务处理能力呢?两个解决方向:

1. 某个服务访问量远高于其他服务,那么,我就让这个高访问的服务能够访问到比普通服务更多的机器,这样就可以分配更多资源给该服务了。

2. 利用多核CPU,让每台机器能够提供N个服务出来,这样就变相增加了机器的数量,也不至于购买新机器。

3. 组合1&2,更好提供服务。

  要想让某服务能够拥有更多的服务器资源,这就涉及到了负载均衡的权重问题和路由问题了。如下为Nginx的配置示例:

server {
listen ;
server_name admin..com; location /func1 {
proxy_pass http://k1;
proxy_set_header Host $host; #域名转发
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr; #IP转发
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout ;
proxy_read_timeout ;
proxy_send_timeout ;
} location /func2 {
proxy_pass http://k2;
proxy_set_header Host $host; #域名转发
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr; #IP转发
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout ;
proxy_read_timeout ;
proxy_send_timeout ;
}
} #nginx 负载均衡配置权重,解决访问概率问题,fun1配置3台机器,fun2配置1台机器
upstream k1{
server 10.136.82.92: weight=;
server 10.136.82.93: weight=;
server 10.136.82.94: weight=;
} upstream k2{
server 10.136.82.93: weight=;
}

  OK,分配概率问题处理了,咱们来看看怎样在一台机器上提供出更多的服务出来。

  就如本文标题据说,多核CPU,是目前的服务器绝对配置,目前可以说单核的机器已经找不到了吧。那么,怎样利用这个资源呢? Java其实是可以自动利用多核资源的,那就是通过多线程去处理业务,这时代码运行就会被随机分配到其他核心处理器去处理了。但是对于不利用多线程编程的情况,多核的资源可能就被浪费了。  那么,怎样直接利用多核资源呢? 当然就是在每个核心上面启动一个新服务咯。

  在每个核心上启动一个服务如Tomcat,方式有多种,如:

1. 复制项目到代码,更改端口,如server -> server1 -> server2,直接指定核心启动

taskset -c  ./tomcat7 start       #直接指定核心启动,当然了,这样是无法利用到多核的
taskset -pc #为进程单独指定核心运行,如为8081->,-> ...

2. 使用docker容器,在一台机器上创建N个docker容器,然后将war/jar的项目代码安装其中,然后向外部暴露一个商品映射到docker内部的8080端口即可。

docker run -it  -d -p 40: con_server1 /bin/bash   # 创建一个容器,端口映射
docker start con_server1 # 启动容器
docker exec -it con_server1 # 进入容器1

  运行好多个实例后,再通过负载均衡分配权重即可。

  至此,多核利用完毕。针对实际应用中,可能不会这么麻烦的去操作,但是也算是一种思路吧,还有就是硬件负载均衡的配置应该会更简单些吧,毕竟是花了钱的。如下是A10负载均衡器的介绍图,就当是位符吧。

  目前很多实际问题,都不能只从代码层面去考虑了,但是我们能做的,还是把代码写好一点,然后去了解下服务器的大环境。

  这样吹牛会不会好点,哈哈哈。。。

原来,负载均衡可以这样用,多核CPU可以这样用的更多相关文章

  1. Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡

    转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...

  2. 记录一个多核CPU负载不均衡问题(动态绑定进程到指定cpu:taskset -pc $CPU $PID)

    昨晚和一位读者朋友讨论了一个问题:在一台多核 CPU 的 Web 服务器上,存在负载不均衡问题,其中 CPU0 的负载明显高于其它 CPUx,进一步调查表明 PHP-FPM 的嫌疑很大.话说以前我曾经 ...

  3. 多核CPU配合负载均衡可以这样用,为老板省点钱

    负载均衡作为一个处理高并发,大流量的访问的业务场景,已经几乎是常识性的知识了. 而本文的意义在于需求:由于大流量请求,导致服务无法正常响应,在不增加购买机器成本的场景下,如何提高服务器的业务处理能力? ...

  4. LINUX内核CPU负载均衡机制【转】

    转自:http://oenhan.com/cpu-load-balance 还是神奇的进程调度问题引发的,参看Linux进程组调度机制分析,组调度机制是看清楚了,发现在重启过程中,很多内核调用栈阻塞在 ...

  5. linux多核cpu下的负载查看

    linux下使用top命令或uptime命令 单核cpu下,负载超过0.7即意味着瓶颈,多核cpu下按核数*0.7计算负载 如2核,1.4可能即意味着负载较吃力了 查看核数 grep 'model n ...

  6. 多事之秋-最近在阿里云上遇到的问题:负载均衡失灵、服务器 CPU 100%、被 DDoS 攻击

    昨天 22:00~22:30 左右与 23:30~00:30 左右,有1台服役多年的阿里云负载均衡突然失灵,造成通过这台负载均衡访问博客站点的用户遭遇 502, 503, 504 ,由此给您带来麻烦, ...

  7. nginx+ISS 负载均衡 快速入门

    第一:下载 http://pan.baidu.com/s/1dDwapbF 或者官网 http://nginx.org/en/download.html 启动服务: 直接运行nginx.exe,缺点控 ...

  8. paip.提升性能--多核cpu中的java/.net/php/c++编程

    paip.提升性能--多核cpu中的java/.net/php/c++编程 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http ...

  9. 烂泥:高负载均衡学习haproxy之安装与配置

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 有关高负载均衡的软件,目前使用比较多的是haproxy.nginx和lvs.下面我们就开始学习haprxoy这款软件. 一.haproxy介绍 以下开始介 ...

随机推荐

  1. jsPlumb之流程图项目总结及实例

    在使用jsPlumb过程中,所遇到的问题,以及解决方案,文中引用了<数据结构与算法JavaScript描述>的相关图片和一部分代码.截图是有点多,有时比较懒,没有太多的时间去详细的编辑. ...

  2. updateByPrimaryKey和updateByPrimaryKeySelective insert和insertSelective

    这两个update都是使用generator生成的mapper.xml文件中,对dao层的更新操作 updateByPrimaryKey对你注入的字段全部更新(不判断是否为Null) updateBy ...

  3. 面向对象15.2String类-构造函数

    public class String_Constructor { //快捷键小方法: Ctrl+d,删除整行,选中几行删除几行 public static void main(String[] ar ...

  4. Java创建连接池连接不同数据库

    在一个应用里面,可能涉及到连接多个不同数据库进行操作,而每次连接写不同的实现会很麻烦.前面已经会了用JDBC连接数据库,那么利用反射和工厂模式,可以实现连接不同的数据库,这样处理起来将会很方便.同时建 ...

  5. [bzoj 1468][poj 1741]Tree [点分治]

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  6. input复选框操作的部分高频率使用代码

    1. 获取单个checkbox选中项(三种写法): $("input:checkbox:checked").val() 或者 $("input:[type='checkb ...

  7. jmeter 接口重放(投票活动)

    目的 这几天公司弄了个投票的活动,召集大家一起投票.自己比较懒,就想这个投票是不是可以直接抓包进行重放通过jmeter集成到jenkins里面去每天来跑.试了下成功了,这里把对应的方案抛出来. 第一步 ...

  8. Jmeter编写Base64加密函数

    方法一: 使用Beanshell Sampler.BSF Sampler等实现,现已Base64加密为例,脚本如下: import sun.misc.BASE64Decoder; String res ...

  9. XRouter-像Retrofit一样使用阿里开源路由中间件

    XRouter 一种基于Arouter的使用封装方案,实现对ARouter的Retrofit式使用. ARouter是阿里巴巴开源的Android平台中对页面.服务提供路由功能的中间件,没用过的务必点 ...

  10. Fiddler基础使用一之捕获https请求

    fiddler抓包工具: http协议cookieFiddler是一个调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出"Fiddle ...