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

  而本文的意义在于需求:由于大流量请求,导致服务无法正常响应,在不增加购买机器成本的场景下,如何提高服务器的业务处理能力?提示为:某个服务访问频率比其他服务的访问频率要高很多,服务是用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. 项目详解4—haproxy 反向代理负载均衡

    一.企业服务架构图及负载均衡的要求 1.场景说明 在企业生产环境中,每天会有很多的需求变更,比如增加服务器.新业务上线.url路由修改.域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首 ...

  2. 千万级高并发负载均衡软件HAproxy

    1负载均衡产品介绍 基于硬件的负载均衡设备例如F5,Big-IP,基于软件的负载均衡产品HAproxy,LVS,nginx在这些软件产品中,又分为基于操作系统的软负载实现和基于第三方应用的软负载实现. ...

  3. 实现基于Haproxy+Keepalived负载均衡高可用架构

    1.项目介绍: 上上期我们实现了keepalived主从高可用集群网站架构,随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务 ...

  4. Linux内核——进程管理之SMP负载均衡(基于版本4.x)

    <奔跑吧linux内核>3.3笔记,不足之处还望大家批评指正 根据实际物理属性,CPU域分类如图1所示. 图1 CPU域分类 问题一:一个4核处理器中的每个物理CPU拥有独立L1 cach ...

  5. 基于Apache的Tomcat负载均衡和集群(2)

    反向代理负载均衡 (Apache+JK+Tomcat) 使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的.这种代理方式 ...

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

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

  7. 原来,负载均衡可以这样用,多核CPU可以这样用

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

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

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

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

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

随机推荐

  1. PHP和Redis实现在高并发下的抢购及秒杀功能示例详解

    抢购.秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等. 抢购.秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一.高并发对数据库产生的压力二. ...

  2. virsh命令详解

    1.简介: virsh 有命令模式和交互模式如果直接在vrish后面添加参数是命令模式,如果直接写virsh,就会进入交互模式. 2.命令模式: virsh list    列出所有的虚拟机,虚拟机的 ...

  3. <转> plsql dev中Dynamic Performance Tables not accessible分析解决

    相信很多使用plsql dev的朋友多遇到过类此如下面的提示: Dynamic Performance Tables not accessible, Automatic Statistics Disa ...

  4. java 虚拟机栈

    与程序计数器一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同.虚拟机栈描述的是Java执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口 ...

  5. JS数组存储(两个数组相等,一个改变,另一个跟着改变)

    数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的实际的数组元素被存储在堆(heap)内存中:数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中. ...

  6. Fedora 25 安装 Bugzilla

    最近领导要我们装一个Bugzulla,虽然我们项目已经有了JIRA(我就呵呵),不过我还是找些资料安装了,在此备忘. Bugzilla 是一个开源的缺陷跟踪系统(Bug-Tracking System ...

  7. 通过启动函数定位main()函数

      如下,通过vc6.0编写一个hello world程序.尝试结合汇编代码.分析启动函数找到main函数.   在printf(xxx)插入断点,调试执行.如下,在堆栈窗口中可见main()下的一个 ...

  8. spring 自定义标签的实现

    在我们进行Spring 框架开发中,估计用到最多的就是bean 标签吧,其实在Spring中像<mvc/><context/>这类标签以及在dubbo配置的标签都是属于自定义的 ...

  9. MySQL表与表之间的关系详解

    外键 说到表与表之间的关系就不得不说到一个关键词:外键 MySQ中的外键是什么,和表与表之间有什么关联? 外键(foreign key)又叫外连接, 在数据库中发挥着重要的作用 尤其是对于表和表之间的 ...

  10. 全渠道java b2b b2c o2o平台

    大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台. 根据微服务化设计思想,结合spring cloud一 ...