隨着公司日益復雜與多變的需求,以及迅速擴展帶來的海量數據業務,我們需要在提供高效服務的同時,降低其設備與程序維護成本。算了,不吹了,說白了就是需要從巨杉數據庫中抓取大量的數據,但是我現在不會,所以需要好好學習一下。順便在此做個筆記,以備不時之需。
這里,我從了解巨杉數據庫的基礎,歷史,性能,部署等方面開始學習。
據在網上粗略的了解,BAT等巨頭內部基本都有自己的NoSQL項目,有的是基於開源項目自行研發,有的是依托MongoDB等NoSQL為基礎搭建數據分析平台。而近些年迅速成長的各類公有雲服務提供商,在除了SQL Server,MySQL,MariaDB等關系數據庫之外,也在開始嘗試部署的NoSQL(當然,這些NoSQL數據庫是以MongoDB為主)。
BAT等大互聯網公司,財大氣粗,大都養着一群程序員基於開源數據庫做改進,使之更適合他們自己的業務,因此,很少這類產品發布。
值得慶幸的是,國內也有NoSQL研發商。廣州巨杉發布的的企業級NoSQL:SequoiaDB,號稱在功能和研發技術方面,並不輸MongoDB。SequoiaDB之前名字還是很陌生的,但是近幾個年來,經常在各類大數據主題的大會,論壇等場合出現,而且在近期宣布獲得千萬級美元的A輪,同時在ArchSummit峰會上宣布開源,聲名鵲起。
廣州巨杉軟件對其產品SequoiaDB的簡介是:SequoiaDB(巨杉數據庫)是一款分布式文檔型NoSQL數據庫,是業界唯一支持事務和SQL的產品。SequoiaDB既可作為Hadoop與Spark的數據源以滿足實時查詢和分析的混合負載,也可獨立作為高性能、靈活易用的數據庫被應用程序直接使用。SequoiaDB已擁有的客戶包括知名IT互聯網公司和世界五百強企業。
一,python環境搭建
1.1 安裝和部署一個集群環境(此步驟並未執行,小編使用的都是部署好的)
進入終端,切入到存放SequoiaDB的目錄,我的目錄是home(~)目錄。
SequoiaDB的安裝包下載下來,是一個tar.gz的壓縮包,需要先解壓:
tar -zxvf sequoiadb-1.10-linux_x86_64-installer.tar.gz
該命令會把壓縮包解壓到當前目錄。
執行解壓出來的run包:
sudo ./sequoiadb-1.10-linux_x86_64-installer.run
此shell命令會執行SequoiadbDB的安裝,如果是桌面環境,默認會以圖形向導的方式安裝,如果需要用字符安裝向導,可以用下面的命令來執行安裝:
sudo ./sequoiadb-1.10-linux_x86_64-installer.run --mode text --SMS false
我采用的是字符向導安裝,依次會經過
- 語言選擇,有 English 和 中文 供選擇,我選擇是English;
- 用戶許可協議聲明,如有疑問開源選擇2,查看協議的具體內容;
- 確認許可,選擇 y;
- 安裝目錄,默認是 /opt/sequoiadb;(不包括“;”)
- 創建數據庫管理員賬戶:用戶名,默認是sdbadmin;密碼,默認為sdbadmin,如果你需要自己設定數據庫管理員用戶名和密碼,可以在對應的輸入提示處輸入;
- 集群管理服務端口,默認是11790;
- 開機自啟動,我選擇的是 Y,確認開機自啟動;
- OM Server安裝等確認,我選擇的是 y,確認安裝;
最后就是繼續安裝確認,必須選擇 Y哈,確認之后會出現一下字符:
lease wait while Setup installs SequoiaDB Server on your computer. Installing 0% ______________ 50% ______________ 100% ###########################
此時耐心等待其安裝即可,當安裝完成,會自動切入Shell輸入狀態。
再次確認一下:安裝過程中,安裝程序會創建一個數據庫管理員的系統用戶,用戶數據庫的管理和部署。
到此處,數據庫正確安裝了 :)
安裝完成后,先檢查數據庫服務狀態,在shell中執行 service sdbcm status
正確情況下,應該出現的是 sdbcmd進程號,和 sdbcm is running. 的提示:
tynia@Milky:~$ service sdbcm status 4991 sdbcm is running.
如果sdbcm服務並沒有啟動,可以手動執行 service sdbcm start 來啟動sdbcm服務。
如果仍然失敗,請檢查一下安裝過程是否出錯。
sdbcm服務狀態正確的話,就可以繼續部署了。
(以上操作是參考此博客,部署的具體操作,請參考網友博客:https://www.cnblogs.com/tynia/p/sequoiadb01.html)
1.2 安裝sequoiadb的驅動
我其實很不解的是為什么我下載巨杉數據庫的驅動,還要我注冊,輸入個人信息等。算了,寄人籬下,就這樣吧,下載鏈接地址如下 http://download.sequoiadb.com/cn/index-cat_id-2#
本人使用的編譯語言是python,所以下載的是python驅動,請看下圖(注意是Linux):

對於Windows,暫未推出驅動開發包,好慘,,,,,

1.3 數據庫操作
數據庫連接(connecting)
import pysequoiadb
from pysequoiadb import client
# connect to local db, using default args value.
host = 'loaclhost'
port = 11810
# user = '', password = ''
db = client(host,port)
# if no error occurs, connect to specified server successfully
print('Connect success')
db.disconnect()
(此教程是巨杉數據庫官方文檔)本例程連接到本地數據庫的服務端口11810,使用的是空的用戶名和密碼。用戶需要根據自己的實際情況配置參數。譬如,將上述代碼中的 db = client() 修改為 db = client('192.168.10.188', 11810)。當數據庫已經創建用戶時,應該使用正確的用戶及密碼連接到數據庫,否則連接失敗。
創建集合空間和集合
以下創建了一個名字為“foo”的集合空間和一個名字為“bar”的集合,集合空間內的集合的數據頁大小為16k。可根據實際情況選擇不同大小的數據頁。創建集合后,可對集合做增刪改查等操作。
# connect to db
db = client("localhost", 11810)
# create collection space
cs_name = 'foo'
cs = db.create_collection_space(cs_name)
cl_name = 'bar'
cl = cs.create_collection(cl_name)
插入數據(insert)
# creat dict object
record = {"name":"Tom", "age":24}
oid = cl.insert ( record ) ;
record為輸入參數,為要插入的數據。dict對象將會被轉換成bson插入到集合中。oid 是插入該記錄時,返回的bson結構的objectid。
查詢(query)
import pysequoiadb
from pysequoiadb import client
from pysequoiadb.error import SDBEndOfCursor
cr = cl.query()
while True:
try:
record = cr.next()
print(record)
except SDBEndOfCursor:
break
finally:
cr.close()
查詢操作需要一個游標對象存放查詢的結果到本地。要獲得查詢的結果需要使用游標操作。本例使用了游標操作的next接口,表示從查詢結果中取到一條記錄。此示例中沒有設置查詢條件,篩選條件,排序情況,及僅使用默認索引。
索引(index)
index_name = "index_name"
idx = OrderedDict([('name', 1), ('age', -1)])
cl.create_index ( idx, index_name, False, False ) ;
集合對象collection中創建一個以“name”為升序,“age”為降序的索引。
更新(update)
rule = {"$set":{ "age":19}}
print rule
cl.update( rule )
在集合對象 ollection中更新了記錄。實例中沒有指定數據匹配規則,所以此示例將更新集合中所有的集合。
1.4 SQL to SequoiaDB shell to Python
SequoiaDB 的查詢用 dict(bson)對象表示,下表以例子的形式顯示了 SQL 語句。SequoiaDB shell 語句和 SequoiaDB Python 驅動程序語法之間的對照。
| SQL | SequoiaDB shell | Python Driver |
|---|---|---|
| insert into bar(a,b) values(1,-1) | db.foo.bar.insert({a:1,b:-1}) | cl = db.get_collection("foo.bar") obj = { "a":1, "b":-1 } cl.insert( obj ) |
| select a,b from bar | db.foo.bar.find(null,{a:"",b:""}) | cl = db.get_collection("foo.bar") selected = { "a":"","b":"" } cr = cl.query(selector = selected ) |
| select * from bar | db.foo.bar.find() | cl = db.get_collection("foo.bar") cr = cl.query () |
| select * from bar where age=20 | db.foo.bar.find({age:20}) | cl = db.get_collection("foo.bar") cond ={"age":20} cr = cl.query ( condition = cond ) |
| select * from bar where age=20 order by name | db.foo.bar.find({age:20}).sort({name:1}) | cl = db.get_collection("foo.bar") cond ={"age":20} orderBy = {"name":1} cr = cl.query (condition=cond , order_by=orderBy) |
| select * from bar where age > 20 and age < 30 | db.foo.bar.find({age:{$gt:20,$lt:30}}) | cl = db.get_collection("foo.bar") cond = {"age":{"$gt":20,"$lt":30}} cr = cl.query (condition = cond ) |
| create index testIndex on bar(name) | db.foo.bar.createIndex("testIndex",{name:1},false) | cl = db.get_collection("foo.bar") obj = { "name":1 } cl.create_index ( obj, "testIndex", False, False ) |
| select * from bar limit 20 offset 10 | db.foo.bar.find().limit(20).skip(10) | cl = db.get_collection("foo.bar") cr = cl.query (num_to_skip=10L, num_to_return=20L ) |
| select count(*) from bar where age > 20 | db.foo.bar.find({age:{$gt:20}}).count() | cl = db.get_collection("foo.bar") count = 0L condition = { "age":{"$gt":20}} count = cl.get_count (condition ) |
| update bar set a=2 where b=-1 | db.foo.bar.update({$set:{a:2}},{b:-1}) | cl = db.get_collection("foo.bar") condition = { "b":1 } rule = { "$set":{"a":2} } cl.update ( rule, condition=condition ) |
| delete from bar where a=1 | db.foo.bar.remove({a:1}) | cl = db.get_collection("foo.bar") condition = {"a":1} cl.delete ( condition=condition ) |
1.5 Python API
1 collection 類添加接口
alter,對集合的屬性進行修改 enable_sharding,對集合啟用分區功能 disable_sharding,對集合關閉分區功能 enable_compression,對集合啟用壓縮功能 disable_compression,對集合關閉壓縮功能 set_attributes,對集合的屬性進行修改
2 collectionspace 類添加接口
alter,對集合空間的屬性進行修改 set_attributes,對集合空間的屬性進行修改 set_domain,修改集合空間所屬的域 remove_domain,移除集合空間所屬的域
3 domain 類添加接口
add_groups,向域中添加數據組 set_groups,對域設置數據組 remove_groups,移除屬於域的某些數據組 set_attributes,設置域的屬性
具體請參考:http://doc.sequoiadb.com/cn/index/Public/Home/document/300/api/python/html/index.html
二:初步了解SequoiaDB數據庫
(此小節說明數據的內容是參考網上博客https://blog.csdn.net/sequoiadb/article/details/12106133)
SequoiaDB作為全球第一家企業級文檔式非關系型數據庫,則提供了諸如此類(高可擴展 性、高可用性、高性能、易維護、低成本)的全方位平台。下面從其特點、數據模型、系統架構等三個方面來了解SequoiaDB。
2.1 SequoiaDB特點
1、當傳統的關系型數據庫無法做到水平擴張能力時,在SequoiaDB中會得到完美的解決,通過對數據進行垂直切片,並應用了新型的非關系型數據模型,SequoiaDB有效地降低了傳統數據庫分區中大量數據交換的瓶頸,進而得到線性水平擴張能力。
2、SequoiaDB能夠將用戶的每一份數據實時保存多份副本,有效地防止了因服務器、機房及人為等因素所造成的系統停機帶來的損失,確保隨時在線可用。
3、SequoiaDB為企業提供了用戶友好並完善的管理、維護及監控界面,實現24×7的電話及現場技術支持,擁有完善的企業級支持。
4、SequoiaDB使用JSON數據模型,靈活有效地降低關系模型的復雜性,讓數據庫更加貼近應用程序,從而大大降低應用程序的開發和維護成本。
5、SequoiaDB在大規模分布式環境中提供了數據最終一致性的保障,滿足用戶對實時性與一致性的需求。
6、SequoiaDB通過分片機制進行讀寫分離,允許前端在線應用與后台數據分析完美並行互不干擾,並可結合Hadoop技術進行海量數據分析。
2.2 SequoiaDB數據模型
SequoiaDB數據庫沒有使用傳統的關系型數據模型,而是JSON數據模型。JSON數據結構的全稱為Javascript Object Notation,是一種輕量級的數據交換格式,非常易於人閱讀和編寫,同時也易於機器生成與解析,為純文本格式,支持嵌套結構與數組。
2.3 JSON建構基於兩種結構:
1、鍵值對集合。在鍵值對集合結構中,每一個數據元素擁有一個名稱與一個數值,數值可以包含數字,字符串等常用結構,或嵌套JSON對象和數組。
2、數組。在數組中的每一個元素不包含元素名,其值可以為數字、字符串等常用結構,或者嵌套JOSN對象和數組。
其典型的嵌套式數據結構如下圖所示:
{ “姓名”:“威哥”, “性別”:“男”, “住址”:“成都市”, “電話”:[ 137895×××××, 191263××××× ], “備注”:[ “IT主管”, “技術達人” ] }
2.4 SequoiaDB系統架構
SequoiaDB使用分布式架構,下圖為體系結構:
在客戶端(或應用程序端),本地或(和)遠程應用程序都與SequoiaDB客戶機庫鏈接。本一與遠程客戶機使用TCP/IP協議與協調節點進行通訊。
協調節點不保存任何用戶數據,僅作為請求分發節點將用戶請求分發至相應的數據節點。
編目節點保存系統的元數據信息,協調節點通過與編目節點通訊從而了解數據在數據節點中的實際分布。一個或多個編目節點可組成復制組集群。
數據節點保存用戶的數據信息。一個或多個數據節點可以構成一個復制組。復制組中每個數據節點的數據保證最終一致性同步。數據復制組又叫做數據分片(Shard),不同的分片中保存的數據無重復。
每個分片中可以包含一個或多個數據節點。當存在多個數據節點時,節點間數據進行異步復制。分片中可以存在最多一個主節點與若干從節點。其中主節點可以進行讀寫操作,從節點進行只讀操作。
從節點離線不影響主節點的正常工作。主節點離線后會在從節點中自動選擇舉出新的主節點處理寫請求。
當節點恢復后,或新的節點加入分片后會理行自動同步,保障數據在同步完成時與主節點一致。
在單個數據節點中的體系結構如下:
在數據節點,活動由引擎可高度單元(EDU)控制。每一個節點對操作系統中的一個進程。每個EDU在節點中為一個線程。對於外部用請求其處理線程為代理線 程,對於集群內部請求則由同步代理線程處理分片內同步事件或分片代理線程處理分片間同步事件。所有對數據的寫操作均會錄入日志緩沖區,通過日志記錄器將其 異步寫入磁盤。用戶數據會由代理線程直接寫入文件系統緩沖池,然后由操作系統將其異步寫入底層磁盤。
從以上三點可以初步了解SequoiaDB數據庫,可為以后更深入學習及應用SequoiaDB數據庫做為理論上的鋪墊。
三: SequoiaDB數據庫的一些基本概念
(此小節基礎知識點是來自博客:https://blog.csdn.net/sequoiadb/article/details/12106005)
3.1 文檔
SequoiaDB中的文檔為JSON格式,一般又被稱為記錄。在數據庫內部使用BSON,即二進制的方式存放JSON數據。一般情況下,一條文檔由一個 或多處字段構成,每個字段分為鍵值與數值兩個部分。需要指出的是:BSON文檔可能有多個同名字段,但是,大多數SequoiaDB接口不支持重復的字段 名;SequoiaDB內部程序創建的一些文檔可能含有重名的字段,但是不會向現有的用戶文檔添加重名的鍵。
3.2 集合
集合(Collection)是SequoiaDB數據庫中存放文檔的邏輯對象。任何一條文檔必須屬於一個且僅一個集合。
3.3 集合空間
集合空間(Collection Space)是數據庫中存放集合的物理對象。任何一個集合必須屬於一個且僅一個集合空間。每一個集合空間在數據節點均對應一個文件。
3.4 數據庫服務器
SequoiaDB是文檔型號非關系型數據庫服務器,數據庫服務器提供軟件服務以便安全、高效地管理信息。數據庫服務器是指安裝了SequoiaDB數據 庫引擎的計算機。SequoiaDB引擎為數據存取操作的基本單元,在分布式架構中,每個數據庫作為一外節點存在,節點之間的數據無共享。在一台計算機 中,每一個SequoiaDB數據庫引擎對應一個數據庫路徑,該數據庫中所有的集合空間均放置在該目錄中。數據庫路徑包含一個或多個集合空間。每個數據庫 引擎可以包含最多4096個集合空間。
3.5 索引
在SequoiaDB數據庫中,索引是一咱特殊的數據對象。索引本身不做為保存用戶數據的容器。而是作為一種特殊的元數據,提高數據訪問的效率。每一個索 引必須建立在一個集合中,一個集合最多可以擁有64個索引。索引可以被認為是將數據按照某個或多上給定的字段進行排序,從而在其中快速搜索到用戶指定查詢 條件的方式。在SequoiaDB中,索引使用B樹結構。
3.6 事務
事務是一系列操作組成的邏輯工作單元。在同一個會話在(或連接)中,同一時刻只允許存在一個事務,也就是說當用戶在一次會話中創建了一個事務,在這個事務 結束前用戶不能再創建新的事務。事務作為一個完整的工作單元執行,事務中的操作要么全部執行成功要么全部執行失敗。SequoiaDB事務中的操作只能是 插入數據、修改數據和刪除數據,在事務過程中執行的其它操作不會納入事務范疇,也就是說事務回滾時非事務操作不會被執行回滾。如果一個表或表空間中有數據 涉及事務操作,則該表或表空間不允許被刪除。默認情況下,事務功能是關閉的。
3.7 最終一致性策略
SequoiaDB為了提升數據的可靠性和實現數據的讀寫分離,對於復制組間的數據采用“最終一致性”策略,在讀寫分離時讀取的數據某一個時期內可能不是最新的,但最終是一致的。
3.8 讀寫分離
SequoiaDB中,所有寫請求都只會發往節點,如果沒有主節點則當前數據組不可處理寫請求。
3.9 集群
SequoiaDB集群是指通過並聯合多台數據庫服務器,達到並行計算,以提升數據請求效率的方式。通過SequoiaDB集群,可以高性能的數據訪問,保障數據高可用性,達到數據庫的水平擴張能力。
3.10 運行模式
是指啟動SequoiaDB服務時,該服務以獨立模式啟動還是以集群模式啟動。獨立模式是啟動SequoiaDB的最精簡模式,僅需要啟動一個獨立模式的 數據節點,即可進行數據服務。(一般推薦在開發環境中使用獨立模式,以減少對硬件資源的需求。)集群模式是啟動SequoiaDB的標准模式,至少需要三 個節點。
3.11 節點
編目節點:是一種邏輯節點,其中保存了數據庫的元數據信息,而不保存其他用戶數據。除了編目節點外,集群中所有其他的節點不在磁盤中保存任何全局元數據信 息。當需要訪問其他節點上的數據時,除編目節點外的其他節點需要從本地緩存中尋找集合信息,如果不存在則需要從編目節點獲取。編目節點與其它節點之間主要 使用編目服務端口進行通訊。 協調節點:也是一種邏輯節點,基中並不保存任何用戶數據信息。協調節點作為數據請求部分的協調者,本身並不參與數據的匹配與讀寫操作,而僅僅是將請求分發到所需要處理的數據節點為。協調節點與其它節點之間主要使用分區服務端口進行通訊。
數據節點:仍是一種邏輯節點,其中保存用戶數據信息。數據節點中高有專門的編目信息集合,因此第一次訪問集合前需要向編目節點請求該集合的元數據信息。在獨立模式中,數據節點為單獨的服務提供者,直接與應用程序或客戶端進行通訊,並且不需要訪問任何編目信息。
3.12 分區組
又被稱為復制組,一個復制組內可以包含一個或多個數據節點(或編目節點),節點之間的數據使用異步日志復制機制,保持最終一致。分區組中所有的節點之間使 用復制服務端口進行通訊,定期相互發送心跳信息以相互驗證狀態。每個分區組的節點有兩種狀態:主節點(可作讀寫操作,所有寫入的數據會同步寫入日志文件, 日志文件中的日志信息會異步寫入從節點)和從節點(作只讀操作,所有從主節點寫入的數據會異步寫入從節點,因此從節點與主節點之間可能存在暫時的數據不一 致,但是復制機制可以保證數據的最終一致性)。
3.13 數據分區
在SequoiaDB集群環境中,用戶往往將數據存放在不同的邏輯節點與物理節點中,以達到交行計算目的。由於每一個存放數據的分區組中所有節點包含的數據完全相同,每個分區組被稱作一個“分區”每個分區之間的數據互不影響,無共享狀態。
