写在前面:Nginx和Tomcat/Jboss的区别
首先说一下Tomcat和Jboss的区别:Tomcat是一个Apache开源的Java Web(Servlet容器)应用服务器;Jboss基于Tomcat内核,青胜于蓝,在很多方面性能优于Tomcat:JBoss Web在活动连接支持、静态内容、大文件和HTTPS方面更优,不仅仅支持JAVA,还支持PHP,.NET等
Nginx是一个Web Server,不仅仅支持HTTP的请求协议,多数用来静态内容(HTML文件,图片文件等)服务和代理服务器,点击查看官方文档
- Nginx实现反向代理
- Nginx实现负载均衡
- Nginx实现虚拟主机
- Nginx实现动静分离
- Nginx实现HTTP缓存
- Nginx实现数据压缩,跨域访问
HTTP的超级基础知识
- IPV4协议 (0 ~255).(0 ~255).(0 ~255).(0 ~255):(0 ~2^16-1)
- HTTP默认端口号80,HTTPS默认的端口号443,默认端口号一般会省略,例如访问:https://www.baidu.com/相当于https://www.baidu.com:443/
杂记
-
1.Kafka和RabbitMQ的区别,项目中如何去选择?
首先对于消息队列的理解,使用消息队列解耦业务的生成和消费,常用就是消息队列/发布/订阅,当然消息队列还提供了消息的容错处理,例如一个消息被一个消费者消费失败了,会重新放入队列被其他消费者继续消费。
在发布/订阅模式当中,一个消息可以被多个消费者消费,在RabbitMQ当中主题被当做发布/订阅模式的实现,更准确说是exchange,每个订阅了交换机的消费者都会为它创建一个队列,然后消息交换机会把对应订阅了生产者的消息分发到对应的队列里面,当然还有由多个消费者组成的消费组,然后订阅某个topic,对应的队列会随机竞争消费这个队列里面的消息。另外每个队列,都分为master和mirror,镜像队列只做备份,读写都在master,如果访问是mirror则把请求路由过去master,这个是RabbitMQ吞吐量的瓶颈。
kafka不是消息中间件的一种实现,相反它是分布式流式系统,kafka没有实现队列,相应的kafka按照相应的类型存储记录集,并把这种类别称为主题topic,kafka为每个主题维护一个分区日志,并且这个分区是有序不可变的,由消息追加到尾部,分区可以分布在多个节点上,每个节点上的分区叫做分片,;然后消费者维护自己的分区偏移,从而顺序的读出消息;只负责读,消息内容一直保存在kafka的分区日志当中,当然也可以配置保存时间,则只会保存这段时间的消息,超过时间的就会从磁盘删除,一个队列也就是分区日志可以有多个节点,也就是分片,默认情况下Kafka使用轮询分区器:把所有分片放进环形List进行轮询进行消息的分片,每个主分片也会有相应的副分片做备份,同步机制类似RabbitMQ,每个分区同一时刻只能被一个消费者消费,消息是否被消费过,通过一个offset来维护,kafka是一个高吞吐量的流式系统。 -
2.TCP流和UDP数据报之间的区别,TCP为什么叫数据流?
TCP本身就是面向连接的协议,数据通信之前需要先建立连接,释放连接还需要四次挥手,数据就在这个连接上流动是双向的,没有边界所以是流,占用系统资源比较多。
UDP不是面向连接的协议,不需要先建立连接,也不存在连接的释放四次挥手,数据报彼此独立,一般不会合并。
TCP是一种可靠性通信协议,UDP是不可靠的,很可能会出现丢包。
UDP使用场景:一般对少量丢包不敏感的,网络情况比较好的比如内网,比如DHCP(动态主机分配协议,是一个局域网协议,由主键服务器控制一段IP,登录的时候随机分配一个IP),TFTP,RTP等,不需要建立连接,也不是一对一的通信,而是可以广播的应用,适合处理速度快延时低,对丢包不敏感 -
3.ELK工作原理,包括ES如何进行索引的建立?冷热分离?
/data/logs/business/microsrv-healthcodehz/healthcodehz.%d{yyyy-MM-dd}.%i.log
日志指定目录 +ServiceName+DataTime,索引里面的Stored Field结构,然后根据字段进行搜索。
关于调优手段,数据的冷热分离,热数据放SSD
每天凌晨对segment进行暴力 merge,仅针对需要搜索的字段进行分词
只有是候选节点才能成为主节点,当两个候选节点投票数一样的时候,节点id小会成为master -
4.docker一些命令,Linux一些命令
cat fileName | tail -n 20
查看日志的后面20行
cat fileName | head -n 20
查看日志前面20行
cat fileName | tail +n 100
查看100行以后的所有内容
docker ps
查看当前docker里面运行的容器,通常拿到对应的containerID进入
docker exec -it containerId /bin/bash
进入容器
docker images
列出当前docker里面的镜像
docker run -d --name first_tomcat -p 8080:8088
tomcat启动Tomcat, 镜像启动run之后就会变成容器container -
5.Redis的集群如何部署 sentinel机制如何选举master的?
sentinel是一个独立于redis之外的进程,适用于redis的master/cluster集群部署下为了保证sentinel的高可用,一般也是集群部署至少3个(当该Sentinel集群中由一个Sentinel节点故障后,仅剩的一个Sentinel节点是永远无法成为Leader)sentinel实例。
关于redis的从节点cluster下线,分为主观下线和客观下线
**主观下线:**当sentinel发现某个结点没有响应心跳数据报,一般是一秒down_after_millsseconds
,该节点就会被sentinel主观下线,此时不一定节点故障了。
客观下线:当sentinel集群开始共同判断,超过一定数量的sentinel认为该redis节点主管下线了,该节点就会被sentinel认为故障而客观下线,如果该节点是master,则进行master选举选举redis master节点由sentinel集群的leader决定,
sentinel leader如何选举redis的master?:- 过滤故障的节点
- 选择优先级slave-priority最大的从节点作为主节点,如不存在则继续
- 选择复制偏移量(数据写入量的字节,记录写了多少数据。主服务器会把偏移量同步给从服务器,当主从的偏移量一致,则数据是完全同步)最大的从节点作为主节点,如不存在则继续
- 选择runid(redis每次启动的时候生成随机的runid作为redis的标识)最小的从节点作为主节点