虚拟机3种网络模式

虚拟机网络模式
无论是vmware,virtual box,virtual pc等虚拟机软件,一般来说,虚拟机有三种网络模式:

1.桥接

2.NAT

3.Host-Only

初学者看到虚拟机有三种网络,估计就慌了,笔者也是。哪一种网络是适合自己的虚拟机呢?

桥接
桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,那么物理网卡和虚拟网卡就相当于处于同一个网段,虚拟交换机就相当于一台现实网络中的交换机,所以两个网卡的IP地址也要设置为同一网段。

所以当我们要在局域网使用虚拟机,对局域网其他pc提供服务时,例如提供ftp,提供ssh,提供http服务,那么就要选择桥接模式。

例如大学宿舍里有一个路由器,宿舍里四个人连接这个路由器,路由器的wanip就不理会了,这个ip是动态获取的,而lanip默认是192.168.1.1,子网掩码是255.255.255.0。而其他四个人是自动获取ip,假设四个人的ip是:

A:192.168.1.100/255.255.255.0, B:192.168.1.101/255.255.255.0, C:192.168.1.102/255.255.255.0, D:192.168.1.103/255.255.255.0

那么虚拟机的ip可以设置的ip地址是192.168.1.2-192.168.1.99,192.168.1.104-192.168.1.254(网络地址全0和全1的除外,再除去ABCD四个人的ip地址)

那么虚拟机的ip地址可以设置为192.168.1.98/255.255.255.0,设置了这个ip地址,ABCD这四个人就可以通过192.168.1.98访问虚拟机了,如果虚拟机需要上外网,那么还需要配置虚拟机的路由地址,就是192.168.1.1了,这样,虚拟机就可以上外网了,但是,上网我们一般是通过域名去访问外网的,所以我们还需要为虚拟机配置一个dns服务器,我们可以简单点,把dns服务器地址配置为google的dns服务器:8.8.8.8,到此,虚拟机就可以上网了。

NAT
NAT模式中,就是让虚拟机借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。

NAT模式中,虚拟机的网卡和物理网卡的网络,不在同一个网络,虚拟机的网卡,是在vmware提供的一个虚拟网络。

NAT和桥接的比较:

(1) NAT模式和桥接模式虚拟机都可以上外网。

(2) 由于NAT的网络在vmware提供的一个虚拟网络里,所以局域网其他主机是无法访问虚拟机的,而宿主机可以访问虚拟机,虚拟机可以访问局域网的所有主机,因为真实的局域网相对于NAT的虚拟网络,就是NAT的虚拟网络的外网,不懂的人可以查查NAT的相关知识。

(3) 桥接模式下,多个虚拟机之间可以互相访问;NAT模式下,多个虚拟机之间也可以相互访问。

如果你建一个虚拟机,只是给自己用,不需要给局域网其他人用,那么可以选择NAT,毕竟NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,只要虚拟机的网路配置是DHCP,那么你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可,就可以让虚拟机联网了。

例如你想建多个虚拟机集群,作为测试使用,而宿主机可能是一个笔记本,ip不固定。这种应用场景,我们需要采用nat模式了,但是我们要考虑一个问题,虚拟机之间是需要互访的,默认采用dhcp,虚拟机的ip每次重启,ip都是不固定的,所以我们需要手工设置虚拟机的ip地址。

但是我们对虚拟机网卡所在的虚拟网络的信息还一无所知,例如虚拟机网络的路由地址,子网掩码,所以我们需要先查下nat虚拟网络的信息。

使用vmware,在Edit->Virtual Network Editor中配置好虚拟网络信息后看到下图所示,注意VMnet8,VMnet8相当于是本机的一个路由,虚拟机设置NAT后就通过这个路由进行上网的,可以查看其网络地址,路由地址,子网掩码。

选择VMnet8->NAT设置,可以看到子网ip显示为192.168.233.0,子网掩码是255.255.255.0,那路由地址呢,其实就是网关IP了,都是同个东西,这里是192.168.233.2。

接下来就好办了,在对应的虚拟机设置好ip,子网掩码,路由地址就可以上外网了,至于dns可以设置为8.8.8.8.

Host-Only
在Host-Only模式下,虚拟网络是一个全封闭的网络,它唯一能够访问的就是主机。其实Host-Only网络和NAT网络很相似,不同的地方就是Host-Only网络没有NAT服务,所以虚拟网络不能连接到Internet。主机和虚拟机之间的通信是通过VMware Network Adepter VMnet1虚拟网卡来实现的。

Host-Only的宗旨就是建立一个与外界隔绝的内部网络,来提高内网的安全性。这个功能或许对普通用户来说没有多大意义,但大型服务商会常常利用这个功能。如果你想为VMnet1网段提供路由功能,那就需要使用RRAS,而不能使用XP或2000的ICS,因为ICS会把内网的IP地址改为192.168.0.1,但虚拟机是不会给VMnet1虚拟网卡分配这个地址的,那么主机和虚拟机之间就不能通信了。

综述
在VMware的3中网络模式中,NAT模式是最简单的,基本不需要手动配置IP地址等相关参数。至于桥接模式则需要额外的IP地址,如果是在内网环境中还很容易,如果是ADSL宽带就比较麻烦了,ISP一般是不会大方的多提供一个公网IP的。

转发
http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html

一致性哈希算法(consistent hashing)

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。
一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:

1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。
3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。
4、负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

在分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法,那么在有机器添加或者删除后,很多原有的数据就无法找到了,这样严重的违反了单调性原则。接下来主要讲解一下一致性哈希算法是如何设计的:

环形Hash空间

按照常用的hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间中。现在我们可以将这些数字头尾相连,想象成一个闭合的环形。如下图

把数据通过一定的hash算法处理后映射到环上
现在我们将object1、object2、object3、object4四个对象通过特定的Hash函数计算出对应的key值,然后散列到Hash环上。如下图:
Hash(object1) = key1;
Hash(object2) = key2;
Hash(object3) = key3;
Hash(object4) = key4;

将机器通过hash算法映射到环上

在采用一致性哈希算法的分布式集群中将新的机器加入,其原理是通过使用与对象存储一样的Hash算法将机器也映射到环中(一般情况下对机器的hash计算是采用机器的IP或者机器唯一的别名作为输入值),然后以顺时针的方向计算,将所有对象存储到离自己最近的机器中。
假设现在有NODE1,NODE2,NODE3三台机器,通过Hash算法得到对应的KEY值,映射到环中,其示意图如下:
Hash(NODE1) = KEY1;
Hash(NODE2) = KEY2;
Hash(NODE3) = KEY3;

通过上图可以看出对象与机器处于同一哈希空间中,这样按顺时针转动object1存储到了NODE1中,object3存储到了NODE2中,object2、object4存储到了NODE3中。在这样的部署环境中,hash环是不会变更的,因此,通过算出对象的hash值就能快速的定位到对应的机器中,这样就能找到对象真正的存储位置了。

机器的删除与添加

普通hash求余算法最为不妥的地方就是在有机器的添加或者删除之后会照成大量的对象存储位置失效,这样就大大的不满足单调性了。下面来分析一下一致性哈希算法是如何处理的。
1. 节点(机器)的删除
以上面的分布为例,如果NODE2出现故障被删除了,那么按照顺时针迁移的方法,object3将会被迁移到NODE3中,这样仅仅是object3的映射位置发生了变化,其它的对象没有任何的改动。如下图:

2. 节点(机器)的添加
如果往集群中添加一个新的节点NODE4,通过对应的哈希算法得到KEY4,并映射到环中,如下图:

通过按顺时针迁移的规则,那么object2被迁移到了NODE4中,其它对象还保持这原有的存储位置。通过对节点的添加和删除的分析,一致性哈希算法在保持了单调性的同时,还是数据的迁移达到了最小,这样的算法对分布式集群来说是非常合适的,避免了大量数据迁移,减小了服务器的的压力。

平衡性

根据上面的图解分析,一致性哈希算法满足了单调性和负载均衡的特性以及一般hash算法的分散性,但这还并不能当做其被广泛应用的原由,因为还缺少了平衡性。下面将分析一致性哈希算法是如何满足平衡性的。hash算法是不保证平衡的,如上面只部署了NODE1和NODE3的情况(NODE2被删除的图),object1存储到了NODE1中,而object2、object3、object4都存储到了NODE3中,这样就照成了非常不平衡的状态。在一致性哈希算法中,为了尽可能的满足平衡性,其引入了虚拟节点。
——“虚拟节点”( virtual node )是实际节点(机器)在 hash 空间的复制品( replica ),一实际个节点(机器)对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以hash值排列。
以上面只部署了NODE1和NODE3的情况(NODE2被删除的图)为例,之前的对象在机器上的分布很不均衡,现在我们以2个副本(复制个数)为例,这样整个hash环中就存在了4个虚拟节点,最后对象映射的关系图如下:

根据上图可知对象的映射关系:object1->NODE1-1,object2->NODE1-2,object3->NODE3-2,object4->NODE3-1。通过虚拟节点的引入,对象的分布就比较均衡了。那么在实际操作中,正真的对象查询是如何工作的呢?对象从hash到虚拟节点到实际节点的转换如下图:

“虚拟节点”的hash计算可以采用对应节点的IP地址加数字后缀的方式。例如假设 NODE1的IP地址为192.168.1.100。引入“虚拟节点”前,计算 cache A 的 hash 值:
Hash(“192.168.1.100”);
引入“虚拟节点”后,计算“虚拟节”点NODE1-1和NODE1-2的hash值:
Hash(“192.168.1.100#1”); // NODE1-1
Hash(“192.168.1.100#2”); // NODE1-2

转载
http://blog.csdn.net/cywosp/article/details/23397179/

http://www.blogjava.net/hello-yun/archive/2012/10/10/389289.html

http://baike.baidu.com/view/1588037.htm

说说并发编程 volatile

Java volatile关键字是用来保证变量的线程可见性。到底什么是线程的可见性呢?准确地讲,每次读取volatile变量要从主内从中读取,而不是从CPU cache中读取;写一个volatile变量,要直接写到主内存,而不仅仅是CPU cache。

Java 5 引入了volatile,就保证了读写都要从主内存中取值。下边详细介绍一下:

线程可见性
在多线程应用程序中, 当线程操作非volatile变量,每个线程需要复制变量从主内存到 CPU缓存中,出于性能方面的设计。如果你的计算机包含多个 CPU,每个线程可能会在不同的 CPU 上运行。这意味着,每个线程可能会将变量复制到不同的 Cpu 的 CPU 缓存。如下所示 ︰
字节码

非volatile变量不保证从主内存中立即读取数据或将数据从CPU 缓存中直接写入到主内存。如果多线程操作一个共享变量的话,就会出现如下的问题:

[java]
public class SharedObject {

public volatile int counter = 0;

}

[/java]

想象一下,如果只有线程1更新counter变量,但是线程1和线程2却可能拿到的不是最新的值。如果没用申明volatile,JVM并不保证counter变量的值马上写回到主内存中,那就意味着CPU cache中的值并不是最新的值。如下图所示:
字节码

这就是线程可见性的问题。线程2并没有实时看到最新的值,因为JVM会先从CPU cache中读取值。

如果申明为volatile,则线程读取值,必须从主内存中读取,写值,必须写到主内存中,这就保证了所有的值对于线程是可见的。但是这不能说明它是线程安全的。这是两个不同的概念。

例子
[java]
package com.learn.core.ch02;

public class VolatileTest {

private int count = 0;

public static void main(String[] args) throws InterruptedException {
while (true) {
VolatileTest test = new VolatileTest();
test.setCount(0);
Thread[] ts = new Thread[2];
for (int i = 0; i < 2; i++) {
ts[i] = new Thread(new MyRun(test, i));
ts[i].start();
}

for (Thread t : ts) {
t.join();
}
Thread.sleep(2);

}
}

public static class MyRun implements Runnable {

private VolatileTest test;
private int index;

public MyRun(VolatileTest test2, int index) {
this.test = test2;
this.index = index;
}

@Override
public void run() {
if (index == 0) {
test.increment();
} else {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (test.getCount() == 0) {
System.out.println(Thread.currentThread().getName() + "—–" + test.getCount());
}
}
}

public int getCount() {
return count;
}

public void increment() {
count++;
}

public void setCount(int count) {
this.count = count;
}

}

[/java]
Thread-10181—–0
Thread-10957—–0
Thread-10959—–0
Thread-11643—–0
Thread-12177—–0
Thread-12269—–0
Thread-12345—–0
Thread-12929—–0
Thread-13221—–0
加上volatile关键字,就可以保证永远拿到最新的值,前提是写的线程先执行。

说说并发编程 ThreadLocal

类ThreadLocal 提供线程局部变量。这些局部变量不同于正常的变量,每个线程都有自己独立初始化的副本,可以通过threadLocal的set/get方法去改变它的。一般ThreadLocal 常用在类变量上。比如DateFormat类不是线程安全的,没有必要所有的方法都加上同步,这是利用ThreadLocal就可以达到效果。

创建ThreadLocal
[java]
private ThreadLocal myThreadLocal = new ThreadLocal();
[/java]

访问ThreadLocal
[java]
//设置变量
myThreadLocal.set("A thread local value");
//读取local变量
String threadLocalValue = (String) myThreadLocal.get();
[/java]

初始化ThreadLocal 变量

[java]
private ThreadLocal myThreadLocal = new ThreadLocal<String>() {
@Override protected String initialValue() {
return "This is the initial value";
}
};
[/java]

例子
[java]
package com.learn.core.ch02;

import java.util.concurrent.atomic.AtomicInteger;

public class ThreadId {

// Atomic integer containing the next thread ID to be assigned
private static final AtomicInteger nextId = new AtomicInteger(0);

// Thread local variable containing each thread’s ID
private static final ThreadLocal<Integer> threadId = new ThreadLocal<Integer>() {

@Override
protected Integer initialValue() {
return nextId.getAndIncrement();
}
};

// Returns the current thread’s unique ID, assigning it if necessary
public static int get() {
return threadId.get();
}

public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new MyRunnable()).start();
}
}

public static class MyRunnable implements Runnable {

@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(threadId.get());
}

}
}

}
[/java]

总结:以下2中情况,可以考虑使用

  • 当每个线程仅仅想拥有自己的一些变量,不想所有的线程共享
  • 一些非线程安全的类变量或者工具类,为了保证线程安全,可以通过ThreadLocal作为线程局部变量达到线程安全的效果
  • Excel Pivot table

    最近在重构一个项目,开发已经完成,为了给用户和PM展示数据前后的变化,会用到很多报表工具,今天介绍的pivot table就是一个很好用工具,可以很详细的展示不同维度的数据总和。下面就简单介绍一下:

    Pivot tables are one of Excel’s most powerful features. A pivot table allows you to extract the significance from a large, detailed data set.

    Our data set consists of 214 rows and 6 fields. Order ID, Product, Category, Amount, Date and Country.

    字节码

    Insert a Pivot Table
    To insert a pivot table, execute the following steps.

    1. Click any single cell inside the data set.
    2. On the Insert tab, click PivotTable.

    字节码
    The following dialog box appears. Excel automatically selects the data for you. The default location for a new pivot table is New Worksheet.

    3. Click OK.
    字节码

    Drag fields
    The PivotTable field list appears. To get the total amount exported of each product, drag the following fields to the different areas.

    1. Product Field to the Row Labels area.
    2. Amount Field to the Values area.
    3. Country Field to the Report Filter area.
    字节码

    Below you can find the pivot table. Bananas are our main export product. That’s how easy pivot tables can be!
    字节码
    Sort
    To get Banana at the top of the list, sort the pivot table.

    1. Click any cell inside the Total column.
    2. The PivotTable Tools contextual tab activates. On the Options tab, click the Sort Largest to Smallest button (ZA).

    PivotTable Tools Contextual Tab

    Result

    Filter
    Because we added the Country field to the Report Filter area, we can filter this pivot table by Country. For example, which products do we export the most to France?

    1. Click the filter drop-down and select France.
    Result. Apples are our main export product to France.

    Filtered Pivot Table
    Note: you can use the standard filter (triangle next to Product) to only show the totals of specific products.

    Change Summary Calculation
    By default, Excel summarizes your data by either summing or counting the items. To change the type of calculation that you want to use, execute the following steps.

    1. Click any cell inside the Total column.
    2. Right click and click on Value Field Settings…

    Value Field Settings

    3. Choose the type of calculation you want to use. For example, click Count.

    Summarize Value Field By

    4. Click OK.
    Result. 16 out of the 28 orders to France were ‘Apple’ orders.

    Two-dimensional Pivot Table
    If you drag a field to the Row Labels area and Column Labels area, you can create a two-dimensional pivot table. For example, to get the total amount exported to each country, of each product, drag the following fields to the different areas.

    1. Country Field to the Row Labels area.
    2. Product Field to the Column Labels area.
    3. Amount Field to the Values area.
    4. Category Field to the Report Filter area.

    Create Two-dimensional Pivot Table

    Below you can find the two-dimensional pivot table.

    Two-dimensional Pivot Table in Excel

    To easily compare these numbers, create a pivot chart and apply a filter. Maybe this is one step too far for you at this stage, but it shows you one of the many other powerful pivot table features Excel has to offer.

    Pivot Chart
    字节码

    很好用的一个工具!