成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于Docker的Rails集群+Ruby負(fù)載均衡代理

云計(jì)算
我打算做一個(gè)比較酷的使用Docker的例子:一個(gè)Rails集群,以及集群前面的一個(gè)Ruby負(fù)載均衡服務(wù)。我曾想過使用若干不同的機(jī)器(每臺(tái)機(jī)器都有自己的IP地址和端口)來運(yùn)行同樣的Rails服務(wù),然后在外部配置一臺(tái)負(fù)載均衡的代理服務(wù)器,在各Railf服務(wù)之間進(jìn)行請(qǐng)求分配。

我打算做一個(gè)比較酷的使用Docker的例子:一個(gè)Rails集群,以及集群前面的一個(gè)Ruby負(fù)載均衡服務(wù)。我曾想過使用若干不同的機(jī)器(每臺(tái)機(jī)器都有自己的IP地址和端口)來運(yùn)行同樣的Rails服務(wù),然后在外部配置一臺(tái)負(fù)載均衡的代理服務(wù)器,在各Railf服務(wù)之間進(jìn)行請(qǐng)求分配。

不過使用Docker的話,在一臺(tái)機(jī)器上就可以模擬集群環(huán)境了。

alt

這里我們將演示一下如何來創(chuàng)建這個(gè)集群環(huán)境。

你可以從我的Github項(xiàng)目上下載所有這次測(cè)試的源代碼。

 

 

創(chuàng)建Docker鏡像

 

 

首先我將創(chuàng)建兩個(gè)Docker鏡像,1個(gè)用來運(yùn)行Rails服務(wù),1個(gè)運(yùn)行Ruby代理服務(wù)。

 

1.首先我制作了一個(gè)可信Docker構(gòu)建(Trusted Docker build),構(gòu)建腳本也在我的Github上( Github project docker-ruby )。使用這個(gè)構(gòu)建腳本創(chuàng)建的鏡像為 murielsalvan/ruby ,它基于Ubuntu Precise,并且安裝了Ruby 2.1.0p0。

 

  1. docker pull murielsalvan/ruby 

1.接著我基于murielsalvan/ruby來創(chuàng)建一個(gè)Docker容器,用來執(zhí)行一個(gè)bash shell,然后在里面安裝Rails并創(chuàng)建一個(gè)Rails應(yīng)用程序。這個(gè)應(yīng)用程序只有一頁(yè),它將打印出它所在服務(wù)器的主機(jī)名和IP地址(集群里的每臺(tái)Rails服務(wù)都有不同的主機(jī)名和IP地址)。你可以從這里查看這個(gè)測(cè)試程序的源代碼。這步的***,我將把這個(gè)容器提交,生成一個(gè)新的鏡像,并命名為murielsalvan/server,這個(gè)鏡像執(zhí)行的時(shí)候,會(huì)啟動(dòng)Rails服務(wù),并監(jiān)聽3000端口號(hào)(容器內(nèi)的端口號(hào))。

  1. docker run -t -i murielsalvan/ruby bash 
  2. docker commit -m=”Test server” -author=”Muriel Salvan <muriel@x-aeon.com>” -run='{“WorkingDir”: “/root/server/”, “Cmd”: ["rails""s"], “PortSpecs”: ["3000"]}’ acf566f7d155 murielsalvan/server 

1.***我們來基于murielsalvan/ruby創(chuàng)建第二個(gè)容器。這個(gè)容器也是啟動(dòng)一個(gè)bash然后安裝一個(gè)Ruby代理服務(wù)(我用了 em-proxy,非常不錯(cuò)的東西,值得一試)。這個(gè)Ruby代理服務(wù)將接收一個(gè)地址列表作為輸入?yún)?shù),并且創(chuàng)建一個(gè)基于隨機(jī)策略的負(fù)載均衡服務(wù),輪詢所有給定的IP地址以及3000端口。這個(gè)代理服務(wù)的源代碼可以在 這里 查看。***我把這個(gè)容器也做了提交操作,生成了一個(gè)新的鏡像 murielsalvan/proxy,它也將監(jiān)聽3000端口。

  1. docker run -t -i murielsalvan/ruby bash 
  2.  
  3. docker commit -m=”Proxy server” -author=”Muriel Salvan <muriel@x-aeon.com>” -run='{“PortSpecs”: ["3000"]}’ 7d2431c16b14 murielsalvan/proxy 

運(yùn)行Rails cluster

在所有的鏡像都創(chuàng)建完成之后,我們就可以啟動(dòng)容器了。我寫了個(gè)小腳本來啟動(dòng)所有需要運(yùn)行Rails服務(wù)的容器,它接收一個(gè)N參數(shù),為Rails服務(wù)器個(gè)數(shù)。等Rails服務(wù)全部啟動(dòng)完成后,這個(gè)腳本會(huì)打印出這些服務(wù)的IP地址列表。

這個(gè)腳本的另一個(gè)工作就是將運(yùn)行Rails服務(wù)的容器內(nèi)的3000端口,綁定到本機(jī)的5000+i 端口上,這樣就可以非常方便的透過代理服務(wù)直接通過 wget -S -O – http://localhost:5000 命令來確認(rèn)每臺(tái)Rails服務(wù)是否運(yùn)行正常。

 

 

 

  1. # run_cluster.rb 
  2.  
  3. np_servers = ARGV[0].to_i 
  4.   
  5. pipes_in = {} 
  6. np_servers.times do |idx| 
  7.   port = 5000 + idx 
  8.   pipe_cmd_in, pipe_cmd_out = IO.pipe 
  9.   cmd_pid = Process.spawn("docker run -p #{port}:3000 murielsalvan/server", :out => pipe_cmd_out, :err => pipe_cmd_out) 
  10.   puts "Launch server on port #{port}: PID=#{cmd_pid}" 
  11.   Process.detach(cmd_pid) 
  12.   pipe_cmd_out.close 
  13.   pipes_in[cmd_pid] = pipe_cmd_in 
  14. end 
  15. # Wait for all servers to be up 
  16. pipes_in.each do |pid, pipe_in| 
  17.   puts "Waiting for PID #{pid} to be listening..." 
  18.   found_info = false 
  19.   while !found_info 
  20.     out = pipe_in.readline.chomp 
  21.     puts out 
  22.     found_info = out.match(/WEpick::HTTPServer/) != nil 
  23.     sleep 0.01 if !found_info 
  24.   end 
  25. end 
  26.   
  27. puts 'All servers up and running.' 
  28.   
  29. # Get their IP addresses 
  30. ips = [] 
  31. `docker ps | sed -e 's/^\\(............\\).*$/\\1/' | tail -#{np_servers}`.split("\n").each do |container_id| 
  32.   ips << `docker inspect #{container_id} | grep IPAddress | sed -e 's/.*: \\"\\(.*\\)\\".*/\\1/g'`.chomp 
  33. end 
  34.   
  35. puts ips.join(' '

這段代碼執(zhí)行后輸出結(jié)果如下所示,請(qǐng)注意***的那IP地址,這些地址是Rails服務(wù)所監(jiān)聽的IP地址,我們?cè)诤竺娴腞uby代理服務(wù)器中會(huì)使用到這些地址。

  1. > ruby -w run_cluster.rb 5 
  2.  
  3. Launch server on port 5000: PID=6559 
  4. Launch server on port 5001: PID=6561 
  5. Launch server on port 5002: PID=6565 
  6. Launch server on port 5003: PID=6571 
  7. Launch server on port 5004: PID=6573 
  8. Waiting for PID 6559 to be listening... 
  9. [2014-02-05 18:19:44] INFO  WEpick 1.3.1 
  10. [2014-02-05 18:19:44] INFO  ruby 2.1.0 (2013-12-25) [x86_64-linux] 
  11. [2014-02-05 18:19:44] INFO  WEpick::HTTPServer#start: pid=1 port=3000 
  12. Waiting for PID 6561 to be listening... 
  13. [2014-02-05 18:19:42] INFO  WEpick 1.3.1 
  14. [2014-02-05 18:19:42] INFO  ruby 2.1.0 (2013-12-25) [x86_64-linux] 
  15. [2014-02-05 18:19:42] INFO  WEpick::HTTPServer#start: pid=1 port=3000 
  16. Waiting for PID 6565 to be listening... 
  17. [2014-02-05 18:19:44] INFO  WEpick 1.3.1 
  18. [2014-02-05 18:19:44] INFO  ruby 2.1.0 (2013-12-25) [x86_64-linux] 
  19. [2014-02-05 18:19:44] INFO  WEpick::HTTPServer#start: pid=1 port=3000 
  20. Waiting for PID 6571 to be listening... 
  21. [2014-02-05 18:19:43] INFO  WEpick 1.3.1 
  22. [2014-02-05 18:19:43] INFO  ruby 2.1.0 (2013-12-25) [x86_64-linux] 
  23. [2014-02-05 18:19:43] INFO  WEpick::HTTPServer#start: pid=1 port=3000 
  24. Waiting for PID 6573 to be listening... 
  25. [2014-02-05 18:19:41] INFO  WEpick 1.3.1 
  26. [2014-02-05 18:19:41] INFO  ruby 2.1.0 (2013-12-25) [x86_64-linux] 
  27. [2014-02-05 18:19:41] INFO  WEpick::HTTPServer#start: pid=1 port=3000 
  28. All servers up and running. 
  29. 172.17.0.16 172.17.0.14 172.17.0.15 172.17.0.13 172.17.0.12 

啟動(dòng)Ruby代理

同樣,我們?cè)谶@里也通過一段Ruby代碼來完成啟動(dòng)代理服務(wù)器的工作:

  1. 同樣,我們?cè)谶@里也通過一段Ruby代碼來完成啟動(dòng)代理服務(wù)器的工作: 
  2. #run_proxy.rb 
  3. lst_ips = ARGV.cloneProcess.wait(Process.spawn("docker run -p 3000:3000 -t murielsalvan/proxy ruby -w /root/run_proxy.rb #{lst_ips.join(' ')}")) 

這段代碼將啟動(dòng)運(yùn)行Ruby代理服務(wù)的Docker容器,其執(zhí)行結(jié)果如下:

 

 

 

  1. > ruby -w run_proxy.rb 172.17.0.16 172.17.0.14 172.17.0.15 172.17.0.13 172.17.0.12 
  2.  
  3. /root/run_proxy.rb:149: warning: `&' interpreted as argument prefix 
  4. /root/run_proxy.rb:150: warning: `&' interpreted as argument prefix 
  5. /root/run_proxy.rb:151: warning: `&' interpreted as argument prefix 
  6. /root/run_proxy.rb:152: warning: `&' interpreted as argument prefix 
  7. /usr/local/lib/ruby/gems/2.1.0/gems/em-proxy-0.1.8/lib/em-proxy/backend.rb:37: warning: method redefined; discarding old debug 
  8. /usr/local/lib/ruby/gems/2.1.0/gems/em-proxy-0.1.8/lib/em-proxy/connection.rb:126: warning: method redefined; discarding old debug 
  9. /root/run_proxy.rb:168: warning: method redefined; discarding old stop 
  10. /usr/local/lib/ruby/gems/2.1.0/gems/em-proxy-0.1.8/lib/em-proxy/proxy.rb:17: warning: previous definition of stop was here 
  11. Launching proxy at 0.0.0.0:3000... 

這將啟動(dòng)Ruby代理服務(wù)程序,并且監(jiān)聽3000端口。(請(qǐng)先忽略 上面的警告信息吧,也許em-proxy需要做一些清理操作吧 :-))

 

打開瀏覽器

 

服務(wù)程序都啟動(dòng)之后,就可以打開瀏覽器訪問了。輸入網(wǎng)址 http://localhost:3000,可以確認(rèn)返回結(jié)果里的主機(jī)名和IP地址。為了確保每次請(qǐng)求都會(huì)發(fā)給代理服務(wù)來處理,要在每次請(qǐng)求這個(gè)網(wǎng)址的時(shí)候先清空一下緩存(強(qiáng)制刷新)。

下面的圖是兩次請(qǐng)求的結(jié)果,從中我們可以看出,兩次請(qǐng)求是分別由兩臺(tái)不同的Rails服務(wù)器返回的。

 

 

alt

 

刷新瀏覽器之后:

alt

怎樣,是不是很簡(jiǎn)單的一種Rails集群方案?你也可以在自己的機(jī)器上嘗試一下。

我個(gè)人的測(cè)試環(huán)境如下:64位的Windows 7 主機(jī),然后通過VirtualBox運(yùn)行了Ubuntu 14.04 Alpha,所有的操作都在虛擬機(jī)里進(jìn)行。性能也還算說的過去(每個(gè)請(qǐng)求的響應(yīng)時(shí)間都低于1秒)。

原文出自:https://docker.cn/p/rails-cluster-with-ruby-load-balancer-using-docker-zh

責(zé)任編輯:Ophira 來源: Docker中文社區(qū)
相關(guān)推薦

2015-07-29 13:21:58

DockerRails 集群高可用架構(gòu)

2023-01-10 08:37:45

Docker開發(fā)架構(gòu)

2010-05-06 15:00:58

集群負(fù)載均衡

2009-08-27 10:21:22

Ruby on Rai

2018-10-14 08:39:52

NginxTomcat服務(wù)器

2017-12-18 12:04:02

Nginx代理均衡

2010-08-13 08:59:58

Rails

2019-06-19 15:34:39

Nginx反向代理負(fù)載均衡

2017-11-14 10:59:41

LVS負(fù)載均衡集群

2012-05-07 10:20:12

LVS集群

2010-05-10 14:17:46

負(fù)載均衡技術(shù)

2009-08-06 09:13:36

Ruby on Rai

2010-04-28 11:35:25

集群負(fù)載均衡

2010-05-05 18:21:18

集群負(fù)載均衡

2010-05-06 09:34:36

負(fù)載均衡集群

2010-09-25 14:39:29

Bruce Tate

2009-09-29 17:04:29

2019-11-04 15:35:53

Nginx反向代理負(fù)載均衡

2019-09-18 10:39:08

負(fù)載均衡反向代理TCP

2018-01-17 09:57:41

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩精品一区二区三区高清免费 | 中文字幕综合 | 国产一伦一伦一伦 | 成人在线视频观看 | 成年人在线观看视频 | 九九九久久国产免费 | 一级片av | 国产精品视频 | 日韩中文欧美 | 亚洲欧洲精品成人久久奇米网 | 激情久久网 | 欧美xxxx色视频在线观看免费 | 国产中文区二幕区2012 | 久久91视频 | 欧美不卡一区 | 国产成人a亚洲精品 | 久久亚洲春色中文字幕久久久 | 97人人澡人人爽91综合色 | 色天堂影院 | 免费在线观看一区二区 | 国产精品久久久久久久久 | 欧美日韩综合精品 | 国产一区二区三区精品久久久 | 黄视频网址| 亚洲欧美一区二区三区视频 | 国产精品成人在线观看 | 亚洲视频一区 | 国产一区亚洲二区三区 | 日韩精品免费一区 | 色综合中文 | 福利一区二区在线 | 国产精品18久久久久久白浆动漫 | 精品久久久久国产 | 亚洲成人精选 | 国产精品高清在线 | 3p视频在线观看 | 免费看黄色片 | 国产精品自产拍 | 91精品免费视频 | 久久久精品视频免费 | 成年人在线 |