C#和NewSQL更配 —— CockroachDB入门

一、CockroachDB是什么

  CockroachDB(https://www.cockroachlabs.com)是Google备受瞩目的Spanner的开源模仿,承诺提供一种高存活性、强一致性,可横向扩展的SQL数据库。主要的设计目标是全球一致性和可靠性,从蟑螂(cockroach)的命名上是就能看出这点 [ 打不死的小强:) ]。Cockroach节点是均衡的,其设计目标是同质部署(只有一个二进制包)且最小配置。CockroachDB的扩展非常容易,只要一行命令,秒级进行。

 


二、环境部署

  官方文档写的非常详细,按照做就好了。部署的文档(https://www.cockroachlabs.com/docs/stable/install-cockroachdb.html),笔者在CentOS上直接使用Binary的方式进行的部署。

  安装完之后开始启动CockroachDB了,启动命令参考文档(https://www.cockroachlabs.com/docs/stable/start-a-node.html)。

  

cockroach start --insecure \--store=hello-1 \--host=192.168.118.21

  

  解释下这行命令:启动一个CockroachDB的节点,存储位置为安装所在目录下的hello-1,并且使用192.168.118.21进行host,如果需要还可以指定管理站点的端口和数据库对外端口,对应的参数为 --port = 26257(默认值)、--http-port = 8080(默认值)

  OK,启动完之后可以在浏览器输入host中指定的IP:端口进入到管理站点,界面如下图1:

 

                           【图1】

 


三、实战

  在真正的使用C#代码调用之前首先先创建一个账户,使用cockroach user 命令。需要注意的是,如果之前在启动节点时指定了ip和端口,那么同样需要进行指定。同样的,再创建一个数据库并且给创建的账户设置权限。代码如下:

 

cockroach user set testaccount --insecure --host=192.168.118.21cockroach sql --insecure -e 'CREATE DATABASE test' --host=192.168.118.21cockroach sql --insecure -e 'GRANT ALL ON DATABASE test TO testaccount'  --host=192.168.118.21

 

  其实在安装完CockroachDB之后会自带SQL Client,在这个上面可以运行所有的SQL语句。当然我们这里暂时不讨论这个,有兴趣的小伙伴可以转到(https://www.cockroachlabs.com/docs/stable/use-the-built-in-sql-client.html)。

  由于CockroachDB支持PostgreSQL的协议,所以我们可以使用C#下比较热门的PostgreSQL驱动,下载地址:https://github.com/npgsql/npgsql 。我们需要使用的其实就是其中的npgsql项目编译出来的dll。好了,开始创建一个表并初始化2条数据:

  using (var conn = new NpgsqlConnection("Server=192.168.118.21;PORT=26257;User ID=testaccount;Password=testaccount;Database=test;Timeout=0;Command Timeout=0")){conn.Open();conn.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS accounts (id INT PRIMARY KEY, balance INT)");                using (var cmd = new NpgsqlCommand("INSERT INTO accounts (id, balance) VALUES (1, 1000), (2, 250)",conn)){cmd.ExecuteNonQuery();}}

 

  可以看到建表的语句所支持的语法和SQL SERVER还是有一些差别的,可以直接在CREATE TABLE 后面跟判断表是否存在。好了,执行完可以点击管理站点左上角的“DATABASES”选项卡,就可以看到下面的数据库(test)和表(accounts)了,图2:

                            【图2】

   好,我们来尝试着读取的一下数据:

  using (var conn = new NpgsqlConnection("Server=192.168.118.21;PORT=26257;User ID=testaccount;Password=testaccount;Database=test;Timeout=0;Command Timeout=0")){conn.Open();           
       
using (var cmd = new NpgsqlCommand("SELECT id, balance FROM accounts", conn)){    
              
using (var reader = cmd.ExecuteReader(Behavior)){                      
                          
while (reader.Read()){ Console.WriteLine(@" reader[id] is {0}", reader["id"]);Console.WriteLine(@" reader[balance] is {0}", reader["balance"]);}}}}

  这里需要注意一点的是。npgsql如果使用连接字符串的方式来初始化连接,那么其默认的连接模式为连接池模式。在此模式下,一但创建的NpgsqlConnection被Dispose()一次之后,后续哪怕再继续实例化一个新的NpgsqlConnection也会报错。如果要使用这种短链接的方式,需要使用NpgsqlConnectionStringBuilder来进行连接的实例化,并且指定 Pooling = true ,如下。

  var connString = new NpgsqlConnectionStringBuilder("Server=192.168.118.21;PORT=26257;User ID=testaccount;Password=testaccount;Database=test;Timeout=0;Command Timeout=0"){Pooling = true}.ToString(); 
using (var conn = new NpgsqlConnection(connString))

 

四、性能测试

  测试客户端机器是 4核 i5-4300U,数据库所在的机器是 8核 Xeon(R) E5630。为了做一个相应的对比,我在CockroachDB所在的机器装了SQL Server 2017 on Lunix、另外也用了装在同等配置下的windows服务器上的SQL SERVER2008进行对比。见图3(点击图片可查看大图):

 

                               【图3】

  大家可以着重看数据库响应时间那列,这里的时间是纯的数据库响应+2次网络I/O的时间,减少数据库访问SDK对结果的影响。但是很明显从”线程时间列“中看出nqgsql中对连接的开销比.net framework中的sqlconnection还是大了2个数量级,所以我们在运用的时候需要考虑封装一层连接池来实现。

  测试结果得出的结论是:CockroachDB在长连接模式下的性能是SQL SERVER的3倍以上,其它场景完全没法用,所以如果要运用CockroachDB还是要围绕这个模式去做。另外SQL SERVER在自家Windows和Lunix上还是有些小差异的,都使用默认设置,性能上高出几个百分点,当然SQL SERVER的版本不同可能也会带来一些影响,这里没有继续深入测试,结果仅供参考。

 

五、结语

  再做上面的一系列工作中,也对CockroachDB的一些信息做了更深入的了解。其目前主要还是围绕着开头说的”可伸缩、跨地域(全球)复制且兼容事务的 ACID 特性的分布式数据库“来做,并不适用于复杂Join或者OLAP型需求的场景。不过其还很年轻,目前只有3岁,从github上的热度来看,其未来的发展还是前途一篇光明的,并且谷歌在Go语言上的投入对CockroachDB的受益是直接的,所以保持持续的关注。

  另外如果各位的确有跨机房多数据中心的需求,并且几个机房的位置离的不远,能够对NTP(如果对CockroachDB的基于NTP的实现HLC感兴趣,可以转到这篇文章:http://www.jianshu.com/p/8500882ab38c)的时钟误差控制在一定可以接受的范围内,我认为还是值得一试的。毕竟动态扩容和rebalance真的是你手指动动秒秒钟的事情,运维成本非常低。


相关文章:

  • Cockroach DB 1.0发布

  • 详解CockroachDB事务处理系统

原文地址:http://www.cnblogs.com/Zachary-Fan/p/cockroachdb_net_csharp.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot+layui从控制器请求至页面时js失效的解决方法

大家好,我是雄雄,欢迎关注公众号【雄雄的小课堂】。 昨天遇到了个很棘手的问题,其实也怪自己大意了,然后翻来覆去一个类一个类的去看,看完之后挨个技术点怀疑,然后分别从各个技术点入手解决,但…

JfreeChart(八)之甘特图

转载自 JfreeChart实现甘特图 一、甘特图简介 甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利L甘特先生的名字命名。 甘特图内在思想简单,即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的活动顺序与持续时间。基本是一条…

springboot从控制器请求至页面时js失效的解决方法

大家好,我是雄雄,欢迎关注公众号【雄雄的小课堂】。昨天遇到了个很棘手的问题,其实也怪自己大意了,然后翻来覆去一个类一个类的去看,看完之后挨个技术点怀疑,然后分别从各个技术点入手解决,但都…

ASP.NET Core 源码学习之 Options[2]:IOptions

在 上一篇 中&#xff0c;介绍了一下Options的注册&#xff0c;而使用时只需要注入 IOption 即可&#xff1a; public ValuesController(IOptions<MyOptions> options){ var opt options.Value; } IOptions IOptions 定义非常简单&#xff0c;只有一个Value属性&a…

Java自动化邮件中发送图表(三)之Highchart

一、Highchart &#xff08;1&#xff09;Highchart.js Highcharts 是一个用纯JavaScript编写的一个图表库。能够很简单便捷的在web网站或是web应用程序添加有交互性的图表。 &#xff08;2&#xff09;highcharts-serverside-export Highcharts Serverside Export框架&…

【2018.5.19】模拟赛之一-ssl2432 面积最大【数学】

正题 大意 解题思路 沟谷定理可以用半径求出高度&#xff0c;然后暴力枚举就好了 公式&#xff1a; ahr2−(a/2)2−−−−−−−−−√∗2ahr2−(a/2)2∗2bhr2−(b/2)2−−−−−−−−−√∗2bhr2−(b/2)2∗2然后计算两个的面积去掉重复的 Sa∗ahb∗bh−a∗bSa∗ahb∗bh−a…

thymeleaf如何迭代遍历,如何判断

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。最近&#xff0c;换了个桌面手机的也同步换了下&#xff1a;哈哈哈&#xff0c;自己看着舒服就行~这几天在业余时间搞一个电商项目&#xff0c;可以说是边学边做&#xff0c;效率比较低&#xff0c;但是…

ASP.NET Core MVC Tag Helpers 介绍

简介 Tag Helpers 提供了在视图中更改和增强现有HTML元素的功能。将它们添加到视图中&#xff0c;会经过Razor模板引擎处理并创建一个HTML&#xff0c;之后再返回给浏览器。有一些Tag Helpers&#xff0c;其实作为元素或实际的标签&#xff08;如environment&#xff0c;cache…

layui结合springboot上传图片

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号**【雄雄的小课堂】**。 最近实在是忙的抽不开身&#xff0c;并且身上也出现了一堆的毛病&#xff0c;今天牙疼&#xff0c;明天脊椎疼&#xff0c;然后接着又头疼……年纪轻轻的&#xff0c;咋这么多毛病呢&#xff1f;…

C#使用Xamarin开发可移植移动应用(1.入门与Xamarin.Forms页面),附源码

前言 什么是Xamarin? Xamarin始创于2011年&#xff0c;旨在使移动开发变得难以置信地迅捷和简单。 Xamarin的产品简化了针对多种平台的应用开发&#xff0c;包括iOS、Android、Windows Phone和Mac App。 Xamarin由许多著名的开源社区开发者创立和参与&#xff0c;而且也是…

Java不需要使用Javafx的Application也能将Node导出图片

一、Java通用导出Javafx Chart图片 Javafx不需要使用Application也能导出图片&#xff0c;使用PlatformImpl.startup方法初始化Javafx的Toolkit。 Javafx API并不是所有机器都支持的&#xff0c;Node导出图片不一定成功。&#xff08;如&#xff1a;无法初始化Javafx的Toolki…

layui上传图片,前端直接拷代码,后端……

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。最近实在是忙的抽不开身&#xff0c;并且身上也出现了一堆的毛病&#xff0c;今天牙疼&#xff0c;明天脊椎疼&#xff0c;然后接着又头疼……年纪轻轻的&#xff0c;咋这么多毛病呢&#xff1f;我也在…

ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot

2017-06-28 更新&#xff1a;OptionsSnapshot 已改为 OptionsManager 变更详情IOptionsCache 已改为 IOptionsMonitorCache 变更详情 在 上一章 中&#xff0c;介绍了 IOptions 的使用&#xff0c; 而我们知道&#xff0c;在 ConfigurationBuilder 的 AddJsonFile 中&#xff0…

layui结合ajax实现下拉联动效果

大家好好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。 昨天分享的是使用layui集合springboot实现图片上传&#xff0c;文章地址在这里&#xff0c;需要的小伙伴们可以去看看&#xff1a; 今天给大家分享的内容也是那天在造项目的时候完成的&am…

ASP.NET Core MVC – Caching Tag Helpers

简介 缓存可以大大提高应用程序加载时间和响应速度。我们可以使用缓存Tag Helpers缓存不会频繁更改的HTML内容。 在上一篇文章ASP.NET Core MVC Tag Helpers 介绍中&#xff0c;我们谈到了Tag Helpers&#xff0c;演示Tag Helpers能做什么、如何使用它们以及一些最常用的Tag …

layui结合ajax实现下拉菜单联动效果

大家好好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。昨天分享的是使用layui集合springboot实现图片上传&#xff0c;文章地址在这里&#xff0c;需要的小伙伴们可以去看看&#xff1a;今天给大家分享的内容也是那天在造项目的时候完成的&#x…

ASP.NET Core 源码学习之 Options[4]:IOptionsMonitor

前面我们讲到 IOptions 和 IOptionsSnapshot&#xff0c;他们两个最大的区别便是前者注册的是单例模式&#xff0c;后者注册的是 Scope 模式。而 IOptionsMonitor 则要求配置源必须是可监听的&#xff0c;用来实现 Options 实例的自动更新&#xff0c;并对外提供了 OnChage 事件…