前言
前面完成了對MySql
與Redis
集羣的搭建,現在就需要完成將後端項目部署到自己搭建的這些集羣上面,在面對數據庫出現問題或是高併發時候,高負載環境下仍能正常的運行,滿足我們實際需求。Redis也搭建了一個集羣,也可以實現更多的緩存來實現。下面來具體學習以下:
部署
數據庫部署
- MySql測試鏈接:
在前面完成了從Docker內部映射到外部地址,並且實現了端口的映射,映射到3306端口,我們在Navicat 就可以進行測試鏈接。 - 後端項目的部署:
這裏使用到人人網的開源項目進行學習:項目下載地址:renren-fast下載地址關於配置問題導入到自己的idea工具即可。 - 數據庫集羣的連接:
對於前面兩章搭建好的數據庫集羣這裏進行配置:首先是MySql數據庫集羣的配置:打開如下圖片目錄,進入到數據庫源的配置:
在如下代碼中寫上自己之前配置出來的端口信息。
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.99.150:3306/renrenfast?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
initial-size: 10
max-active: 100
min-idle: 10
max-wait: 60000
然後打開同級目錄下的application.yml
文件填寫上自己之前設置完成的redis數據庫集羣。
redis:
open: false # 是否開啓redis緩存 true開啓 false關閉
database: 0
port: 6379
timeout: 6000ms # 連接超時時長(毫秒)
cluster:
nodes:
- 172.19.0.2:6379
- 172.19.0.2:6379
- 172.19.0.2:6379
- 172.19.0.2:6379
- 172.19.0.2:6379
- 172.19.0.2:6379
jedis:
pool:
max-active: 1000 # 連接池最大連接數(使用負值表示沒有限制)
max-wait: -1ms # 連接池最大阻塞等待時間(使用負值表示沒有限制)
max-idle: 10 # 連接池中的最大空閒連接
min-idle: 5 # 連接池中的最小空閒連接
tomcat部署
與redis的配置文件同一個配置文件裏面進行如下的配置:
server:
tomcat:
uri-encoding: UTF-8
max-threads: 1000
min-spare-threads: 30
port: 6001
connection-timeout: 5000ms
servlet:
context-path: /renren-fast
注意: 通過前面的配置我們知道,對於Mysql和Redi都進行了網段的劃分,在自己的網段裏面搭建起來了集羣,此時若是我們的項目部署在另外一個網段,想要對數據庫的調用訪問時候就會出現問題,因爲docker虛擬機是靜止跨網段進行訪問的。
這個時候,就需要把我部署我們java程序所在的網絡部署到宿主機的網絡上,就是說不爲我們的java容器劃分網段,直接使用到宿主機的網絡,這個時候就可以訪問所有的網段。但是我們的宿主機不可能只搭載一個程序,未來會搭載多個程序,我們就需要未每一個程序分配一個端口,未來使用起來也會更加的方便。
Maven進行工程的打包
在進行打包之前需要先進入到對應的目錄下面就是renren項目對應的目錄的下面:可以使用命令進行打包這裏先學習命令打包的方法:
mvn clean install -Dmaven.test.skip=true;
// clean 表示清除之前打包的Jar文件。
// install: 表示打包到本地。
// -Dmaven.test.skip=true 最後一部分表示跳過測試代碼。
這是使用到命令的方式,當然對於idea來說直接可以通過如下操作進行打包處理。
-
點擊maven:
-
點擊 LiftCycle 看到clean和下面的install。
-
點擊clean 然後 install(注意使用這種方式,需要將代碼中的test 代碼註釋掉。因爲這樣沒有辦法進行跳過test)如下表示成功。進行拷貝。
運行java容器部署後臺項目
- 既然是要運行java項目,我們還是先要拉去java鏡像:
docker pull java
如下查看你已經下載了哪些鏡像
2. 我們知道需要使用到一個數據捲來容納和運行我們的java程序
docker volume create j1
ls /var/lib/docker/volumes/j1/_data
// 可以使用到sftp將java文件上傳到應數據卷目錄下面
renren-fast.jar
- 創建一個容器名爲j1.
docker run -it -d --name j1 -v j1:/home/soft --net=host java
- 進入到容器的內部啓動jar文件
docker exec -it j1 bash
// 啓動java項目 注意 此時是後臺運行 需要在前面加上 nohup。
nohup java -jar /home/soft/renren-fast.jar
- 測試訪問,完成以上以後,我們就可以進行訪問測試:出現沒有辦法訪問的情況,可以開啓防火牆設置。
完成以上的配置之後,雖然後端的健壯性和高,可以在Mysql數據庫節點或是redis節點掛掉的時候仍然能夠提供正常的服務,但是此時若是前端的Tomcat節點出現了故障,就完全不能夠再訪問,所以我們再任何可能會出現問題的地方都需要進行冗餘節點的配置。
我們如法炮製上面的操作,對於數據庫連接和redis連接都不變化,但是由於創建多個連接,所以修改tomcat的端口,設置6002 6003,然後打包,創建數據卷,容器,拷貝到容器內部執行等。
#創建數據卷,上傳JAR文件
docker volume create j2
#啓動容器
docker run -it -d --name j2 -v j2:/home/soft --net=host java
#進入j1容器
docker exec -it j2 bash
#啓動Java項目
nohup java -jar /home/soft/renren-fast.jar
#創建數據卷,上傳JAR文件
docker volume create j3
#啓動容器
docker run -it -d --name j3 -v j3:/home/soft --net=host java
#進入j1容器
docker exec -it j3 bash
#啓動Java項目
nohup java -jar /home/soft/renren-fast.jar
這個時候我們的三個端口都可以訪問到我們的網頁。可以自行測試,記得開放防火牆。
nginx
單個nginx
現在我們的三個後臺程序都可以成功運行,但是是在三個端口進行運行,我們有也不可能將所有的請求都打在同一個端口(也不可能去記憶這些端口)所以就需要用到負載均衡,和之前數據庫的原理是類似的。
前端接口的請求,由nginx進行負載均衡
- 首先還是下載安裝nginx的鏡像
- 配置文件編寫:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
upstream tomcat {
# 自定義名稱 下面就是ip地址和端口號
server 192.168.99.101:6001;
server 192.168.99.101:6002;
server 192.168.99.101:6003;
}
server {
# 服務端端口 配置轉發
listen 6101;
server_name 192.168.99.104;
location / {
proxy_pass http://tomcat;
index index.html index.htm;
}
}
}
- 啓動nginx 需要注意的一點是,這裏啓動時候沒有使用數據卷,因爲數據卷只能實現目錄和目錄的映射處理,這裏我們是nginx的修改的配置文件,所以需要先在本地創建對應的文件夾將nginx配置文件放到其中。在home目錄下面創建叫做n1的文件夾,然後再裏面創建叫做nginx.conf 的配置文件。
docker run -it -d --name n1 -v /home/n1/nginx.conf:/etc/nginx/nginx.conf --net=host --privileged nginx
這個時候對於nginx就相當於已經啓動了,我們可能訪問6101 端口不會覺得有什麼變化,其實對於nginx來說已經實現了負載均衡,我們可以進行 測試,使用到掛掉j1容器,還有j2 與 j3 但是此時訪問到6101 端口還是沒有問題
docker pause j1
多nginx
經過我們前面的學習發現,此時對於一個nginx來說能夠保證後端節點出現問題還能訪問,但是若是這個nginx發生故障呢,豈不就是也不能夠繼續訪問,所以我們需要實現nginx冗餘節點。我們對下面的部分進行修改:
upstream tomcat {
# 自定義名稱 下面就是ip地址和端口號
server 192.168.99.101:6001;
server 192.168.99.101:6002;
server 192.168.99.101:6003;
}
server {
# 服務端端口 配置轉發
listen 6102;
# 端口變成了6102
server_name 192.168.99.104;
location / {
proxy_pass http://tomcat;
index index.html index.htm;
}
}
前面的nginx第一個節點的操作就是先本機創建目錄,同上面一樣在相同的home下面創建叫做n2的文件夾裏面使用touch創建nginx.conf ,然後將配置文件上傳上去,再度創建一個nginx節點,測試訪問也是沒有問題的,這個時候,我們就可以開始對於nginx的雙擊熱備的部署與學習了。
使用keepalived來實現nginx的雙機熱備
和之前一樣,在docker內安裝keepalived,然後設置虛擬的ip,讓這兩個keepalived去爭搶虛擬ip。
之前我們不是已經創建完成了n1容器,現在進入到這個容器,來進行安裝keepalived。
docker exec -it n1 bash // 進入容器
apt-get update // 執行更新
apt-get install keepalived // 安裝keepalived
apt-get install vim // 安裝編譯器,不然在容器內部無法使用 vim對配置文件的信息進行改動。
在以上完成之後就可以開始對keepalived配置文件進行具體的配置
vi /etc/keepalived/keepalived.conf
# 完成以後使用 esc + wq 退出
配置文件的內容如下:
vrrp_instance VI_1 {
state MASTER
#
interface ens33 # 網卡 使用宿主機網絡 網卡 宿主機網卡
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.99.151
# 虛擬ip
}
}
virtual_server 192.168.99.151 6201 {
# 表示這個ip和端口接受請求 然後轉發到我們下面的ip和端口
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.99.101 6101 {
# 真實宿主機ip地址 和之前我們接受的ip地址。
weight 1
}
}
然後啓動keepalived。
service keepalived start
然後就可以使用192.168.99.151:6201+ 對應的原來的地址進行訪問即可。
這個時候我們就是相當於在nginx第一個結點裏面使用了一個keepalived實現由最開始的192.168.99.101:6101 轉換成爲192.168.99.151:6201。這個時候我們再度重複以上的操作實現第二個nginx結點裏裝配keepalived。
#進入n2節點 和n1結點的操作相同
docker exec -it n2 bash
#更新軟件包
apt-get update
#安裝VIM
apt-get install vim
#安裝Keepalived
apt-get install keepalived
#編輯Keepalived配置文件(如下)
vim /etc/keepalived/keepalived.conf
#啓動Keepalived
service keepalived start
配置信息:
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.99.151
}
}
virtual_server 192.168.99.151 6201 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.99.104 6102 {
# 真實機器的6201 端口。
weight 1
}
}
後記
以上我們就完成了對於後端項目的搭載和負均衡。下面我們來重新回顧一下具體的流程。
- 因爲我們後端的Mysql數據庫和Redis數據庫都配置了集羣的功能,所以修改配置文件改成我們數據庫的集羣。
- 完成以後,因爲不可能只搭建一個java後端項目,我們想着出問題了那之前的數據庫集羣也都白費了,所以搭建了三個java後端項目,端口非別是 6001 ,6002,6003 。 但是我們訪問不可能還記錄端口,並且請求都落在同一個端口上面豈不是壓力就會很大,所以想到了使用nginx負載均衡。
- 這個時候我們就搭建一個nginx1負載均衡,端口映射到6101 端口,就可以使用主機ip地址+6101 端口進行訪問,這個時候我們做了嘗試發現就算是停掉一個java容器還是可以繼續運行。
- 但是我們又想到了要是對於這個nginx節點也出現了問題呢,不還是會所有的端口都不能能夠正常訪問,所以我們又創建了一個nginx節點,端口是6201,這個時候,兩個端口都可以進行訪問。
- 當然我們創建多個端口的意義就是能夠實現雙機,就使用到了keepalived,我們在之前配置好的兩個nginx容器都安裝keepalived並修改配置文件,實現ip地址的映射。這樣就可以使用到虛擬的ip地址+6201端口進行訪問。
- 所以前端訪問
192.168.99.151 6201
端口,轉發到192.168.99.101:6101
,192.168.99.101:6201
上(兩個nginx)。然後每一個nginx結點下面都有192.168.99.6001,6002,6003
三個java服務器,保證在一個nginx出現故障並且java容器也出現故障的時候還能夠提供正常的服務。
結語
以上就是在Mysql和Redis數據庫集羣上搭建後端項目,並實現nginx的負載均衡了,有什麼不得體或是沒有看懂的地方大家可以指出來,我也一定及時進行更改!!!謝謝。