C#和NewSQL更配 —— CockroachDB入門(可能是C#下的全網首發)

来源:http://www.cnblogs.com/Zachary-Fan/archive/2017/08/07/cockroachdb_net_csharp.html
-Advertisement-
Play Games

閱讀目錄 CockroachDB是什麼 環境部署 實戰 性能測試 結語 一、CockroachDB是什麼 CockroachDB(https://www.cockroachlabs.com)是Google備受矚目的Spanner的開源模仿,承諾提供一種高存活性、強一致性,可橫向擴展的SQL資料庫。主 ...


閱讀目錄

 

 

一、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.21

cockroach sql --insecure -e 'CREATE DATABASE test' --host=192.168.118.21

cockroach 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真的是你手指動動秒秒鐘的事情,運維成本非常低。

 

 

 

作者:Zachary_Fan
出處:http://www.cnblogs.com/Zachary-Fan/p/cockroachdb_net_csharp.html

 

 

如果你想及時得到個人自寫文章的消息推送,歡迎掃描下麵的二維碼~。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天同事在主庫在給一個大表的欄位新加了一個索引,因為是大表,所以用了pt-osc工具,在添加完索引沒過多久,開發那邊反應丟數據了。 這個表以前是寫在主庫的,後來不知道是什麼原因改成了寫從庫,也就是說主庫有部分以前的歷史數據,但是新的數據都是寫在從庫上,同事用pt-osc加索引的時候是在主庫加的,於是 ...
  • tm 工具 資料庫 SQL MySQL MySQL ddl 的問題現狀 在 運維mySQL資料庫時,我們總會對數據表進行ddl 變更,修改添加欄位或者索引,對於mysql 而已,ddl 顯然是一個令所有MySQL DBA 詬病的一個功能,因為在MySQL中在對錶進行ddl時,會鎖表,當表比較小比如小 ...
  • 啟動hive:start-all.shhive 進入hive之後,創建一個hive資料庫庫:create database if not exists db; 創建一個新表,結構與其他一樣hive> create table new_table like records; 創建分區表:hive> c ...
  • 緣起:有個朋友問我分區表在58的應用,我回答不出來,在我印象中,百度、58都沒有聽說有分區表相關的應用,業內進行一些技術交流的時候也更多的是自己分庫分表,而不是使用分區表。於是去網上查了一下,並詢問了58到家的DBA專家,將自己收到的信息沉澱下來,share給大伙。 解決什麼問題? 回答:當mysq ...
  • 今天,所有MySQL從伺服器上的主從複製都被異常中斷了,登陸到其中一臺上執行show slave status\G,發現如下錯誤:--Last_Error: Error 'Operation DROP USER failed for 'guest'@'localhost'' on query. De ...
  • 1.資料庫 顧名思義,資料庫DB (DataBase)即指存放數據的倉庫,只不過該倉庫位於電腦的存儲設備上。通常,這些數據面向一個組織、部門或整個企業,它們是按照一定的數據組織模型存放在存儲器上的一組相關數據集合。例如學生成績管理系統中,學生的基本信息、學籍信息、成績信息等都是來自學生成績管理數據 ...
  • insert into 表名1 ( 欄位A ,欄位B ,欄位C) SELECT 欄位A ,欄位B ,欄位C FROM 表名2 (where條件看情況而定) ...
  • Oracle資料庫概述 Oracle資料庫llg具有良好的體繫結構、強大的數據處理能力、豐富實用的功能和許多創新的特性,並根據用戶對象需求的不同,設置了不同的版本.本章將對Oracle的產品結構和創新特性進行介紹.另外,在學習Oracle11g之前,我們首先回顧資料庫的一些基本概念和基礎知識,以及O ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...