【項目案例】超詳細的高可用網(wǎng)絡架構的部署方案
時間:2023-04-18 14:20:02 | 來源:網(wǎng)站運營
時間:2023-04-18 14:20:02 來源:網(wǎng)站運營
【項目案例】超詳細的高可用網(wǎng)絡架構的部署方案:
網(wǎng)站架構演變
1. 問題學習從單機架構到集群架構的演變之路:
- 單機版LNMP
- 獨立數(shù)據(jù)庫服務器
- Web服務器集群與Session保持
- 動靜分離、數(shù)據(jù)庫集群
- 各種緩存服務器 業(yè)務模型
2. 步驟此案例主要是學習網(wǎng)站架構演變的過程,以拓撲圖和理論為主,具體實現(xiàn)還需要結合具體的軟件。
單機版網(wǎng)站,拓撲如圖所示。
用戶量少時使用,簡單、成本低、存在單點故障。
獨立數(shù)據(jù)庫服務器是將網(wǎng)站靜態(tài)文件、代碼文件等資料與數(shù)據(jù)庫分離的架構,當用戶量增加時單機的處理能力有限,PHP或JAVA代碼的執(zhí)行需要消耗大量CPU資源,數(shù)據(jù)庫的增刪改查需要調用大量的內存資源,將兩者分離可以減輕服務器的壓力,其拓撲結構如圖所示。
Web服務器和數(shù)據(jù)庫服務器的壓力都可以得到有效改善,訪問量有所增加。但是服務器依然存在單點故障問題。
我們可以通過Nginx、Haproxy代理服務器實現(xiàn)Web負載均衡集群,也可以使用LVS調度器實現(xiàn)Web負載均衡集群。部署完Web集群后還需要考慮如何進行Session會話保持,方法很多,如:根據(jù)源IP保持,代理服務器重寫Cookie信息,共享文件系統(tǒng)保存session,使用數(shù)據(jù)庫共享session等等。該架構拓撲如圖所示。
但是如果只有一臺調度器依然會導致單點故障的問題,因此還需要使用Keepalived或Heartbeat之類的軟件進行高可用配置,如圖所示。
對于網(wǎng)站內容而言可以分離為動態(tài)頁面和靜態(tài)頁面,靜態(tài)頁面就需要數(shù)據(jù)文件,動態(tài)頁面則需要CPU解析代碼,需要消耗大量的CPU資源,因此可以將靜態(tài)和動態(tài)分離為兩組服務器,動態(tài)頁面有腳本代碼組成,是一種基于網(wǎng)頁的應用程序,因此這一組服務器也稱為應用服務器,其架構如圖所示。
隨著服務器的增加,雖然性能與并發(fā)量得到了明顯的提升,但是數(shù)據(jù)的一致性、管理的便利性成為了新的問題,因此就需要增加統(tǒng)一的存儲服務器,實現(xiàn)數(shù)據(jù)的同步一致,可以使用NFS,GlusterFS、Ceph等軟件實現(xiàn)該功能,其架構如圖所示。
此時所有應用服務器都連接一臺數(shù)據(jù)庫服務器進行讀寫操作,而且后期隨著數(shù)據(jù)庫中的數(shù)據(jù)不斷增加,會導致數(shù)據(jù)庫成為整個網(wǎng)站的瓶頸!這就需要我們對數(shù)據(jù)進行分庫分表,創(chuàng)建數(shù)據(jù)庫主從或者數(shù)據(jù)庫集群,實現(xiàn)讀寫分離,其拓撲如圖所示。
對于靜態(tài)數(shù)據(jù)我們可以通過varnish、squid或者nginx進行緩存,將數(shù)據(jù)緩存到距離用戶更近的位置,構建CDN(內容分發(fā)網(wǎng)絡)架構。
對于傳統(tǒng)的SQL數(shù)據(jù)庫而言,我們也可以通過增加NoSQL數(shù)據(jù)庫,實現(xiàn)數(shù)據(jù)緩存的功能,提升數(shù)據(jù)庫的訪問速度。
備注:數(shù)據(jù)庫相關知識在第三階段課程有詳細介紹,第二階段項目暫時不做數(shù)據(jù)庫優(yōu)化。
最后,基于前面的架構,我們還可以將網(wǎng)站按照公司的業(yè)務進行分離,每個業(yè)務都可以是一個獨立的集群,如圖所示。
LNP+Mariadb數(shù)據(jù)庫分離
1. 問題部署LNP+Mariadb實現(xiàn)數(shù)據(jù)庫與Web服務器分離,實現(xiàn)以下目標:將舊的數(shù)據(jù)庫備份,遷移到新的服務器修改配置調用新的數(shù)據(jù)庫服務器。
2.方案實驗拓撲如圖所示,做具體實驗前請先配置好環(huán)境。
主機配置如表所示。
3. 步驟實現(xiàn)此案例需要按照如下步驟進行。
1)準備一臺獨立的服務器,安裝數(shù)據(jù)庫軟件包
[root@database ~]# yum -y install mariadb mariadb-server mariadb-devel
[root@database ~]# systemctl start mariadb
[root@database ~]# systemctl enable mariadb
2)將之前單機版LNMP網(wǎng)站中的數(shù)據(jù)庫遷移到新的數(shù)據(jù)庫服務器。
登陸192.168.2.11主機,備份數(shù)據(jù)庫并拷貝給新的服務器,關閉舊的數(shù)據(jù)庫服務。
[root@centos7 ~]# mysqldump wordpress > wordpress.bak
[root@centos7 ~]# scp wordpress.bak 192.168.2.21:/root/
[root@centos7 ~]# systemctl stop mariadb
[root@centos7 ~]# systemctl disable mariadb
登陸192.168.2.21主機,使用備份文件還原數(shù)據(jù)庫。
創(chuàng)建空數(shù)據(jù)庫:
[root@database ~]# mysql
MariaDB [(none)]> create database wordpress character set utf8mb4;
MariaDB [(none)]> exit
使用備份文件還原數(shù)據(jù):
[root@database ~]# mysql wordpress < wordpress.bak
重新創(chuàng)建賬戶并授權訪問:
[root@database ~]# mysql
MariaDB [(none)]> grant all on wordpress.* to wordpress@'%' identified by 'wordpress';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit
3)修改wordpress網(wǎng)站配置文件,調用新的數(shù)據(jù)庫服務器。
Wordpress在第一次初始化操作時會自動生產(chǎn)配置文件:wp-config.php,登陸192.168.2.11修改該文件即可調用新的數(shù)據(jù)庫服務。
[root@centos7 ~]# vim /usr/local/nginx/html/wp-config.php
修改前內容如下:
define('DB_HOST', '192.168.2.11');
修改后內容如下:
define('DB_HOST', '192.168.2.21');
客戶端使用瀏覽器訪問wordpress網(wǎng)站。
[root@client ~]# firefox
http://192.168.2.11Web服務器集群
1. 問題使用HAProxy部署Web服務器集群,實現(xiàn)以下目標:
- 部署三臺Web服務器
- 遷移網(wǎng)站數(shù)據(jù),使用NFS實現(xiàn)數(shù)據(jù)共享
- 部署HAProxy代理服務器實現(xiàn)負載均衡
- 部署DNS域名解析服務器
2. 方案實驗拓撲如圖所示,做具體實驗前請先配置好環(huán)境。
備注:實際操作中DNS服務代理服務器部署在同一臺主機上(節(jié)約虛擬機資源)。主機配置如表所示。
3. 步驟實現(xiàn)此案例需要按照如下步驟進行。
1)安裝LNP軟件包
[root@web2 ~]# yum -y install gcc pcre-devel openssl-devel
[root@web2 lnmp_soft]# tar -xf nginx-1.12.2.tar.gz
[root@web2 lnmp_soft]# cd nginx-1.12.2/
[root@web2 nginx-1.12.2]# ./configure /
--with-http_ssl_module /
--with-http_stub_status_module
[root@web2 nginx-1.12.2]# make && make instal
[root@web2 ~]# yum -y install php php-fpm php-mysql mariadb-devel
[root@web3 ~]# yum -y install gcc pcre-devel openssl-devel
[root@web3 lnmp_soft]# tar -xf nginx-1.12.2.tar.gz
[root@web3 lnmp_soft]# cd nginx-1.12.2/
[root@web3 nginx-1.12.2]# ./configure /
--with-http_ssl_module /
--with-http_stub_status_module
[root@web3 nginx-1.12.2]# make && make instal
[root@web3 ~]# yum -y install php php-fpm php-mysql mariadb-devel
2)修改nginx配置實現(xiàn)動靜分離(web2和web3操作)
web2修改默認首頁index.php,配置兩個location實現(xiàn)動靜分離。
[root@web2 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
}
location ~ /.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
web3修改默認首頁index.php,配置兩個location實現(xiàn)動靜分離。
[root@web3 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
}
location ~ /.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf; }
3)啟動相關服務
[root@web2 ~]# echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
[root@web2 ~]# chmod +x /etc/rc.local
[root@web2 ~]# /usr/local/nginx/sbin/nginx
[root@web2 ~]# systemctl start php-fpm #啟動php-fpm服務
[root@web2 ~]# systemctl enable php-fpm
[root@web3 ~]# echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
[root@web3 ~]# chmod +x /etc/rc.local
[root@web3 ~]# /usr/local/nginx/sbin/nginx
[root@web3 ~]# systemctl start php-fpm #啟動php-fpm服務
[root@web3 ~]# systemctl enable php-fpm
附加知識:systemd?。?!
源碼安裝的軟件默認無法使用systemd管理,如果需要使用systemd管理源碼安裝的軟件需要手動編寫服務的service文件(編寫是可以參考其他服務的模板文件)。以下是nginx服務最終編輯好的模板。
Service文件存儲路徑為/usr/lib/system/system/目錄。
[root@centos7 ~]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The Nginx HTTP Server
#描述信息
After=network.target remote-fs.target nss-lookup.target
#指定啟動nginx之前需要其他的其他服務,如network.target等
[Service]
Type=forking
#Type為服務的類型,僅啟動一個主進程的服務為simple,需要啟動若干子進程的服務為forking
ExecStart=/usr/local/nginx/sbin/nginx
#設置執(zhí)行systemctl start nginx后需要啟動的具體命令.
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#設置執(zhí)行systemctl reload nginx后需要執(zhí)行的具體命令.
ExecStop=/bin/kill -s QUIT ${MAINPID}
#設置執(zhí)行systemctl stop nginx后需要執(zhí)行的具體命令.
[Install] WantedBy=multi-user.target
- 步驟二:部署NFS,將網(wǎng)站數(shù)據(jù)遷移至NFS共享服務器
1)部署NFS共享服務器
[root@nfs ~]# yum install nfs-utils
[root@nfs ~]# mkdir /web_share
[root@nfs ~]# vim /etc/exports
/web_share 192.168.2.0/24(rw,no_root_squash)
[root@nfs ~]# systemctl restart rpcbind
[root@nfs ~]# systemctl eanble rpcbind
NFS使用的是隨機端口,每次啟動NFS都需要將自己的隨機端口注冊到rpcbind服務,這樣客戶端訪問NFS時先到rpcbind查詢端口信息,得到端口信息后再訪問NFS服務。
[root@nfs ~]# systemctl restart nfs
[root@nfs ~]# systemctl enable nfs
2)遷移舊的網(wǎng)站數(shù)據(jù)到NFS共享服務器
將web1(192.168.2.11)上的wordpress代碼拷貝到NFS共享。
[root@web1 ~]# cd /usr/local/nginx/
[root@web1 nginx]# tar -czpf html.tar.gz html/
[root@web1 nginx]# scp html.tar.gz 192.168.2.31:/web_share/
登陸nfs服務器,將壓縮包解壓
[root@nfs ~]# cd /web_share/
[root@nfs web_share]# tar -xf html.tar.gz
3)所有web服務器訪問掛載NFS共享數(shù)據(jù)。
[root@web1 ~]# rm -rf /usr/local/nginx/html/*
[root@web1 ~]# yum -y install nfs-utils
[root@web1 ~]# echo "192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0" >> /etc/fstab
[root@web1 ~]# mount -a
[root@web2 ~]# yum -y install nfs-utils
[root@web2 ~]# echo "192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0" >> /etc/fstab
[root@web2 ~]# mount -a
[root@web3 ~]# yum -y install nfs-utils
[root@web3 ~]# echo "192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0" >> /etc/fstab
[root@web3 ~]# mount -a
部署HAProxy
安裝軟件,手動修改配置文件,添加如下內容。
[root@proxy ~]# yum -y install haproxy
[root@proxy ~]# vim /etc/haproxy/haproxy.cfg
listen wordpress *:80
balance roundrobin
server web1 192.168.2.11:80 check inter 2000 rise 2 fall 3
server web2 192.168.2.12:80 check inter 2000 rise 2 fall 3 s
erver web3 192.168.2.13:80 check inter 2000 rise 2 fall 3
[root@proxy ~]# systemctl start haproxy
[root@proxy ~]# systemctl enable haproxy
1)安裝DNS相關軟件(192.168.4.5操作)。
[root@proxy ~]# yum -y install bind bind-chroot
2)修改主配置文件,添加zone。
[root@proxy ~]# vim /etc/named.conf
options {
listen-on port 53 { any; }; #服務監(jiān)聽的地址與端口
directory "/var/named"; #數(shù)據(jù)文件路徑
allow-query { any; }; #允許任何主機訪問DNS服務
... ...
};
zone "
http://lab.com" IN { #定義正向區(qū)域
type master;
file "lab.com.zone";
};
#include "/etc/named.rfc1912.zones";
#注釋掉改行 #include "/etc/named.root.key"; #注釋掉改行
[root@proxy ~]# named-checkconf /etc/named.conf #檢查語法
3)修改正向解析記錄文件。
注意:保留文件權限。
[root@proxy named]# cp -p /var/named/named.localhost /var/named/lab.com.zone
[root@proxy named]# vim /var/named/lab.zone
$TTL 1D @
IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ NS dns.lab.com.
dns A 192.168.4.5 www A 192.168.4.5
4)啟動服務
[root@proxy named]# systemctl start named
[root@proxy named]# systemctl enable named
5)客戶端修改DNS解析文件
提示:做完實驗修改回原始內容。
[root@room9pc01 data]# cat /etc/resolv.conf
# Generated by NetworkManager
search
http://tedu.cnnameserver 192.168.4.5
nameserver 172.40.1.10
nameserver 192.168.0.220
修改wp-config.php
在define(‘DB_NAME’, ‘wordpress’)這行前面添加如下兩行內容:
[root@web3 html]# vim /usr/local/nginx/html/wp-config.php
define('WP_SITEURL', '
http://www.lab.com');
define('WP_HOME', '
http://www.lab.com');
如果不添加這兩行配置,瀏覽器訪問網(wǎng)站某個子頁面后,URL會固定到某一臺后端服務器不輪詢。
附加知識(常見面試題)
什么是灰度發(fā)布?答:灰度發(fā)布(又名金絲雀發(fā)布)是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式。
讓一部分用戶繼續(xù)用產(chǎn)品特性A,一部分用戶開始用產(chǎn)品特性B,如果用戶對B沒有什么反對意見,那么逐步擴大范圍,把所有用戶都遷移到B上面來?;叶劝l(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時候就可以發(fā)現(xiàn)、調整問題,以保證其影響度。灰度期:灰度發(fā)布開始到結束期間的這一段時間,稱為灰度期。
DNS服務器有哪些種,其使用的端口為多少?答:有根DNS、一級DNS、二級DNS、三級DNS、緩存DNS;主DNS服務器、從DNS服務器;端口:53。
從日志/opt/bjca3/logs/ca_access.log中截取14點到16點的日志,將截取的日志導入到/tmp/ca_access.txt中,日志格式如下:答:awk ‘$4>“13:00:00”&&$4<=“16:59:00”’ ca_access.log
監(jiān)控檢查,使用ping命令編寫腳本來查詢一組IP地址同時檢測他們是否處于活躍狀態(tài)。要求(range:192.168.1.200-192.168.1.220,一個IP發(fā)送4個ping包,ping的過程不能輸出信息到終端)?答:#!/bin/bash
for i in {200..220}
do
ping -c 4 -i 0.2 -W 1 192.168.1.$i &>/dev/null
if [ $? -ne 0 ];then
echo "192.168.1.$i is down"
fi
done
假設nginx的訪問日志格式如下,統(tǒng)計訪問頁面前10位的IP數(shù)?答:awk ‘{IP[$1]++} END{for(i in IP){print i,IP[i]}}’ access.log /
| sort -n | tail -10
請列舉出10個以上的你所知曉的SQL語句?參考答案:insert select delete update create show drop grant revoke load data create view
如何切換到某個數(shù)據(jù)庫,并在上面工作?答:use 庫名
列出數(shù)據(jù)庫內的所有表?答:show tables
如何刪除表、刪除數(shù)據(jù)庫?答:drop table 表名;drop database 庫名;
如何列出表"xrt"內name域值為"tecmint",web_address域值為"http://tecmint.com"的所有數(shù)據(jù)?答:select * from xrt where name="tecmint" and web_address="
http://tecmint.com";
Keepalived高可用
1. 問題部署兩臺代理服務器,實現(xiàn)如下效果:
- 利用keepalived實現(xiàn)兩臺代理服務器的高可用
- 配置VIP為192.168.4.80
- 修改對應的域名解析記錄
2. 方案實驗拓撲如圖所示,做具體實驗前請先配置好環(huán)境。
備注:實際操作中DNS服務代理服務器部署在同一臺主機上(節(jié)約虛擬機資源)。主機配置如表所示。
3. 步驟實現(xiàn)此案例需要按照如下步驟進行。
部署HAProxy
安裝軟件,手動修改配置文件,添加如下內容。
[root@proxy2 ~]# yum -y install haproxy
[root@proxy2 ~]# vim /etc/haproxy/haproxy.cfg
listen wordpress *:80
balance roundrobin
server web1 192.168.2.11:80 check inter 2000 rise 2 fall 3
server web2 192.168.2.12:80 check inter 2000 rise 2 fall 3
server web3 192.168.2.13:80 check inter 2000 rise 2 fall 3
[root@proxy2 ~]# systemctl start haproxy
[root@proxy2 ~]# systemctl enable haproxy
1)配置第一臺代理服務器proxy(192.168.4.5)。
[root@proxy ~]# yum install -y keepalived
[root@proxy ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id proxy1 //設置路由ID號
vrrp_iptables //不添加任何防火墻規(guī)則
} vrrp_instance VI_1 {
state MASTER //主服務器為MASTER(備服務器需要修改為BACKUP)
interface eth0 //定義網(wǎng)絡接口
virtual_router_id 51
priority 100 //服務器優(yōu)先級,優(yōu)先級高優(yōu)先獲取VIP(實驗需要修改)
advert_int 1
authentication {
auth_type pass
auth_pass 1111 //主備服務器密碼必須一致
}
virtual_ipaddress { //誰是主服務器誰獲得該VIP(實驗需要修改) 1
92.168.4.80
}
}
[root@proxy ~]# systemctl start keepalived
!??!重要!??!
在全局配置global_defs{}中手動添加vrrp_iptables,即可解決防火墻的問題。
2)配置第二臺代理服務器proxy(192.168.4.6)
[root@proxy2 ~]# yum install -y keepalived
[root@proxy2 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id proxy2 //設置路由ID號
vrrp_iptables //不添加任何防火墻規(guī)則
}
vrrp_instance VI_1 {
state BACKUP //主服務器為MASTER(備服務器需要修改為BACKUP)
interface eth0 //定義網(wǎng)絡接口
virtual_router_id 51
priority 50 //服務器優(yōu)先級,優(yōu)先級高優(yōu)先獲取VIP
advert_int 1
authentication {
auth_type pass auth_pass 1111 //主備服務器密碼必須一致
}
virtual_ipaddress { //誰是主服務器誰獲得該VIP
192.168.4.80
}
}
[root@proxy2 ~]# systemctl start keepalived
?。?!重要?。。?br>
在全局配置global_defs{}中手動添加vrrp_iptables,即可解決防火墻的問題。
1)修改網(wǎng)站域名對應的解析記錄,解析到新的VIP地址。
192.168.4.5為DNS服務器。
[root@proxy ~]# vim /var/named/lab.com.zone
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ NS dns.lab.com.
dns A 192.168.4.5
www A 192.168.4.80
2)重啟DNS服務
[root@proxy ~]# systemctl restart named
部署Ceph分布式存儲
1. 問題部署Ceph分布式存儲,實現(xiàn)如下效果:
- 使用三臺服務器部署Ceph分布式存儲
- 實現(xiàn)Ceph文件系統(tǒng)共享
- 將網(wǎng)站數(shù)據(jù)從NFS遷移到Ceph存儲
2. 方案實驗拓撲如圖所示,做具體實驗前請先配置好環(huán)境。
備注:實際操作中DNS服務代理服務器部署在同一臺主機上(節(jié)約虛擬機資源)。主機配置如表所示。
3. 步驟實現(xiàn)此案例需要按照如下步驟進行。
1)物理機為所有節(jié)點配置yum源服務器。
提示:ceph10.iso在/linux-soft/02目錄。
[root@room9pc01 ~]# mkdir /var/ftp/ceph
[root@room9pc01 ~]# mount ceph10.iso /var/ftp/ceph/
2)在node1配置SSH密鑰,讓node1可用無密碼連接node1,node2,node3
[root@node1 ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''
[root@node1 ~]# for i in 41 42 43
do
ssh-copy-id 192.168.2.$i
done
3)修改/etc/hosts域名解析記錄(不要刪除原有的數(shù)據(jù)),同步給所有ceph節(jié)點。
[root@node1 ~]# vim /etc/hosts
192.168.2.41 node1
192.168.2.42 node2
192.168.2.43 node3
[root@node1 ~]# for i in 41 42 43
do
scp /etc/hosts 192.168.2.$i:/etc
done
4)為所有ceph節(jié)點配置yum源,并將配置同步給所有節(jié)點
[root@node1 ~]# cat /etc/yum.repos.d/ceph.repo
[mon]
name=mon
baseurl=ftp://192.168.2.254/ceph/MON
gpgcheck=0
[osd]
name=osd
baseurl=ftp://192.168.2.254/ceph/OSD
gpgcheck=0
[tools]
name=tools
baseurl=ftp://192.168.2.254/ceph/Tools
gpgcheck=0
[root@node1 ~]# yum repolist #驗證YUM源軟件數(shù)量
源標識 源名稱 狀態(tài)
Dvd redhat 9,911
Mon mon 41
Osd osd 28
Tools tools 33
repolist: 10,013
[root@node1 ~]# for i in 41 42 43
do
scp /etc/yum.repos.d/ceph.repo 192.168.2.$i:/etc/yum.repos.d/
done
5)所有節(jié)點主機與真實主機的NTP服務器同步時間。
提示:默認真實物理機已經(jīng)配置為NTP服務器。
[root@node1 ~]# vim /etc/chrony.conf
… …
server 192.168.2.254 iburst
[root@node1 ~]# for i in 41 42 43
do
scp /etc/chrony.conf 192.168.2.$i:/etc/
ssh 192.168.2.$i "systemctl restart chronyd"
done
6)使用virt-manager為三臺ceph虛擬機添加磁盤。每臺虛擬機添加2塊20G的磁盤。
1)給node1主機安裝ceph-deploy,創(chuàng)建工作目錄,初始化配置文件。
[root@node1 ~]# yum -y install ceph-deploy
[root@node1 ~]# mkdir ceph-cluster
[root@node1 ~]# cd ceph-cluster
2)給所有ceph節(jié)點安裝ceph相關軟件包
[root@node1 ceph-cluster]# for i in node1 node2 node3
do
ssh $i "yum -y install ceph-mon ceph-osd ceph-mds"
done
3)初始化mon服務
[root@node1 ceph-cluster]# ceph-deploy new node1 node2 node3
[root@node1 ceph-cluster]# ceph-deploy mon create-initial
[root@node1 ceph-cluster]# ceph -s #查看結果
cluster 9f3e04b8-7dbb-43da-abe6-b9e3f5e46d2e
health HEALTH_ERR monmap e2: 3 mons at
{node1=192.168.2.41:6789/0,node2=192.168.2.42:6789/0,node3=192.168.2.43:6789/0}
osdmap e45: 0 osds: 0 up, 0 in
4)準備磁盤分區(qū),創(chuàng)建journal盤,并永久修改設備權限。
[root@node1 ceph-cluster]# for i in node1 node2 node3
do
ssh $i "parted /dev/vdb mklabel gpt"
ssh $i "parted /dev/vdb mkpart primary 1 100%"
done
提示:下面的步驟在所有主機都需要操作(node1,node2,node3)
#臨時修改權限:
[root@node1 ceph-cluster]# chown ceph.ceph /dev/vdb1
#永久修改權限:
[root@node1 ceph-cluster]# vim /etc/udev/rules.d/70-vdb.rules
ENV{DEVNAME}=="/dev/vdb1",OWNER="ceph",GROUP="ceph"
5)使用ceph-deploy工具初始化數(shù)據(jù)磁盤(僅node1操作)。
[root@node1 ceph-cluster]# ceph-deploy disk zap node1:vdc
[root@node1 ceph-cluster]# ceph-deploy disk zap node2:vdc
[root@node1 ceph-cluster]# ceph-deploy disk zap node3:vdc
6)初始化OSD集群。
[root@node1 ceph-cluster]# ceph-deploy osd create /
node1:vdc:/dev/vdb1
//創(chuàng)建osd存儲設備,vdc為集群提供存儲空間,vdb1提供JOURNAL緩存,
//一個存儲設備對應一個緩存設備,緩存需要SSD,不需要很大
[root@node1 ceph-cluster]# ceph-deploy osd create /
node2:vdc:/dev/vdb1
[root@node1 ceph-cluster]# ceph-deploy osd create /
node3:vdc:/dev/vdb1
[root@node1 ceph-cluster]# ceph -s #查看集群狀態(tài)
cluster 9f3e04b8-7dbb-43da-abe6-b9e3f5e46d2e
health HEALTH_OK
monmap e2: 3 mons at {node1=192.168.4.11:6789/0,node2=192.168.4.12:6789/0,node3=192.168.4.13:6789/0}
election epoch 6, quorum 0,1,2 node1,node2,node3
osdmap e45: 3 osds: 3 up, 3 in
flags sortbitwise
pgmap v25712: 64 pgs, 1 pools, 86465 kB data, 2612 objects
508 MB used, 60 GB / 60 GB avail
64 active+clean
1)啟動mds服務
[root@node1 ceph-cluster]# ceph-deploy mds create node3
2)創(chuàng)建存儲池(文件系統(tǒng)由inode和block組成)
[root@node1 ceph-cluster]# ceph osd pool create cephfs_data 128
[root@node1 ceph-cluster]# ceph osd pool create cephfs_metadata 128
[root@node1 ceph-cluster]# ceph osd lspools
0 rbd,1 cephfs_data,2 cephfs_metadata
3)創(chuàng)建文件系統(tǒng)
[root@node1 ceph-cluster]# ceph fs new myfs1 cephfs_metadata cephfs_data
[root@node1 ceph-cluster]# ceph fs ls
name: myfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
- 步驟四:遷移網(wǎng)站數(shù)據(jù)到ceph集群
1)卸載web1,web2,web3的NFS共享。
暫停服務防止有人實時讀寫文件。
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s stop
[root@web2 ~]# /usr/local/nginx/sbin/nginx -s stop
[root@web3 ~]# /usr/local/nginx/sbin/nginx -s stop
[root@web1 ~]# umount /usr/local/nginx/html
[root@web2 ~]# umount /usr/local/nginx/html
[root@web3 ~]# umount /usr/local/nginx/html
[root@web1 ~]# vim /etc/fstab
#192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0
[root@web2 ~]# vim /etc/fstab
#192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0
[root@web3 ~]# vim /etc/fstab
#192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0
2)web服務器永久掛載Ceph文件系統(tǒng)(web1、web2、web3都需要操作)。
在任意ceph節(jié)點,如node1查看ceph賬戶與密碼。
[root@node1 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==
/etc/rc.local是開機啟動腳本,任何命令放在該文件中都是開機自啟。
[root@web1 ~]# mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ /
-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==
[root@web1 ~]# echo 'mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ /
-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==' >> /etc/rc.local
[root@web1 ~]# chmod +x /etc/rc.local
[root@web2 ~]# mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ /
-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==
[root@web2 ~]# echo 'mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ /
-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==' >> /etc/rc.local
[root@web2 ~]# chmod +x /etc/rc.local
[root@web3 ~]# mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ /
-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==
[root@web3 ~]# echo 'mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ /
-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==' >> /etc/rc.local
[root@web3 ~]# chmod +x /etc/rc.local
另一種解決方案,還可以通過fstab實現(xiàn)永久掛載。
提示:如果希望使用fstab實現(xiàn)永久掛載,客戶端需要額外安裝libcephfs1軟件包。
[root@web1 ~]# yum -y install libcephfs1
[root@web1 ~]# vim /etc/fstab
… …
192.168.4.11:/ /usr/local/nginx/html/ ceph defaults,_netdev,name=admin,secret=AQCVcu9cWXkgKhAAWSa7qCFnFVbNCTB2DwGIOA== 0 0
第三種掛載方案:對于高可用的問題,可以在mount時同時寫入多個IP。
臨時命令:
[root@web1 ~]# mount -t ceph /
192.168.4.11:6789,192.168.4.12:6789,192.168.4.13:6789:/ /usr/local/nginx/html /
-o name=admin,secret=密鑰
永久修改:
[root@web1 ~]# vim /etc/fstab
192.168.4.11:6789,192.168.4.12:6789,192.168.4.13:6789:/ /usr/local/nginx/html/ /
ceph defaults,_netdev,name=admin,secret=密鑰 0 0
3) 遷移NFS服務器中的數(shù)據(jù)到Ceph存儲
登陸NFS服務器備份數(shù)據(jù),將備份數(shù)據(jù)拷貝給web1或web2或web3,tar備份數(shù)據(jù)時注意使用-f選項保留文件權限。
[root@nfs ~]# cd /web_share/html/
[root@nfs html]# tar -czpf /root/html.tar.gz ./*
[root@nfs html]# scp /root/html.tar.gz 192.168.2.11:/usr/local/nginx/html/
登陸web1將數(shù)據(jù)恢復到Ceph共享目錄
[root@web1 html]# tar -xf html.tar.gz
[root@web1 html]# rm -rf html.tar.gz
4)恢復web服務
[root@web1 ~]# /usr/local/nginx/sbin/nginx
[root@web2 ~]# /usr/local/nginx/sbin/nginx
[root@web3 ~]# /usr/local/nginx/sbin/nginx
部署Git版本控制系統(tǒng)
1. 問題部署Git版本控制系統(tǒng),管理網(wǎng)站代碼,實現(xiàn)如下效果:
- 基于SSH協(xié)議的服務器
- 基于Git協(xié)議的服務器
- 基于HTTP協(xié)議的服務器
- 上傳代碼到版本倉庫
2. 方案生產(chǎn)環(huán)境應該有一臺獨立的Git服務器,這里為了節(jié)約主機資源,我們使用數(shù)據(jù)庫主機同時做完Git服務器,如圖所示。
主機配置如表所示。
3. 步驟實現(xiàn)此案例需要按照如下步驟進行。
1)安裝軟件包,創(chuàng)建空倉庫。
[root@database ~]# yum -y install git
[root@database ~]# mkdir /var/git/
[root@database ~]# git init --bare /var/git/wordpress.git #創(chuàng)建空倉庫
2)登陸web1服務器克隆git倉庫,上傳網(wǎng)站代碼到git服務器。
[root@web1 var]# git config --global push.default simple
[root@web1 var]# git config --global user.email you@example.com
[root@web1 var]# git config --global user.name "Your Name"
[root@web1 var]# cd /var/
[root@web1 var]# git clone root@192.168.2.21:/var/git/wordpress.git
[root@web1 var]# cd /var/wordpress
[root@web1 wordpress]# cp -a /usr/local/nginx/html/* ./
[root@web1 wordpress]# git add .
[root@web1 wordpress]# git commit -m "wordpress code"
[root@web1 wordpress]# git push
root@192.168.2.21's password:<輸入192.168.2.21主機root的密碼>
1)安裝軟件包(192.168.2.21操作)
[root@database ~]# yum -y install git-daemon
2)修改配置文件,啟動Git服務
[root@database ~]# vim /usr/lib/systemd/system/git@.service
修改前內容如下:
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/git --export-all --user-path=public_git --syslog --inetd –verbose
修改后內容如下:ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/git --export-all --user-path=public_git --syslog --inetd –verbose
[root@database ~]# systemctl start git.socket
[root@database ~]# systemctl status git.socket
3)客戶端測試(使用web2做完客戶端主機,192.168.2.12)
在web2執(zhí)行clone等同于是把代碼又備份了一份。
[root@web2 ~]# cd /var/
[root@web2 var]# git clone git://192.168.2.21/wordpress.git
- 步驟三:部署HTTP協(xié)議的版本控制服務器
1)安裝軟件包(192.168.2.21操作)
[root@database ~]# yum -y install httpd gitweb
2)修改配置文件
[root@database ~]# vim /etc/gitweb.conf
$projectroot = "/var/git"; #添加一行
3)啟動服務
[root@database ~]# systemctl start httpd
4)客戶端驗證
[root@room9pc01 ~]# firefox
http://192.168.2.21/git訪問網(wǎng)頁可以查看到wordpress倉庫,點擊tree菜單后可以看到如圖所示的代碼。
優(yōu)化Web服務器
1. 問題優(yōu)化Web服務器,實現(xiàn)如下效果:
- 自定義網(wǎng)站404錯誤頁面
- 升級nginx至1.15.8版本,開啟status模塊
- 編寫日志切割腳本,實現(xiàn)每周五備份日志
- 開啟gzip壓縮功能,提高數(shù)據(jù)傳輸效率
- 開啟文件緩存功能
2. 步驟實現(xiàn)此案例需要按照如下步驟進行。
1)優(yōu)化前測試(客戶端訪問一個不存在的頁面)。
[root@room9pc01 ~]# firefox
http://www.lab.com/gi2)修改Nginx配置文件,自定義錯誤頁面
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
error_page 404 /404.html; //自定義錯誤頁面
[root@web2 ~]# vim /usr/local/nginx/conf/nginx.conf
error_page 404 /404.html; //自定義錯誤頁面
[root@web3 ~]# vim /usr/local/nginx/conf/nginx.conf
error_page 404 /404.html; //自定義錯誤頁面
3) 重啟nginx
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@web2 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@web3 ~]# /usr/local/nginx/sbin/nginx -s reload
1)配置、編譯新的nginx(web1、web2、web3做相同操作,下面以web1為例)
[root@web1 ~]# tar -xf nginx-1.15.8.tar.gz
[root@web1 ~]# cd nginx-1.15.8
[root@web1 nginx-1.15.8]# ./configure /
--with-http_ssl_module /
--with-http_stub_status_module
[root@web1 nginx-1.15.8]# make
2)備份老版本nginx,更新新版本nginx
[root@web1 nginx-1.15.8]# mv /usr/local/nginx/sbin/nginx{,.old}
[root@web1 nginx-1.15.8]# cp objs/nginx /usr/local/nginx/sbin/
3)修改配置文件
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
... ...
location /status {
stub_status on;
allow 192.168.2.0/24;
deny all;
}
... ...
4)升級或重啟服務
注意:必須在nginx-1.15.8源碼包目錄下執(zhí)行make upgrade命令。
[root@web1 nginx-1.15.8]# make upgrade
或者手動執(zhí)行killall命令殺死進程后重新啟動
[root@web1 ~]# killall nginx
[root@web1 ~]# /usr/local/nginx/sbin/nginx
1)編寫腳本(以web1為例)
[root@web1 ~]# vim /usr/local/nginx/logbak.sh
#!/bin/bash
date=`date +%Y%m%d`
logpath=/usr/local/nginx/logs
mv $logpath/access.log $logpath/access-$date.log
mv $logpath/error.log $logpath/error-$date.log
kill -USR1 $(cat $logpath/nginx.pid)
2)創(chuàng)建計劃任務
[root@web1 ~]# crontab -e
03 03 * * 5 /usr/local/nginx/logbak.sh
修改Nginx配置文件
[root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf
http {
.. ..
gzip on; //開啟壓縮
gzip_min_length 1000; //小文件不壓縮
gzip_comp_level 4; //壓縮比率
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
//對特定文件壓縮,類型參考mime.types
.. ..
}
如果需要處理大量靜態(tài)文件,可以將文件緩存在內存,下次訪問會更快。
http {
open_file_cache max=2000 inactive=20s;
open_file_cache_valid 60s;
open_file_cache_min_uses 5;
open_file_cache_errors off;
//設置服務器最大緩存2000個文件句柄,關閉20秒內無請求的文件句柄
//文件句柄的有效時間是60秒,60秒后過期
//只有訪問次數(shù)超過5次會被緩存
}