動態負載伺服器如何實現代碼同步
㈠ 兩台伺服器的數據同步如何實現
1.安裝CentOS7.0yum install ssh 安裝SSH協議yum install rsync (rsync是一個遠程數據同步工具,可通過LAN/WAN快速同巧渣困步孝念多台主機間的文件)service sshd restart 啟動服務任務梁螞
㈡ 如何把測試伺服器上的代碼通過svn同步到正式伺服器上
您好,最簡單的辦法,將SVN伺服器和測試伺服器架設在同一台主機上,然後編輯SVN的post-commit鉤子腳本,這個鉤子是在每次成功commit後由SVN伺服器自動調用執行的,存放在SVN伺服器上該版本庫的hooks文件夾下,編輯這個腳本,調用svn的checkout或者update,在SVN伺服器主機上得到一個最新版的SVN客戶端文件夾,接著通過這個腳本調用編譯、部署指令,部署到測試伺服器指定的文件夾,這就ok了。這樣每次commit後就會自動發布一個新的測試版到測試伺服器上。
當然了,也可以用操作系統的定時任務來做這個,來定時發布新測試版。
㈢ 關於Nginx負載均衡目錄同步問題
近期外包接單,做了一個簡單的系統,本以為如此簡單一個Tomcat就足以滿足,結果客戶要求需要兩台伺服器負載均衡,之前負載均衡都是由專門的人負責,第一次自己實現Nginx,走了不少彎路。
由於項目組有附件上傳的功能,沒有專門的文件伺服器,將附件都存放在了ROOT底下,負載均衡後發現經常找不到圖片,明顯是因為兩台伺服器資源不同步的問題造成的,於是開始研究伺服器目錄同步,使用Rsync+Sersync實現目錄同步,具體步驟:
1:制定兩台伺服器中的一台為主伺服器(安裝軟體rsync+sersync,但是不需要啟動rsync),另一台為從伺服器(安裝軟體rsync,需要啟動rsync)
2:從伺服器安裝完rsync需要對/etc/rsyncd.conf 進行配置:
uid = root #擁有目錄許可權用戶
gid = root #擁有目錄許可權的組
use chroot = no #內網使用可以不用配置
max connections = 200 #最大連接數
timeout = 300 #超時時間
pid file = /var/run/rsyncd.pid #啟動進程寫入此PID文件
lock file = /var/run/rsyncd.lock #lock文件來配合最大連接數參數
log file = /var/log/rsyncd.log #日誌文件
ignore errors = yes #忽略I/O錯誤
read only = false #允許讀寫
list = false #不列出列表
hosts allow = 192.168.1.0/24 #允許網段
hosts deny = * #拒絕其他網段
auth users = users #認證用戶
secrets file = /opt/app/rsyncd/auth.pass #密碼文件
[web] #同步目錄
path = /backup/web
設置 /opt/app/rsyncd/auth.pass文件格式為user:password
給 /opt/app/rsyncd/auth.pass添加600許可權 chmod 600 /opt/app/rsyncd/auth.pass
啟動rsync rsnyc --daemon
3:主伺服器部署
主伺服器安裝完sersync後需要配置confxml.xml,在sersync的安裝目錄下
<sersync>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/>
<!--default every 60mins execute once-->
<crontab start="false" schele="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>
啟動sersync :/opt/soft/sersync/sersync/sersync2 -d -r -o /opt/soft/sersync/sersync/confxml.xml
location ~ .*\.(gif|jpg|jpeg|png|flv|mp3)$ { #靜態
proxy_pass http://192.168.1.12:80/;
}
㈣ OpenResty 動態負載均衡
在之前提到的OpenResty/Nginx的負載均衡當中,當伺服器啟動之後,upstream中的上游伺服器就是固定死的了,做不到動態的變更。這裡面說到的變更,其實更多指的是增加機器。因為當上游伺服器不可用時,upstream會自動將伺服器摘除,但是當新增伺服器時,upstream就做不到了。傳統的負載均衡辦法,就是能是修改配置,然後重啟服務。下面介紹一下動態負載均衡的方式,一種是通過動態重啟服務;另外一種是通過代碼的方式動態拉取伺服器列表。
Consul是一個分布式服務注冊與發現系統。這裡面使用Consul來管理上游伺服器,當伺服器啟動時將其注冊到注冊中心去,當服務關閉時從注冊中心列表中剔除。這裡面需要注意一點的是:當上游伺服器關閉時,Consul本身不會自動從列表中剔除,而是需要在伺服器關閉前主動向Consul發起刪除服務。
Consul有以下特性:
通過Consul可以獲取到upstream中的上游伺服器列表,下面要做的事情就是生成upstream中的模板了。這里就需要用到Consul-templete,它可以使用HTTP長輪詢實現變更觸發和配置更改。從而可以根據Consul伺服器列表動態生成配置文件,然後去重新啟動OpenResty/Nginx即可。
Consul+Consul-templete 就如上面所說的,是一種監聽伺服器列表變更,然後動態生成upstream模板,重啟伺服器。
Consul-Server
筆者使用的是MAC,下面所進行的操作都是基於MAC系統的。首先需要安裝Consul如下:
安裝完成之後,可以通過如下命令啟動Consul服務:
啟動完成之後,可以通過如下地址:localhost:8500/ui。訪問Consul的Web界面:
可以使用HTTP的方式向Consul注冊一個服務:
Consul-template
Consul-template的作用是生成upstream配置模板,安裝命令如下:
然後在nginx.conf同級目錄下創建moguhu_server.ctmpl
重啟OpenResty腳本如下:reboot.sh
然後nginx.conf配置如下:
上游伺服器
上游伺服器upstream中使用的是Spring Boot實現的,其核心代碼如下所示:
筆者在實驗時,Consul版本的問題,造成在JVM停止時,沒有執行刪除服務的操作。因此附上下面的pom依賴
測試驗證
1、啟動Consul
2、啟動Consul-template
3、啟動2台upstream伺服器
然後你會發現在nginx.conf的同級目錄下生成了moguhu_server.conf文件,內容如下:
當手動停掉一台伺服器時,配置又會變更為如下:
此時reboot.sh腳本會自動觸發執行,如下所示:
上面的方式實現動態負載均衡在配置較多的時候會有一些問題,比如配置較多時,OpenResty重啟的速度就會變慢。所以通過Lua腳本的方式可以規避掉重啟這一步驟。
使用Lua實現時,與上面的組件相比Consul-templete就不需要了。通過Consul的 http://127.0.0.1:8500/v1/catalog/service/moguhu_server 介面就可以獲取到服務的列表,如下所示:
這一方式當中主要就是OpenResty裡面的相關配置。
OpenResty 配置
upstreams.lua
nginx.conf
上面通過balancer_by_lua_block去動態的設置了,upstream的伺服器列表。然後啟動OpenResty就可以了。
參考:《億級流量網站架構核心技術》