The Go Blog

KVM Virtualization

bantana
6 September 2014

符号说明:

假设6台物理机器:(物理机器使用vm1表示,虚拟机使用vm1-nginx1这种形式表示)

 vm1   vm2  vm3  vm4   vm5   vm6

nginx

vm1-nginx1
vm2-nginx1

这2台组成一个HA,

tomcat

vm1-tomcat1
vm2-tomcat1
vm3-tomcat1
vm4-tomcat1
vm5-tomcat1
vm6-tomcat1

这6台tomcat服务器组成下面这种结构(HA)

vm1-nginx1 ----|---vm1-tomcat1
+ (option)     |---vm2-tomcat1
vm2-nginx1 ----|---vm3-tomcat1
               |---vm4-tomcat1
               |---vm5-tomcat1
               |---vm6-tomcat1

session问题:

1. 可以使用tomcat cluster

or

2. nginx+(ip_hash or upstream_hash) + beckend tomcat 一致性方案来保证用户访问原tomcat服务器;

or

3. 使用redis or memcache来储存session;(我推荐这种方案)

mysql

vm3-mysql1
vm4-mysql1

这2台组成一个master/slave的异步模式(业务繁重的情况下会出现master/slave的数据不同步);

mongodb

1.数据可允许丢失,单实例,or master/slave都可以

vm5-mongodb1
vm6-mongodb1

2.数据不停机服务,官方推荐的产品模式:

最小每个分片3个一组(工业标准是3个备份,定时主动down1台来做离线备份,至少有2台可保证master选举产生。只有1台存活的情况下会进入只读模式来保护数据):

vm1-mongodb1
vm2-mongodb1
vm3-mongodb1

需要对性能和容量做水平扩展的时候,每次增加1组;

vm1-mongodb1          vm4-mongodb2
vm2-mongodb1     +    vm5-mongodb2
vm3-mongodb1          vm6-mongodb2

mongodb有mongos自动做分片,所以你只需要在线添加机器就可以;

redis

vm1-redis1
vm2-redis1
vm3-redis1
...

通过hash来尽量利用每台机器的空闲内存资源

memcache

vm4-mc1
vm5-mc1
vm6-mc1
...

netty

vm1-netty1
vm2-netty1
vm3-netty-nginx

组成这种结构

vm3-netty-nginx  ---|---vm1-netty1
                    |---vm2-netty1

然后列出一张表

vm1
vm1-nginx1
vm1-tomcat1
vm1-redis1
vm1-netty1

vm2
vm2-nginx1
vm2-tomcat1
vm2-redis1
vm2-netty1

vm3
vm3-tomcat1
vm3-mysql1
vm3-redis1
vm3-netty-nginx

vm4
vm4-tomcat1
vm4-mysql1
vm4-mc1

vm5
vm5-tomcat1
vm5-mc1
vm5-mongodb1

vm6
vm6-tomcat1
vm6-mc1
vm6-mongodb1

然后扩展这张表:

例如:

vm1           2 x 6core/cpu   64G   disk  network   note
vm1-nginx1    4 core          4G    40G   wan+lan   nginx主要是静态文件和路由,对cpu和内存要求不高
vm1-tomcat1   4 core          8G    40G   lan       计算+日志
vm1-redis1    1 core          12G   10G   lan       不使用磁盘持久化,redis只能利用1个core
vm1-netty1    4 core          6G    40G   lan

通过上述图表就可以清楚资源的规划和调配了,这样你服务器的采购配置表也出来了.

Related articles