Tomcat
配置:server.xml包括顶级组件server:1个Tomcat实例;容器组件:service:关联多个connector和1个engine;engine:通过connector接收请求,处理请求,转发请求到对应的host;host:虚拟主机;context:应用程序,指定webapp路径;连接器组件connector:指定端口接收请求;被嵌套类组件:Valve:阀门,发送到webapp前拦截请求,实现如日志、IP控制等;realm:关联一个用户认证库,实现认证和授权,包括UserDatabaseRealm使用JNDI自定义、MemoryRealm使用tomcat-users.xml、JDBCRealm使用JDBC链接数据库;
优化:安全优化:普通用户启动、SHUTDOWN端口禁telnet、禁用AJP连接、删除多余的Root目录避免漏洞;性能优化:禁止DNS查询(Connector配置enableLookups=false)、JVM调优(catalina.sh增加JAVA_OPTS)、使用线程池(定义线程池Executor在Connector中使用)、使用NIO(Connector中配置protocol:bio/nio/nio2/apr);
实现原理:connector通过Socket接收请求,将Socket请求封装成HttpRequest请求并传给Container;Container封装和管理Servlet,处理请求,并返回HttpResponse给connector;connector将HttpResponse转换成Socket返回给客户端;
Connector:通过不同的ProtocolHandler实现,每个ProtocolHandler包括Endpoint(处理Socket连接)、Processor(Socket转HttpRequest)、Adapter(适配Http请求到Servlet容器);
Container:包括engine、host站点、context应用、wrapper单个Servlet;通过Pipeline-Value责任链模式(每1层容器就是1个Pipeline,每1层有多个实现类即Value)实现不同层容器的调用;每一层最后执行Base类(StandardXXValue),再由BaseValue类调用下一层;执行顺序:EnginePipelineValue多个、StandardEngineValue、HostPipelineValue多个、StandardHostValue、ContextPipelineValue多个、StandardContextValue、WrapperPipelineValue多个、StandardWrapperValue(最后创建FilterChain,包含匹配的所有Filter和Servlet)、Filter.doFilter/Servlet.service多个;
责任链模式:两种实现:Pipeline-Valve(Pipeline管道和Valve阀门,单链表实现,invoke)和过滤器链(FilterChain和Filter,数组实现,doFilter);
Servlet容器:容器管理Servlet的生命周期(初始化init、调用service和销毁destroy),Tomcat是一个Servlet容器;Web服务器收到Servlet请求时会交给Servlet容器处理;Tomcat也可以做Web服务器,性能较差;
Nginx
作用:Http服务器、反向代理服务器、邮件服务器、负载均衡、Web缓存(动静分离,作为静态资源的CDN);
配置:每个配置项分号结束;全局配置:user(用户用户组,默认nobody)、worker_processes(进程数,默认1)、pid(进程文件地址)、error_log(日志路径级别);events配置:accept_mutex(网络连接序列化,防止惊群)、multi_accept(一个进程同时接收多个连接,默认off)、use epoll(事件驱动模型)、worker_connections(每个进程最大连接数);http配置:全局参数(sendfile、keepalive_timeout、error_page、upstream服务器配置、日志配置)、多个server配置;server配置:主要配置location;location配置:proxy_pass、deny的IP、allow的IP;内置参数:$remote_addr、$remote_user、$request等;
惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能;通过accept_mutex解决;
负载均衡策略:内置策略:轮询(默认)、加权轮询(处理1次连接则权重减1重新排序,所有机器down后重置所有机器的状态)、IP hash(经过20次hash仍找不到可用的机器时退化成轮询)、least_conn(把请求转发给连接数较少的后端服务器);扩展策略:fair(根据服务器响应时间判断负载,选出负载最轻的机器)、url_hash、一致性hash;upstream配置参数:ip_hash、least_conn、weight(加权轮询的权重)、backup(标记备份服务器,主服务器挂掉才会处理请求)、down(标记服务器永久停机)、max_fails/fail_timeout/fail_time(fail_timeout时间内失败了max_fails次则认为服务器停机,停机时间为fail_time,默认10s);
动静分离:静态资源(HTML,JavaScript,CSS,img等)部署在单独的nginx,动态资源(jsp、do)部署在tomcat,提高用户访问静态代码的速度,降低对后台应用访问;通过反向代理nginx转发到静态服务器nginx和动态服务器tomcat;
工作原理:Nginx由内核和模块(静态编译,自动加载)组成;模块从结构上分:核心模块(http、event、mail)、基础模块(access、proxy、fastcgi、rewrite)、第三方模块;模块从功能上分:Handlers、Filters、Proxies;请求响应过程:核心模块接收请求通过配置文件找到location再由location中的指令找到模块处理、根据配置选择一个handler处理请求、多个Filter处理请求、响应客户端;
进程模型:单工作进程:master+1个worker(单线程);多工作进程:master+多个worker(1个主线程);master进程:接收CLI信号、向worker发送信号、监控worker状态、实现重启、平滑升级、配置加载,不处理网络业务事件;执行reload命令:启动新nginx进程向master发送信号、master重新加载配置,启动新的worker,通知老的worker处理完后退出;worker进程:独立平等,从master进程fork,通过抢互斥锁,注册listenfd读事件实现一个请求只有一个work处理;
高性能实现:多进程模型中多worker进程独立不加锁,没有锁的开销;master自动启动新的worker代替异常退出的worker;异步非阻塞:每个worker只有1个主线程,通过异步非阻塞可同时处理大量请求;
事件驱动模型:Nginx响应和处理Web请求的过程基于事件驱动模型的,包含事件收集器、事件发送器和事件处理器;事件发送器每传递过来一个请求,目标对象就将其放入一个待处理事件的列表,使用非阻塞I/O方式调用事件处理器来处理该请求;事件驱动处理库又被称为多路IO复用方法;select/poll:创建一个待处理事件列表(一个进程所打开的文件描述符有限),然后把这个列表发给内核,再去轮询检查这个列表,以判断事件是否发生,select对读、写、异常创建3个集合分别轮询,poll只创建一个集合,每个包含读、写、异常3个事件,一次轮询同时检查3个事件,Windows不支持;epoll:把事件列表的管理交给内核,由内核主动通知进程事件的发生,进程不再轮询,支持一个进程打开大数目的socket描述符(FD),IO效率不随FD数目增加而线性下降(因为内核只通知活动的FD);rtsig:实时信号Real-Time Signal,进程通过内核建立一个rtsig队列用于存放标记事件发生(客户端请求)的信号,每个事件发生时,系统内核就会产生一个信号存放到rtsig队列中等待工作进程的处理;kqueue:BSD平台中使用,类似epoll;/dev/poll:主要用于Solaris,通过将要监视的文件描述符加入虚拟设备/dev/poll获得事件通知;
性能优化:worker_processes(同CPU核心数)、worker_rlimit_nofile(最大打开文件数,同Linux)、事件处理模型(use epoll、worker_connections、multi_accept)、高效文件传输(sendfile on、tcp_nopush on)、各种连接超时时间、gzip调优、expires缓存调优、防盗链(通过校验referer,防止其他网站盗用占用带宽)、Linux内核优化、文件描述符(ulimit);
Mybatis
概念:半ORM框架(需要自己写SQL),内部封装了JDBC来连接数据库(数据库兼容性较好),可通过XML和注解完成映射和配置;缺点:SQL编写工作量大,且不能移植,迁移数据库需要重新写;
使用:Mapper接口:接口全限定名就是XML的namespace,接口方法就是XML的SQL ID,通过接口和方法定位到SQL,所以方法不能重载;每个select/update等语句被解析成MapperStatement对象,使用JDK动态代理为Mapper接口生成代理对象,调用对应的MapperStatement执行SQL;分页实现:通过 RowBounds 对象进行内存分页;物理分页需要自己写SQL;或者通过分页插件(自定义分页插件,拦截SQL,根据数据库方言重写SQL);封装执行结果:SQL列名和对象属性映射,通过反射创建对象并赋值;常用标签:select、insert、update、delete、resultMap、parameterMap、sql、include、where、foreach、if、choose、when、otherwise;#{}预编译,${}替换字符串;
关联查询:联合查询,resultMap中通过association(一对一)/collection(一对多)配置字段映射;或者嵌套查询,resultMap中通过association/collection通过配置select指定查询ID实现;
延迟加载:仅支持 association和collection关联集合对象的延迟加载,设置lazyLoadingEnabled=true,内部通过Cglib创建代理对象,拦截对应的get方法,如果为空则调用对应的SQL查询结果再set;
缓存:一级缓存:HashMap实现,默认打开,作用域为SQLSession,缓存失效:Session关闭、使用不同的SQLSession、查询条件不同,使用了修改操作、手动刷新缓存,分布式时多个SQLSession会导致脏数据,和Spring集成时不支持一级缓存;二级缓存:可自定义存储如Ehcache,默认关闭,作用域为Mapper NameSpace,不同SQLSession可共享,多表查询时容易脏数据,可在Mapper中配置cache或配置每个语句的缓存;查询顺序:二级缓存、一级缓存、数据库;分布式时不能使用,会有脏数据,一般使用Redis实现;
插件:又称拦截器,采用责任链模式,通过JDK动态代理,拦截指定方法,调用InvocationHandler实现;支持拦截ParameterHandler(SQL参数处理)、ResultSetHandler(结果集处理)、StatementHandler(语句构建处理,执行SQL,实现一级缓存)、Executor(执行器方法,调用StatementHandler,处理二级缓存)这4种接口的插件;编写插件:实现Mybatis的Interceptor接口并复写 intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,在配置文件中配置编写的插件;
核心类:SqlSession(顶层API,数据库会话)、Executor(包括SimpleExecutor、ReuseExecutor重用PrepareStatement、BatchExecutor)、StatementHandler、ParameterHandler 、ResultSetHandler 、TypeHandler(Java和Jdbc数据类型转换)、MappedStatement (封装XML的select等节点)、SqlSource(动态生成SQl) 、BoundSql(SQL和参数) 、Configuration(配置信息);
Netty
作用:定制编解码协议:可使用Netty实现自己的服务器(Http服务器、Redis、Ftp等,通过定制编解码协议实现),理解:传统Http原理:服务端创建ServerSocket并监听端口、客户端请求端口、服务器accept获得客户端Socket、服务器端请求新线程处理(读Socket、解码得到HttpRequest、处理并封装HttpResponse、编码并写Socket);Http服务器的编解码协议是Http,如果换成其他协议就成了其他类型的服务器;基于Java NIO进行封装:底层使用操作系统的支持(select、epoll),对外提供一套易用的NIO接口,传统的BIO:Socket的accept、read、write操作都是阻塞的;
粘包拆包:操作系统按字节流读取导致Netty发送的数据到接收时格式不正确,字符串被拆开了;服务端拆包和客户端粘包一一对应;Netty提供了拆包器可直接使用:基于字符串长度的、基于分隔符的、基于行的,pipline.addLast使用拆包器;
零拷贝:传统方式:4次拷贝4次切换,磁盘到内核的readbuffer、内核缓冲区到用户缓冲区、用户缓冲区到内核的socketbuffer、内核socketbuffer到网卡接口;Java的FileChannel.transferTo:省去第23步拷贝,数据从文件由DMA引擎拷贝到内核readbuffer、接着DMA从内核readbuffer将数据拷贝到网卡接口buffer,没有CPU参与,实现零拷贝;Netty实现:bytebuffer使用直接内存通过DMA发送到网卡,避免堆内存的拷贝;使用组合bytebuffer通过保存引用避免多个bytebuffer的拷贝,使用了FileChannel的transferTo方法;
Reactor线程模型:所有线程都是NIO线程,单线程模型:1个Reactor线程(完成所有IO操作包括接收、分发和处理),实现:ServerBootstrap().group(NioEventLoopGroup);多线程模型:1个Reactor线程(负责接收)+多个Acceptor线程(线程池,负责处理),实现:ServerBootstrap().group(NioEventLoopGroup(1),NioEventLoopGroup);主从模型:1个主Reactor线程(负责接收,只负责接入认证、握手等,然后重新注册到从Reactor)+多个从Reactor线程(线程池)+多个Acceptor线程(线程池,负责处理),实现:ServerBootstrap().group(NioEventLoopGroup,NioEventLoopGroup);
执行流程:服务端:创建ServerBootStrap、绑定Reactor线程池NioEventLoopGroup、绑定NioServerScoketChannel、创建ChannelPipeline和handler、绑定并启动监听端口、当轮训到准备就绪的channel后由Reactor线程NioEventLoop执行pipline中的方法最终调度并执行channelHandler;客户端:创建BootStrap、绑定Reactor线程池EventLoopGroup、绑定NioSocketChannel、创建ChannelPipeline和handler、发起连接connect;
Redis
数据结构:String:key-value,命令:get/set、mset/mget(同时操作多个)、setex(设置过期时间)、setnx(不存在才设置);Hash:类似Map,key-filed-value,命令:hset/hget、hexists(判断field是否存在)、hmset/hmget、hkeys、hvals、hgetall、hdel、hsetnx(field不存在才设置);list:列表List,可重复,命令:lpush、lindex(获取指定序号的值)、lrange、lset(设置指定序号的值)、lpop(删除第一个)、rpop(删除最后一个);set:集合,类似list,无序可去重,使用hash实现,命令:sadd、scard求长度、sdiff求2个集合的差集、sinter求交集、sunion求并集、srem删除指定元素、spop随机移除元素;zset:有序集合,分数可重复,元素不可重复,使用hash实现,命令:zadd、zrange、zcount;
常用命令:save(同步保存磁盘)、bgsave(异步保存磁盘)、shundown(异步保存磁盘再关闭)、info(显示服务器信息)、config(运行时配置)、exists(判断key存在)、keys(正则查询所有key)、del(删除key)、type(key类型)、ttl(Key的剩余时间)、expire(设置过期)、flushdb(删除当前库的所有key)、flushall(删除所有库的所有key);
持久化:RDB:快照保存,默认方式,将内存数据保存到磁盘dump.rdb文件;保存时机:根据规则定期保存(save设置,xx时间内超过xx个Key被修改则保存),手动保存(执行save或bgsave命令);原理:fork子进程,由子进程保存数据到临时rdb文件,再替换原rdb文件;适合做备份但不能实时保存;AOF(Append Only File):追加写,每个修改命令追加到appendonly.aof文件中;保存时机:执行修改命令时或每秒一次可配置;可实时保存,写较多时会降低性能;支持同时开启RDB和AOF,系统重启后会优先使用AOF来恢复数据,这样丢失的数据会最少;
通信协议:RESP是Redis序列化协议,文本协议,实现简单,性能极好,协议将传输的结构数据分为5种最小单元类型,单元结束时统一加上回车换行符号\r\n;单行字符串(+开头)、多行字符串($开头跟上字符串长度)、整数值(:开头,后跟整数的字符串形式)、错误消息(-开头)、数组(*开头跟上数组长度);
部署方式:单机模式,单节点读写使用;主从复制:1个master+n个slave,master负责读写,slave从master复制数据,只负责读,master/slave数据相同,slave降低master读的压力,无法保证高可用,没有解决写的压力;哨兵模式:基于主从复制模式增加了n个哨兵服务器(单独进程,定时和主从服务器心跳获取信息),用于监控主从服务器间的连接、通知管理员故障、主服务器故障时转移故障,实现了高可用,但切换要丢数据,没有解决写的压力;集群代理模式:n个master+n个salve+n个哨兵,master层前使用第三方代理工具Twemproxy进行代理,维护成本高,扩展性差;集群模式:数据按Slot分段分别存储在所有机器上,每个Node分配一段Slot(0-16384),Node退出或加入会已Slot为单位迁移数据,分摊了写操作,但节点间互相监听、读和写,任务繁重;
线程模型:单线程,基于Reactor模式的文件事件处理器;文件事件处理器监听多个客户端的socket,并根据socket产生的事件选择不同的事件处理器处理客户端连接请求、命令请求和响应请求;文件事件处理器包括多个客户端连接的Socket、IO多路复用程序(监听Socket并放入队列)、文件事件分派器(处理队列中的Socket分派到处理器)、事件处理器(应答/命令请求/命令回复/主从复制处理器);高并发的原因:纯内存操作、非阻塞IO多路复用程序、单线程避免上下文切换带来的CPU消耗;
内存策略:删除策略:定期删除(每隔100ms随机抽取一部分设置了过期时间的key,若过期则删除)、惰性删除(获取key时检查,过期则删除);淘汰策略:内存满时的策略,noeviction(默认,不淘汰,写时返回错误)、allkeys-lru/volatile-lru(从所有key/设置了过期时间的key淘汰最近最少使用的)、allkeys-random/volatile-random(随机淘汰)、allkeys-lfu/volatile-lfu(淘汰最近最少访问的)、volatile-ttl(淘汰越早过期的);设置:maxmemory(最大使用内存,不设或0则不限制)、maxmemory-policy(内存淘汰策略);Redis实现LRU:采用随机采样法,每次抽取5个key淘汰最近最少使用的,每个key内部增加最近访问时间字段;
事务:执行事务:MULTI(开始事务)、输入N个命令(命令如FIFO队列,不会马上执行)、EXEC(执行事务,串行执行队列的多个命令);WATCH:乐观锁,执行事务前设置需要观察的多个key,执行事务时判断若观察的key被修改则事务失败;通过watched_keys字典实现,修改每个客户端的REDIS_DIRTY_CAS字段,执行事务时判断该字段来决定是否执行;Redis事务满足ACID:A(执行过程中不被中断)、C(不支持回滚,入队失败则事务失败,单条命令执行错误不影响事务)、I(单线程串行执行)、D(RDB/AOF实现);
缓存问题:缓存穿透:查询的数据不存在,会直接请求到数据库,解决:缓存空值,布隆过滤器;缓存击穿:大量请求查询的key正好失效如系统配置,解决:互斥锁(先取缓存再查库再更新缓存)、缓存标识(提前识别过期key更新缓存);缓存雪崩:大量缓存key同时失效或宕机导致请求到数据库,解决:redis集群、ehcache本地缓存、分散key过期时间;
分布式锁:通过setnx、expire加锁,get、del解锁,通过lua脚本实现;Spring提供RedisLockRegistry可操作分布式锁API;
Redis槽位:Redis采用CRC16(key) mod 16384进行Hash定位槽位,CRC16算法产生的hash值有16bit,该算法可以产生2^16-=65536个值,由于节点间通信定时发送心跳消息Ping Pong,消息中会带有槽位信息,如果槽位太多就会导致心跳消息太大产生网络拥塞,处于性能考虑槽位数没有选择65536二而是16384,Redis集群节点数也建议不超过1000;
Redis管道:管道用于一次打包多个命令发送给Redis执行处理,Redis之前完前会缓存命令结果再一次发送给客户端;所以管道命令不能太多,会耗内存、增加客户端等待时间、造成网络拥塞;原生的批处理命令mget等是原子的,管道非原子;
Redis底层数据结构:简单动态字符串SDS(定义了长度、空闲长度、数组,比C原生字符串性能高)、链表(C没提供,自己实现双端链表,定义了长度等属性方法)、字典(C没提供,哈希表底层实现,采用拉链法解决哈希冲突,采用渐进式Hash,分多次完成,并非一次对所有Hash)、跳跃表;整数集合intset、压缩列表;
Redis使用Lua脚本:减少网络开销(将多个请求通过脚本的形式一次发送减少网络时延)、原子操作(Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入)、复用(客户端发送的脚步会永久存在redis中)、实现事务(Redis中的脚本本身就是一种事务,所以任何在事务里可以完成的事在脚本里面也能完成);使用3个命令实现:eval、evalsha、script load;
Kafka
高可用:通过副本实现,1个主题多个分区,1个分区多个副本,不同副本保存在不同broker;副本同步ISR:每个分区维护自己的ISR(与leader保持同步的副本列表,定期消息同步,不同步则剔除),写入消息时先给leader,leader再同步的把消息同步给ISR内的多个副本,再提交,再异步的把消息同步给ISR外的副本;选举leader:ZK创建临时节点成功的为leader,先到先得,所有副本都不工作时等待ISR中第一个恢复的为leader或者所有副本中第一个答复的为leader;
高性能:partiton机制:1个Topic有多个partiton,partiton分布在不同节点且存储在本地文件夹且可在不同磁盘,1个partiton有多个segment,1个segment有1个数据和索引文件,从节点、磁盘、文件上都可并发,同时1个partiton只有1个消费者线程,避免竞争;ISR机制:可用性和一致性的动态平衡,动态复制,避免慢节点拖慢整体性能;顺序写磁盘:新消息顺序写入文件,读消息通过offset顺序读,删消息删整个segment文件,避免磁盘随机写;支持多磁盘:broker数据存储支持配置多个磁盘路径,不同分区数据尽量写到不同路径;零拷贝:transferTo和transferFrom使用零拷贝读写文件;批处理:同一主题和分区的多条消息合并传输,并支持数据压缩;高效的序列化:可自定义使用更高效的序列化方式;
持久化:1个分区1个目录(topic名称+分区序号)包含多个segment文件,segment文件包含1个index索引文件和1个log数据文件,offset命名;
选举机制:Broker选举Leader:创建ZK临时节点,第一个创建成功则为leader,后续节点注册watch事件;broker退出会判断是否存在副本leader,有则重新选举并更新ISR;broker加入会判断是否存在分区副本,有则同步;分区副本选举Leader:创建时指定的或第一个副本为Leader;消费者组选Leader:第一个为Leader;
其他:特点:持久化、高吞吐、低延迟、分布式、可容错、高扩展;发送消息:确认成功:0(不等broker确认)、1(leader确认,异步同步)、-1(leader和ISR所有副本都确认);分区机制:顺序轮询分区(默认)、随机轮询分区、按Key分区;offset存储:老版默认存储在ZK,新版默认存储在__consumer_offsets主题中,可配置;消费者:1个分区只能被同1个消费者组的1个线程消费,1个消费者线程可同时消费多个分区;节点:leader负责全部的读写,follower只负责备份不负责读(区别于ZK的follower负责读);
Kafka事务:场景包括:生产者发送多条消息可以封装在一个事务中,形成一个原子操作;read-process-write模式:将消息消费和生产封装在一个事务中,形成一个原子操作;事务方法包括:init/begin/commit/abortTransactions;事务配置:Producer设置transactional.id,Consumer设置isolation.level=read_committed和enable.auto.commit=false;事务实现:使用2PC,引入Tranaction Corordinator节点;事务本质:将一组写操作(如果有)对应的消息与一组读操作(如果有)对应的Offset的更新进行同样的标记(Transaction Marker)来实现事务中涉及的所有读写操作同时对外可见或同时对外不可见,只提供对Kafka本身的读写操作的事务性,不提供包含外部系统的事务性;
MongoDb
特点:C++编写,无数据结构限制(没有表结构概念,每条记录可以有不同结构)、完全的索引支持(支持单键/数据/全文索引等)、方便的冗余和扩展(复制集、分片扩展)、支持动态查询、自动分片、支持JS、支持故障恢复;适用场景:持久化缓存、文档化存储和查询、实时插入查询、大尺寸低价值的数据、高伸缩性的场景;不适合:高度事务性系统、复杂的表级联查询;
概念:和关系数据库概念映射:数据库(同数据库)、集合(同表)、文档(同行,JSON格式)、字段(同列)、索引(同索引)、主键(同主键,默认_id为主键字段);Journal:类似redo日志,用于数据故障恢复和持久化数据的,可通过批量提交提高写入性能;32位系统默认关闭;实现涉及磁盘文件:data file和journal file,内存映射shared view和private view;分析器:类似执行计划和慢查询记录;分析器级别:0-没打开;1-记录超过阈值的查询;2-记录所有查询;db.system.profile.find()查询执行信息;find().explain分析特定查询;BSON:Binary JSON,比JSON多支持一些数据类型,用于存储文档和数据传输;namespace:数据库名.集合名称即为命名空间;更新操作不会立刻fsync到磁盘,而是定时批量写;MongoDb没有使用锁和回滚,类似MySQL MylSAM的自动提交模式;支持存储过程,使用JS写;GridFS:将大型文件存储在MongoDB数据库中的文件规范,可以将一个大文件分割成为多个较小的文档;MapReduce:相当于Mysql中的"group by",统计比较容易;
使用:启动:手动创建data/log/conf目录,创建mongodb.conf配置文件配置,启动时可指定配置文件路径:mongod -f conf/mongodb.conf;通过客户端连接:mongo ip:port;自带工具:mongo(客户端程序,连接MongoDB)、mongod(服务端程序,启动管理MongoDB)、mongodump/mongorestore(数据库二进制导入导出用于备份还原)、mongoimport/mongoexport(数据库数据导入导出)、mongostat(用于查看数据库状态)、mongooplog(用于数据库的操作记录)、mongos(数据分片程序,支持数据的横向扩展)、mongofiles(GridFS工具,内建的分布式文件系统);常用命令:show dbs查看所有数据库、use xx使用xx数据库,不存在则创建、db.dropDatabase删除数据库、show collections查看所有集合、db.集合名.insert/find/update/remove/drop/getIndexes/ensureIndex({json})插入/查询/更新/删除局/删集合/查看索引/创建索引,集合不存在会自动创建、find().count/skip/limit/sort对查询结果统计总数/跳过前x项/返回指定条目/排序、db.createUser(创建用户)、xx.explain(查看指令详情);
索引类型:_id索引(自动创建)、单键索引(单一值的单字段创建索引)、多键索引(多值的单字段创建索引如数组字段)、复合索引(多字段创建索引)、过期索引(一段时间后会过期的索引,时间字段才能创建,索引过期后相应的数据会被删除)、全文索引(对字符串与字符串数组创建全文可搜索的索引)、地理索引;索引属性:name、unique唯一性、sparse稀疏性(没有该字段则不对该行创建索引);
部署方案:主从(一主一从一主多从):主节点可读可写,记录所有操作oplog,从节点可读不写,定期从主节点同步数据,主节点挂掉需要人工重新指定;副本集(支持自动故障转移的主从):主节点可读可写,挂掉后通过仲裁节点选举一个副本节点作为主节点,副本节点可读不写,同步数据,参与选主,仲裁节点无数据,不参与选主,只投票,副本节点需为奇数;分片:将数据拆分并分散存放在不同机器上,每个分片维护着一个数据集合的子集,支持自动分片,包括分片服务器(mongod实例,可由副本集承担)、配置服务器(mongod 实例,保存集群和分片源数据)和路由服务器(客户端连接入口,路由客户请求到对应的分片服务器);