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


閱讀目錄

 

 

一、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
出處:https://zacharyfan.com/archives/238.html

 

 

▶關於作者:張帆(Zachary,個人微信號:Zachary-ZF)。堅持用心打磨每一篇高質量原創。歡迎掃描右側的二維碼~。

定期發表原創內容:架構設計丨分布式系統丨產品丨運營丨一些思考。

 

如果你是初級程序員,想提升但不知道如何下手。又或者做程序員多年,陷入了一些瓶頸想拓寬一下視野。歡迎關注我的公眾號「跨界架構師」,回復「技術」,送你一份我長期收集和整理的思維導圖。

如果你是運營,面對不斷變化的市場束手無策。又或者想了解主流的運營策略,以豐富自己的“倉庫”。歡迎關注我的公眾號「跨界架構師」,回復「運營」,送你一份我長期收集和整理的思維導圖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM