Ruby操作MongoDB(進階五)-資料庫管理Administration
通過前面四章的學習,本章我們開始學習Ruby操作MongoDB資料庫中的資料管理Administration
-
資料庫相關
Ruby驅動為資料庫物件執行命令,獲取集合列表,和管理任務提供了多種多樣的幫助。
1.1 獲取集合列表List Collection
通過collections和collection_names兩個指令可以獲取集合列表和集合的名字。例如:
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film')
database=client.database
database.collections
database.collection_names
在資料庫上執行任何命令,請使用commond方法
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film')
database=client.database
result=database.commond(:ismaster=>1)
result.first
1.2 資料庫刪除 drop database
使用drop方法刪除一個數據庫。在資料庫物件上呼叫drop方法
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film')
client.database.drop
2. 集合相關
驅動也給集合管理工作提供了相應輔助功能。建立一個帶引數的集合(比如建立一個固定集合),在從客戶端連接獲取集合的同時進行引數傳遞,然後呼叫create方法
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film')
actors=client[:actors,:capped=>true,:size=>1024]
actors.create
actors.capped?
結果為true,因為設定了:capped=>true屬性
2.1 集合刪除 drop collection
同樣通過呼叫drop方法,但是是在集合物件上呼叫,實現集合的刪除功能。
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film')
actors=client[:actors]
actors.drop
2.2 修改讀寫的首選項
為了改變特定操作的預設讀取首選項引數和寫入首選項引數,我們可以在集合上使用with方法。
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film')
actors=client[:actors]
actors.with(:read=>{:mode=>:primary_preferred}).find.to_a
actors.with(:write=>{:w=>:3}).insert_one({:name=>'Depeche Mode'})
3 授權相關
MongoDB支援多種型別的授權機制。
3.1 建立一個使用者
為一個特定的資料庫建立一個使用者,請使用create方法,將使用者名稱username,密碼password和使用者角色引數roles parameters傳遞給create方法。
client.database.users.create(‘Peter’,password:'password',roles:[Mongo::Auth::Roles:READ_WRITE])
3.2 提供授權證書
如果開啟了授權功能,在建立一個客戶端連線時就要提供授權證書。
client=Mongo::Client.new(['127.0.0.1:27017'],user:'test',password:'123')
對於2.6及之後的MongoDB版本,:auth_source預設為admin,要麼就是當前使用的資料庫。如果要切換當前使用的資料庫,可以使用use命令
client=Mongo::Client.new(['127.0.0.1:27017'])
film_client=client.use('film')
建立授權證書時,可以建立一個新的客戶端連線,例如:
authenticated_client=client.with(user:'test',password:'123'),此時建立了一個新的客戶端連線authenticated_client.
同樣,設定當前資料庫和授權證書可以在一個操作中完成。
authenticated_film_client=client.with(:database=>'film',user=>'test',password=>'123')
3.3 MONGODB-CR機制
MONGODB-CR是2.6及其以上版本的預設授權認證機制。可以在證書設定時進行認證機制設定
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film',user=>'test',password=>'123',:auth_meth=>:mongodb_cr)
3.4 客戶端驗證client certificate(x509)
需要2.6版本及以上才支援。
在SSL協商期間,驅動提供了x509驗證。Client Certificate(X509)機制驗證從當前證書衍生得到的具有辨識性主題名稱的使用者名稱。這種驗證機制的運用需要基於SSL連線方式的使用。例如:
client=Mongo::Client.new(['127.0.0.1:27017'],:auth_mech=>:mongodb_x509,ssl:true,ssl_cert:'/path/to/client.pem',ssl_ca_cert:'/path/to/ca.pem')
3.5 LDAP(SASL PAIN)驗證機制
需要2.6及以上企業版本才支援。
2.6及以上企業版本的MongoDB支援使用LDAP驗證機制,也就是允許使用LDAP(輕量級目錄訪問協議)伺服器來作為驗證證書。
注意:使用LDAP驗證機制,密碼會以純文字形式傳送到伺服器。因此,當時用愛中授權認證機制時,強烈建議開啟SSL。
client=Mongo::Client.new(['127.0.0.1:27017'],:auth_mech=>:plain,ssl:true,ssl_verify:true,ssl_cert:'/path/to/client.pem',ssl_ca_cert:'/path/to/ca.pem')
3.6 Kerbero(GSSAPI)驗證機制
需要2.4及以上企業版本才支援。通過JRuby在Ruby驅動中使用Kerbero,需要經過如下步驟:
1. 設定幾個具體的系統屬性,這樣底層的GSSAPI Java庫就可以獲取一個Kerberos入場券;
2. 通過在配置檔案中提供一個密碼,或者設定'java.security.auth.login.config'系統屬性,從而可以索引到一個keytab檔案。在Ruby驅動中通過Matz's Ruby Interpreter(MRI)使用Kerberos。通過kinit建立一個授予入場券。
client=Mongo::Client.new(['127.0.0.1:27017'],
:auth_mech=>:gssapi
user:'test',
password:'123')
4 日誌Logger相關
除了可以使用預設的全域性驅動日誌,你也可以設定自己的日誌服務。下面的例子設定了自己的日誌服務:Mongo::Logger.logger=other_logger
4.1 修改日誌級別
修改日誌級別:
Mongo::Logger.logger.level=Logger::WARN
為了獲得更多控制,我們可以在建立客戶端連線時傳遞一個logger引數,在全域性日誌的基礎上為每個客戶端提供日誌控制。
my_logger=Logger.new($stdout)
Mongo::Client.new(['127.0.0.1:27017'],:database=>'test',:logger=>my_logger)
4.2 日誌截斷功能Truncate
預設的日誌截斷功能會在250個字元是進行截斷,通過給client例項傳遞一個引數可以關閉這個功能。
Mongo::Client.new(['127.0.0.1:27017'],:database=>'test',:truncate_logs=>false)
5 監控Monitoring
所有使用者初始化時傳送給伺服器的指令產生的時間,都可以描述成好的細粒度資訊。為了監控API針對每個指令都發布了一個保證質量的起始事件,也就是說要麼成功,要麼失敗。一個使用者必須實現started,succeeded和failed三個方法的一種,每一種都作為當前事件的一個簡單引數。驅動中預設的日誌使用者就是一個例項
module Mongo
class Monitoring
class CommandLogSubscriber
include Loggable
attr_reader=>:options
LOG_STRING_LIMIT =250
def initialize(option ={})
@options=option
end
def started(event)
log_debug("#{prefix(event)}|STARTED|#{format_command(event.command)}")
end
def succeeded(event)
log_debug("#{prefix(event)}|SUCCEEDED|#{format_command(event.command)}")
end
def failed(event)
log_debug("#{prefix(event)}|FAILED|#{format_command(event.command)}")
end
private
def format_command(args)
begin
truncating?truncate(args):args.inspect
rescue Exception
'<Unable to inspect arguments>'
end
end
def prefix(event)
"#{event.address,to_s}|#{event.database_name}.#{event.command_name}"
end
def truncate(command)
((s=command.inspect).length>LOG_STRING_LIMIT ? "#{s[0..LOG_STRING_LIMIT]}...":s
end
def truncating?
@truncating||=(options[:truncate_logs]!=false)
end
end
end
end
如果想要註冊一個通用的使用者,你可以所有客戶端的全域性屬性或者單個客戶端的基礎設定
Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::COMMAND,my_subscriber)
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'test')
client.subscribe(Mongo::Monitoring::COMMAND,my_subscriber)
關閉監控只需要將監控引數設定為false
client=Mongo::CLient.new(['127.0.0.1:27017'],:database=>'test',:monitoring=>false)
本篇文章講述了資料庫管理方面的知識和引數設定,主要包括資料庫層面,集合層面,認證機制,日誌,監控五個方面的知識講解。