最近作了一個不大不小的項目,現就刪繁就簡單獨拿出來web集羣這一塊寫一篇博客。數據庫集羣請參考《MySQL集羣架構篇:MHA+MySQL-PROXY+LVS實現MySQL集羣架構高可用/高性能-技術流ken》下面是項目的一些簡單介紹。php
隨着網站訪問量的激增,勢必會致使網站的負載增長,現需求搭載一套高性能,高負載,高可用的網站集羣架構以保障網站的持續、高效、安全、穩定的運行。html
針對以上需求,咱們採用了以下的技術:node
² 系統版本:CentOS Linux release 7.5.1804 (Core)mysql
² 內核版本:3.10.0-862.el7.x86_64nginx
² SELinux關閉狀態web
² Firewalld關閉狀態redis
第一部分:WEB集羣sql
1.當用戶請求通過路由器轉發進網絡中,由Keepalived+Lvs組成的一臺服務器首先接收請求,根據配置好的調度規則轉發至後端服務器節點。在這裏準備了兩臺服務器,使用Keepalived解決單點故障問題,實現服務的高可用。數據庫
2.由Keepalived+Lvs轉發過來的用戶請求進入到緩存代理服務器當中。這裏使用Nginx作了一個緩存服務器以及代理服務器,若是緩存中有用戶請求的緩存數據,就會直接返回給客戶端,若是沒有用戶請求數據的緩存就會根據文件類別進行日後方節點轉發。apache
3.若是客戶請求是靜態文件就會被調度到靜態服務器。靜態服務器由apache構建,靜態服務器提供靜態文件,並由後方的文件共享服務器提供文件。
4.若是客戶請求是動態文件就會被調度到動態服務器。動態服務器由nginx構建,動態服務器提供動態文件,這裏作了一個apache,mysql,php分離的架構。
5.把須要部署的網站包放在文件共享服務器。文件共享服務器部署NFS。
6.對文件共享服務器作好備份,防止數據丟失。這裏採用rsync+inotify實現數據的徹底備份,保證數據的一致性。
第二部分:監控集羣
1.監控採用zabbix,並使用分佈式監控系統,減少主監控節點的壓力。
2.兩個mysql-proxy分別監控web集羣和mysql集羣,實時反應每一個節點的狀態信息,快速定位故障節點進行修復。
3.在zabbix服務器端一塊兒配置了DNS以及NTP服務,分別提供內部服務器的網站域名解析服務,以及時間同步服務。
主機名(角色) |
IP地址 |
keepalived+lvs主 |
10.220.5.131 |
keepalived+lvs備 |
10.220.5.132 |
VIP |
10.220.5.133 |
代理緩存1 |
10.220.5.134 |
代理緩存2 |
10.220.5.135 |
靜態服務器 |
10.220.5.137 |
動態服務器 |
10.220.5.138 |
文件共享服務器 |
10.220.5.139 |
備份服務器 |
10.220.5.140 |
zabbix.ntp.dns |
10.220.5.111 |
上面的架構我已經寫成了腳本,能夠實現一鍵安裝,腳本能夠複用。先就針對每一個腳本進行講解
[root@ken ~]# ls
arp.sh fileshare.sh inotify7.sh keepalived.conf qimojiagou.tar.gz ssh1.sh zhengti.sh
dongtai5.sh huancun3.sh keep2.sh nginx.conf rsync6.sh static4.sh
1.實現腳本一鍵安裝第一步要作的就是祕鑰的分發。
2.祕鑰自動分發藉助於expect來實現,因此腳本中第一步是要安裝expect。
3.刪除保存的祕鑰信息,能夠實現腳本的複用。
4.使用ssh-keygen來生成祕鑰,藉助於expect實現自動化。
5.使用一個for循環的語句,把你須要聯繫的節點的IP地址寫進去,這樣就能夠實現免祕鑰登陸了。
[root@ken ~]# vim ssh1.sh #!/bin/bash . /etc/init.d/functions #下載expect yum install expect -y &>/dev/null if [ $? -eq 0 ];then echo -n "download expect" success echo "" else echo -n "download expect" failure echo "" exit 8 fi #刪除保存的祕鑰信息 if [ -f id_rsa -o -f id_rsa.pub -o known_hosts ];then rm -rf /root/.ssh/id* rm -rf /root/.ssh/known* fi #自動生成祕鑰對 /usr/bin/expect<<eof spawn ssh-keygen expect { "(/root/.ssh/id_rsa)" {send \r;exp_continue} "passphrase" {send \r;exp_continue} "again" {send \r} } expect eof exit eof #在各個節點分發祕鑰 for i in 31 32 34 35 37 38 39 40 do ken=10.220.5.1$i /usr/bin/expect<<eof spawn ssh-copy-id $ken expect { "yes/no" {send yes\r;exp_continue} "password" {send o\r} } expect eof exit eof done
1.在兩個keepalived節點之上下載須要的軟件
2.使用ssh結合命令在備節點執行下載操做
3.把/root/下的keepalived文件傳到備節點之上
4.使用sed修改keepalived配置文件
5.作後端節點的arp抑制
[root@ken ~]# vim keep2.sh #!/bin/bash . /etc/init.d/functions bash /root/ssh1.sh yum install nginx keepalived ipvsadm libnl* popt* -y &>/dev/null if [ $? -ne 0 ];then echo -n "download error at master" failure echo "" exit 4 fi #keepalved備節點也下載軟件 ssh 10.220.5.132 yum install keepalived ipvsadm libnl* popt* -y &>/dev/null if [ $? -ne 0 ];then echo -n "download error at slave" failure echo "" exit 2 fi #把準備好的從節點keepalived文件傳送到備節點並啓動 scp -q /root/keepalived.conf 10.220.5.132:/etc/keepalived &>/dev/null ssh 10.220.5.132 systemctl restart keepalived &>/dev/null #準備主keepalived文件並啓動 cp -f /root/keepalived.conf /etc/keepalived/ sed -i 's/router_id id2/router_id id1/' /etc/keepalived/keepalived.conf &>/dev/null sed -i 's/state SLAVE/state MASTER/' /etc/keepalived/keepalived.conf &>/dev/null sed -i 's/priority 100/priority 150/' /etc/keepalived/keepalived.conf &>/dev/null systemctl restart keepalived &>/dev/null #緩存1arp抑制 scp -q /root/arp.sh 10.220.5.134:/root ssh 10.220.5.134 bash /root/arp.sh #緩存2arp抑制 scp -q /root/arp.sh 10.220.5.135:/root ssh 10.220.5.135 bash /root/arp.sh systemctl restart nginx ipvsadm -L -n
1.在後端節點10.220.5.134,10.220.5.135安裝nginx做爲緩存代理服務器
2.把準備好的nginx配置文件發送到後端節點並進行重啓生效
#!/bin/bash . /etc/init.d/functions #配置134代理緩存 ssh 10.220.5.134 yum install nginx -y &>/dev/null if [ $? -ne 0 ];then echo -n "download nginx" failure echo "" exit 5 fi mkdir /k &>/dev/null mkdir /kenken &>/dev/null scp -q /root/nginx.conf 10.220.5.134:/etc/nginx &>/dev/null ssh 10.220.5.134 systemctl restart nginx &>/dev/null #配置135代理緩存 ssh 10.220.5.135 yum install nginx -y &>/dev/null if [ $? -ne 0 ];then echo -n "download nginx" failure echo "" exit 5 fi scp -q /root/nginx.conf 10.220.5.135:/etc/nginx &>/dev/null ssh 10.220.5.135 systemctl restart nginx &>/dev/null
1.安裝httpd以及nfs組件
2.掛載共享服務器節點至本機的網站根目錄
3.重啓nginx使配置生效
[root@ken ~]# vim static4.sh
#!/bin/bash . /etc/init.d/functions yum install httpd nfs-utils -y &>/dev/null #mkdir -p /var/www/html/static &>/dev/null mount -t nfs 10.220.5.139:/ken /var/www/html &>/dev/null systemctl restart httpd
1.安裝配置lnmp環境
2.掛載共享服務器節點至本機的網站根目錄之下
3.重啓apache使配置生效
[root@ken ~]# vim dongtai5.sh #!/bin/bash yum install httpd php php-mysql nfs-utils -y &>/dev/null #mkdir -p /var/www/html/dongtai &>/dev/null mount -t nfs 10.220.5.139:/ken /var/www/html/ &>/dev/null systemctl restart httpd
[root@ken ~]# vim rsync6.sh
#!/bin/bash . /etc/init.d/functions ruser=user1 vuser=kenken file=/ken hosts=10.220.5.139/24 yum install rsync -y &>/dev/null useradd -r -u 333 -s /sbin/nologin $ruser &>/dev/null if [ ! -e $file ];then mkdir $file &>/dev/null fi chown -R $ruser $file cat>/etc/rsyncd.conf<<eof pid file=/var/lock/subsys/pidfile lock file=/var/lock/subsys/rsync log file=/var/log/rsync uid=333 gid=333 timeout=100 max connections=199 [ken] path=/ken list=yes use chroot=yes read only=no auth users=kenken secrets file=/etc/rsyncd.pwd hosts allow=10.220.5.139/24 eof echo "$vuser:123" > /etc/rsyncd.pwd chmod 600 /etc/rsyncd.pwd rsync --daemon &>/dev/null if [ $? -eq 0 ];then echo -n "start rsync..." success echo "" else echo -n "start rsync..." failure echo "" fi
1.在本機安裝inotify和rsync
2.監控/ken下的文件,若是發生更改就會被推送至rsync服務器端
[root@ken ~]# vim inotify7.sh #!/bin/bash . /etc/init.d/functions file=/ken vuser=kenken host=10.220.5.140 mname=ken yum install inotify-tools -y &>/dev/null echo "123" >/etc/rsync.pwd chmod 600 /etc/rsync.pwd inotifywait -mrq --format "%w%f" -e create,delete,modify $file | while read line do rsync -rz --delete $file $vuser@$host::$mname --password-file=/etc/rsync.pwd done
1.把本機的/ken目錄共享給10.220.5.137,10.220.5.138服務器端文件能夠解壓在本目錄下便可
[root@ken ~]# vim fileshare.sh
#!/bin/bash . /etc/init.d/functions yum install nfs-utils rpcbind -y &>/dev/null mkdir -p /ken/static &>/dev/null mkdir -p /ken/dongtai &>/dev/null chown -R nfsnobody.nfsnobody /ken cat>/etc/exports<<eof /ken 10.220.5.137/24(rw,async,all_squash) /ken 10.220.5.138/24(rw,async,all_squash) eof systemctl restart rpcbind systemctl restart nfs
至此全部的腳本已經介紹完畢,下面來看一下nginx的配置文件。
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { 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; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. proxy_cache_path /k levels=1:2 keys_zone=scache:30m; #定義靜態文件的緩存 fastcgi_cache_path /kenken levels=1:2 keys_zone=kenken:30m; #定義動態文件的緩存 server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html; index index.html; # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; location / { proxy_pass http://10.220.5.137; #靜態文件會被代理到10.220.5.137 proxy_set_header host $host; proxy_set_header realip $remote_addr; proxy_cache scache; #使scache緩存 proxy_cache_valid any 10m; #定義緩存的類型及時間 } location ~ \.php$ { proxy_pass http://10.220.5.138; #動態的文件會被緩存到10.220.5.138 proxy_set_header host $host; proxy_set_header realip $remote_addr; fastcgi_cache kenken; #使用動態緩存 fastcgi_cache_valid any 10m; fastcgi_cache_key http://$host$request_uri; #定義動態緩存的key } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
最後來看一下總體的腳本,即執行的腳本
1.把寫好的腳本及準備好的配置文件都存放在10.220.5.131的/root下
2.使用scp及ssh進行遠程傳送腳本及運行腳本
[root@ken ~]# vim zhengti.sh
#!/bin/bash . /etc/init.d/functions #執行祕鑰分發 bash /root/ssh1.sh #實現keepalived+LVS bash /root/keep2.sh #實現緩存代理 bash /root/huancun3.sh #實現文件共享 scp -q /root/fileshare.sh 10.220.5.139:/root ssh 10.220.5.139 bash /root/fileshare.sh #實現靜態服務器 scp -q /root/static4.sh 10.220.5.137:/root ssh 10.220.5.137 bash /root/static4.sh #實現動態服務器 scp -q /root/dongtai5.sh 10.220.5.138:/root ssh 10.220.5.138 bash /root/dongtai5.sh #實現備份服務器rsync scp -q /root/rsync6.sh 10.220.5.140:/root ssh 10.220.5.140 bash /root/rsync6.sh #實現共享文件服務器inotify scp -q /root/inotify7.sh 10.220.5.139:/root ssh 10.220.5.139 bash /root/inotify7.sh & iptables -F
只要運行總的腳本便可,會自動調用其餘腳本
[root@ken ~]# bash zhengti.sh
第一步:在10.220.5.137主機建立靜態測試文件
[root@ken html]# cat index.html test for 137ddd
第二步:在10.220.5.138主機建立動態測試文件
[root@ken html]# cat index.php <?php phpinfo(); ?>
第三步:輸入10.220.5.133/index.html,即虛擬IP 訪問10.220.5.137主機的動態文件
第四步:輸入10.220.5.133/index.php,即虛擬IP 訪問10.220.5.138主機的動態文件
看到這些信息即表示成功
實現全網監控首先須要給每一個待監控的主機安裝zabbix的客戶端,可使用以下腳本進行安裝\
第一步:執行以下腳本
給每一個待監控的客戶端安裝zabbix-agen客戶端
還要確保開啓主動模式及
ServerActive=172.20.10.6 ##這個IP地址是你監控服務器的地址,客戶端都要指向服務器端
#!/bin/bash #author:技術流ken #date:2018-11-15 #desc:this script for downloading zabbix-agent for clients ip=10.220.5.1 for i in 31 32 34 35 37 38 39 40 do ssh $ip$i yum install zabbix-agent -y &>/dev/null ssh $ip$i sed -i 's/Server=127.0.0.1/Server=10.220.5.137/' /etc/zabbix/zabbix_agentd.conf &>/dev/null ssh $ip$i systemctl restart zabbix-agent &>/dev/null done
第二步:在zabbix服務器端開啓自動註冊
點擊configuration>actions>選擇右上角的auto redistration
點擊creation action
選擇以下動做
點擊add保存
第三步:查看
點擊configure>hosts便可查看自動註冊到的主機