阿里云常见问题分析与解答

  1. 云栖社区>
  2. 博客>
  3. 正文

阿里云常见问题分析与解答

技术小阿哥 2017-11-27 11:13:00 浏览883
展开阅读全文

1、网站纯静态页面和伪静态页面有何区别

纯静态,就是服务器上有个html文件,不需要任何处理,直接返回客户端
伪静态,从客户端上看,好像在请求一个文件,但是其实是服务器动态生成的
虽然看网址看不出来,但是明显一些内容是必须动态合成才能产生的就不可能是真的静态文件


2、php java 哪个更合适网站开发?

都适合,相比来说,java更适合企业开发;针对场景和应用的不同,选择语言也不同

如果是一般的中小企业网络应用,建议php开发(快就一个字)中小网站追求速度,可采用php

如果是大型应用,推荐java,java方便扩展和集成,易维护,代码简洁明了,适合大型web开发


3、弹性Web托管 和 云虚拟主机 有什么区别呢?

弹性 Web 托管是基于容器技术,就是 container 。云虚拟主机是虚拟机的技术,就是 hypervisor。

前者是 docker 这种 Linux 内核层面的虚拟化,后者是 xen 这种对硬件层面的虚拟化。

具体使用来说,弹性 Web 托管主要支持 php 站点,比如 WordPress;而云虚拟主机则更加灵活

性能上也是后者更加强大,当然前者的价格更具有优势。

选择哪个需要看具体的需求


4、高并发,大数据的java系统,采用应用服务器,数据库服务器,分布式?

高并发,大数据是一个笼统的概念,实际应用场景中要考虑是有多大的并发,读写压力有多大,磁盘IO有多大,根据具体的情况在系统架构上会有很多的不同。通用架构分层做法如下:

Requests --> load balancer --> Web Server Cluster --> Middlerware --> DB Cluster

根据具体的并发压力,需要有针对性的进行系统扩展。

load balancer层:
load balancer进行请求转发,根据具体的请求数量,需要考虑使用硬件或软件。通常情况下硬件load balancer性能远高于软件load balancer,软件实现中ngnix性能远高于Apache。当然硬件load balancer价格也会非常昂贵,需要专业维护。如F5, Redware.
考虑到页面数据是否可以缓存,需要增加CDN.如淘宝前端页面会直接从CDN读取,12306 80%的访问请求由CDN处理。
根据CDN的策略,带宽大小,并发量大小及业务重要程度,需要考虑多机房部署,减轻带宽和load balancer压力。

Web Server cluster
Web server可以使用开源的Tomcat, jBoss等,也可以使用商业的WebSphere, WebLogic。区别是开源需要自己创建、维护cluster状态,商业软件会极大的简化cluster创建和维护。
稳定,易于维护的Web Server应用服务器是基础,性能则有应用实现决定。
应用需要考虑的是线程并发,查询优化,缓存使用,通信代价。
应用完成后根据单台应用服务器的实际处理能力,横向和纵向扩展Web Server cluster. 
横向扩展:增加Web Server数量(提升能力理论上无上限)
纵向扩展:增加硬件机器性能,优化应用性能,提升单台Server性能(提升能力有限,受限于硬件资源)

Middlerware
当涉及到分布式环境,需要使用中间件来保证集群一致性。
Session中间件 :如果业务是无状态,可以直接在load balancer按照轮询或权重策略转发。无需session处理,性能会高很多。
如果业务有状态:1)load balancer使用sticky session策略,由同一台server进行后续有状态服务,session无需处理。但如果server失败,转由其他server服务时,需要重新登录。测试需要client有重新登录机制,否则用户体验不好。2)session复制。session复制需要由session中间件进行处理,保证整个集群共享session,会带来额外性能损耗。
消息中间件 :分布式系统之间进行数据同步和唤醒,多个业务系统同步,需要使用消息中间件进行时效性保证。
远程调用中间件: 远程调用保证分布式系统中高效的数据交换。
数据库中间件: 访问数据库层,如果数据库进行了分库分表操作,需要再数据库中间件中进行操作封装。
缓存中间件: 缓存数据库数据和业务计算数据。

DB Cluster
关系数据库
为保证数据库稳定性,会考虑创建主备数据库,多个主备数据构成数据库cluster,当主库出现失败时,自动进行主备切换。
有多个数据库的时候,根据读写频率进行读写分离。
数据量大的时候,进行分表操作。


5、每天帖子亿万阅读量该如何应对?比如页面加载等如何优化?

如果业务已经运行,也没有太大的问题,只是想优化,那么全流程每个地方都可以有很多方法优化:

1)浏览器:HTTP缓存
2)DNS解析:智能DNS + CDN
3)浏览器和服务器交互:HTTP长连接、SPDY、压缩
4)服务端负载均衡
5)服务器缓存:MC、Redis等
6)服务器Web加速:Varnish、Squid
7)服务器存储:分库分表等

如果业务运行有问题了,那么先明确问题瓶颈在哪里,不要每个环节都去优化,找准问题点后再集中资源解决


6、Spark热火朝天,Hadoop何去何从?

1 Hadoop主要针对map-reduce函数编程模型的程序,spark则比较灵活,提供多种transformation和action,可以表达更复杂的模型;
2 运行在Hadoop上的map-reducec程序,基本上自己管理自己的数据(来自HDFS或者http等文件系统的文件数据,来自关系型数据库或者NoSQL型数据库的数据),而Spark则是提供了RDD这种数据结构并把RDD当作分布式数据来对待;
3 Spark可以在程序中指定将特定的RDD缓存于内存还是磁盘,而Hadoop的cache机制并没有那么有效(?)至少理论上是这样;
4 Hadoop通常认为适合数据是key-value这种形式的,实际中个人感觉至少要是表格形式的,而且在一次job中表格的条目之间最好逻辑不相关;而Spark则可以处理逻辑结构更加复杂的数据(例如图特别是有向无环图);
5 个人感觉Hadoop可以当做分布式计算框架来使用,而Spark更像是一种数据过滤和统计计算工具。未必准确,只是个人的感觉;
6 编程语言方面,Hadoop除了Java(或者其他JVM语言)之外,理论上可以支持任何可以用stdin/stdout进行输入输出的编程语言(通过Hadoop Streaming);而Spark仅仅支持Java/Scala/Python/R这四种


7、mysql sql语句消耗内存问题

wKiom1kueQrTB_r4AAQEg82RM-U061.png-wh_50

看截图吧,我发的这段问题发不上来,提示我存在攻击行为,把我拦截了


首先,这种语句逻辑在MySQL服务端是不需要保存所有数据的,因为是按顺序扫描,可以认为耗费的内存核小。
至于客户端, mysql 客户端有一个--quick 参数,在你的这种业务需求中,应该使用这个参数。这样客户端在读取数据的时候,会一行行读一行行写到目标文件, 不需要将数据全部保存到内存里面


8、MYSQL提交数据后,等一会才能生效,是怎么回事呢?

有两个HTTP请求,一个请求结果(新增成功)已经返回了,然后再执行另一个请求(通过js控制),结果有时查到有时查不到有时又查到,查不到的时候过一会就能查到。就像:已经commit了,但是等一会才能执行成功一样;数据库客户端直接执行SQL插入数据也是要等一会才能查到
用的是 java+mysql+阿里云+tomcat


按照您的描述,比较大的可能是:
1) 两个http请求使用的不是同一个连接。
2) 而第一个提交动作其实并不是正的commit,而是只是插入成功。

我们经常有客户发现类似的问题,就是java connector会默认使用set autocommit=0的模式。
这样第一个线程执行成功后,其实并没有提交事务,
第二个线程去查的时候是查不到的。

这个是一种比较常见的可能。至于要确诊,您可以开启RDS的审计日志,从数据库的执行语句序列中印证原因


9、阿里云的redis和mongodb服务是否能加入到vpc中?

目前阿里云MongoDB、redis已支持vpc,你在控制台购买实例的时候就能选择将实例加入到某个vpc网络里(如果还没有专有网络,需要先创建)


10、阿里云ecs数据盘和系统盘的区别和用途分析

系统盘就像是Windows的C盘,而数据盘就相当于你windows下的D盘, 一个系统只能有一个系统盘,所以你无法再购买一个系统盘。
通常系统盘用来存放系统,如果你的网站数据不是很大的话你也可以把程序和数据库放在系统盘,如果网站数据大,就要购买并挂载数据盘。
也可以选择阿里云RDS数据库, 此时数据库不会占用你的系统盘或数据盘,而是存放在阿里云里面,这种情况下你就无需购买数据盘了。


11、阿里云的CDN是否支持https?

支持啦,搬运个文档给你:
HTTPS安全加速设置
https://help.aliyun.com/document_detail/cdn/getting-started/httpsdelivery.html?pos=1


12、rds mysql 历史的binlog日志怎么查看或下载?

在RDS控制台 备份恢复 日志列表 这里吧,下载binlog ,默认应该是保留最近7天的binlog日志


13、数据库数据转移比较麻烦,不知道有没有好的方法,现在是读写分离的?

如果数据有定时转移的需求,最好设计成按时间分表,这样删除的时候,可以用truncate或者drop的方式。
至于需要读走数据,有读写分离,应该问题不大?另外,如果可以多搭建一个备库,方案会灵活很多


14、用Docker集群管理三剑客在阿里云ECS上部署LNMP问题

比如,有两台阿里云ECS主机,打算用docker快速在两台机器上部署Lnmp环境,操作思路是:
1、第一步,首先在阿里云控制台把ECS主机买好(主机系统为centos7);
2、第二步,用xshell分别登录两台ECS主机,分别在两台主机上安装好docker集群管理三剑客(docker machine,docker compose,docker swarm),也就是要操作两次;
3、第三步,用docker-compose.yml把需要的东西定义好,然后在两台主机上分别执行
$docker-compose up命令,这样就完成了,同样,这需要操作两次。
问题是:
1、我感觉这不是最简便的方式,有更简便的方式吗?
2、docker集群管理的三个工具,貌似只用到了docker compose,其他两个都没用到。在这里其他两个工具ocker machine,docker swarm的使用场景是什么?
备注:本地操作系统是windows。


您可以使用阿里云容器服务快速创建一个Docker集群

它提供了Docker Swarm接口,支持任何Docker Compose和Docker镜像,

https://yq.aliyun.com/teams/11是我们的团队博客,上面有很多使用Docker技术和容器服务的用例分享


15、从零开始搭建容器云的技术选型

根据sina应用docker的经验来看,随着docker1.9新版本的出现 如果没有任何技术债的情况下,我们要从零开始搭建容器云的话,如何进行技术选择?
是使用openstack把docker当虚拟机来用呢还是直接docker-machine swarm compose来做呢?跨主机的网络这块有什么推荐,是否选择docker1.9中的network特性会优于SDN的一些方案


一般而言不要将Docker作为轻量级VM来使用,那样会丧失很多Docker交付和运维的优势。
OpenStack的docker nova driver并不是一个成功的样例,现在随着Docker自身网络、存储和编排技术的提升,应该选择更加原生的Docker技术方案来搭建容器云。

Docker Swarm, Kubernetes和Mesos都是可以选择的技术方向。

如果您在公有云上希望体验容器云技术,可以考虑阿里云容器服务 https://www.aliyun.com/product/containerservice

它提供了Docker Swarm兼容的方式来管理Docker集群,支持Docker Compose和Docker 镜像,简化了您搭建容器云的复杂性,也提供了很多特性简化web应用,微服务应用和DevOps.

https://yq.aliyun.com/teams/11 是我们的团队博客,您能看到很多实例和文档来帮助您使用容器服务


16、如何限制百度等蜘蛛的抓取频率?

发现有时候,百度抓取非常频繁,会导致服务器压力过大。如何限制他们的抓取频率?


nginx的ngx_http_limit_req_module模块限制了百度蜘蛛的抓取频率。每分钟允许百度蜘蛛抓取200次,多余的抓取请求返回503。
nginx的配置:

全局配置

limit_req_zone $anti_spider zone=anti_spider:60m rate=200r/m;

某个server中

limit_req zone=anti_spider burst=5 nodelay;
if ($http_user_agent ~* "baiduspider") {
set $anti_spider $http_user_agent;
}

参数说明:
指令limit_req_zone 中的rate=200r/m 表示每分钟只能处理200个请求。
指令limit_req 中的burst=5 表示最大并发为5。即同一时间只能同时处理5个请求。
指令limit_req 中的 nodelay 表示当已经达到burst值时,再来新请求时,直接返回503
IF部分用于判断是否是百度蜘蛛的user agent。如果是,就对变量$anti_spider赋值。这样就做到了只对百度蜘蛛进行限制了。


17、从PHP5迁移到PHP7扩展需要哪些改动?

PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容。有不少方法参数做了调整。下面是在迁移过程中遇到的一些问题。记录下来,避免大家再踩坑。

add_assoc_stringl

方法参数改为四个。
add_assoc_stringl(parray, key, value, value_len);
迁移的时候,只要把最后一个参数删除即可。

add_assoc_string

方法参数从四个改为了三个。
add_assoc_stringl(parray, key, value);
迁移的时候,只要把最后一个参数删除即可。

add_next_index_stringl

方法参数从四个改为了三个。
add_next_index_stringl(parray, value, value_len);
迁移的时候,只要把最后一个参数删除即可。

add_next_index_string

方法参数从三个改为了两个。
add_next_index_string(parray, value);
迁移的时候,只要把最后一个参数删除即可。

RETURN_STRINGL

方法参数从三个改为了二个。
RETURN_STRINGL(value, length);
迁移的时候,只要把最后一个参数删除即可。

错误:‘INT64_MAX’ 在此作用域中尚未声明

原因为深入研究。在 #include "php.h" 上面加上一行

wKiom1kufmSSsgB9AAAtgl-6etA673.png-wh_50

解决。

创建类

可以参考mysqli扩展mysqli.c文件中的 mysqli_objects_new 方法。

变量声明从堆上分配,改为栈上分配。

如,原先代码为

wKioL1kufprRT-HCAAANfTyeMB4392.png-wh_50

改为

wKioL1kufsizyoKVAAAJ4Gqr9EI287.png-wh_50

ps:由于提交,提示有违禁词,不得不删除了一部分。更多内容查看
PHP扩展迁移为兼容PHP7记录


18、Jenkins之类的持续集成工具dokcer化的问题

我们在做基于docker的Devops,会遇到希望把jenkins之类的持续集成工具dokcer化的问题,即:docker in docker.请问你们的解决方案是什么?另外还有个问题,docker与devops的结合,通常认为不只是技术层面上的事情,也是质量管理,组织方式等的变革,请问这方面能否分享你们的最佳实践?


Jenkins方面,可以看看我们的这篇文章 https://yq.aliyun.com/articles/53971


传统的持续集成分发的最小单元是代码,基于容器的持续集成分发的最小单元是镜像,这可能是最大的区别,但是这并不是说一刀就将传统的开发模型与基于容器的开发模型切开,我们以前的流程可能是构建、测试、部署、验证、上线,基于容器后,这些步骤还是相同的,唯一的区别是实现的方式不同。关于docker in docker我理解是您希望通过jenkins的slave构建镜像,而您的slave也是基于容器的,这个问题的解法是这样的,docker in docker没问题,但是里面的docker和外边的docker是父子关系还是兄弟关系有很大的部分,我们建议的方式是您可以通过volume挂载的方式,用/var/run/docker.sock:/var/run/docker.sock这种方式,使内部的docker成为外部的docker的一个兄弟节点。关于最佳实践,其实最佳实践是特定场景下的最优解决方案,上面太公提供的那篇文章是剥离的最小化的一个场景,您可以基于这个场景丰富并满足自己的需求


19、docker 集群化 给推荐一个解决方案!

首先推荐阿里云容器服务 https://www.aliyun.com/product/containerservice/ 兼容swarm api,整合了负载均衡、日志、监控、存储等功能。

如果是自己搭建集群,可以使用swarm或者kubernetes,docker 1.12支持原生编排,也可以考虑


20、阿里云的ecs对docker支持怎么样?

阿里云的ecs对docker支持怎么样,我在本地build一个dockerfile没有任何问题
在ecs上build的时候导致cpu100%,无法访问,只能重启


阿里云ECS对Docker支持没有问题,阿里云容器服务可以创建基于ECS实例的Docker集群,已经很多用户在阿里云上利用Docker来交付和运维应用。

由于ECS镜像缺省路由配置和Docker default bridge的配置有冲突,一些初学者会遇到一些困扰。在阿里云上除了手工安装配置Docker和利用容器服务之外,还可以利用docker-machine的ECS驱动 ,轻松创建ECS上Docker环境。 https://help.aliyun.com/document_detail/26088.html

在ECS上build时候CPU飙高的现象可能要具体情况具体分析,这件事和Dockerfile编写以及Docker的配置可能都有关系。可以进一步具体讨论。


本文转自 2012hjtwyf 51CTO博客,原文链接:http://blog.51cto.com/hujiangtao/1934825,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小阿哥
+ 关注