Azure Cosmos DB 简测

2022-04-14 00:00:00 数据 代码 测试 写入 区域

CommosDB现在能支持5种API ,支持DocumentDB API 、MongoDB API 、Graph API 、表 API  、Cassandra API 。对于各种API 和语言支持情况,如下:

cosmosDB 是一个分布式数据库,可以全球范围数据同步,达到毫秒级,并且保证一致性保证。

是我来创建一个cosmosdb,测试下 cosmosdb,是不是能做到这样的水平,是不是吹牛来着 。

季测试,我们测试Document DB,

首先创建一个基于SQL API的CosmosDB

在全球复制上,我选了多个区域,一致性默认的是:会话

为了测试简单,我使用标准的sample代码。点击快速入门,默认创建了items集合

本人喜欢.net代码,所以测试使用.net代码。

1、这里下载的示例直接运行是不会成功的。 需要安装NuGet 包。在 Visual Studio 中,右键单击解决方案资源管理器中的项目,并单击“管理 NuGet 包”。

2、在 NuGet“浏览”框中,键入 DocumentDB。

3、从结果中安装“Microsoft.Azure.DocumentDB”库。 这会安装 Microsoft.Azure.DocumentDB 包以及所有依赖项

如果导入失败,报告400错误什么的,建议更换程序包源,:

编译通过后,就可以生成如下这样的应用。

我创建了3个站点来进行测试, 分别在 澳大利亚东南部、美国中部、日本东部。

修改代码:DocumentDBRepository.cs

添加三个区域,每个区域的站点分别都本数据中心的数据。 下面是日本站点的代码

ConnectionPolicy connectionPolicy = new ConnectionPolicy();
// connectionPolicy.PreferredLocations.Add(LocationNames.EastUS); // second preference
//connectionPolicy.PreferredLocations.Add(LocationNames.AustraliaSoutheast); // second preference
connectionPolicy.PreferredLocations.Add(LocationNames.JapanEast); // third preference

同理可以分别发布美国和澳大利亚的代码


ConnectionPolicy connectionPolicy = new ConnectionPolicy();
connectionPolicy.PreferredLocations.Add(LocationNames.EastUS); // second preference
//connectionPolicy.PreferredLocations.Add(LocationNames.AustraliaSoutheast); // second preference
//connectionPolicy.PreferredLocations.Add(LocationNames.JapanEast); // third preference

ConnectionPolicy connectionPolicy = new ConnectionPolicy();
// connectionPolicy.PreferredLocations.Add(LocationNames.EastUS); // second preference
connectionPolicy.PreferredLocations.Add(LocationNames.AustraliaSoutheast); // second preference
//connectionPolicy.PreferredLocations.Add(LocationNames.JapanEast); // third preference

由于次是肉测,所以我也写了一个简单的页面


<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8" />
   <title></title>
   
</head>
<body>
 
   <table width="">
       <tr>
           <td><iframe id="if1" name="iframe1" frameborder= marginheight= marginwidth= scrolling=no src="http://australiasoutheast.azurewebsites.net/" width="" height="500px"></iframe></td>
           <td><iframe id="if2" name="iframe2" frameborder= marginheight= marginwidth= scrolling=no src="http://japaneasttest.azurewebsites.net/" width="" height="500px"></iframe></td>
       </tr>
       <tr>
           <td><iframe id="if3" name="iframe3" frameborder= marginheight= marginwidth= scrolling=no src="http://esus01.azurewebsites.net/" width="" height="500px"></iframe></td>
           <td>
               <input type="button" onclick="flush();"  value="刷新" />
           </td>
       </tr>
   </table>
   <script type="text/javascript">
       function flush() {
           document.getElementsByName("iframe1").iframe1.src = document.getElementsByName("iframe1").iframe1.src;
           document.getElementsByName("iframe2").iframe2.src = document.getElementsByName("iframe2").iframe2.src;
           document.getElementsByName("iframe3").iframe3.src = document.getElementsByName("iframe3").iframe3.src;
           setTimeout("flush()", 1000);
       }
       
   </script>
</body>
</html>

此页面一秒钟刷新一次,在任意一个站点输入数据。观察数据同步情况。

从肉测来看,数据是同步的,每一笔数据写入后,读出数据同步。但是毕竟是肉测无法确定是不是毫秒级。 从系统提供的监视来看如下:

读取延迟,SLA是提供10ms的延迟,实际是读取是不到2ms,写入延迟提供15ms的SLA,实际是不到8ms的延迟。

但是此数据是小量写入,而且无压力可言。因此可以搞一个压力测试。测试如下。下载测试代码

https://github.com/Azure/azure-documentdb-dotnet/tree/master/samples/documentdb-benchmark

创建了一个测试数据集 sample

使用了大的性能的RU/S,会很贵。基本上一天要几百美金。一个月6000美金

使用此工具写入200000条结果集,在我的本机进行写入的性能是这样的:

可以说差的一塌糊涂。 20万条数据写了10多分钟。每秒写入206,差就一个字。

我突然想到是不是我们伟大的国度的网络问题,因此我到azure.com开了一台虚拟机,再来测试,发现结果如下

结果是快了10倍!10倍啊!

20万笔不到2分钟写完。这个结果是不错的。同时同步到全球的结果集是怎么样的情况,再看看指标。

从指标看是很完美的。但是本测试只是从指标来看。

数据集总条目:

从简单的测试虽然不能确认同步读取的时间,一致性问题。有5种级别的一致性,目前测试的是会话。因此需要测试的内容非常多。

不过从简单的测试来看,我认为cosmosdb确实可以实现分布式的数据库,毫秒级同步,全球范围内部署你的应用。适合于构建全球的网站。 而国内的应用来看就比较尴尬,因为只有2个点,作为应用的负载分配来说,感觉没有多大的意义。其他的数据库都可以实现。

另外CosmosDB 也是一个写入区域,多个读取区域,优点在于同步速度毫秒级,可以在全球30多个数据中心分发数据。如果要实现多点写入,多区域读取,可以通过分区的方法来从业务层面来实现。 在文档中也有说明和介绍。

相关文章