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

  而本文的意义在于需求:由于大流量请求,导致服务无法正常响应,在不增加购买机器成本的场景下,如何提高服务器的业务处理能力?提示为:某个服务访问频率比其他服务的访问频率要高很多,服务是用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. xtrabackup备份还原MySQL数据库

    mysqldump 备份鉴于其自身的某些特性(锁表,本质上备份出来insert脚本或者文本,不支持差异备份),不太适合对实时性要求比较高的情况Xtrabackup可以解决mysqldump存在的上述的 ...

  2. MySQL中基于mysqldump和二进制日志log-bin进行逻辑备份以及基于时间点的还原

    本文出处:http://www.cnblogs.com/wy123/p/6956464.html 本文仅模拟使用mysqldump和log-bin二进制日志进行简单测试,仅作为个人学习笔记,可能离实际 ...

  3. CSS 盒子投影

    box-shadow 属性可以设置盒子的投影效果.它的原理同文本投影一样.字体风格一节有介绍. 它有4个值,同时使用,也可以有选择地使用: 第一个值 设置阴影左右延伸长度,负值向左,正值向右 第二个值 ...

  4. 判断URL是否能被链接

    判断url是否能被正确链接 function checkUrl(url, name) { $.ajax({ url: url, type: "get", dataType : 'j ...

  5. 中间件RabbitMQ之运维篇

    一.RabbtMQ简介        RabbitMQ的官方站: http:/://www.rabbitmq.com/        rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业 ...

  6. 解决win10电脑VB虚拟机无法安装64位系统的方法

    64位电脑在VB虚拟机里却只能安装32位系统怎么办? **原因:CPU虚拟化未开启 只要CPU虚拟化开启即可解决问题. 开启步骤: 1.打开电脑设置 2.进入 更新和安全 界面 3.进入 恢复 界面 ...

  7. python3 urllib.parse 常用函数

    1.获取url参数 urlparse from urllib import parse url = "https://docs.python.org/3.5/library/urllib.p ...

  8. 450. Delete Node in a BST 删除bst中的一个节点

    [抄题]: Given a root node reference of a BST and a key, delete the node with the given key in the BST. ...

  9. react项目的ant-design-mobile的使用

    现在测试一下ant-design-mobile的使用,引用一个Button 没有样式 这个问题是没有引入样式 解决方法有两种 这种方法自己弄不出来,然后用另外一种方法 引入样式: import 'an ...

  10. Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/jms/JMSContext

    参考链接 : https://blog.csdn.net/angus_Lucky/article/details/82811946?utm_source=blogxgwz7 org.springfra ...