Logstash2.3.4趟坑之集成Redis哨兵模式

最新在使用Lostash2.3.4收集數據的時候,在讀取redis數據的時候,報了以下的一個異常:git

異常以下

Pipeline aborted due to error {:exception=>#<URI::InvalidURIError: the scheme redis does not accept registry part: redis_master_10214 (or bad hostname?)>, :backtrace=>["/home/search/logstash-2.3.4/vendor/jruby/lib/ruby/1.9/uri/generic.rb:214:in `initialize'"

Logstash自帶的ruby是1.9的版本,自帶集成的redis插件也是最新的redis-rb3.3.1github

Logstash裏面默認自帶了redis插件,也就是redis-rb3.3.1redis

若是沒帶能夠進入logstash目錄:docker

logstash-2.3.4\vendor\jruby\bin進行安裝ruby

cd logstash-2.3.4\vendor\jruby\bin
gem install redis

若是redis採用的是哨兵模式的集羣,那麼redis-rb插件也是支持的,具體的看官網github文檔:dom

https://github.com/redis/redis-rbui

logstash的代碼以下:url

input{
 stdin{}
}


filter{

ruby{
init => "
require 'redis'

class Rconn  
   @@SENTINELS = [{:host => '192.168.10.214', :port => 26381},
             {:host => '192.168.10.214', :port => 26382},
             {:host => '192.168.10.214', :port => 26383}]
   def self.con   
   @@con  
   end 
  
   def self.SENTINELS
   @@SENTINELS
   end 
   @@con = Redis.new(:url => 'redis://redismaster10214', :sentinels => Rconn.SENTINELS, :role => :master)
end
"
code => "
event['redis_data']=Rconn.con.get(event['message']) 
"
}
}

output{
  stdout { codec => rubydebug }
}

注意下面這句話

:url => 'redis://redismaster10214'

redis的哨兵masterName在ruby1.9中必須不能帶下劃線,不然會報下面的異常:插件

錯誤的用法

:url => 'redis://redis_master_10214'
<URI::InvalidURIError: the scheme redis does not accept registry part: redis_master_10214 (or bad hostname?)>,

ruby裏面的標準的url校驗,發現url裏面若是有帶下劃線的,會認爲是不合法的url,具體可參考下面兩個問題鏈接:debug

https://github.com/docker/compose/issues/472

http://stackoverflow.com/questions/2180465/can-domain-name-subdomains-have-an-underscore-in-it

目前在ruby1.9的版本中發現此bug,使用最新的版本ruby2.3.0則沒有此問題,說明在高版本的ruby中 已經修復了此問題,可是logstash最新的版本綁定的jruby版本是1.9的ruby,因此還存在此問題,只能在使用時避免,真是血淚教訓,花費了大半天時間趟的坑。 輸入圖片說明

相關文章
相關標籤/搜索