订阅云计算RSS CSDN首页> 云计算

性能测试:SequoiaDB vs. MongoDB vs. Cassandra vs. HBase

发表于2014-09-22 14:58| 次阅读| 来源CSDN| 0 条评论| 作者云知秋

摘要:NoSQL通过弱化一部分关系型数据库特性(如一致性和关系模型)来提升其可扩展性及高可用性,弥补了关系型数据库在很多互联网类应用中的不足。因此,不同的NoSQL有着不同的杀手级应用,这里我们通过基准测试摸索。

附录A:配置信息

1. MongoDB

MongoDB的分片分布如图9,不同颜色代表不同的分片,我们采用的是多个副本的分片


MongoDB的部署脚本如下(deploy.sh):

#!/bin/bash
ssh perftest-1 "mongod --configsvr --logpath /data/disk1/mongodb-cfg/configsvr.log --dbpath /data/disk1/mongodb-cfg/ --port 37019 --journal --fork"
ssh perftest-2 "mongod --configsvr --logpath /data/disk1/mongodb-cfg/configsvr.log --dbpath /data/disk1/mongodb-cfg/ --port 37019 --journal --fork"
ssh perftest-3 "mongod --configsvr --logpath /data/disk1/mongodb-cfg/configsvr.log --dbpath /data/disk1/mongodb-cfg/ --port 37019 --journal --fork"

ssh perftest-1 "mongos --configdb perftest-0:37019,perftest-1:37019,perftest-2:37019 --logpath /data/disk1/mongodb-data/mongos.log --fork"
ssh perftest-2 "mongos --configdb perftest-0:37019,perftest-1:37019,perftest-2:37019 --logpath /data/disk1/mongodb-data/mongos.log --fork"
ssh perftest-3 "mongos --configdb perftest-0:37019,perftest-1:37019,perftest-2:37019 --logpath /data/disk1/mongodb-data/mongos.log --fork"
ssh perftest-4 "mongos --configdb perftest-0:37019,perftest-1:37019,perftest-2:37019 --logpath /data/disk1/mongodb-data/mongos.log --fork"


hostno=0
hosts=("perftest-1" "perftest-2" "perftest-3" "perftest-4")
disknos=(1 1 1 1)
port=37017
for((i=0;i<8;++i))
do
   for ((j=0;j<3;++j))
   do
     ssh ${hosts[$hostno]} "mongod --replSet dg$i --logpath /data/disk${disknos[$hostno]}/mongodb-data/mongd.log --dbpath /data/disk${disknos[$hostno]}/mongodb-data/ --logappend --quiet --port $port --fork"

      let disknos[$hostno]=${disknos[$hostno]}+1
      let hostno=hostno+1
      if [ $hostno -eq ${#hosts[@]} ];then
         let hostno=0
      fi
   done
   let port=port+10

done
MongoDB的分片添加脚本如下(addshard.js):

var port=37017
var hosts=[" perftest-1"," perftest-2"," perftest-3"," perftest-4"];
var hostid=0;
for(i=0;i<8;++i)
{
   var conf = new Object();
   conf._id = 'dg'+i;
   conf.members = new Array();
   for (j=0;j<3;++j)
   {
      var member = new Object();
      member._id = j;
      member.host = hosts[hostid] + ":" + port;
      conf.members[j] = member;
      hostid=hostid+1;
      if (hostid == hosts.length)
      {
         hostid = 0;
      }
   }
  var db = connect(conf.members[0].host +"/test");
  rs.initiate(conf);
  rs.conf();
  port = port + 10
  var db2 = connect(conf.members[0].host + '/test');
  sh.addShard('dg'+i+'/'+conf.members[0].host )
}
MongoDB的集合创建脚本如下(createcl.sh):

mongo <<EOF
sh.stopBalancer();
use ycsb;
db.dropDatabase();
use admin;
db.runCommand({enableSharding:"ycsb"});
use admin;
db.runCommand({shardcollection:"ycsb.usertable",key:{_id:'hashed'},numInitialChunks:4096});
exit
EOF

所有的writeConcern都为normal。

2. SequoiaDB

SequoiaDB的数据组分布情况如图10,其中不同颜色代表不同的分片。

SequoiaDB的部署脚本如下(deploy.js):

try
{
   var db = new Sdb();
   db.createCataRG('perftest-1',11820,'/opt/sequoiadb/database/cata/11820');
   db.getRG(1).createNode('perftest-2',11820,'/opt/sequoiadb/database/cata/11820');
   db.getRG(1).createNode('perftest-3',11820,'/opt/sequoiadb/database/cata/11820');
   db.getRG(1).getNode('perftest-2',11820).start();
   db.getRG(1).getNode('perftest-3',11820).start();

   // group number is 8
   var port=11830;
   var hostid = 0;
   var diskno = 1;
   var diskids = [1,1,1,1];
   for(i=0;i<8;++i)
   {
      db.createRG('dg'+i);
      // 3 nodes of per group
      for (j=0;j<3;++j)
      {
         db.getRG('dg'+i).createNode('perftest-'+( hostid+1), port,'/data/disk' + diskids[hostid] + '/sequoiadb/database/data'+port);
         diskids[hostid] += 1;
         hostid += 1;
         if (hostid > 3)
         {
            hostid = 0;
         }
      }
      db.getRG('dg'+i).start();
      port += 10;
   }
}catch(e)
{
   throw e;
}
创建分区集合的脚本如下(createcl.js):

try
{
   var db = new Sdb()
   db.dropCS('ycsb')
}catch(e)
{
   if (e != -34)
   {
      throw "drop cs failure" + e;
   }
}

try
{
   db.createCS('ycsb')
   db.ycsb.createCL('usertable',{ShardingType:'hash',ShardingKey:{_id:1},EnsureShardingIndex:false})
   var snapshot8 = db.snapshot(8,{Name:'ycsb.usertable'}).toArray();
   var obj = eval ( "(" + snapshot8[0] + ")" );
   var srcgroup = obj["CataInfo"][0]["GroupName"];
   var partition = obj["Partition"];

   var groupnames = new Array()
   var groups = db.list(7).toArray();
   for(i=0;i<groups.length;++i)
   {
      var group = eval("(" + groups[i] + ")");
      if (group["GroupName"] == "SYSCatalogGroup")
      {
         continue;
      }
      groupnames.push(group["GroupName"]);
   }

   var remainderpart = partition % groupnames.length ;
   var part = (partition - remainderpart) / groupnames.length
   for(i=0;i<groupnames.length;++i)
   {
      if (groupnames[i] == srcgroup )
      {
         continue;
      }
      println("spliting from " + srcgroup + " to " + groupnames[i]+ "........");
      db.ycsb.usertable.split(srcgroup, groupnames[i], {Partition: (i*part)},{Partition:(i+1)*part});
      if (remainderpart > 1)
      {
         db.ycsb.usertable.split(srcgroup, groupnames[i], {Partition: endpart},{Partition: (endpart + 1)})
         endpart += 1;
         remainderpart -= 1;
      }
   }
}catch(e)
{
   throw e;
}

3. HBase

HBase的数据分布情况如图11:

图11:HBase部署架构图

创始表语句使用:

create 'usertable', 'cf', {SPLITS => ['user1', 'user2', 'user3', 'user4', 'user5', 'user6', 'user7', 'user8', 'user9' ]}

5.4Cassandra

图12是一个Cassandra四节点集群。我们采用使用二十四块硬盘同时处理数据和提交日志。


图12:Cassandra部署架构图

与测试的其他数据库不同,Cassandra 在配置中使用环形拓扑,节点需要被明确地视为“种子”节点(这有助于它们加入到环中)。在配置时,必须指定哪些令牌将映射到哪些实例。

我们使用了 https://raw.github.com/riptano/ComboAMI/2.2/tokentoolv2.py提供的令牌生成工具来创建节点配置。 

$ ./tokentoolv2.py 4 
{ 
"0":{ 
"0":0, 
"1":42535295865117307932921825928971026432, 
"2":85070591730234615865843651857942052864, 
"3":127605887595351923798765477786913079296 
} 
} 

Cassandra 的一致性级别可以调节。每次读取和写入都可以明确地说明该操作需要什么级别的数据库一致性。由于这是一个基准测试项目,因此我们使用了最弱和最快的一致性级别(ONE)来进行读取和写入。

对于所有数据库,我们使用的复制因子都是 2。其他主要设置为: 

内容
分区工具 RandomPartitioner
初始令牌空间 2^127 / 4
内存表空间 4GB
并发读取 48
并发写入 48
压缩 SnappyCompressor
提交日志同步 10000 ms
以下内容为 conf/cassandra.yaml 的设置:

cluster_name: 'Test'
initial_token: 0 

hinted_handoff_enabled: true
max_hint_window_in_ms: 3600000 # one hour
hinted_handoff_throttle_delay_in_ms: 1
authenticator: org.apache.cassandra.auth.AllowAllAuthenticator
authority: org.apache.cassandra.auth.AllowAllAuthority
partitioner: org.apache.cassandra.dht.RandomPartitioner
data_file_directories:
    - /data/disk1/cassandra-data
    - /data/disk2/cassandra-data
    - /data/disk3/cassandra-data
    - /data/disk4/cassandra-data
    - /data/disk5/cassandra-data
    - /data/disk6/cassandra-data

commitlog_directory: 
     /data/disk1/cassandra-log/,/data/disk2/cassandra-log/,/data/disk3/cassandra-log/,/data/disk4/cassandra-log/
     ,/data/disk5/cassandra-log/,/data/disk6/cassandra-log/

saved_caches_directory: /data/disk1/apache-cassandra/saved_caches
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000

seed_provider:
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameter s:
          - seeds: "192.168.30.62,192.168.30.64,192.168.30.65,192.168.30.67"


flush_largest_memtables_at: 0.75

reduce_cache_sizes_at: 0.85
reduce_cache_capacity_to: 0.6

concurrent_reads: 48
concurrent_writes: 48

memtable_flush_queue_size: 4

sliced_buffer_size_in_kb: 64

storage_port: 7000

ssl_storage_port: 7001

listen_address: 192.168.30.62 

rpc_address: 0.0.0.0 
rpc_port: 9160

rpc_keepalive: true

rpc_server_type: sync
thrift_framed_transport_size_in_mb: 15

thrift_max_message_length_in_mb: 16

incremental_backups: false

snapshot_before_compaction: false
column_index_size_in_kb: 64

in_memory_compaction_limit_in_mb: 64

multithreaded_compaction: false

compaction_throughput_mb_per_sec: 16

compaction_preheat_key_cache: true

rpc_timeout_in_ms: 10000
endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch

dynamic_snitch_update_interval_in_ms: 100 

dynamic_snitch_reset_interval_in_ms: 600000
dynamic_snitch_badness_threshold: 0.1
request_scheduler: org.apache.cassandra.scheduler.NoScheduler

index_interval: 128

encryption_options:
    internode_encryption: none
    keystore: conf/.keystore
    keystore_password: cassandra
    truststore: conf/.truststore
    truststore_password: cassandra
使用以下命令对数据库进行初始化: 

CREATE KEYSPACE usertable 
WITH placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' AND strategy_options = {replication_factor:2}; 
use usertable; 
CREATE COLUMN FAMILY data WITH comparator = UTF8Type 
AND key_validation_class = UTF8Type


免费订阅“CSDN云计算(左)CSDN大数据(右)”微信公众号,实时掌握第一手云中消息,了解最新的大数据进展!

CSDN发布虚拟化、Docker、OpenStack、CloudStack、数据中心等相关云计算资讯,     分享Hadoop、Spark、NoSQL/NewSQL、HBase、Impala、内存计算、流计算、机器学习和智能算法等相关大数据观点,提供云计算和大数据技术、平台、实践和产业信息等服务。   

  • CSDN官方微信
  • 扫描二维码,向CSDN吐槽
  • 微信号:CSDNnews
程序员移动端订阅下载

微博关注

相关热门文章