概述
應用vmware在本地構建linux虛擬機集羣,包括一個nginx節點,三個GeoServer節點,三個GlusterFS文件系統節點。
軟件準備
1.geoserver軟件(使用tomcat作爲web容器)
2.nginx
3.glusterFS
虛擬系統準備
在vmware中克隆三臺CentOS 7 虛擬機,分別安裝nginx,geoserver,gfs。
其他幾個節點直接再克隆已有的節點,修改相關配置文件。
具體步驟
1.由centos 7 64位虛擬機模板克隆nginx虛擬機節點
虛擬機的設置如下:
注意一定要使用NAT模式,以使得該虛擬機使用宿主機的IP訪問公網。
使用NAT模式,就是讓虛擬系統藉助NAT(網絡地址轉換)功能,通過宿主機器所在的網絡來訪問公網。也就是說,使用NAT模式可以實現在虛擬系統裏訪問互聯網。NAT模式下的虛擬系統的TCP/IP配置信息是由VMnet8(NAT)虛擬網絡的DHCP服務器提供的,無法進行手工修改,因此虛擬系統也就無法和本局域網中的其他真實主機進行通訊。採用NAT模式最大的優勢是虛擬系統接入互聯網非常簡單,你不需要進行任何其他的配置,只需要宿主機器能訪問互聯網即可。
開啓虛擬機,開始配置虛擬機的網絡。
修改克隆虛擬機的靜態IP,修改網卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33
其中IPADDR爲該虛擬機在宿主機局域網中的IP,最後的201爲我自己規定的,前面的213要查看vmnet8的子網地址,如果沒有設置正確,是連不到宿主機的。
在vmware中,編輯–》虛擬網絡編輯器可查看。
子網掩碼填寫也如上圖。
網關的填寫也是有依據的,點擊NAT設置,查看網關:
DNS服務器可以只配一個,我用的是兩個免費的dns服務器。
Esc :wq保存並退出。
重啓網絡服務
systemctl restart network
修改主機名稱
[root@localhost ~] hostnamectl set-hostname nginx201
[root@localhost ~] hostnamectl --pretty
[root@localhost ~] hostnamectl --static
[root@localhost ~] hostnamectl --transient
nginx201
修改hosts文件,添加如下域名
vim /etc/hosts
192.168.213.201 nginx201
192.168.213.202 geoserver202
192.168.213.203 geoserver203
192.168.213.204 geoserver204
192.168.213.130 gfs130
192.168.213.131 gfs131
192.168.213.132 gfs132
重啓虛擬機
reboot
檢查hostname 和ifconfig信息。
關機克隆該虛擬機爲geoserver202,geoserver203,geoserver204
需要在geoserver202,geoserver203,geoserver204修改的爲
1.本機靜態IP(分別爲192.168.213.202,192.168.213.203,192.168.213.204)
2.主機名(分別爲geoserver202,geoserver202,geoserver204)
3.hosts不用再配置。
方法同上。
配完之後互相ping一下測試聯通性。
ping不通的話看看windows防火牆關了沒。
配完之後就可以使用xshell連接了,vmware裏不能複製粘貼太難受。
在nginx201上安裝nginx。
略。
配置nginx集羣:
打開nginx.conf
vi /usr/local/nginx/conf/nginx.conf
修改如下配置
upstream mygeoserver {
ip_hash;
server 192.168.213.202:8080;
server 192.168.213.203:8080;
server 192.168.213.204:8080;
}
server {
listen 9090;
server_name 192.168.213.201;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://mygeoserver;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
讀取nginx.conf,啓動nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
在geoserver202,203,304上傳jdk,tomcat,geoserver.war
創建目錄
mkdir /opt/software
mkdir /opt/module
將軟件包放在software目錄下,將安裝位置放在module下(三個節點都這樣操作)。
1.安裝jdk(略)
2.安裝tomcat(略)
3.部署geoserver項目
將geoserver.war放在webapps目錄下:
啓動tomcat,自動解壓並部署項目
瀏覽器訪問成功。如果沒成功,檢查端口是否開放。
訪問geoserver web管理頁面
三個節點都這樣佈置完並啓動後,集羣還並不能夠使用。因爲三個geoserver節點所使用的數據目錄並不一致,我們要將其配置到統一的文件系統路徑上。所以我們接下來搭建GlusterFS分佈式文件系統。
1.克隆三臺虛擬機,分別爲gfs130,gfs131,gfs132。各自需要修改的配置有:
- 靜態ip;
- hosts文件 域名映射;
- 主機名;
修改靜態ip(各個節點ip爲130,131,132):
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改hosts文件映射
vim /etc/hosts
修改主機名
hostnamectl set-hostname gfs130
hostnamectl --pretty
hostnamectl --static
hostnamectl --transient
reboot重啓機器。
修改另外兩個文件系統節點的配置信息。
基本信息修改完後,在另三臺機器上安裝GlusterFS。
步驟如下:
安裝glusterfs(三臺都要執行)
#安裝glusterfs
yum install centos-release-gluster
yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
#啓動gluster服務
systemctl start glusterd.service
systemctl enable glusterd.service
在gfs132上執行,將gfs130,gfs131加入集羣
gluster peer probe gfs130
gluster peer probe gfs131
在gfs132上看集羣狀態
[root@gfs132 ~]# gluster peer status
Number of Peers: 2
Hostname: gfs131
Uuid: 9a746d3b-ee5e-4f6a-9bb5-f437dc871fcf
State: Peer in Cluster (Connected)
Hostname: gfs130
Uuid: 1625a441-fd0f-47cd-ab13-f1cf97dc407d
State: Peer in Cluster (Connected)
[root@gfs132 ~]#
在gfs132上執行,創建3副本的複製卷。glusterfs使用現有Linux文件系統創建glusterfs文件系統。
#創建卷
[root@gfs132 ~]# gluster volume create app-data replica 3 transport tcp node-1:/gfs-data/ node-2:/gfs-data/ node-3:/gfs-data/ force
volume create: app-data: success: please start the volume to access data
# 列出卷
[root@gfs132 ~]# gluster volume list
app-data
#查看卷信息
[root@gfs132 ~]# gluster volume info
Volume Name: app-data
Type: Replicate
Volume ID: a3f4999a-bfcd-4db5-8a4d-b040568ffa20
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: gfs130:/gfs-data
Brick2: gfs131:/gfs-data
Brick3: gfs132:/gfs-data
Options Reconfigured:
performance.client-io-threads: off
nfs.disable: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
features.quota: on
features.inode-quota: on
features.quota-deem-statfs: on
[root@gfs132 ~]#
# 啓動卷
[root@gfs132 ~]# gluster volume start app-data
volume start: app-data: success
[root@gfs132 ~]# gluster volume quota app-data enable
volume quota : success
[root@gfs132 ~]# gluster volume quota app-data limit-usage / 30GB
volume quota : success
# 查看卷狀態
[root@gfs132 ~]# gluster volume status
Status of volume: app-data
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick gfs130:/gfs-data 49152 0 Y 1120
Brick gfs131:/gfs-data 49152 0 Y 1112
Brick gfs132:/gfs-data 49152 0 Y 1346
Self-heal Daemon on localhost N/A N/A Y 1366
Quota Daemon on localhost N/A N/A Y 1355
Self-heal Daemon on gfs131 N/A N/A Y 1138
Quota Daemon on gfs131 N/A N/A Y 1101
Self-heal Daemon on gfs130 N/A N/A Y 1140
Quota Daemon on gfs130 N/A N/A Y 1129
Task Status of Volume app-data
------------------------------------------------------------------------------
There are no active volume tasks
[root@gfs132 ~]#
#掛載 將創建的app-data卷掛載到gfs132 的/gfs-share 目錄上。
[root@gfs132 ~]# mkdir /gfs-share && mount -t glusterfs gfs132:app-data /gfs-share
查看/gfs-share目錄。上傳測試文件到該目錄下。如果文件系統中其他節點下gfs-data看到了上傳的文件,證明實現了文件共享,GlusterFS集羣基本搭建完成。
在gfs130和gfs131的/gfs-data中
geoserver集羣訪問GlusterFS文件系統集羣
前面提到了讓各個GeoServer節點能夠訪問統一的文件系統目錄,這裏就介紹如何將GFS集羣的app-data卷掛載到geoserver各個節點上。
但是在真正讓geoserver節點可訪問文件系統集羣之前,需要做另外一個工作:集羣時間同步。集羣時間不同步會導致對數據的計劃任務等不協調,造成數據混亂。更重要的是,集羣時間不同步,GFS文件系統的卷,是不會讓你掛載到客戶端來訪問的。
關於集羣時間同步的詳細內容,請問一下度娘。
隨意選擇一個節點做集羣時間服務器,其他幾個節點開啓定時任務和該節點進行時間同步。
時間服務器配置(必須root用戶)
(1)檢查ntp是否安裝
[root@gfs132~]# rpm -qa|grep ntp
ntp-4.2.6p5-10.el6.centos.x86_64
ntpdate-4.2.6p5-10.el6.centos.x86_64
(2)修改ntp配置文件
vi /etc/ntp.conf
修改內容如下
a)修改1(授權192.168.213.0-192.168.213.255網段上的所有機器可以從這臺機器上查詢和同步時間)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap爲
restrict 192.168.213.0 mask 255.255.255.0 nomodify notrap
b)修改2(集羣在局域網中,不使用其他互聯網上的時間)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst爲
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3(當該節點丟失網絡連接,依然可以採用本地時間作爲時間服務器爲集羣中的其他節點提供時間同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
[root@gfs132 ~]# vim /etc/sysconfig/ntpd
增加內容如下(讓硬件時間與系統時間一起同步)
SYNC_HWCLOCK=yes
(4)重新啓動ntpd服務
[root@gfs132 ~ ]# service ntpd status
...
[root@gfs132 ~ ]# service ntpd start
(5)設置ntpd服務開機啓動
[root@gfs132 ~ ]# chkconfig ntpd on
其他機器配置(必須root用戶)
(1)在其他機器配置10分鐘與時間服務器同步一次
[root@geoserver202 ~]# crontab -e
編寫定時任務如下:
*/10 * * * * /usr/sbin/ntpdate gfs132
[root@geoserver202 ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@geoserver202 ~]#
geoserver節點安裝GlusterFS客戶端
配置完集羣時間同步後,在每一臺geoserver節點上安裝GlusterFS客戶端,去掛載文件服務器的卷。
1.安裝客戶端,逐一運行如下命令
yum install centos-release-gluster
yum -y install glusterfs
yum -y install glusterfs-client
mkdir /mnt/glusterfs
mount -t glusterfs gfs132:app-data /mnt/glusterfs
需要注意的是,客戶端的glusterfs 版本一定要和server端一致。否則會出現掛載失敗的問題。我這裏是如下版本:
Package glusterfs-7.5-1.el7.x86_64 already installed and latest version
掛載成功後,查看掛載目錄,發現能訪問到之前上傳的測試數據。
爲geoserver軟件設置統一GFS文件路徑
修改geoserver的數據目錄
/opt/module/apache-tomcat-8.5.54/webapps/geoserver/WEB-INF/web.xml
將geoserver的數據目錄修改爲掛載上的GFS共享文件目錄,如下所示:
<context-param>
<param-name>GEOSERVER_DATA_DIR</param-name>
<param-value> /mnt/glusterfs</param-value>
</context-param>
查看geoserver web管理頁面,如果數據被清空,證明配置生效。如果還是默認的那些服務,重啓geoserver即可。
發佈wmts服務進行性能測試
用ftp將大小爲900M的tiff上載至gfs132:gfs-data目錄下。實現各節點數據共享。首先用geoserver發佈wms服務。
如下圖
我現在可以直接用如下代碼按照wms服務的方式去訪問了
var aerial = new Cesium.WebMapServiceImageryProvider({
url: 'http://192.168.213.201:9090/geoserver/sichuan/wms',//使用nginx代理
layers: 'sichuan1:sv1-03_20181210_l2a0000808046_1103190005003_011',
parameters: {
service: 'WMS',
format: 'image/png',
transparent: true
}
});
viewer.imageryLayers.addImageryProvider(aerial);
但是爲了提高服務訪問速度,我們採用wmts服務的方式來進行訪問。點擊“tile layer”,找到對應的服務,選擇一種預覽方式,查看服務情況。
放大縮小沒有問題,第一次瀏覽可能會有些卡頓,這是因爲訪問這個服務geoserver在給這副地圖實時生成瓦片,多預覽一段時間後會好的多。另外初期可能在控制檯上得到許多400 bad request錯誤,沒有關係,那是因爲有的瓦片還沒生產出來,只要有正確的瓦片返回,則服務是沒有問題的。
生成的瓦片存儲在我們設定的數據目錄下
多瀏覽幾次該服務,會越來越流暢。
使用cesium加載wmts服務
要加載發佈圖層的切片地圖服務,我們首先要找到幾個重要參數:
工作空間:圖層名稱
服務地址:
http://192.168.213.202:8080/geoserver/gwc/service/wmts/rest/sichuan:sv1-03_20181210_l2a0000808046_1103190005003_011/{style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}?format=image/png
打開wmts能力文檔後,搜索對應的工作空間名稱和圖層名
向下查找找到對應的服務鏈接
另外還需要找到style,座標系等參數,我這裏的服務沒有設置那麼多,用默認值就可以了。
var wmtsImageryProvider = new Cesium.WebMapTileServiceImageryProvider({
url: 'http:///192.168.213.201:8080/geoserver/gwc/service/wmts/rest/sichuan:sv1-03_20181210_l2a0000808046_1103190005003_011/{style}/{TileMatrixSet}/{TileMatrixSet}:{TileMatrix}/{TileRow}/{TileCol}?format=image/png',
layer: 'sichuan:sv1-03_20181210_l2a0000808046_1103190005003_011',
style: '',
format: 'image/png',
tileMatrixSetID: 'EPSG:900913' //一般使用EPSG:3857座標系
});
viewer.imageryLayers.addImageryProvider(wmtsImageryProvider);
效果
注意事項
使用nginx做負載均衡,是以用戶(一個用戶訪問ip)爲單位的,一旦nginx分配了一個節點爲該用戶提供服務,那麼無論後續這個用戶訪問量再大,併發請求數再多,也只使用被分配的這個節點來處理。其他節點不會幫忙計算,就是一個幹,六個看。
那nginx起到了什麼作用呢?它其實是用來處理多用戶併發的,它將來自不同用戶的請求分發給不同的節點負責處理,達到了負載均衡的目的。就單個用戶來說,即使這個用戶訪問量再大,也不會調動其他節點來幫忙,它只應用他被分配的節點的資源,nginx的作用沒有發揮。
那麼geoserver服務的響應時間受什麼影響呢?我畫了一張草圖做了一些分析:
可以看到,一個服務的響應時間爲請求等待時間+服務器計算時間+網頁內容下載時間+瀏覽器渲染時間。我們這裏討論服務端的性能,就把最後兩項瀏覽器的參數去掉,只留前兩項。
如果當前服務請求沒有達到geoserver服務器能承受的最大併發數,則響應時間只受服務器計算時間的影響,就是服務器性能本身。如果當前超過了最大併發數,則需要進行等待,響應時間即爲等待時間和計算時間之和。
現在遇到一個問題,就是我需要知道,如果要求的響應時間爲5S,能處理多大的併發數呢?假設每個地圖用戶訪問平均發起50個地圖服務請求,算出這個併發數處以50,就是單個節點5S內能夠同時服務的用戶數。
編寫腳本以不同地圖範圍參數瞬時訪問該地圖服務,查看5S之內能返回多少個請求,即爲要求的併發數。
在我的節點資源爲8C/3g的時候,5秒能夠處理2000併發。所以摺合成用戶數,就是可以同時滿足40用戶同時訪問。
腳本編寫待續
整理待續
補充待續