怀着忐忑的心情等待着等待着,终于等来了腾讯一面,结果凉凉,但素,觉得自己成长得很快(相比第一次来说),第二次能有这样的进步自己还是非常开心。所以,怀着开心又难过的心情写下此篇总结,算是菜鸟的成长历程吧。听说一边面试一边总结的同学进步更快哟~
2018.4.15一面腾讯业务运维实习生,面试官和蔼亲切带着一点小严肃(但我还是觉得阿里的小哥哥更加温柔一些嘿嘿,没有啦其实都很温柔很耐心的嘿嘿),主要还是围绕简历发问,途中有适度扩展
Q1:自我介绍一下吧?
A1:老师好,我是就读于**大学的**专业大三学生,今天来面试**岗位......(之后估计是时间紧迫,所以直接进入正题开始说项目)
进入第一个项目
Q2:那说说你的第一个项目吧?
A2:好的,我的第一个项目是nginx+varnish实现CDN加速。我们都知道主流的搭建CDN的方案一般是三种,squid、varnish、nginx+memcache。但是没有人用过nginx+varnish,所以提出这个创新性的想法。
大致过程:
一般用户发出http请求的时候是直接去访问nginx的,但是加入了varnish之后,就会先访问varnish,然后varnish通过反向代理访问web站点。通过varnish的时候会出现两种情况,命中缓存和未命中缓存。如果命中缓存,直接将结果返回给客户端。如果未命中缓存,接着访问后端nginx,nginx通过它的负载均衡机制将请求分摊给后端,再将结果返回给varnish,varnish又反馈结果给客户端,并且在经过varnish的时候利用内存缓存机制会将信息在本地缓存下来,存在memcache中,下次再访问就可以直接访问。
CDN的工作原理是将源站内容分发到距离用户最接近的节点,是用户可以就近选取所需的内容。
通过在网络各处放置节点服务器,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度和访问成功率。比如说我人在西安,我要访问的服务器在北京,就可以把北京服务器上的数据复制到西安的服务器上啊。那为什么人在西安就一定是复制到西安,而不是复制到南京去,因为有DNS解析。我们知道一个做简单的CDN网络包括两个核心,就是DNS和缓存。
Q3:CDN的全称是什么?用来解决什么问题?怎么解决这些问题的?
A3:CDN全称是内容分发网络(Content Delivery Network ),使用CDN是为了避开互联网上有可能影响数据传输速度和稳定性的瓶颈,使内容传输更快更稳定。应对某一段时间用户访问数量激增,解决访问路径过长的问题。google不是做过一项调查嘛,如果一个网站慢一秒,就会失去许多访客,而且这些访客以后都不会再访问这个网站,所以访问速度的快慢对一个网站来说真的是个致命打击
我们都知道哪怕一个最简单的CDN网络都是由一个DNS服务器+几个缓存服务器组成
1.当用户点击网站页面的内容URL,首先是经过本地的DNS系统解析,然后DNS系统将域名交给CDN专用的DNS服务器
2.CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回给用户
3.用户向CDN的全局负载均衡设备发起URL访问请求
4.CDN全局负载均衡设备根据用户的IP地址以及用户请求的内容URL选择一台用户所属区域的负载均衡设备,告诉用户向这台设备发起请求
5.区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务
选择的依据:根据用户IP地址,判断哪一台服务器距用户最近;
根据用户请求的URL中携带的内容名称,判断哪台服务器上有用户所需的内容;
查询各个服务器上当前的负载情况,判断哪一台服务器尚有能力提供服务
基于以上综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址
6.全局负载均衡设备把服务器的IP地址返回给用户
7.用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需的内容传送到用户终端。如果这台服务器上没有用户想要的内容,而区域均衡设备任然将他分配给了用户,那么这台服务器就向上一级缓存服务器请求内容,直到找到网站的源服务器将内容拉倒本地
CDN的工作原理就是这样
Q4:为什么要使CDN加速呢?怎么想到的?
A4:CDN加速这个功能还是很值得实现的,如果经营一家网站,这个网站在复杂的网络环境下运行,系统逐渐变得庞大,如果系统变慢肯定会造成用户流失,用户体验就不好。本身的CDN的负载均衡还有分布式存储技术,也可以增强网站的可靠性。
Q5:除了varnish,还听说过哪些可以用来做缓存的?
A5:除了varnish,还听说过ATS(traffic server)、HAProxy,看过他们和squid、nginx的一个对比
进入第二个项目
Q6:介绍一下第二个项目?
A6:在传统的应用运行环境中,收集、分析日志是非常必要且常见的工作,一旦应用出现问题或者需要分析分析应用行为时,会通过一些传统的工具对日志进行检查,比如cat、tail、sed、awk,但这些做法仅限于少量主机和日志
对于日志来说,无非就是收集、查询、显示,正好对应了logstash、elasticsearch、kibana的功能,所以搭建了日志分析平台,除了查看日志,该平台也可以通过代理对不同服务器的日志流进行管理。
logstash在各个应用中设置一个shipper节点用来收集并转化为统一格式的日志数据,然后将其转入Message Broker(redis),然后日志中心的indexer节点(logstash)负责从Broker中读取日志流,并转存至ElasticSearch中建立索引,以便日后快速查找、搜索、分析,最后由kibana从ElasticSearch中读取数据,支持各种查询、展示
注意事项:kibana:为了让kibana能够以服务形式运行,需要配置Systemd文件
Logstash: Logstash主要三个功能:事件输入input、事件数据过滤filter、事件输出output
中心节点:负责将Broker中的数据流转化到ElasticSearch中,创建一个配置文件,创建完成后往redis中push一条数据测试,通过kibana查看
shipper节点:将各类日志收集起来并发送给redis
第二个项目也不知为何,并没有多做提问(也许面试官不感兴趣吧),就进入了技能的考察
Q9:如果在一个浏览器输入https://www.qq.com到访问到页面,这个过程中用到哪几个协议?
A9:网上标识资源位置的三种方式
URL:https://www.qq.com
域名:qq.com
IP:一串数字
URL:类似于DOS中的目录,传输协议相当于驱动符号;www.qq.com是站点名类似于根目录;index.html是文件名
传输协议://主机IP或主机域名/资源所在路径和文件名
执行过程:
1.客户端浏览器通过DNS解析到www.qq.com的IP地址,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到IP地址,然后通过TCP进行封装数据包,输入到网络层。
2.在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3.客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,无非就是通过查找路由表决定通过那个路径到达服务器。
4.客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。
(8) 浏览器将首页文件进行解析,并将Web页显示给用户
涉及到的协议:
(1) 应用层:HTTP(WWW访问协议),DNS(域名解析服务)
DNS解析域名为目的IP,通过IP找到服务器路径,客户端向服务器发起HTTP会话,然后通过运输层TCP协议封装数据包,在TCP协议基础上进行传输
(2) 传输层:TCP(为HTTP提供可靠的数据传输),UDP(DNS使用UDP传输)
HTTP会话会被分成报文段,添加源、目的端口;TCP协议进行主要工作
(3)网络层:IP(IP数据数据包传输和路由选择),ICMP(提供网络传输过程中的差错检测),ARP(将本机的默认网关IP地址映射成物理MAC地址)
为数据包选择路由,IP协议进行主要工作,相邻结点的可靠传输,ARP协议将IP地址转成MAC地址。
Q10:DNS是干嘛的?运行在哪里?
A10:运行在UDP,53端口(附解析过程)
Q11:TCP和UDP的区别是什么?
A11:TCP(传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,只简单的描述下这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
TCP建立连接要进行3次握手,而断开连接要进行4次
1 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求
2 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
3 由B 端再提出反方向的关闭请求,将FIN置1
4 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束.
由TCP的三次握手和四次断开可以看出,TCP使用面向连接的通信方式,大大提高了数据通信的可靠性,使发送数据端和接收端在数据正式传输前就有了交互,为数据正式传输打下了可靠的基础
UDP(用户数据报协议)
(1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
小结TCP与UDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
Q:TCP/IP与TCP、UDP的区别?
A:TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了。
TCP/IP协议集包括应用层,传输层,网络层,网络访问层。
其中应用层包括:
超文本传输协议(HTTP):万维网的基本协议.
文件传输(TFTP简单文件传输协议): 远程登录(Telnet),提供远程访问其它主机功能,它允许用户登录 internet主机,并在这台主机上执行命令.
网络管理(SNMP简单网络管理协议),该协议提供了监控网络设备的方法,以及配置管理,统计信息收集,性能管理及安全管理等.
域名系统(DNS),该系统用于在internet中将域名及其公共广播的网络节点转换成IP地址.
其次网络层包括:
Internet协议(IP)
Internet控制信息协议(ICMP)
地址解析协议(ARP)
反向地址解析协议(RARP)
最后说网络访问层:网络访问层又称作主机到网络层(host-to-network).网络访问层的功能包括IP地址与物理地址硬件的映射,以及将IP封装成帧.基于不同硬件类型的网络接口,网络访问层定义了和物理介质的连接
Q12:LNMP的全称是什么?为什么是采用这几个组合?为什么要用PHP语言呢?
A12:LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。
Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、gentoo等
Nginx是一个高性能的HTTP和反向代理服务器
Mysql是一个小型关系型数据库管理系统
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言
这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统
为什么用PHP?
PHP 的加速可使用 eAccelerator 加速器,eAccelerator 是一个自由开放源码的 PHP 加速器。它会优化动态内容缓存,提高 PHP 脚本缓存性能,使 PHP 脚本在编译状态下,对服务器的开销几乎完全消除。它还可对脚本起优化作用,以加快其执行效率。 使 PHP 程序代码执效率可提高 1-10 倍。
也可以是Python、Perl
Q13:介绍一下LVS?工作原理是怎样的?
A13:LVS Linux虚拟服务器集群系统,当前互联网大多都会使用的服务器集群技术。所谓集群技术就是将相同的服务部署在多台服务器上构成一个集群整体对外提供服务(集群可以是web集群,也可以是数据库集群等等),当一头牛拉不动车的时候,不是去再找一头更强壮的牛,而是用两头牛。
提到集群就不得不提负载均衡,负载均衡可以采用硬件负载,也可以采用软件负载,硬件设备通常成本较高。软件负载最出名的就是LVS,高性能、高可用的服务器集群技术。把多个低性能的服务器组合在一起形成一个超级服务器,且稳定可靠,扩展性强
LVS的体系架构分三个部分:最前端的负载均衡层(Load Balancer) 中间的服务器集群层(Server Array) 最底端的数据共享存储层(Shared Storage)
负载均衡层:整个集群的最前端,有一台或多台负载调度器,LVS模块就安装在Director Server上,Director Server是一个类似于路由器的东西,含有完成LVS功能所设定的路由表,通过这些路由表把用户请求分发给服务器集群层的应用服务器(Real Server),Director Server上还安装有对Real Server服务的监控模块Ldirector,用于检测各个Real Server的健康状况,不可用时提出,恢复时重新加入
服务器集群层:一组实际运行应用服务的机器,可以是web服务器,DNS服务器都可以,每个Real Server之间通过高速的LAN连接
数据共享存储层:为所有的Real Server提供共享存储空间和内容一致性的存储区域,通过NFS网络文件系统共享数据
负载均衡技术有很多实现方案,在众多的调度算法中,执行率最高的是IP负载均衡
LVS的IP负载均衡是通过IPVS来实现的,IPVS模块安装在Director Server上,Director Server会虚拟出一个IP,也就是VIP,用户会通过这个VIP来访问。访问受限经过VIP到达负载调度器,然后负载调度器从Real Server中选取一个服务节点响应用户的请求
当用户的访问到达请求到达负载均衡调度器后,调度器如何将请求发送到提供服务的Real Server,而Real server又是如何返回数据给用户呢,这是IPVS实现的重点技术,也就是负载均衡的两个关键点“选谁”和“转发”
关于“转发”的方法,IPVS有三种负载均衡机制
1.NAT模式,网络地址翻译技术,当用户请求到达调度器时,调度器将请求报文的目标地址(VIP)改写成选定的Real Server地址,同时报文的目标端口也改写成选定的Real Server的相应端口,最后将报文请求发送给选定的Real Server。服务器端在得到数据后,Real Server要返回数据给用户,再次经过负载调度器时,将报文的源地址和源端口修改成VIP的,再发送给用户(本质上是一个修改IP的过程)在这个方法下,用户的请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力会出现瓶颈
2.DR模式,直接路由技术,DR模式通过改写请求报文的MAC地址来转发报文,将请求发送给Real Server,而Real Server将响应直接返回给用户(本质上是修改MAC地址)但这个方法有个限制是Dirrector Server与Real Server都有一块网卡连在同一个物理网段上
3.TUN模式,IP隧道技术,当用户请求到达调度器,调度器采用IP隧道技术将用户请求转发到某个Real Server上,而这个Real Server也将直接响应用户请求,不再经过前端的负载调度器。此种方法的调度器只用处理请求报文就好,集群系统的吞吐量大大提高,对Rreal Server的地域位置没有要求
负载调度器是根据各个服务器的负载情况,动态地选择一台Real Server来响应用户请求。动态选择是如何实现的呢?就是依靠负载调度算法,IPVS有8种负载调度算法,常用的有4种
1.轮叫,将用户请求按顺序1:1分配到集群每一个Real Server上,平等的对待每一台Real Server,不管服务器上实际的负载状况和连接状态
2.加权轮叫,根据Real Server的不同处理能力来调度访问请求,对每台Real Server设置不同的调度权值,对于性能较好的Real Server可以设置较高的权值,对于处理能力较弱的设置较低的权值
3.最少连接,动态地将网络请求调度到已建立的连接数最少的服务器上
4.加权最少连接,每个服务节点用相应的权值表示其处理能力,系统管理员可以动态地设置相应权值,使服务接点已建立的连接数和权值成正比
关于“选谁”,这是健康检查问题,用keepalived实现
编写脚本实现对Real Server的VIP配置,对主备调度器源码安装并配置keepalived和LVS
LVS的高可用体现在负载均衡及故障切换,当master端keepalived服务关闭,备机backup接管,在浏览器访问http页面可实现页面在两个Real Server上切换
遇到的问题:session共享和会话保持
关闭一台Real Serverde的httpd服务,keepalived监控模块没能及时发现
解决办法:用memcache解决sesssion
用基于源IP的持续性保持(nginx的ip_hash算法)就解决会话保持
在配置文件健康检查TCP_CHECK忘了写,加上就好
(中间我插了句现在的企业用lvs好像不多了,然后老师问那用什么比较多?)
Q14:LVS和nginx对比分别有什么优缺点?
A14:Nginx和LVS都是使用很广泛的负载均衡软件,负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析,如果是中小型的Web应用,用Nginx就完全可以,大型网站或重要的服务,且服务器比较多时,可以考虑用LVS。
Nginx的优点是:
1. 工作在网络的7层之上,可以针对http应用做一些分流的策略,Nginx单凭这点可利用的场合就远多于LVS了
2. Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大
3. Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大
4. 可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些
5. Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满
6. Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好
7. Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器
8. Nginx可作为中层反向代理使用
9. Nginx也可作为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区非常活跃,第三方模块也很多
Nginx的缺点是:
1.Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点
2.对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决
LVS的优点是:
1. 抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
2. 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
3. 工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如LVS+Keepalived
4. 无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会受到大流量的影响。
5. 应用范围比较广,因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、在线聊天室等等。
LVS的缺点是:
1. 软件本身不支持正则表达式处理,不能做动静分离;
2. 如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,特别后面有 Windows Server的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。
Q15:LVS有几种工作模式?有什么不同?分别的应用场景是什么?
A15:关于“转发”的方法,IPVS有三种负载均衡机制
1.NAT模式,网络地址翻译技术,当用户请求到达调度器时,调度器将请求报文的目标地址(VIP)改写成选定的Real Server地址,同时报文的目标端口也改写成选定的Real Server的相应端口,最后将报文请求发送给选定的Real Server。服务器端在得到数据后,Real Server要返回数据给用户,再次经过负载调度器时,将报文的源地址和源端口修改成VIP的,再发送给用户(本质上是一个修改IP的过程)在这个方法下,用户的请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力会出现瓶颈
2.DR模式,直接路由技术,DR模式通过改写请求报文的MAC地址来转发报文,将请求发送给Real Server,而Real Server将响应直接返回给用户(本质上是修改MAC地址)但这个方法有个限制是Dirrector Server与Real Server都有一块网卡连在同一个物理网段上
3.TUN模式,IP隧道技术,当用户请求到达调度器,调度器采用IP隧道技术将用户请求转发到某个Real Server上,而这个Real Server也将直接响应用户请求,不再经过前端的负载调度器。此种方法的调度器只用处理请求报文就好,集群系统的吞吐量大大提高,对Rreal Server的地域位置没有要求
Q16:MySQL主从复制的过程是什么?
A16:MySQL的主从复制涉及到两个库和三个线程
从库生成的I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志)文件中;
主库生成的log dump线程,用来给从库的I/O线程传binlog;
从库生成的SQL线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致
主从复制的作用是为读写分离作铺垫,提升性能
复制过程中遇到的问题:复制延迟。
影响复制速度的两个问题是I/O瓶颈和单线程复制
单线程复制——使用并发复制 I/O瓶颈——SSD
具体问题:在主从同步过程中一直出现server-id重复,导致主从复制无法实现
解决办法:修改多个从库的server-id,也有可能是网络延迟导致的复制延迟,可以把slave_net_timeout参数设置小一点
Q17:Binglog是什么?有什么作用?
A17:Mysql的binlog日志作用是用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录(对数据库的改动)
对数据库的查询select或show等不会被binlog日志记录;主要用于数据库的主从复制以及增量恢复。
Q18:写一个X的n次方的小程序?