• 1. 几种不同虚拟技术的 隔离性 韦远科 weiyuanke123#gmail.com
  • 2. 虚拟化技术全虚拟化, vmware, kvm 半虚拟化,xen 操作系统级虚拟化, java虚拟机
  • 3. 隔离性隔离性是虚拟机性能的重要指标,尤其是对商业 hosting, 如 VPS、VDS 等来说,虚拟机能否把各个 VPS 合理的隔开 并让物理机器上的每个 VPS 能按照事先约好的定义(如 CPU/RAM/DISK 等)公平而且充分的利用物理服务器资源
  • 4. 理论隔离性全虚拟化 > 半虚拟化 > 操作系统级虚拟化
  • 5. 测试方法首先确定一些 baseline 数据,然后做 stress 测试 把1台物理机器分成4个虚拟机,每个虚拟机上运行1个 apache web server + SPECweb 2005 组合来得到 baseline 数据。 然后做 stress 测试,这个时候在其中1台虚拟机上增加 stress测试,来测试这个 stress 加上去以后对原有的虚拟机有多大影响。
  • 6. 测试对象CPU Intensive Fork Bomb Memory Intensive Disk Intensive:用 IOzone 工具,开10个线程,每个线程不停的进行交替读写操作(iozone -i0 -i1 -r 4 -s 100M -t 10 -Rb); Network Intensive :开4个线程,每个线程不停的发送 60K 大小的 UDP 包; Network Intensive (Receive):开4个线程,每个线程不停的接受 60K 大小的 UDP 包。
  • 7. 测试结果
  • 8. kVM虚拟机IO优化
  • 9. (本页无文本内容)
  • 10. 采用raw镜像格式 qcow2 < raw 采用半虚拟化virtio接口 ide < virtio 设置磁盘缓存为writeback writethrough < none < writeback (4) qcow2格式下,采用预分配策略 qemu-img create -f qcow2 -o preallocation=metadata centos_test0_preallc.qcow2 20G (5) 在虚拟机中elevator=noop 宿主机中elevator=deadline (6) 文件系统noatime, nodiratime writethrough: O_SYNC I/O NONE: O_DIRECT I/O
  • 11. 测试结果kvm -m 1024 -drive file=test.img,cache=writeback,if=virtio -net nic -net tap -usb -usbdevice tablet -vnc :1 采用dd命令 dd if=/dev/zero of=..... bs=.. count= .. 优化之后: 读/写194/77.3 优化之前: 读/写143/62
  • 12. kVM虚拟机IO性能测试
  • 13. 测试环境宿主机:16核CPU,5G内存,4T硬盘(grub选项mem=5G) 虚拟机:1 VCPU, 5G内存,50G硬盘
  • 14. 宿主机IO测试数据cnic@node74:~$ sudo tune2fs -l /dev/sda2|grep Block Block count: 479978271 Block size: 4096 Blocks per group: 32768
  • 15. 虚拟机IO测试数据
  • 16. 结果对比
  • 17. 一致性哈希算法
  • 18. 应用场景考虑系统的容错性和可扩展性 如何将web server的每次访问,分发到不同的memcache服务器上??
  • 19. 扩展性采用如下的哈希 h = Hash(key) % 3 key0: 1# key1: 2# key2: 3# key3: 1# key4: 2# key5: 3# key6: 1# key7: 2# ... ...当4#服务器加入后 h = Hash(key)%4 key0: 1# key1: 2# key2: 3# key3: 4# key4: 1# key5: 2# key6: 3# key7: 4# ... ...
  • 20. from hashlib import md5 from struct import unpack_from NODE_COUNT = 100 NEW_NODE_COUNT = 101 DATA_ID_COUNT = 10000000 moved_ids = 0 for data_id in xrange(DATA_ID_COUNT): data_id = str(data_id) hsh = unpack_from('>I', md5(str(data_id)).digest())[0] node_id = hsh % NODE_COUNT new_node_id = hsh % NEW_NODE_COUNT if node_id != new_node_id: moved_ids += 1 percent_moved = 100.0 * moved_ids / DATA_ID_COUNT print '%d ids moved, %.02f%%' % (moved_ids, percent_moved) 9900989 ids moved, 99.01%
  • 21. 使用一致性哈希解决上述问题1. 首先求出每个memcache的哈希值,并将其配置到一个0~2^32的圆环区间上。 2. 使用同样的方法求出需要存储对象key的哈希值,也将其配置到这个圆环上。 3. 从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个memcache节点上。如果超过2^32仍然找不到Cache节点,就会保存到第一个memcache节点上。
  • 22. (本页无文本内容)
  • 23. 假设在这个环形哈希空间中,Cache5被映射在Cache3和Cache4之间,那么受影响的将仅是沿Cache5逆时针遍历直到下一个Cache(Cache3)之间的对象(它们本来映射到Cache4上)。
  • 24. 假设在这个环形哈希空间中,Cache3被移除,那么受影响的将仅是沿Cache3逆时针遍历直到下一个Cache(Cache2)之间的对象(它们本来映射到Cache3上)。
  • 25. 一致性哈希在swift中的应用swift的数据映射文件: account.ring.gz object.ring.gz container.ring.gz
  • 26. 非关系型数据库
  • 27. 关系数据库存在的问题High performance - 对数据库高并发读写的需求 2、Huge Storage - 对海量数据的高效率存储和访问的需求 3、High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求 在基于web的架构当中,数据库是最难进行横向扩展的 关系数据库的优势又无法体现 数据库事务一致性需求 2、数据库的写实时性和读实时性需求 3、对复杂的SQL查询,特别是多表关联查询的需求
  • 28. 非关系数据库为了解决这类问题的非关系数据库应运而生: Redis,Tokyo Cabinet,Cassandra,Voldemort MongoDB,Dynomite,HBase,CouchDB,Hypertable Riak,Tin, Flare, Lightcloud, KiokuDB,Scalaris, Kai ThruDB, ...... 特别是键值数据库(Key-Value Store DB)
  • 29. (本页无文本内容)
  • 30. 非关系数据库分类满足极高读写性能需求的Kye-Value数据库:Redis,Tokyo Cabinet, Flare redis:数据库在内存中,依赖与客户端实现分布式读写 二、满足海量存储需求和访问的面向文档的数据库:MongoDB,CouchDB Mongo主要解决的是海量数据的访问效率问题 三、满足高可扩展性和可用性的面向分布式计算的数据库:Cassandra,Voldemort Cassandra由一堆数据库节点共同构成的一个分布式网络服务
  • 31. (本页无文本内容)
  • 32. read/update results
  • 33. mapreduce results
  • 34. CassandraCassandra是一款混合的非关系型数据库,和Google的BitTable数据库属于同一类。此数据库比键/值数据库功能更多,但相比一个文档存储数据库(例如MongoDB),它所支持的查询类型要少。 它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。 快速查询,无单点故障,集群高度可扩展和易管理
  • 35. Cassandra
  • 36. Mongodb MongoDB是一个基于分布式文件存储的数据库开源项目,是一个介于关系数据库和非关系数据库之间的产品。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。 Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 面向集合, 模式自由, 文档被存储为键-值对形式 很高的可扩展性 – 轻轻松松就可实现PB级的存储
  • 37. Mongodb为什么Flowdock从Cassandra迁移到MongoDB ? 我们遭遇到了Cassandra的稳定性问题.所有的节点都陷入无线无限循环(infinite loop),运行垃圾回收工作(GC, Garbage Collection)并尝试压缩数据文件-并偶尔导致集群瘫痪.除了对集群进行重启并经常性的手工对节点做压缩工作以让其稳定一会外,我们无计可施. 1. 智能(多键)索引. MongoDB可以自动帮我们维护所需的索引. 2. Map-Reduce. MongoDB的Map-Reduce功能支持虽然不是非常完美,但它起码很易用. 3. GridFS让我们的文件存储操作变得非常容易. 运行还非常平稳. 开发人员与数据库管理员的工作也因此减轻了很多
  • 38. 一个典型的mongodb集群
  • 39. mongos> db.runCommand({addshard: "127.0.0.1:27020", allowLocal:1, maxSize:2, minKey:1, maxKey:10}) { "shardAdded" : "shard0000", "ok" : 1 } mongos> db.runCommand({addshard: "127.0.0.1:27021", allowLocal:1, maxSize:2, minKey:1, maxKey:10}) { "shardAdded" : "shard0001", "ok" : 1 } mongos> db.runCommand({listshards:1}) { "shards" : [ { "_id" : "shard0000", "host" : "127.0.0.1:27020", "maxSize" : NumberLong(2) }, { "_id" : "shard0001", "host" : "127.0.0.1:27021", "maxSize" : NumberLong(2) } ], "ok" : 1 }
  • 40. mongos> db.posts1.stats() { "sharded" : true, "flags" : 1, "ns" : "dnt_mongodb.posts1", "count" : 0, ... ... "shards" : { "shard0000" : { "ns" : "dnt_mongodb.posts1", "count" : 0, "size" : 0, "storageSize" : 8192, "numExtents" : 1, "nindexes" : 1, "lastExtentSize" : 8192, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 8176, "indexSizes" : { "_id_" : 8176 }, "ok" : 1 } }, "ok" : 1 }