基於Mysql與Redis集羣上的後端項目搭載與負載均衡

前言

前面完成了對MySqlRedis集羣的搭建,現在就需要完成將後端項目部署到自己搭建的這些集羣上面,在面對數據庫出現問題或是高併發時候,高負載環境下仍能正常的運行,滿足我們實際需求。Redis也搭建了一個集羣,也可以實現更多的緩存來實現。下面來具體學習以下:

部署

數據庫部署

  1. MySql測試鏈接:
    在前面完成了從Docker內部映射到外部地址,並且實現了端口的映射,映射到3306端口,我們在Navicat 就可以進行測試鏈接。
  2. 後端項目的部署:
    這裏使用到人人網的開源項目進行學習:項目下載地址:renren-fast下載地址關於配置問題導入到自己的idea工具即可。
  3. 數據庫集羣的連接:
    對於前面兩章搭建好的數據庫集羣這裏進行配置:首先是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來說直接可以通過如下操作進行打包處理。

  1. 點擊maven:
    在這裏插入圖片描述

  2. 點擊 LiftCycle 看到clean和下面的install。
    在這裏插入圖片描述

  3. 點擊clean 然後 install(注意使用這種方式,需要將代碼中的test 代碼註釋掉。因爲這樣沒有辦法進行跳過test)如下表示成功。進行拷貝。
    在這裏插入圖片描述

運行java容器部署後臺項目

  1. 既然是要運行java項目,我們還是先要拉去java鏡像:
docker pull java

如下查看你已經下載了哪些鏡像
在這裏插入圖片描述
2. 我們知道需要使用到一個數據捲來容納和運行我們的java程序

docker volume create j1
ls /var/lib/docker/volumes/j1/_data
// 可以使用到sftp將java文件上傳到應數據卷目錄下面
renren-fast.jar
  1. 創建一個容器名爲j1.
docker run -it -d  --name j1 -v j1:/home/soft --net=host java
  1. 進入到容器的內部啓動jar文件
docker exec -it j1 bash
// 啓動java項目 注意 此時是後臺運行 需要在前面加上 nohup。
nohup java -jar /home/soft/renren-fast.jar
  1. 測試訪問,完成以上以後,我們就可以進行訪問測試:出現沒有辦法訪問的情況,可以開啓防火牆設置。
    在這裏插入圖片描述
    完成以上的配置之後,雖然後端的健壯性和高,可以在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進行負載均衡
在這裏插入圖片描述

  1. 首先還是下載安裝nginx的鏡像
  2. 配置文件編寫:
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;
        }
    }
}
  1. 啓動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
    }
}

後記

以上我們就完成了對於後端項目的搭載和負均衡。下面我們來重新回顧一下具體的流程。

  1. 因爲我們後端的Mysql數據庫和Redis數據庫都配置了集羣的功能,所以修改配置文件改成我們數據庫的集羣。
  2. 完成以後,因爲不可能只搭建一個java後端項目,我們想着出問題了那之前的數據庫集羣也都白費了,所以搭建了三個java後端項目,端口非別是 6001 ,6002,6003 。 但是我們訪問不可能還記錄端口,並且請求都落在同一個端口上面豈不是壓力就會很大,所以想到了使用nginx負載均衡。
  3. 這個時候我們就搭建一個nginx1負載均衡,端口映射到6101 端口,就可以使用主機ip地址+6101 端口進行訪問,這個時候我們做了嘗試發現就算是停掉一個java容器還是可以繼續運行。
  4. 但是我們又想到了要是對於這個nginx節點也出現了問題呢,不還是會所有的端口都不能能夠正常訪問,所以我們又創建了一個nginx節點,端口是6201,這個時候,兩個端口都可以進行訪問。
  5. 當然我們創建多個端口的意義就是能夠實現雙機,就使用到了keepalived,我們在之前配置好的兩個nginx容器都安裝keepalived並修改配置文件,實現ip地址的映射。這樣就可以使用到虛擬的ip地址+6201端口進行訪問。
  6. 所以前端訪問 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的負載均衡了,有什麼不得體或是沒有看懂的地方大家可以指出來,我也一定及時進行更改!!!謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章