@JunQiu
2018-09-28T17:10:50.000000Z
字数 4127
阅读 1436
summary_2018/08
net
mongodb
1、静态 NAT
静态 NAT 设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。
这种方法主要用在内部网络中有对外提供服务的服务器,如 WEB、MAIL 服务器时。这些服务器的IP地址必须采用静态地址转换,以便外部用户可以使用这些服务。该方法的缺点是需要独占宝贵的合法IP地址。即如果某个合法IP地址已经被NAT静态地址转换定义,即使该地址当前没有被使用,也不能被用作其它的地址转换。
2、动态地址 NAT
动态地址 NAT 则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。(相当于将公网地址放在一个地址池里,当有内网地址需要访问外部网站时,从地址池中取出一个公网地址,用于内网地址到公网地址的转换)
动态地址 NAT 只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部 IP 地址,主要应用于拨号,对于频繁的远程联接也可以采用动态 NAT。当远程用户联接上之后,动态地址 NAT 就会分配给他一个 IP 地址,用户断开时,这个 IP 地址就会被释放而留待以后使用。
3、网络地址端口转换 NAPT
NAPT 则是把内部地址映射到外部网络的一个IP地址的不同端口上。网络地址端口转换 NAPT(Network Address Port Translation)是人们比较熟悉的一种转换方式。
NAPT 普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的 IP 地址后面。
优点:在Internet中使用NAPT时,所有不同的信息流看起来好像来源于同一个 IP 地址。这个优点在小型办公室内非常实用,通过从ISP处申请的一个 IP 地址,将多个连接通过NAPT接入Internet。对于只申请到少量 IP 地址甚至只有一个合法 IP 地址,却经常有很多用户同时要求上网的情况,这种转换方式非常有用。
上面的优点虽然这样会导致信道的一定拥塞,但考虑到节省的 ISP 上网费用和易管理的特点,用 NAPT 还是很值得的。NAPT 与动态地址 NAT不同,它将内部连接映射到外部网络中的一个单独的 IP 地址上,同时在该地址上加上一个由 NAT 设备选定的 TCP 端口号。
(1)宽带共享 :通过一个公网地址可以让许多机器连上网络;理论上所有网络端口有多少一个公网IP就能够支持多少台机器联网;解决了IP地址不够用的情况;
(2)安全防护:通过NAT技术转换后,实际机器隐藏自己的真实IP,仅通过端口来区别是内网中的哪个机器,保证了自身安全。
// 缺点
在一个具有NAT功能的路由器下的主机并没有建立真正的端对端连接,并且不能参与一些因特网协议。一些需要初始化从外部网络建立的TCP连接,和使用无状态协议(比如UDP)的服务将被中断。除非NAT路由器作一些具体的努力,否则送来的数据包将不能到达正确的目的地址。(一些协议有时可以在应用层网关的辅助下,在参与NAT的主机之间容纳一个NAT的实例,比如FTP。)NAT也会使安全协议变的复杂。
// 局限性
(1)NAT违反了IP地址结构模型的设计原则。IP地址结构模型的基础是每个IP地址均标识了一个网络的连接。Internet的软件设计就是建立在这个前提之上,而NAT使得有很多主机可能在使用相同的地址,如10.0.0.1。
(2)NAT使得IP协议从面向无连接变成立面向连接。NAT必须维护专用IP地址与公用IP地址以及端口号的映射关系。在TCP/IP协议体系中,如果一个路由器出现故障,不会影响到TCP协议的执行。因为只要几秒收不到应答,发送进程就会进入超时重传处理。而当存在NAT时,最初设计的TCP/IP协议过程将发生变化,Internet可能变得非常脆弱。
(3)NAT违反了基本的网络分层结构模型的设计原则。因为在传统的网络分层结构模型中,第N层是不能修改第N+1层的报头内容的。NAT破坏了这种各层独立的原则。
(4)有些应用是将IP地址插入到正文的内容中,例如标准的FTP协议与IP Phone协议H.323。如果NAT与这一类协议一起工作,那么NAT协议一定要做适当地修正。同时,网络的传输层也可能使用TCP与UDP协议之外的其他协议,那么NAT协议必须知道并且做相应的修改。由于NAT的存在,使得P2P应用实现出现困难,因为P2P的文件共享与语音共享都是建立在IP协议的基础上的。
(5)NAT同时存在对高层协议和安全性的影响问题。RFC对NAT存在的问题进行了讨论。NAT的反对者认为这种临时性的缓解IP地址短缺的方案推迟了Ipv6迁移的进程,而并没有解决深层次的问题,他们认为是不可取的。
1、nat是单向还是双向??
动态NAT是单向的,要实现双向访问可以使用静态NAT或者NAPT。
2、自己的电脑搭建nat,都是端口映射??如果不是,如何区分是自己本机发起的请求还是内网??
应该在静态和动态分配的情况下是独占IP,相当于做了一个IP映射,只需要修改IP报文的IP地址,根据映射表来转发。(????)
▶ mongostat
insert query update delete getmore command flushes mapped vsize res faults qr|qw ar|aw netIn netOut conn time
*0 40 1 *0 0 1|0 0 4.3G 11.1G 150.0M 0 0|0 0|0 2k 12k 201 19:07:04
*0 20 *0 *0 0 1|0 0 4.3G 11.1G 150.0M 0 0|0 0|0 1k 11k 201 19:07:05
*0 *0 1 *0 0 1|0 0 4.3G 11.1G 150.0M 0 0|0 0|0 244b 10k 201 19:07:06
*0 20 *0 *0 0 1|0 0 4.3G 11.1G 150.0M 0 0|0 0|0 1k 11k 201 19:07:07
*0 20 *0 *0 0 2|0 0 4.3G 11.1G 150.0M 0 0|0 0|0 1k 11k 201 19:07:08
参数说明:
res: 常驻内存大小
mapped: 通过mmap映射数据所占用虚拟内存大小(只对MMAPv1有效)
vsize: mongodb进程占用的虚拟内存大小
faults: page fault次数,如果持续过高,则可以考虑加内存
qr/qw: 读取/写入等待队列的大小,如果队列很大,表示MongoDB处理能力跟不上,可以看看是否存在慢操作,或者减缓请求
ar/rw:当前正在读/写的操作的数量。
conn: 当前连接数,conn也会占用MongoDB资源,合理控制连接数
idx miss: 索引不命中所占百分比 如果太高则要考虑索引是否设计得不合理
flushes: 通常为0或1,对于MMAPv1,表示后台刷盘次数(默认60s),对于WiredTiger,表示执行checkpoint次数(默认60s或2GB journal日志)
lr/lw: 读取/写入操作等待锁的比例 (New In MongoDB 3.2, Only for MMapv1)
lrt/lwt: 读取/写入锁的平均获取时间(微妙)
db.serverStatus().mem: 当前数据库内存使用情况
db.serverStatus().connections: 当前数据库服务器的连接情况
db.serverStatus().extra_info: 在Linux下,包含page fault次数
db.serverStatus().locks: 数据库各种类型锁竞态情况
db.serverStatus().backgroundFlushing: 数据库后台刷盘情况(默认60s)一次,仅针对MMAPv1存储引擎
> db.stats()
{
"db" : "test",
"collections" : 2,
"objects" : 3,
"avgObjSize" : 430,
"dataSize" : 1290,
"storageSize" : 49152,
"numExtents" : 0,
"indexes" : 1,
"indexSize" : 16384,
"ok" : 1
}