Linux學習筆記-高級

集羣基礎概念
負載太高超出單臺服務器資源:
Scale On:向上擴展,增長單臺服務器配置,縱向擴展
Scale Out:向外擴展,增長服務器,橫向擴展html

Cluster:集羣
Load Balancing:LB,負載均衡集羣,增長併發處理能力,
Round Robin:輪詢
WRR:加權輪詢
HA:High Avaliability,高可用集羣,增長服務可用性,在線時間/(在線時間+故障處理時間)=可用性
heartbeat
health check:健康檢查,連續檢查3次依舊不在線,踢出集羣,健康恢復再添加回來
HP(HPC):High Perfomance Compute,高性能集羣
並行處理集羣
分佈式文件系統
將大任務切割爲小任務,分別進行處理的機制java

頁面程序在節點間同步機制:
rsync:文件同步工具
inotify:變動通知功能node

共享存儲:與NFS區別,NFS文件級,存儲設備爲塊級別,無需額外處理,性能提升許多
DAS:Direct Attached Storage,直連存儲
NAS:Network Attached Storage,網絡存儲
分佈式存儲:解決單節點存儲處理能力
分佈式文件系統python

split-brain:腦裂,爲避免集羣分裂,最好HA集羣爲3個節點以上,奇數個節點
STONITH:爆頭,Shoot The Other Node In The Head,出現主端過忙但未徹底down機,還有寫入任務,但從已接管服務,爲避免雙端寫入致使腦裂,直接將主電源斷掉,從徹底接管
fencing:隔離
節點隔離級別:STONITH
資源隔離級別:硬件需可接受遠程管理指令mysql

LVS類型詳解linux

負載均衡設備:
Hardware:
F5:BIG IP
Citrix:Netscaler
A10:
Software:
四層:工做性能好,但沒有對應用級特性的支持
LVS
七層:反向代理,針對協議特性開發,可操做能力更強,但性能略弱
nginx
http,smtp,pop3,imap
haproxy
http,tcp應用(mysql,smtp)ios

LVS:Linux Virtual Server,工做在內核中,LVS不可和IPTABLES同時使用
director:調度服務器
realserver:後端承載實際應用的服務器,被調度服務器nginx

iptables/netfilter
LVS:
ipvsadm:用戶空間管理集羣服務的命令行工具
ipvs:內核空間中調度轉發web

調度方法:schedule method正則表達式

LVS對外提供服務器的IP地址:VIP,virtual IP
後端被調度的Real服務器IP地址:RIP:RealServer IP
LVS端與Real服務器鏈接IP地址:DIP:Director IP
發出請求的客戶端IP地址:CIP:Client IP

LVS類型:
NAT:Network address translation(LVS-NAT):地址轉換
多目標的DNAT轉換,入站出站都須要通過LVS服務器,所以性能略弱
遵循基本條件:
一、全部集羣節點必須與LVS處於同一網絡,全部Real Server的網關必須指向DIP;
二、RIP地址一般爲私有地址,僅用於各集羣節點間的通訊;
三、Director位於client和real server之間,並負責處理進出的全部通訊;
四、real server必須將網關指向DIP
五、支持端口映射,內外端口能夠不一樣;
六、real server可使用任意操做系統;
七、較大規模應用場景中,director易成爲系統瓶頸;
DR:Direct routing(LVS-DR):直接路由
性能較好,LVS處理入站,出站由realserver直接返回客戶端
一、集羣節點與director必須再統一個物理網絡中;
二、RIP能夠不用私有IP,可用公有地址實現便捷的遠程管理;
三、Director僅處理入站請求,響應報文則由real server直接發往客戶端
四、集羣節點不能將網關指向DIP;
五、Director不支持端口映射,由於返回由real server負責,沒法完成端口轉換;
六、大多數操做系統都能用在real server;
七、DR可以比NAT處理更多的轉換請求;
TUN:IP tunneling(LVS-TUN):隧道
相似DR,由realserver直接返回客戶端,但轉發過程當中須要從新封裝IP包,適用於跨機房負載均衡模式;兩個IP報文封裝,進行雙封裝來進行轉發
一、集羣節點,無需在同一網絡,能夠跨越互聯網;
二、RIP必須是公網地址;
三、Director僅處理入站請求,響應報文則由real server直接發往客戶端;
四、realserver網關不能指向DIP;
五、只有支持隧道協議的OS才能用於real server;
六、不支持端口映射;

LVS調度方法及NAT模型的演示

固定調度:靜態調度,不考慮real server的繁忙程度,固定的平均或規律的分發請求
rr:輪叫,輪詢,論調
wrr:weight,加權重輪詢
sh:source hash,源地址hash,來自同一個客戶端IP的請求,所有發給同一臺real server,無session sharing時使用,用來作session affnity,會話綁定
dh:Destination hashing,目標地址hash,將同一個IP地址請求發送給同一個real server,以目標地址爲基準。例如cache server分發

動態調度:
lc:least-connection,最少鏈接
經過計算當先後端real server的活動鏈接最少,算法:active*256+inactive,誰小選誰
wlc:加權最少鏈接,LVS默認方法
經過權重方式選擇,(active*256+inactive)/weight,誰小選誰
sed:最短時間望延遲,改進的wlc
(active+1)*256/weight,誰小選誰
nq:never queue,永不排隊,改進的sed
無論如何總會分發到權重低的一次
LBLC:基於本地的最少鏈接
相似dh,比dh會都考慮cache服務器的鏈接數,找空閒服務器分發
LBLCR:基於本地的帶複製功能的最少鏈接
比LBLC多了複製緩存,cache之間能夠共享緩存,cacheA沒有訪問過來能夠去cacheB去取

LVS-NAT模型安裝
grep -i 'ip_vs' /boot/config-2.6.28-308.el5
查看內核是否支持ipvs功能,出現CONFIG_IP_VS=m 說明內置了這個模塊,還有調度算法等
安裝配置ipvsadm
yum install ipvsadm
ipvsadm使用:
管理集羣服務
添加:-A -t|u|f service-address [-s scheduler]
-t:TCP協議的集羣
serivce-addrees表示 IP:PORT的套接字
例如:ipvsadm -A -t 172.16.100.1::8 -s rr
-u:UDP協議的集羣
serivce-addrees表示 IP:PORT的套接字
-f:FirewallMark簡稱FWM:防火牆標記
serivce-addrees表示:Mark Number標記號
修改:-E
使用同上
刪除:-D
-D -t|u|f service-address
管理集羣服務中Real Server
添加:-a -t|u|f service-address -r realserver-addrees [-g|i|m] [-w weight] [-x upper] [-y lower]
-t|u|f service-address:事先定義好的某集羣服務
-r server-address:某個RS的地址,在NAT模式中,可使用IP:PORT實現端口映射
[-g|i|m]:LVS類型,
-g:DR,默認爲此模型
-i:TUN
-m:NAT
[-w weight]:定義服務器權重
[-x upper]:
[-y lower]:
例:ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m
修改:-e
刪除:-d -t|u|f service-address -r realserver-addrees
查看
-L|-l
-n:數字格式顯示IP地址和端口號
--stats:統計信息
--rate:速率信息
--timeout:顯示的TCP\tcpfin\UDP會話的超時時間限定
--daemon:顯示進程狀態和多播端口
--sort:排序real server,根據協議、地址、端口進行升序排序
-c:鏈接統計數,多少客戶端連入
清空計數器:
-Z:清空計數器
清空規則,刪除全部集羣服務
-C:清空ipvs規則
保存規則:
service ipvsadm save 能夠保存
-S:使用輸出重定向保存規則
例:ipvsadm -S > /path/to/somefile
載入此前的規則:
-R:使用輸入重定向規則
例:ipvsadm -R < /path/form/somefile

各節點之間的時間誤差不能超出1秒:
NTP:Network Time Protocol,同步時間
使用ntpdate server-address調整時間

LVS DR詳解及配置演示

DR模式須要給全部real server都配置VIP,所以數據報發送進來須要響應的不必定是Director主機,爲確保數據報能準確被Director響應接可使用如下幾種方式:
一、綁定靜態的解析路由,VIP:MAC(DVIP)
二、基於arptables
三、kernel parameter:arp響應級別和通告級別限定
arp_ignore:定義接收到ARP請求時的響應級別
0:默認級別,只要本地配置有相應地址便給予響應
1:僅在請求的目標地址配置請求到達的接口的地址給予響應
2:只響應目的IP地址爲接收網卡上的本地地址的arp請求,而且arp請求的源IP必須和接收網卡同網段。
3:若是ARP請求數據包所請求的IP地址對應的本地地址其做用域(scope)爲主機(host),則不迴應ARP響應數據包,若是做用域爲全局(global)或鏈路(link),則迴應ARP響應數據包。
4-7:預留
8:不迴應全部的arp請求
arp_announce:定義將本身地址及MAC對應關係向外通告時的通告級別
0:默認級別,將本機任何接口上的任何地址向外通告
1:試圖僅向目標網絡通告與其網絡匹配的網絡地址
2:僅將與本地接口上地址匹配的網絡通告
設置訪問的real servervip配置在lo網卡,只要訪問接收報文的網卡不是實際配置vip的網卡就不予接收,這樣就能夠只讓Director的VIP網卡接收了

按照網絡規則,real server接收到報文響應時優先使用本機接口卡實際配置的地址去響應,若是本機沒有配置地址會到其它接口返回響應,所以real server會優先使用eth0網卡響應,而咱們DR模式下可能會把VIP配置在real server的lo網卡,因此還須要添加一條路由,表示響應時使用lo的網卡配置信息進行響應返回給客戶端

最佳方式:
經過路由給VIP一個公網地址響應客戶端請求,DIP和RIP都是私網地址,並鏈接另外一個路由地址出去。這樣能夠作到內外隔離。

DR模型的配置:以簡單模型配置,VIP、DIP、RIP均在同一網段
Director配置eth0:0地址爲172.16.100.1爲VIP地址
Director實際的DIP爲172.16.100.2
# ifconfig eth0:0 172.16.100.1/16

兩臺Real Server地址爲172.16.100.7和8
先配置IP地址以後再配置別名地址
# cd /proc/sys/net/ipv4/conf/all
# sysctl -w net.ipv4.conf.eth0.arp_announce=2 # 設置Real server的VIP僅與本地接口上地址匹配的網絡通告,不是本地接口上的地址不予響應,使Real server的VIP即使在同一網絡中也不響應請求
# sysctl -w net.ipv4.conf.all.arp_announce=2 # all表示全部其餘網卡均遵循此規則
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore # 設置Real server的VIP僅在請求的目標地址配置請求到達的接口的地址給予響應,保證包返回給客戶端時響應地址爲VIP地址並非RIP地址
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore # 其餘接口遵循此配置
# ifconfig lo:0 172.16.100.1/16 # 全部Real Server均配置此條添加VIP地址
# ifconfig lo:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
# route add -host 172.16.100.1 dev lo:0 # 以上兩條爲Real Server添加路由,路由來的地址是VIP地址過來的均有lo:0設備進出
# echo 1 > /proc/sys/net/ipv4/ip_forward # 開啓IP轉換

Director上
# iconfig eth0:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
# route add -hots 172.16.100.1 dev eth0:0 # 設置VIP地址路由過來的均由eth0:0設備進入
# echo 1 > /proc/sys/net/ipv4/ip_forward # 開啓IP轉換

配置IPVS
ipvsadm -C # 先清理以前配置
ipvsadm -A -t 172.16.100.1:80 -s wlc
ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.7 -g -w 2
ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.8 -g -w 1
ipvsadm -L -n
此時配置只是負載均衡,若是出現某臺RS服務器DOWN掉,服務就會中斷

腳本實現LVS後端服務健康狀態檢查
能夠把Director服務器也看成Real Server使用,但性能可能會受影響,但能夠看成緊急故障時提供錯誤頁面提示使用。

DR類型中,Director和Real Server的配置腳本示例:

Director腳本:
#!/bin/bash
#
# LVS script for VS/DR
# chkconfig: - 90 10
#
. /etc/rc.d.init.d/functions
#
VIP=
DIP=
RIP1=
RIP2=
PORT=
RSWEIGHT1=2
RSWEIGHT2=5

#
case "$1" in
start)

/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:0

# Since this is the Director we must be able to forward packets
echo 1 > /proc/sys/net/ipv4/ip_forward

# Clear all iptables rules.
/sbin/iptables -F
# Reset iptables counters.
/sbin/iptables -Z
# Clear all ipvsadm counters.
/sbin/ipvsadm -C

# Add an IP virtual service for VIP 192.168.0.219 port 80
# In this recipe,we will use the round-robin scheduling method.
# In production,however,you should use a weighted,dynamic scheduling method.
/sbin/ipvsadm -A -t $VIP:80 -s wlc

# Now direct packets for this VIP to
# The real server IP(RIP) inside the cluster
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w $RSWEIGHT1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w $RSWEIGHT2

/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;

stop)
# Stop forwarding packets
echo 0 > /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
/sbin/ipvsadm -C
# Bring down the VIP interface
/sbin/ifconfig eth0:0 down
/sbin/route del $VIP

/bin/rm -f /var/lock/subsys/ipvsadm

echo "ipvs is stopped..."
;;

status)
if [ ! -e /var/lock/subsys/ipvsadm ]; then
echo "ipvsadm is stopped ..."
else
echo "ipvsadm is running ..."
ipvsadm -L -n
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
;;
esac


Real Server腳本:

#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: -90 10
# description: LVS DR real server
. /etc/rc.d/init.d/functions

VIP=172.16.100.1

host=`/bin/hostname`

case "$1" in
start)
# Start LVS-DR real server on this machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 |grep $VIP`
isrothere=`netstat -rn | grep "lo:0"|grep $VIP`
if [ ! "$islothere" -o ! "isrothere"]; then
# Either the route or the lo:0 device
# not found.
echo "LVS-DR real server Stopped."
else
echo "LVS-DR real server Running."
fi
;;
*)
# Invalid entry.
echo "$0" Usage: $0 {start|stop|status}
exit1
;;
esac


健康監測腳本思路:
第一種:
使用elinks -dump http://192.168.10.7訪問頁面,頁面正常反饋則服務狀態OK
echo $? # 返回值爲0則正常,返回值爲1則服務故障,將故障主機移除,值爲0時再加回LVS集羣
第二種:
在web發佈目錄下建立一個隱藏的頁面 .health_check.html,寫入內容
elinks -dump http://192.168.10.7/.health_check.html,只要能正常顯示內容便可
使用curl http://192.168.10.7/.health_check.html 也能夠訪問效率更高,而且可使用--connect-timeout <seconds> 設置自打請求時間,超出則斷開訪問
curl
-I:使用HTTP的head請求,不訪問頁面,只得到頁面的響應首部
只要響應首部爲2或3開頭則證實頁面是正常訪問的,例如:200
--connect-timeout <seconds>:最大請求時間
-s:靜音模式

RS健康狀態檢查腳本示例初版:
健康監測腳本,發現Real Server不在線則移除,健康則加回集羣
vim health_check.sh

#!/bin/bash
#
VIP=192.168.10.3
# Array(數組),element(元素) ,RS變量屬於數組,等於一組變量,數組中元素編號從0開始,引用時寫爲${RS[0]}表示第一個元素也就是192.168.10.7,則${RS[1]}表示第二個元素,使用echo ${#RS[*]} 能夠查看此數組中共多少個元素,echo ${RS{*}}輸出全部數組元素
RS=("192.168.10.7" "192.168.10.8")
RW=("2" "1")
RSTATUS=("1" "1")
FAIL_BACK=127.0.0.1
CPORT=80
RPORT=80
TYPE=g

add() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
del() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT -$TYPE
[ $? -eq 0 ] && return 0 || return 1
}
while :; do
let COUNT=0
for I in ${RS[*]}; do
if curl --connect-timeout 1 http://$I &> /dev/null; then
if [ ${RSTATUS[$COUNT]} -eq 0 ]; then
add $I $RW[$COUNT]
[ $? -eq 0 ] && RSTATUS[$COUNT]=1
fi
else
if [ ${RSTATUS[$COUNT]} -eq 1 ]; then
del $I
[ $? -eq 0 ] && RSTATUS[$COUNT]=0
fi
fi
let COUNT++
done
sleep 5
done

RS健康狀態檢查腳本示例第二版:
#!/bin/bash
#
VIP=192.168.10.3
CPORT=80
FAIL_BACK=127.0.0.1
RS=("192.168.10.7" "192.168.10.8")
declare -a RSSTATUS
RW=("2" "1")
RPORT=80
TYPE=g
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
addrs() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
delrs() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}
checkrs() {
local I=1
while [ $I -le $CHKLOOP ]; do
if curl --connect-timeout 1 http://$1 &> /dev/null; then
return 0
fi
let I++
done
return 1
}
initstatus() {
local I
local COUNT=0;
for I in ${RS[*]}; do
if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
fi
let COUNT++
done
}
initstatus
while :; do
let COUNT=0
for I in ${RS[*]}; do
if checkrs $I; then
if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
addrs $I ${RW[$COUNT]}
[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
fi
else
if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
fi
fi
let COUNT++
done
sleep 5
done


數組:變量陣列
賦值:array_name=("" "")
還能夠聲明爲數組
declare -a A
-i:聲明爲整型

LVS持久鏈接
不管使用什麼算法,LVS持久都能實如今必定時間內,未來自同一個客戶端的請求派發至此前選定的RS。
持久鏈接模板表(內存緩衝區域):
記錄每一個客戶端IP和選定的RS對應關係
持久鏈接表查看命令:
ipvsadm -L --persistent-conn
ipvsadm -L -c

啓用持久鏈接:
ipvsadm -A|E ... -p timeout
timeout:持久鏈接時長,默認300秒,單位爲秒;
例:ipvsadm -E -t 192.168.10.3:80 -s rr -p 600
# 上面的例子說明將以前的列表改進爲rr輪詢算法,並加持久鏈接600秒

在基於SSL,須要用到持久鏈接;

 

持久類型:主要場景,session和cookie須要持久鏈接場景
PPC:持久端口連接,來自於同一個客戶端對同一個集羣服務的請求,始終定向至此前選定的RS;
ipvsadm -E -t 192.168.10.3:80 -s rr -p 600 # 正常啓用持久鏈接默認就是PPC
PCC:持久客戶端鏈接,來自於同一個客戶端對全部端口的請求,始終定向至此前選定的RS;
ipvsadm -E -t 192.168.10.3:0 -s rr -p 600 # 端口爲0表示全部端口指向同一RS
ipvsadm -a -t 192.168.10.3:0 -r 192.168.10.7 -g -w 2
ipvsadm -a -t 192.168.10.3:0 -r 192.168.10.7 -g -w 1
PNMPP:持久防火牆標記鏈接,標記爲0-99之間的整數
ipvs的perrouting鏈上打標記爲10,標記爲10的內容能夠是80和23兩個端口
例:
ipvsadm -C
service ipvsadm save
iptables -t mangle -A PREROUTING -d 192.168.10.3 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -d 192.168.10.3 -i eth0 -p tcp --dport 23 -j MARK --set-mark 8
ipvsadm -A -f 8 -s rr # 將標記添加至集羣
ipvsadm -a -f 8 -r 192.168.10.7 -g -w 2 # 添加RS
ipvsadm -a -f 8 -r 192.168.10.8 -g -w 5
以上並未使用持久鏈接,能夠經過加-p timeout爲持久鏈接便可
ipvsadm -E -f 8 -s rr -p 600
經常使用場景,80和443的綁定

解決論壇訪問:上傳附件內容共享
rsync server(inotify+rsync):更新速度較慢,大訪問量站點不適用
sersync工具:金山基於C++開發,支持多線程併發複製,適用於較大場景

解決session共享問題:
mamcached服務,session會話在mamcached上共享,高性能緩存服務器

DR模型下,普通服務器2-4C,4-8G內存,能夠吃撐幾萬甚至幾十萬訪問量

awk入門及進階

文本處理工具三劍客:
grep:文本過濾器
grep 'pattern' input_file ...

sed:流編輯器

awk:報告生成器,以三個做者名字首字母命名,Aho、Kernighan、Weinberger
格式化之後,顯示
改進版本爲:nawk,linux中新版本爲gawk

awk的使用方法:
awk [options] 'script' file1,file2, ...
awk [options] 'PATTERN { action }' file1,file2,...
print:打印輸出結果
printf:自定義輸出格式

例如:test.txt文件中存儲着this is a test.這句話
awk '{print $0}' test.txt # 則表示打印出整句話
awk '{print $4}' test.txt # 則表示test.
awk '{print $1,$2}' test.txt # 則表示this is
awk會自動將整句話以空格爲分隔符截取成4段,使用$#表示第幾段輸出
awk 'BEGIN{OFS="#"}{print $1,$2}' test.txt # 表示使用#號爲分隔符輸出
結果爲this#is

1、print
print的使用格式:
print item1,item2,...
要點:
一、各項目之間使用逗號隔開,而輸出時則以空白字符分隔;
二、輸出的item能夠爲字符串或數值、當前記錄的字段(如:$1)、變量或awk的表達式,數值會先轉換爲字符串,然後再輸出;
三、print命令後面的item能夠省略,此時其功能至關於print $0,所以,若是想輸出空白行,則須要使用print "";

例子:
awk 'BEGIN { print "line one\nline two\nline three" }'
# 輸出line one line two ... \n爲換行符
awk -F: '{ print $1,$2 }' /etc/passwd
# -F: 輸入分隔符,匹配原文件內容,也可用做FS="#",OFS="#"輸出分隔符,顯示結果時的分隔符

2、awk變量
一、awk內置變量之記錄變量:
FS:field separator,默認是空白字符,讀取文本時,所使用的字段分隔符;
RS:Record separator,默認是換行符,輸入文本信息所使用的換行符;
OFS:Output Filed Separator,輸出字段分隔符;
ORS:Output Row Separator,輸出行分隔符;

二、awk內置變量之數據變量
NR:awk命令所處理的行數;若是有多個文件,這個數目會把處理的多個文件中行數統一計數
NF:Number of Field,當前記錄的field個數,統計正在處理的當前行有多少字段的總數;
FNR:與NR不一樣的是,FNR用於記錄正處理的行,多個文件,則按前後順序各自顯示其行數
ARGV:數組,保存命令行自己這個字符串,如awk '{print $0}' a.txt b.txt 這個命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC:awk命令的參數的個數;
FILENAME:awk命令所處理的文件的名稱;
ENVIRON:當前shell環境變量及其值的關聯數組;

如:awk 'BEGIN{print ENVIRON["PATH"]}'

三、用戶自定義變量 gawk容許用戶自定義本身的變量以便在程序代碼中使用,變量名命名規則與大多數編程語言相同,只能使用字母、數字和下劃線,且不能以數字開頭。gawk變量名稱區分字符大小寫。

在腳本中賦值變量
在gawk中給變量賦值使用賦值語句進行
例如:awk 'BEGIN{var="variable testing";print var}'

在命令行中使用賦值變量
gawk命令也能夠在「腳本」外圍變量賦值,並在腳本中進行引用。
例如:awk -v var="variable testing" 'BEGIN{print var}'

3、printf
printf命令是會用格式:
printf format,item1,item2,...

要點:
一、其他print命令的最大不一樣是,printf須要指定format
二、format用於指定後面的每一個item的輸出格式;
三、printf語句不會自動打印換行符:\n

format格式的指示符都以%開頭,後跟一個字符:以下:
%c:顯示字符的ASCII碼
%d,%i:十進制整數
%e,%E:科學技術法顯示數值
%f:顯示浮點數
%g,%G:以科學技術法的格式或浮點數的格式顯示數值
%s:顯示字符串
%u:無符號整數
%%:顯示%自身

修飾符:
N:顯示寬度
-:左對齊
+:顯示數值符號

例子:
awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd

4、輸出重定向

print items > output-file
print items >> output-file
print items | command

特殊文件描述符:
/dev/stdin:標準輸入
/dev/sdtout:標準輸出
/dev/stderr:錯誤輸出
/dev/fd/N:某特定文件描述符,如/dev/stdin就至關於/dev/fd/0

例子:
awk -F: '{printf "%-1s %i\n",$1,$3 > "/dev/stderr" }' /etc/passwd

5、awk的操做符:
一、算術操做符
-x:負值
+x:轉換爲數值
x^y:
x**y:次方
x*y:乘法
x/y:除法
x+y:
x-y:
x%y:

二、字符串操做符:
只有一個,並且不用寫出來,用於實現字符串鏈接

三、賦值操做符
=
+=
-=
*=
/=
%=
^=
**=
++
--
須要注意的是,若是某模式爲*號,此時使用/*/可能會有語法錯誤,應爲/[*]/替代

四、布爾值
awk中,任何非0值或非空字符串都爲真,反之就爲假:

五、比較操做符:
x < y
x <= y
x > y
x >= y
x == y
x != y
x ~ y:y爲一個模式,若是x被y的模式匹配到就爲真,不然爲假
x !~ y:與上反之
subscript in array:是否有這樣的元素,有則爲真,無則爲假

七、表達式間的邏輯關係符
&&
||

八、條件表達式:
selector?if-true-exp:if-false-exp
三目操做符,至關於下面
if selector; then
if-true-exp
else
if-false-exp
fi

九、函數條用:
function_name (para1,para2)

7、awk的模式
awk 'program' input-file1 input-file2 ...
其中的program爲:
pattern { action }
pattern { action }
...

一、常見的模式類型:
一、Regexp:正則表達式,格式爲/regular expression/
如:awk -F: '/^r/{print $1}' /etc/passwd
passwd裏以r開頭的用戶名,顯示出來
二、expression:表達式,其值非0或爲非空字符時知足條件,
如:$1 ~ /foo/ 或 $1 == "magedu",用運算符~(匹配)和~!(不匹配)
awk -F: '$3>=500{print $1,$3}' /etc/passwd
# 輸出用戶ID號大於500的用戶
awk -F: '$7~"bash$"{print $1,$7}' /etc/passwd
# passwd文件中匹配到bash結尾的用戶
三、Ranges:指定的匹配範圍,格式爲pat1,pat2
如:awk -F: '$3==0,$7~"nologin"{print $1,$3,$7}' /etc/passwd
# 從ID號爲0的用戶開始到匹配到第一個nologin的用戶顯示出來
四、BEGIN/END:特殊模式,僅在awk命令執行前運行一次或結束前運行一次
如:awk -F: 'BEGIN{print "Username ID Shell "}{printf "%-10s%-10s%-20s\n",$1,$3,$7}END{print "End of report."}' /etc/passwd
# 上面在輸出的內容前輸出一個表頭,標記每行對應的內容,並在結尾打出結束語
BEGIN:讓用戶指定的第一條輸入記錄被處理以前所發生的的動做,一般可再這裏設置全局變量
END:讓用戶在最後一條輸入記錄被讀取以後發生的動做

五、Empty(空模式):匹配任意輸入行,文件中的每一行都要作處理

二、常見的Action
一、Expressions:表達式
二、Control statements:控制語句,if、for、do等
三、Compound statements:複合語句
四、Input statements:輸入語句
五、Output statements:輸出語句

/正則表達式/:使用通配符的擴展集

關係表達式:能夠用下面運算符表中的關係運算符進行操做,能夠是字符串或數字的比較,如$2>%1選擇第二個字段比第一個字段長的行

模式,模式:指定一個行的範圍,該語法不能包括BEGIN和END模式。


8、控制語句:
一、if-else
語法:if(condition) {then-body} else {[ else-body ]}
例子:
awk -F: '{if ($1=="root") print $1,"Admin";else print $1,"Command User"}' /etc/paaswd
# 打印出全部用戶,若是是root用戶則表示未Admin,不然爲Command User
awk -F: '{if ($1=="root") printf "%-15s: %s\n",$1,"Admin";else printf "%-15s: %s\n",$1,"Command User"}' /etc/paaswd
# 同上,可是顯示格式調整,空出15個字符並在:後面顯示Admin仍是Command
awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd
# 打印出ID號大於等於500的用戶數量

二、while 循環字段,對於每行的字段進行循環處理
語法:if (condition){statement1;statement2;...}
例子:
awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd
#
awk -F: '{i=1;while (i<=NF) { if(length($i)>=4) {print $i}; i++}}' /etc/passwd
# 每行大於等於4個字符的字段顯示出來

三、do-while
語法:do {statement1;statement2;...} while (condition)
例子:
awk -F: '{i=1;do {peint $i;i++}}while(i<=3)' /etc/passwd

四、for
語法:for ( variable assignment; condition;iteration process) {statement1;statement2;...}
例子:
awk -F: '{for (i=1;i<=3;i++) print $i}' /etc/passwd
awk -F: '{for (i=1;i<=NF;i++) { if(length($i)>=4) {print $i}}}' /etc/passwd
# 每行大於等於4個字符的字段顯示出來
for循環還能夠用來遍歷數組元素:
語法:for (i in array) {statement1;statement2;...}
awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){print "%15s:%i\n",A,BASH[A]}}' /etc/passwd

五、case
語法:switch (expression) { case VALUE or /REGEXP/: statement1,statement2,... default statement1,...}

六、break和continue
經常使用於循環或case語句中,中止本字段的循環,提早走下一字段的循環

七、next
提早結束對本行文本的處理,並接着處理下一行;
例如:下面的命令將顯示其ID號爲奇數的用戶:
awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd

9、awk中使用數組

一、數組
array[index-expression]
index-expression可使用任意字符串;須要注意的是,若是某數據組元素事先不存在,那麼在引用其時,awk會自動建立此元素並初始化爲空串;所以,要判斷某數據組中是否存在某元素,須要使用index in array的方式

要遍歷數組中的每個元素,須要使用以下的特殊結構:
for (var in array) { statement1,...}
其中,var用於引用數組下標,而不是元素值;

例子:
netstat -ant |awk '/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]}'
# 統計每一個鏈接狀態的數量,每次出現被/^tcp/模式匹配到的行,數組S[$NF]就加1,NF爲當前匹配到的行的最後一個字段,此處用值做爲數組S的元素索引;
a是本身定義的S數組的下標值,打印a其實就是S的下標內容,和統計內容

awk '{connts[$1]++}; END {for(url in counts)print counts[url],url}' /var/log/httpd/access_log
# 用法與上一個例子相同,用於統計某日誌文件中IP地址的訪問量
awk '{connts[$1]++}END{for(ip in counts) {printf "%-20s:%d\n", ip,counts[ip]}}' /var/log/httpd/access_log
# 同上,格式變換,更爲整齊

awk -F: '{shell[$NF]++}END{for(A in shell) {print A,shell[A]}}' /etc/passwd
# shell[$NF]把每一個用戶的bash看成下標造成數組名爲shell,最終統計每一個shell登陸的用戶共計數量

二、刪除數組變量
從關係數組中刪除數組索引須要使用delete命令,使用格式爲:
delete array[index]

10、awk的內置函數

split(string,array[,fieldsep [ ,seps ]])
功能:將string表示的字符串以fieldsep爲分隔符進行分割,並將分隔後的結果保存至array爲名的數組中;數組下標爲從0開始的序列;

netstat -ant | awk '/:80\>/{split($5.clients.":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50

length([string])
功能:返回string字符串中字符的個數;


substr(string, start [, length])
功能:取string字符串中的子串,從start開始,取length個;start從1開始計數;

system(command)
功能:執行系統command並將結果返回至awk命令

systime()
功能:取系統當前時間

tolower(s)
功能:將s中的全部字母轉爲小寫

toupper(s)
功能:將s中的全部字母轉爲大寫

11、用戶自定義函數
自定義函數使用function關鍵字。格式以下:

function F_NAME([variable])
{
statements
}

函數還可使用return語句返回值,格式爲「return value」。


高可用集羣原理詳解

Director服務器存在單點風險,須要雙機解決
主節點:Active或Primary
從節點:Passive或Standby

FailOver:故障轉移
FailBack:轉移恢復

資源粘性:資源更傾向於哪一個節點,資源和節點間的關係

Messaging Layer:集羣事務信息層
CRM:Cluster Resource Manager集羣資源管理器,收集資源狀態,計算資源應該運行的節點
DC:Designated Coordinator,推選事務協調員
PE:Policy Engine,策略引擎,CRM子功能
TE:Transaction Engine,事務引擎,按PE計算結果指揮LRM執行動做
LRM:Local Resource Manager,負責執行動做

高可用協會定義標準:須要提供多個組件爲高可用集羣提供標準服務
須要一個標準腳原本完成以上的內容定義,須要遵循Linux Standard Base
RA:Resource Agent

資源組RG:Resource Group

高可用集羣的資源約束:Constraint(約束)定義資源和資源之間的傾向性
排列約束:colation Constranint,score(分數)
定義資源是否可以運行於同一節點
正值:能夠在一塊兒
負值:不能在一塊兒
位置約束:location Constranint,score(分數)
正值:傾向於此節點
負值:傾向於逃離此節點
順序約束:Order Constranint
定義資源啓動或關閉時的次序

特殊取值方式:
-inf:負無窮
inf:正無窮

資源隔離:
節點級別:STOTINTH(爆頭)
資源級別:
例如:
FC SAN Switch能夠實如今存儲資源級別拒絕某節點的訪問

HA MySQL:須要HA資源
一、vip:Float IP(流動的IP地址)
二、mysql service
三、File System

split-brain:集羣節點沒法有效獲取其餘節點的狀態信息時,產生腦裂
後果之一:搶佔共享存儲
避免方案:資源隔離

雙actvie集羣:
須要使用集羣文件系統:Cluster Filesystem,任何節點對一個文件施加了鎖會通知其餘節點,其餘節點會看到此鎖,所以文件系統就不會錯亂,但集羣文件系統的存儲設備必須是DAS和SAN的設備,不能是NAS設備
GFS
OCFS2

高可用集羣原理詳解之共享存儲
機械:隨機讀寫(性能差)、順序讀寫(性能好)
IDE:(ATA)速率133M
SATA:速率600M
轉速7200rpm
IOPS:100
SCSI:速率320M
SAS:速率600M
轉速15000rpm
IOPS:200
USB:
2.0:480Mb/s,60MB/s
3.0:3.2Gb/s,400MB/s
固態:無隨機讀寫性能差的問題
SSD:

IDE,SCSI:並口
SATA,SAS,USB:串口

DAS:Direct Attached Storage,直接附加存儲,直接接到主板總線,BUS
文件:塊
NAS:Network Attached Storage,網絡附加存儲
文件服務器:文件
SAN:Storage Area Network,存儲區域網絡
文件:塊
SCSI:Small Computer System Interface,
文件:塊
控制器:Controller
適配器:Adapter
LUN:Logical Unit Number,邏輯單元號

高可用集羣原理詳解之多節點集羣

仲裁機制:
第三方網絡:經過ping同一個設備發現某個應用服務器down機
仲裁盤:往同一塊盤上寫數據,哪臺再也不寫入則出現down機
watchdog:看門狗,經過某進程不停向watchdog發送請求,哪臺再也不發送則出現down機

資源粘性:資源對某節點的依賴程度,經過score定義

資源約束:
位置約束:location,資源對某節點的依賴程度
排隊約束:coloation,資源間的互斥性
正值:能夠在一塊兒
負值:不能在一塊兒
順序約束:order,定義資源啓動或關閉時的次序

quorum:法定票數

資源管理策略:without_quorum_policy,當不知足法定票數時
freeze:凍結,不接受新請求,但當前鏈接請求會處理完成
ignore:忽略,集羣繼續運行,
stop:中止服務

failover domain:故障轉移域

RHCS:RehHat Cluster Suite,紅帽集羣套件

Messaging Layer組件:集羣事務信息層
heartbeat(v1,v2,v3)
heartbeat v3
heartbeat,pacemaker,cluster-glue
Corosync+pacemaker
cman:cluster manager
keepalived
ultramokey

CRM組件:
heartbeat v1 自帶的資源管理器
haresources
heartbeat v2 自帶資源管理器
haresources
crm
heartbeat v3:資源管理器crm發展爲獨立項目,叫pacemaker
cman:cluster manager
rgmanager

Recource Type:
Primitive:主資源,某一時刻只能運行在某個節點
clone:主資源作多分克隆資源
group:組,多個主資源歸爲一體,同進同退
master/slave:只能運行在兩個節點,兩個節點分主從關係,drbd

RA:Resource Agent

RA Classes:
Legacy heartbeat v1 RA
LSB(/etc/rc.d/init.d/)
OCF(Open Cluster Framework)
pacemaker
linbit(drbd)
Stonith

資源隔離級別:
節點級別:STOTINTH
資源級別:FC SAN Switch

STONITH
一、電源分佈單元,PDU:電交換機,可接網線,能夠暫停某個接口的電源
二、不間斷電源,UPS:高級的UPS也能夠實現
三、刀片服務器電源控制設備
四、Lights-out Devices:輕量級管理設備
五、Testing Devices:測試性設備

STONITH的實現:
stonithd:管理進程
STONITH plug-ins:STONITH插件

httpd HA實現:
VIP
HTTPD SERVER
File System

Heartbeat:
UDP/694端口

高可用集羣之heartbeat安裝配置

rhel 5.8
heartbeat v2
ha web
node1,node2
節點名稱,/etc/hosts
節點名稱必須跟uname -n命令的執行結果一致
ssh互信通訊
時間同步

兩個節點分別命令爲node1和node2
vim /etc/sysconfit/network
HOSTNAME=node1.magedu.com
保存退出
hostname node1.magedu.com
確保使用uname -n能夠查看到此名稱
ssh互信
生成祕鑰文件
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub root@node2.magedu.com
在node2節點執行
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub root@node1.magedu.com
測試ssh鏈接另外一臺服務器,是否不用輸入密碼
兩個節點均更改hosts文件,添加以下
vim /etc/hosts
172.16.100.6 node1.magedu.com node1
172.16.100.7 node2.magedu.com node2
互ping主機名
同步時間,都從一個主機同步,兩個節點均作
service ntpd stop
chkconfig ntpd off
ntpdate 172.16.0.1 # 第一次主動同步時間
以後最好使用ntpd慢慢追準時間
crontab -e
*/5 * * * * /sbin/ntpdate 172.16.0.1 &> /dev/null # 每5分鐘同步一次時間
保存退出
scp /var/spool/cron/root node2:/var/spool/cron/


epel網站下載
heartbeat工具包:
heartbeat:heartbeat核心包
heartbeat-devel:開發包
heartbeat-gui:管理heartbeat集羣的圖形界面
heartbeat-ldirectord:爲ipvs高可用提供規則自動生成及後端realserver健康狀態檢查的組件
heartbeat-pils:裝載庫的通用插件和接口
heartbeat-stonith:實現爆頭的接口

heartbeat安裝:
rpm -ivh perl-MailTools-1.77-11.el5.noarch.rpm
yum --nogpgcheck localinstall perl-MailTools-1.77-11.el5.noarch.rpm # 解決依賴關係安裝
cd i386/
rpm -ivh heartbeat-2.1.4-9.el5.i386.rpm heartbeat-gui-2.1.4-9.el5.i386.rpm heartbeat-ldirectord-2.1.4-9.el5.i386.rpm heartbeat-pils-2.1.4-9.el5.i386.rpm heartbeat-stonith-2.1.4-9.el5.i386.rpm libnet-1.1.4-3.el5.i386.rpm
yum --nogpgcheck localinstall heartbeat-2.1.4-9.el5.i386.rpm heartbeat-gui-2.1.4-9.el5.i386.rpm heartbeat-ldirectord-2.1.4-9.el5.i386.rpm heartbeat-pils-2.1.4-9.el5.i386.rpm heartbeat-stonith-2.1.4-9.el5.i386.rpm libnet-1.1.4-3.el5.i386.rpm # 解決依賴關係安裝
兩個節點均要安裝

heartbeat三個配置文件:
一、祕鑰文件,600權限,authkeys
二、heartbeat服務的配置文件ha.cf
三、資源管理配置文件
haresources
cp /usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} ./
chmod 600 authkeys
vim authkeys # 查看文件
#auth 1 # 格式寫法,填寫下面一、二、3個種類的校驗方式
#1 crc # 1爲循環冗餘校驗碼,不建議使用,不夠安全
#2 sha1 HI! # 2爲sha1校驗方式
#3 md5 Hello! # md5校驗方式,Hello!爲md5編碼的密碼內容
dd if=/dev/random count=1 bs=512 | md5sum # 生成md5編碼

vim ha.cf # 前面有井號後面緊跟這單詞的均爲可開啓的功能
#debugfile /var/log/ha-debug # 調試日誌,debug日誌開啓
logfile /var/log/ha-log # 日誌文件,和logfacility不能同時開啓
#logfacility local0 # 日誌設施,local0表示記錄設施,意爲使用syslog進行記錄
keepalive 1 #多久鏈接一次,默認2秒,啓用改成1秒
#deadtime 30 #多長時間聲明某主機死掉了,可改成5秒或10秒,但要避免誤殺
#warntime 10 # 警告時長,鏈接1秒未到後再多等的時間,默認關閉
#initdead 120 # 第一個節點啓動後,等待第二個節點啓動的時長
#udpport 694 # 定義端口號
#baud 19200 # 串行線發送速率
#serial /dev/ttyS0 #Linux
#serial /dev/cuaa0 #FreeBSD
#serial /dev/cuad0 #FreeBSD 6.x
#serial /dev/cua/0 #Solaris
以上均未串型設備是什麼
bcast eth0 #Linux # 定義哪塊網卡進行廣播,必須打開一項
#bcast eth1 eth2 #Linux
#bcast le0 #Solaris
#bcast le1 le2 #Solaris
#bcast eth0 #廣播
#mcast eth0 225.0.0.1 694 1 0 #多播,組播
#ucast eth0 192.168.1.2 #單播,兩個節點使用單播,多節點不建議使用

auto_failback on # 原來的節點又恢復以後是否轉移回去
#watchdog /dev/watchdog # 看門狗設備定義
node node1.magedu.com # 指定node節點,必須添加
node node2.magedu.com # 必定要與uname -n,必須添加

#ping 10.10.10.254 # node節點ping的地址通常爲網關
#ping_group group1 10.10.10.254 10.10.10.253 # 一組內的主機只要有一個ping通便可
#respawn hacluster /usr/lib/heartbeat/ipfail # heartbeat節點宕機了,先重啓服務恢復

vim haresources
#node1(節點名稱) 10.0.0.170(vip) Filesystem::/dev/sha1::/data1::ext2(自動掛載的文件系統)
兩個節點都安裝web服務
yum install httpd
echo "<h1>node1.magedu.com</h1>" >> /var/www/html/index.html
service httpd restart
service httpd stop
chkconfig httpd off
回到heartbeat
cd /etc/ha.d/
vim haresources
添加:
node1.magedu.com IPaddr::172.16.100.1/16/eth0 httpd
保存退出

虛擬機實驗中建議不要使用橋接,使用hostonly模式
scp -p authkeys haresources ha.cf node2:/etc/ha.d/
service heartbeat start
ssh node2 'service heartbeat start' # 遠程啓動另一個節點的heartbeat
ha測試腳本
cd /usr/lib/heartbeat
./hb_standby # 測試腳本,把本身轉換爲備節點
Going standby...# 提示說明切換過去了
查看vip已經到了備節點上,訪問vip爲node2
把頁面程序放在公用的nfs上進行ha
先配置一個nfs server放置一個頁面文件
編輯heartbeat
vim haresources
node1.magedu.com IPaddr::172.16.100.1/16/eth0 Filesystem::172.16.100.10:/web/htdocs::/var/www/html::nfs httpd
保存退出
scp -p authkeys haresources ha.cf node2:/etc/ha.d/ # 配置文件同步至另外一個節點
service heartbeat start
ssh node2 'service heartbeat start' # 遠程啓動另一個節點的heartbeat

高可用集羣之heartbeat基於crm進行資源管理

CRM:Cluster Resource Manager
haresources(heartbeat v1)
crm,haresources(heartbeat v2)
pacemaker(heartbeat v3)
rgmanager(RHCS)

爲那些非ha-aware的應用程序提供調用的基礎平臺;

crmd:CRM守護進程,管理API
GUI:圖形接口
CLI:命令行接口

Resource Type:
primitive(native):主資源
group:組資源
clone
STONITH
Cluster Filesystem
dlm:Distributed Lock Manager
master/slave:
drbd:分佈式複製塊設備,分佈式磁盤塊鏡像
資源粘性:
定義資源的傾向性
資源約束:
location,位置約束
colocation,順序約束
order,排列約束

heartbeat配置文件:
authkeys:驗證
ha.cf
node:定義節點信息
bcast,mcast,ucast:廣播,多播,單播
生成環境儘可能使用多播模式,廣播會產生大量日誌,若是節點數只有兩天可使用單播
haresources

HA條件:
一、時間同步
二、SSH雙機互信
三、主機名稱要與uname -n保持一致,而且經過/etc/hosts解析;

CIB:Cluster Information Base 集羣信息庫
xml格式
執行文件:
/usr/lib/heartbeat/haresources2cib.py

/usr/lib/heartbeat/ha_propagate
將任意一個節點上的配置文件同步至其餘節點

CRMD:端口5560 tcp

crm gui使用:
passwd hacluster用戶加密
hb_gui & # 此命令會打開一個窗口
點擊login cluster,使用hacluster用戶和密碼登陸

資源粘性:
資源是否傾向於留在當前節點
整數:樂意
負數:離開

高可用集羣之基於heartbeat和nfs的高可用mysql

NFS:MySQL的數據
mysql配置文件:
/etc/my.cnf --> /etc/mysql/mysql.cnf
$MYSQL_BASE
--default-extra-file = 配置文件路徑

NFS服務建立
fdisk 劃分分區
partprobe /dev/sda5
pvcreate /dev/sda5
vgcreate myvg /dev/sda5
lvcreate -L 10G -n mydata myvg
mke2fs -j /dev/myvg/mydata
全部節點建立mysql用戶和組,ID號保持一致
groupadd -g 3306 mysql
useradd -u 3306 -g 3306 -s /sbin/nologin -M mysql
mkdir /mydata
vim /etc/fstab
添加:
/dev/myvg/mydata /mydata ext3 defaults 0 0
mount -a
mkdir /mydata/data
chown -R mysql.mysql /mydata/data
建立nfs共享配置
vim /etc/exports
添加:
/web/htdocs 172.16.0.0/255.255.0.0(ro)
/mydata 172.16.0.0/255.255.0.0(no_root_squash,rw)
exportfs -arv # 從新導出
把兩個節點的heartbeat所有中止
掛載NFS到節點
mkdir /mydata
mount -t nfs 172.16.100.10:/mydata /mydata
tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local
cd /usr/local
ln -sv mysql-5.5.28-linux2.6-i686 mysql
cd mysql
chown -R root:mysql ./*
scripts/mysql_install_db --user=mysql --datadir=/mydata/data
cp support-files/my-large.cnf /etc/my.cnf
vim /my.cnf
添加:
datadir = /mysqdata/data
innodb_file_per_table = 1
保持退出
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig -add mysqld
chconfig mysqld off
service mysqld start
啓動兩個節點的heartbeat
service heartbeat start
ssh node1 'service heartbeat start'
crm_mon 查看節點狀態
tail /var/log/messages 查看啓動狀態
node1和node2所有online便可
查看誰是DC節點
在DC節點上執行hb_gui & 打開控制檯
配置mysql資源組:
mysql_vip
mysql_stroe
mysqld

主機級別的RIAD,主節點讀寫都可,備節點不能讀寫掛載,只能備份使用。
DRDB:存儲鏡像,存儲A節點的數據會自動同步至B節點一份,分佈式複製塊設備,分佈式磁盤塊鏡像。
Dual master:雙主模型,可同時掛載和讀寫
必須使用集羣文件系統:GFS、OCFS2

高可用集羣之corosync基礎概念及安裝配置

高可用計算法則:
A=MTBF/MTBF+MTTR
A:可用性
MTBF:平均在線時間,平均無端障時間
MTTR:平均修復時間

硬件故障:
設計故障
隨機故障
錯誤操做故障
硬件壽命故障
提升硬件MTBF:
使用質量更好的硬件設備
提早更換壽命到期的設備

提升軟件MTBF:
找經驗豐富的團隊開發
檢查全部代碼
簡潔設計

Heartbeat:

RHCS 5.x自帶Openais做爲內核中信息通訊API,cman藉助於完成Messaging Layer信息層管理,rgmanager完成資源管理
RHCS 6.x自帶Corosync
Corosync:Messaging Layer
ha-aware須要crm結合(pacemaker)
openais:AIS

corosync --> pacemaker
SUSE Linux Enterpris Server:hawk,WebGUI
LCMC:Linux Cluster Management Console,WebGUI,能夠經過ssh登陸到各節點配置服務
RHCS:Conga(luci/ricci)
webGUI
keepalived:VRRP,最多2個節點,2個節點最理想使用工具

rpm,sources安裝

corosync:
一、時間同步
二、主機名
三、SSH雙機互信

安裝rpm包:
libibverbs,librdmacm,lm_sensors,libtool-ltdl,openhpi-libs,openhpi,perl-TimeDate

高可用集羣之配置corosync資源及約束
crm命令進入後會列出模式狀態,進入某個模式來管理節點
使用crm進入輸入help能夠查看命令使用
子命令詳細使用信息可用help 命令便可獲取

爲避免報錯信息老是提示stonith錯誤能夠禁用
# crm configure property stonith-enabled=false

crm:兩種模式
交互式:
配置信息執行commit命令後才生效
批處理:
當即生效

分佈式複製塊設備drbd的基礎概念及配置
DRBD:distributed Replicated Block Dvice

heartbeat-ldirectord:
爲ipvs高可用提供規則自動生成及後端realserver健康狀態檢查的組件
生成規則
健康狀態檢查

corosync + ldirectord

keepalived + ipvs

scsi:initiator:發起數據存取請求的
target:服務器端提供數據服務的

DRBD:僅容許兩個節點
主從模型
primary:可執行讀寫操做
secondary:文件系統不能掛載
dual primary,雙主模型,可同時掛載和讀寫
DLM:Distributed Lock Manager 分佈式鎖管理器
GFS二、OCFS2

磁盤調度器:合併讀請求和寫請求;

數據同步模型:
A:Async,異步,只負責本地存儲結束
B:semi sync半同步,傳輸至網絡結束
C:sync同步,對端數據存儲完成結束

DRBD資源:
資源名稱:能夠是除了空白字符外的任意ASCII碼字符;
DRBD設備:在雙方節點上,此DRBD設備的設備文件;通常爲/dev/drbdN,其主設備號固定爲147
磁盤配置:在雙方節點上,各自提供的存儲設備;
網絡配置:雙方數據同步時,所使用的網絡屬性

drbd的配置文件:
/etc/drbd.conf
/etc/drbd.d/global_common.conf
/etc/drbd.d/resouece.d/

基於drbd+corosync的高可用mysql
drbd-overview #查看drbd節點狀態,前面爲本機狀態
umount /mydata # 卸載掛載節點
drbdadm secondary mydrbd #降級
service drbd stop
設置corosync資源的應用就不能設置系統自啓動
安裝corosync
安裝完成後
cd /etc/corosync
cp corosync.conf.example corosync.conf
vim corosync.conf
更改一下項
secauth: on
threads: 2
bindnetaddr: 改成本地解析地址的網絡地址 如:172.16.0.0
mcastaddr: 廣播地址儘量大一些 239.212.16.19
to_syslog: no
添加:
service {
ver: 0
name: pacemaker
}

aisexec {
user: root
group: root
}
保存退出
生成祕鑰:
corosync-keygen
同步祕鑰和配置文件到另外一個節點:
scp -p authkey corosync.conf node2:/etc/conrosync
service corosync start 啓動服務
ssh node2 'service corosync start'
crm status # 查看狀態
禁用stonith設備
property 敲兩下tab鍵,能夠查看到全部可配置的屬性
找到stonith-enabled=
property stonith-enabled= 敲兩下tab鍵依舊能夠提示可填寫信息
property stonith-enabled=false # 禁用stonith設備

crm configure:配置crm,進入crm的配置環境
verify # 查看verify是否有錯誤信息
無錯誤信息後,執行commit提交任務
property -no-quorum-policy=ignore # 由於只有兩個節點,不具有法定票數時不讓其關閉服務
verify #驗證
commit #提交
配置資源粘性rsc
rsc_defaults 兩下tab能夠查看默認屬性
rsc_defaults resource-stickiness=100 # 資源粘性值爲100
verify
commit
show # 查看全局配置信息
cd # 退出到crm的根目錄
ra # 進入ra資源配置模式
provides drbd # 查看誰提供的drbd資源,有heartbeat和linbit
classes # 查看provid信息,heartbeat和linbit屬於ocf
meta ocf:heartbeat:drbd # 查看heartbeat的drbd源數據
meta ocf:linbit:drbd # 查看linbit的drbd源數據

configure # 進入配置模式
primitive mysqldrbd ocf:hearbeat:drbd params drbd_resource=mydrbd op start timeout=240s op stop timeout=100s op monitor role=Master interval=20s timeout=30s op monitor role=Slave interval=30s timeout=30s
# 定義一個主資源類型爲ocf:heartbeat:drbd,資源名爲mydrbd,
ms ms_mysqldrbd mysqldrbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
# 定義主從類型,設定主最大值,主節點最大值,整個資源最大值,從節點最大值,報警通知管理員
show mydrbd # 查看資源詳細配置
verify #驗證
commit #提交配置
cd #退到根
node #進入節點模式
help # 查看此模式下可以使用的命令
online # 將節點拉起
online node2.magedu.com # 拉起node2節點
status # 查看節點狀態
exit # 退出crm管理
drbd-overview # 查看drbd資源主從狀態
crm node standby #切換node1位standby
crm status # 查看主從狀態,node2位master
crm node online # 使node1節點online
接下來配置filesystem資源
crm
configure
primitive mystore ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mydata fstype=ext3 op start timeout=60s op stop timeout=60s
verify #驗證
colocation mystore_with_ms_mysqldrbd inf: mystore ms_mysqldrbd:Master # 配置排列約束
order mystore_after_ms_mysqldrbd mandatory: ms_mysqldrbd:promote mystore:start # 配置順序約束
verify #驗證
commit #提交
cd # 退出配置模式
status #查看狀態,查看掛載點mystore是否跟着主節點保持一致
兩個節點上安裝mysql數據庫
兩個my.conf配置文件中加入掛載數據的掛載點
datadir = /mydata/data
啓動mysql數據庫
確保兩邊的組ID和用戶ID保持一致,由於要往同一個共享存儲寫入數據
兩邊chkconfig mysqld off都改爲開啓不啓動狀態
添加mysqld資源
crm
configure
primitive mysqld lsb:mysqld
verify
coloation mysqld_with_mystore inf: mysqld mystore # 配置永久排列約束,inf爲永久生效
order mysqld_after_mystore mandatory: mystore mysqld #定義次序約束
verify
commit #提交配置
status #查看狀態
再配置vip資源
crm
configure
primitive myip ocf:heartbeat:IPaddr params ip=172.16.100.1 nic=eth0 cidr_netmask=255.255.0.0
verify
coloation myip_with_ms_mysqldrbd inf: ms_mysqldrbd:Master myip
verify
show xml # 分析關係
commit #提交
status
用第三方的一個客戶端訪問vip進行數據庫鏈接,查看是否能看到drbd共享存儲中的內容

RHCS架構詳解 Red Hat Cluster Suite,紅帽集羣套件
LVS
HA
GFS
cLVM

RHCS架構:
Cluster Infrastructure基礎架構層:heartbeat、corosync、keepalived
資源管理器:CRM
heartbeat v1:haresources
heartbeat v2:CRMD
heartbeat v3:pacemaker
RA資源代理:Lsb(/etc/init.d/),ocf(providers),Legacy Heartbeat v1,stonith
internal
script:lsb
/etc/init.d/*

corosync(cman)
pacemaker(rgmanager)

corosync
1.4.5版本以前都使用自帶投票系統
2.3.0(needle)
votequorum 新一代投票系統,優於cman的投票系統

cLVM:Cluster LVM
藉助於HA的功能,將某節點對LVM操做通知給其餘節點
/etc/lvm/lvm.conf
找到locking_type = 1
1表示基於本機使用
2表示外部共享庫的鎖庫
3表示內建的集羣鎖(適用於集羣環境,安裝clvm插件使用)
RHCS:
CCS:Cluster Configuration System
每節點都有一個ccsd守護進程,某個節點更改配置文件,ccsd會同步給其餘節點
CMAN:/etc/cluster/cluster.conf

piranha:圖形化配置LVS的套件

Faliover Domain
故障轉移域:Service
HA SERVER:vip,httpd。filesystem
軟件安裝:
pxe+dhcp+tftp和cobbler,批量安裝操做系統或應用軟件安裝升級
批量執行命令:
for+ssh互信機制在集羣內節點所有執行
fabric命令分發工具
配置文件管理:
puppet,重量級工具,能夠軟件分發,配置文件管理,使用較爲複雜
圖形配置界面:
redhat6.4:pcs
rhel5.8:system-config-cluster

RHCS集羣配置

軟件、系統安裝命令:
for,ssh
命令分發工具fabric,python程序,fab命令
配置文件管理、軟件分發:
puppet

rhcs重要組件:
cman:openais
rgmanger
system-config-cluster:一個節點安裝便可
gfs2-utils
clvm:lvm-cluster

HA:至少三臺,兩臺須要仲裁磁盤
node1 node1.magedu.com 172.16.100.6-8

steppingstone.magedu.com 172.16.100.100 跳板機:管理三個node節點

前提:
一、時間同步
二、名稱解析,且每一個主機的主機名與其‘uname -n’保持一致;
三、配置好每一個節點的yum源

RHCS:
cman,rgmanager,system-config-cluster

配置過程:
登陸steppingstone跳板機執行批量安裝組件:
alias ha='for I in {1..3}; do' #把for循環前綴作成別名叫ha
ha ssh node$I 'yum -y install cman rgmanager system-config-cluster'; done # 再三個節點執行yum源安裝cman rgmanager system-config-cluster組件
for循環遵循bash模式,一條命令結束後才能執行下一條命令,所以效率較慢,fabric命令分發工具則能夠將命令在各節點並行執行,效率快不少

RHCS服務啓動前提:
一、每一個集羣都有惟一的集羣名稱
二、至少有一個fence設備,fence_manual -n 指定一個節點,模擬fence設備
三、至少三個節點;兩個節點須要qdisk仲裁磁盤
執行system-config-cluster & 會調用xmanager圖形配置界面,若是未配置rhcs則會提示建立新的配置文件,配置後會經過ccs工具同步至其餘節點
一、生成新的配置文件,起一個集羣名稱,指定多播地址,若是不選則會內部選用一個多播地址,是否使用仲裁磁盤等參數,保存便可
二、點擊cluster nodes右邊的對話框中選擇Add a cluster 三、node添加節點,填寫節點名稱必須和uname -n保持一致的名稱,並填寫法定票數,通常爲1,點擊ok完成節點添加
四、選擇fence device選項,添加fence設備,選擇manual fencing手動添加,name填寫meatware點擊ok完成添加
五、點擊file選項下的save選項,保存位置爲/etc/cluster/下點擊ok保存結束
查看cluster.conf配置文件
在配置節點上執行service cman start 過程當中會啓用ccs將配置文件同步至其餘節點,啓動完成後再去其餘節點查看配置文件已經存在

回到steppingstone跳板機啓動rgmanager
ha ssh node$I 'service ramanager start'; done

在node1節點執行
netstat -tnlp 查看一下服務對應監聽

資源:
VIP
httpd

每一個節點安裝httpd
ha ssh node$I 'yum -y install httpd'; done
安裝完成後將本身對應的主機名寫入頁面:
vim /var/www/html/index.html
添加各自主節點名稱
node1 ~ 3

在任何node節點上執行:
cman_tool status # 查看集羣狀態
clustat # 也能夠查看集羣狀態

cman中建立資源無命令,只能配置文件添加
使用system-config-cluster & 進入圖形界面
添加資源,點擊resource,選擇右邊create a resource
彈出對話框選擇資源類型ip address 填寫IP地址 172.16.100.1 subnet爲16,添加虛IP資源
在選擇建立資源,類型爲script,NAME填寫webserver,file路徑爲/etc/rc.d/init.d/httpd 點擊ok完成添加
再選擇services選項,點擊create a service建立一個服務,能啓動的均爲服務
name填寫爲webservice,點擊OK,進入服務配置界面,failover domain指定故障轉移域
autostart this service資源配置好後自動啓動此服務,在recovery policy恢復策略中萱蕚restart(本機重啓服務),relocate(換一個節點),disable(禁用服務)
在下面的create a new
resource for this service中建立新資源,也能夠add a shared resouece to this service添加一個共享資源,點擊添加共享資源,選擇vip和web server添加進來
添加好以後退出到原始界面,點擊右上角的send to cluster同步至其餘節點,選擇yes便可同步

此時在查看cman_tool status查看集羣狀態,查看到httpd服務運行在了node3節點
在node3節點查看監聽:
netstat -tnlp|grep :80 能夠查看到80端口監聽已經啓動
ip addr show # 查看vip添加狀況,ifconfig看不到則使用此命令查看
此時訪問172.16.100.1能夠訪問到node3頁面

cman_tool -h 查看相關命令使用
noes # 能夠查看各節點狀況
cman_tool service # 能夠查看誰利用cman傳遞心跳信息

clusvcadm -h # 查看此命令能夠顯示、遷移、鎖定資源組
-l 鎖定一個資源組
-u 解鎖一個資源組
clusvadm -r webservice -m node2.magedu.com # 遷移webservice服務到node2節點
此時再訪問172.16.100.1能夠顯示的是node2頁面
-e 啓用一個資源
-d 禁用資源
-r 重啓資源
-s 中止資源
-M 遷移,只能實時遷移虛擬機,將虛機當作一個資源進行熱遷移
-r 複製

ccs_tool -h # 實現管理配置文件
addnode 添加一個節點
delnode 刪除一個節點
addfence 添加一個fence設備
delfence 刪除一個fence設備
create 建立一個集羣
lsnode 顯示節點
lsfence 顯示fence

配置集羣共享存儲:
mkdir -pv /web/htdcos # 在跳板機或存儲節點上建立一個目錄
vim /etc/export
添加:
/web/htdcos 172.16.0.0/16(ro)
保存退出
service nfs start
chkconfig nfs on
showmount -e 172.16.100.100
建立頁面 index.html
添加 nfs server內容

在system-config-cluster &圖形界面中
添加services服務,點擊edit serivce properties直接編輯現有服務
選擇添加一個新專用資源,選擇nfs mount類型
name:webstore
mount point:/var/www/html
host:172.16.100.100
export path:/web/htdocs
選擇nfs選項
點擊ok結束配置
執行send to cluster同步至其餘節點
由於getenforce會看到enforcing是開啓狀態,由於selinux的緣故可能影響掛載權限
在跳板機執行:各節點關閉enforce
ha ssh node$I 'setenforce 0'; done

clusvcadm -r webservice -m node1.magedu.com #遷移到node1節點查看服務
再訪問頁面則會看到顯示爲nfs server頁面了

經過命令行方式配置集羣:
先將全部節點服務中止,cman也中止
ha ssh node$I 'rm -f /etc/cluster/*";done #刪除配置文件
配置集羣服務:
ccs_tool create tcluster #自動建立配置文件,名稱爲tcluster
ccs_tool addfence meatware fence_manual 建立fence設備
ccs_tool addnode -v 1 -n 1 -f meatware node1.magedu.com #添加第1個節點
ccs_tool addnode -v 1 -n 2 -f meatware node2.magedu.com #添加第2個節點
ccs_tool addnode -v 1 -n 3 -f meatware node3.magedu.com #添加第3個節點
每一個節點重啓啓動cman服務
service cman start
資源添加沒法在命令行下添加,只能使用圖形

iSCSI協議、架構及其安裝配置
scsi以塊方式傳輸
設備無關性
多設備並行
高帶寬
低系統開銷


iSCSI Target:服務器端 scsi-target-utils
端口:3260
驗證客戶端來源方式:
一、基於IP驗證
二、基於用戶,CHAP:雙向認證
iSCSI Initiator:客戶端 iscsi-initiator-utils
open-iscsi

安裝:
fdisk /dev/sda
e 選擇擴展分區類型
4 第4個分區
n 劃分新空間起始
默認回車,截止空間位
p 查看分區結果
n 再劃分一個
+20G 劃分20G空間
w 保存退出
partprobe /dev/sda 刷新配置
不格式化

安裝服務器端:
yum install scsi-target-utils
rpm -ql scsi-target-utils 查看安裝後的文件及路徑
service tgtd start 啓動服務端
netstat -tnlp 查看3260端口
tgtadm -h 查看命令行工具使用 模式化命令
--mode
經常使用模式:target、logicalunit、account
target --op
new 建立新target
delete 刪除
show 顯示
update 更新
bind 綁定,IP受權,容許哪些IP地址訪問target
unbind 解綁
logicalunit --op 某個已有target的邏輯單元
new、delete
account --op 用戶
new、delete、bind、unbind
--lld,-L 指定驅動
--tid,-t 指定tid號
--lun,-l 指定lun號
--back-store,-b 指定後端存儲
--user,-u 指定用戶名
--passwe ,-p指定密碼
--initiator-address <addrees>,-I
--targetname <targetname>,-T
session:會話管理和查看
iface:接口管理和查看

targetname命名:域名要反寫,
iqn.yyyy-mm.<reversed domain name>[:identifier]
例:iqn.2013-05.com.magedu:tetore.desk1


建立一塊服務端存儲:
tgtadm --lld iscsi --mode target -op new --targetname iqn.2013-05.com.magedu:tetore.desk1 --tid 1
#建立一塊磁盤爲共享存儲設備,tid不能指定0,0爲存儲端使用設備號
tgtadm --lld iscsi --mode target --op show # 查看建立的磁盤信息
一個target能夠建立32個LUN
tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 -b /dev/sda5
# 建立一個lun,lun 0爲存儲使用爲控制器類型
tgtadm --lld iscsi --mode target --op bind --tid 1 --initiator-address 172.16.0.0/16
#將某個tid的設備綁定給某個網絡端使用掛載

客戶端安裝和掛載:
yum -y install iscsi-initiator-utils
rpm -ql iscsi-initiator-utils
iscsi-iname #自動隨機生成initiatior名稱
-p 指定前綴 iqn.2013-05.com.magedu 回車後再名稱後生成隨機串
echo "IntiatorName=`iscsi-iname -p iqn.2013-05.com.magedu`" > /etc/iscsi/intiatorname.iscsi
# 將隨機生成的name放置在配置文件中
service iscsi start 啓動客戶端服務
iscsiadm模式化的命令
-m {discovery|node|session|iface}
discovery:發現某個服務器是否有target輸出,以及輸出了哪些target
-d:0-8
-I:
-t type;SendTargets(st),SLP,and iSNS
-p:IP:port
例:iscsiadm -m discovery -t st -p 172.16.100.100
cd /var/lib/iscsi/send_targets/
ls 172.16.100.100,3260
node:管理跟某target的關聯關係,創建、解除
-L 登陸全部
-U 登出全部
-S 顯示
-T 登陸單個某個targetname
-p 經過那個IP或端口登陸
-l 登陸
-u 登出
-o 操做數據庫,對應登陸的數據庫的操做
new,delete,update,show
-n name 跟-o組合使用,指定數據庫條目
-v 值爲修改內容
例:iscsiadm -m node -T iqn.2013-05.com.magedu:testore.desk1,portal:172.16.100.100 -l
客戶端認盤命令,執行後使用fdisk -l能夠查看到新的磁盤sdb

iSCSI及gfs2

/var/lib/iscsi/目錄下能夠看到相應的配置目錄
send_targets目錄下是對端配置目錄,目錄下存儲相應配置文件
ifaces目錄下存儲着接口綁定信息
/etc/iscsi/iscsid.conf的配置文件配置相關屬性
node.startup = automatic #自動啓動節點並掛載
還有會話時間等設備
配置基於用戶的認證:
# 登出以前掛接的條目:
iscsiadm -m node -T iqn.2013-05.com.magedu:tetore.desk1 -p 172.16.100.100 -u
# 刪除其相關的數據庫數據,send_targets目錄下的內容將被刪除
iscsiadm -m node -T iqn.2013-05.com.magedu:tetore.desk1 -p 172.16.100.100 -o delete
# 服務器端解除綁定
tatadm --lld iscsi -m target --op unbind --tid 1 --initiator-address 172.16.0.0/16
# 再次查看
tatadm --lld iscsi --mode target --op show
# 建立帳號
tgtadm --lld iscsi --mode account --op new --user iscsiuser --password iscsiuser
# 綁定
tgtadm --lld iscsi --mode account --op bind --tid 1 --user iscsiuser
tgtadm --lld iscsi --mode account --op bind --tid 1 --initiator-address 172.16.0.0/16
# 查看
tatadm --lld iscsi --mode account --op show
# 客戶端發現,提示No portals found
iscsiadm -m discovery -t st -p 172.16.100.100
# 查看詳細日誌,提示對方禁止登陸
iscsiadm -m discovery -d 2 -t st -p 172.16.100.100
# 配置iscsid.conf配置文件
vim /etc/iscsi/iscsid.conf
找到CHAP認證相關內容
node.session.auth.authmethod = CHAP
node.session.auth.username = iscsiuser
node.session.auth.password = iscsiuser
discovery.sendtargets.auth.method = CHAP
discovery.sendtargets.auth.username = iscsiuser
discovery.sendtargets.auth.password = iscsiuser
保存退出
service iscsi restart # 重啓服務

iscsi-initiator-utils:
不支持discovery認證;
若是使用基於用戶的認證,必須首先放開基於IP的認證

早期:
服務端創建的連接所有爲內核操做,在內存中。須要永久生效的話須要在/etc/rc.local中寫入命令集,重啓時自動加載。
如今:
vim /etc/tgt/targets.conf
添加容許的掛接條目
<target iqn.2013-05.com.magedu:tetore.desk1>
backing-store /dev/sda5
incominguser iscsiuser iscsiuser
initiator-address 172.16.0.0/16
</target>
保存退出
service tgtd restart

gfs2:全局文件系統,分佈式集羣系統的一種
組件:
cman,rgmanger,gfs2-utils
建立分區
fdisk /dev/sdc
n
2
+10G
p
w
partprobe /dev/sdc
主服務器執行:
alias ha='for I in {1..3};do'
ha ssh node$I 'yum -y install gfs2-utils';done
格式化命令:
mkfs.gfs2 -h
-b<bytes> 文件系統block大小
-c<MB> 以MB計算大小
-D 開啓debug模式
-J<MB> journals日誌文件系統大小,默認128M
-j <num> journals日誌區域的個數,有幾個就可以被幾個節點掛載
-p {lock_dlm|lock_nolock} 鎖協議名稱
-t <name> 鎖表的名稱,格式爲clustername:locktablename,clustername爲當前節點所在 集羣名稱,locktablename要在當前集羣惟一;
格式化:
mkfs.gfs2 -j 2 -p lock_dlm -t tcluster:mysqlstore /dev/sdc2
按照提示y繼續格式化,分佈式文件系統格式化時間較長
gfs2_tool管理工具
list列出當前文件系統下關聯列表
journals查看日誌信息

掛載:
mount -t gfs2 /dev/sdc2 /mnt
幾個節點同時掛載,a機寫入文件b機可見
日誌個數擴展,必須指定掛載的文件系統
查看當前設備日誌個數:gfs2_tool journals /dev/sdc2
擴展日誌個數,指定新增個數:gfs2_jadd -j 3 /dev/sdc2

注意:最多不要超過16個節點,性能會很是差

iSCSI、cLVM和gfs2
cLVM集羣邏輯卷:
在主服務器上執行安裝相應包:
ha ssh node$I 'yum -y install cman rgmanager gfs2-utils lvm2-cluster'; done

clvm:共享存儲作成lvm,依賴於cman和rgmager
借用ha的機制
/etc/lvm/lvm.conf
lockingtype = 3
各節點啓動clvm服務
建立集羣:
ccs_tool create tcluster
ccs_tool addfence meatware fence_manual
ccs_tool lsfence
ccs_tool addnode -n 1 -f meatware node1.magedu.com
ccs_tool addnode -n 2 -f meatware node2.magedu.com
ccs_tool addnode -n 3 -f meatware node3.magedu.com
ccs_tool lsnode
各節點挨個啓動
service cman start
在各節點配置文件中啓用集羣邏輯卷類型
ha ssh node$I 'lvmconf --enable-cluster ';done
啓用集羣邏輯卷功能
ha ssh node$I 'service clvmd start';done
開機啓用功能
ha ssh node$I 'chkconfig clvmd on; chkconfig cman on; chconfig rgmanager on';done
建立邏輯卷
pvcreate /dev/sdb
在各節點查看都能看到建立的PV
pvs
建立clustervg
vgcreate clustervg /dev/sdb
vgs
建立lv
lvcreate -L 10G -n clusterlv clustervg
lvs
建立集羣文件系統
格式化爲gfs2文件系統
mkfs.gfs2 -j 2 -p lock_dlm -t tcluster:lktb1 /dev/clustervg/clusterlv
每一個節點進行掛載:
mkdir /mydata
mount -t gfs2 /dev/clustervg/clusterlv /mydata
查看文件系統狀態信息
gfs2_tool df /mydata
更改參數
gfs2_tool settune /mydata new_files_directio 1 # 開啓直接寫模式
gfs2_tool gettune /mydata # 查看參數列表
gfs2_tool freeze /mydata # 凍結分區,至關於設置只讀,文件備份時使用
gfs2_tool unfreeze /mydata # 解凍
gfs2_tool getargs /mydata # 掛載參數
gfs2_tool setargs /mydata # 設置掛載參數
擴容邏輯卷:
gfs2_grow /dev/clustervg/clusterlv # clvm擴展後邏輯邊界還未擴展成功,此命令可擴展邏輯邊界,lvm只是擴展了物理邊界

計算機及操做系統原理
cpu從一級緩存二級緩存三級緩存到內存所有緩存的內容叫通寫 Write through
回寫:Write Back數據須要丟棄時寫會到一級緩存,當前回寫方式最多

os:vm
cpu時間切片
緩存:緩存當前程序數據
指令計數器:記錄當前指令執行的位置
進程切換:保存現場、恢復現場(保存內存中)
內存:線性地址<--物理地址
空間:映射,完成空間切片

x86的cpu指令分0、一、二、3共4個環
linux只使用0和3,0負責內核,3負責用戶
徹底虛擬化:
虛擬化經過軟件模擬出一套硬件調度過程,在環3運行,模擬出環0的調度,其實由宿主機完成調用環0的動做
虛擬機運行性能是物理機的60%到70%
由於性能差別新一代cpu又延伸出-1環,特權指令在-1環內,0環能夠給虛擬機調度使用

Ready
Sleeping
可打斷:忙碌的進程不可打斷
不可打斷:完成工做後的進程

Linux操做系統原理
進程描述符:
進程的元數據
內核中:
雙向鏈表
建立進程描述符添加到鏈表中,存在內核中
上下文切換:進程切換
從用戶空間轉至內核模式,在轉回用戶模式
此時會產生用戶時間和內核時間
top命令cpu橫向中 sy爲內核時間 us爲用戶時間
linux支持搶佔:
優先級高進程可搶佔低的進程運行時間
系統時鐘:內部時鐘頻率
tick:滴答,一次爲1毫秒
時間解析度
100Hz
1000Hz
搶佔時會發聲時鐘中斷
A:5ms,1ms

進程類別:
交互式進程(I/O密集型) ,時間片長,優先級低
批處理進程(CPU密集型) 守護進程,時間片短,優先級高
實時進程(Real-time)
linux優先級:priority
實時優先級:1-99,數字越小優先級越低,一般與內核相關
查看優先級:ps -e -o class,cmd| grep ssh
查看實時優先級:ps -e -o class,rtpri,pri,nic,cmd
nic值:調整靜態優先級,nic值-20到19分別對應優先級100-139,所以nic值0則優先級120,默認nic值均爲0,所以優先級爲120
靜態優先級:100-139,數字越小優先級越高,一般與用戶相關

實時優先級比靜態優先級高
top命令中PR項中RT爲實時優先級,20表示未120的數字優先級

ps中帶中括號的進程爲內核線程

調度類別:
實時進程:ps命令CLS列就是調度類別
SCHED_FIFO:First In First Out 先進先出
SCHED_RR:Round Robin 輪詢
SCHED_Other:用來調度100-139之間的進程,用戶空間進程
動態優先級:
主要針對SCHED_Other,始終監控是否有進程好久未分配cpu時間片,爲其臨時調整優先級,動態優先級取值算法 dynamic priorty = max(100,min(static priority - bonus +5,139))
bonus取值範圍0-10

手動調整優先級:
100-139:nice
nice N Command
renice
1-99:
chrt命令調整實時優先級
-p 調整進程的pid號
-f 表示fifo類別
-r 表示rr類別
-i idle進程
例:chrt -f -p [prio] PID

linux 2.6之後機制,進程執行過程,按照99-1和100-139排列掃描隊列首部,掃到優先級最高的排隊執行
隊列分:活動隊列和過時隊列

SCHED_Other
CFS:Complete Fair Scheduler
Kernel--> init
init
fork():系統調用 建立新的子進程
task_struct 進程描述符,內核完成
Memory-->Parent 建立進程的內存空間與父進程共用
COW:Copy On Write 父進程或子進程須要寫時分家佔用本身的內存空間

CPU負載觀察及調優方法
CPU 一級和二級緩存爲獨有,三級爲共享
I1 指令一級緩存
D1 數據一級緩存
SMP:
對稱多處理器
NUMA:
非一致性訪問結構
numactl:控制命令,numa策略控制
--cpunodebind=nodes,-N nodes:進程綁定某個CPU
--show:顯示策略

numastat:狀態命令
-s <node>:顯示某個node信息,並排序
如:numastat -s node0
顯示node節點信息
hit表示命中量
miss表示未命中,繞過,此數據較多則須要綁定cpu
numad:服務進程,自我監控和自我調優,在很是繁忙的服務器中啓動此進程可優化提高50%,前提要看一下miss值是否很高
此命令可保存
numademo:演示命令

CPU affinity:CPU 姻親關係,綁定在某顆CPU,不交叉內存訪問
綁定cpu場景:numa_miss數據量大的時候就須要綁定

進程與CPU綁定的命令,非NUMA架構也能夠
tackset:綁定進程至某CPU上
-c <num>:定義幾號CPU,不須要寫CPU掩碼,直接寫CPU的號便可
mask:
0001二進制或0x0000 0001十六進制表示第0顆CPU,所謂CPU掩碼的方式,16進制
0011二進制或0x0000 0003表示表示0號和1號CPU
0111二進制 0-2號CPU
格式taskset -p mask pid
例子:taskset -p 0x00000004 101 # 表示把101號進程綁定在第3號CPU上
taskset -p -c 0-2,7 101 # 表示把101號進程綁定在第0到2號和7號CPU上
預留CPU方式:
啓動時向/etc/grub.conf配置文件中傳遞參數
isolcpus=cpu number,...,cpu number # 啓動時隔離的CPU,啓動後不會被進程佔用
隔離中斷:使CPU要麼處理內核要麼處理於某進程
CPU服務中斷:運行當中遇到硬件級內核優先級較高的處理,便會中斷轉換到內核模式處理內核進程
echo cpu_mask > /proc/irq/<irq_num>/smp_affinity
irq_num爲中斷線或中斷號碼
cat /proc/irq/0/smp_affinity
顯示ffffffff,ffffffff這表示可運行在任意中斷線上,將此中斷線綁定到CPU上便可
應該將中斷綁定至哪些非隔離的CPU上,從而避免那些隔離的CPU從處理中斷程序;

綁定CPU的場景:
一、NUMA場景命中率低時,也就是miss值較高時須要綁定
二、某進程繁忙,上下文切換頻繁
TASK_RUNNABLE和TASK_UNINTERRUPTABLE進程
sar -q :抓取負載狀況,包括每隔10分鐘一次的歷史。隊列長度和負載平均值
runq-sz:運行隊列長度,越高等待調度的排隊越長
plist-sz:task列表中進程個數,也就是當前系統中進程個數
ldavg-1:過去1分鐘的平均值
ldavg-5:過去5分鐘的平均值

-b:IO狀況
-B:查看內存頁面置換狀況
-d:查看每秒的事務數TPS,每一個塊設備的每秒中的事務數


rpm -qf `which sar` #查看命令由誰安裝的
rpm -ql sysstat #查看命令對應的信息
iostat
pidstat
mpstat
cifsiostat
sadf
sa、sa1和sa2獨特命令,用來生成文件來分析過去的執行情況
sa1

top
w
uptime
vmstat 1 5
CPU
CPU utilization
mpstat 1 2
-I CPU 1 # 1號CPU處理中斷時的信息
多處理器的每顆CPU使用狀況
mpstat -P 0 1 # 只顯示0號CPU的狀況,每秒中顯示一次
顯示結果:
%usr 用戶空間佔用
%nice 不一樣用戶級別nice值對應使用的
%sys 內核空間佔用
%iowait IO等待的
%irq 用於處理中斷
%soft 處理軟中斷
%steal 被虛擬機偷走的
%guest 虛擬機使用的
%idle 空閒的
sar -p ALL 1 2
-p:指定CPU號,ALL 表示全部
iostat -c 1 2 # CPU統計數據和輸入輸出統計數據,1秒鐘採樣1次,共採樣2次
-c:顯示CPU
-d:顯示設備
/proc/stat
dstat #系統資源統計數據命令,紅帽6自帶以前版本需安裝
--top-cpu:顯示哪一個進程最消耗CPU
--top-cputime:最消耗CPU時間的,毫秒爲單位
--top-cputime-avg:最消耗CPU時間片的
--top-io:消耗最高IO的進程
--top-latency:消耗延遲最高的進程
--top-mem:消耗最高內存的進程
上下文切換查看:
vmstat 1
system中的cs就是上下文切換次數
sar -w
cswch\s :顯示每秒鐘上下文切換次數,以及進程建立的平均值

Scheduler domains:調度器域
使CPU劃分好組將某進程綁定在對應組
建立方法:
建立目錄cpusets
在vim /etc/fstab
添加:
cpuset /cpuset cpuset defaults 0 0
保存退出mount -a
mount查看
ls /cpusets
查看內容可看到建立了N多文件,此時cpusets目錄則爲根域
查看cat /cpusets/cpuset.cpus
能看到0-x,全部CPU號數
查看cat /cpusets/cpuset.mems
能看到哪段內存屬於根域
tasks文件
能看到運行在此根域的全部進程號
建立子域:在根域下建立目錄
mkdir domain1
cd domain1
查看文件依舊生成了N多文件,將cpus和mems設定好便可完成資源劃分
echo 0 > cpuset.cpus # 將0號CPU分配給子域
echo 0 > cpuset.mems # 將0號CPU調度內存分配子域
echo pid > tasks # 將某進程劃分至子域
此時這個進程就只能運行在0號CPU的子域中了
ps -eo psr,pid,cmd |grep httpd
查看psr項就是運行在那顆CPU的顯示結果,能看到綁定的pid已經運行在0號CPU上
另外一種方法taskset命令
taskset -p -c 0 16380 # 將pid16380進程綁定到0號CPU

正經常使用戶空間和內核空間比例:用戶7,內核3比例正常,利用率長期超出80%說明CPU較爲繁忙

 

Linux內存子系統及經常使用調優方法

虛擬化環境:內存是虛擬化中最難完成的組件
進程地址PA-->虛擬機地址HA-->物理地址MA
虛擬機轉換:PA-->HA
Shadow PT(pagetable):影子頁表,完成地址翻譯
Memory
TLB:hugetable page 大表頁,需使用hugetlbfs文件系統
實現使用不一樣頁面大小的頁面存儲
cat /proc/meminfo |grep -i Huge
查看內存信息中的hugepages信息
啓用大頁面:
sysctl -w vm.nr_hugepages=10
in /etc/sysctl.conf
vm.nr_hugepages=n # n爲啓用個數
另外一種方式
Kernel parameter
hugepages=n #n爲啓用個數
建立hugetblfs
mkdir /hugepages
mount -t hugetlbfs none /hugepages
dd if=/dev/zero of=/hugepages/a.test bs=1m count=5 # dd測試寫入

觀察進程如何進行系統調用的
strace命令
-o /tmp/strace.out -p PID
# 追蹤某個PID進程的系統調用並輸出到某個文件
COMMAND (某個命令)
# 追蹤某個命令的系統調用
-c
#:只輸出其歸納信息
內存優化:
一、下降微型內存對象的系統開銷
slab 小內存對象調用機制
cat /proc/slabinfo # 能夠查看到全部存入slab的內存對象,支持多種內存結構
二、縮減慢速子系統的服務時間
一、經過buffer cache緩存文件元數據,提速IO子系統時間
二、disk IO:page cache緩存disk IO
三、interprocess communication 進程間通訊:使用share memory 共享內存解決
四、Network IO:經過buffer cache,arp cache,connection tracking(鏈接追蹤)提高

內存分配:
vm.min_free_kbytes:預留最小參數,不容許爲進程分配的最小值,特定預留。此值調小
vm.overcommit_memory:容許內存過量使用,超出物理內存一部分Swap
cat /proc/sys/vm/overcommit_memory
0:表示啓發式過量,本身決定是否啓用
1:表示老是過量,不管什麼場景超出物理內存就會使用
2:表示大於全部物理內存後可使用一部分swap空間
vm.overcommit.ratio:定義能夠超出內存百分之多少
只有vm.overcommit_memory值設定爲2時纔會使用,儘量不要超過百分之150的ram
OOM:out of memory 內存溢出
內存溢出時系統會將佔用內存較高的進程殺掉,OOM killer
ls /proc/1 # 查看每一個PID進程目錄下的控制文件
oom_adj
oom_score:oom評分,此分數越高先kill誰
oom_score_adj:貼個標籤,優先監控
調優slab cache:
slabtop命令查看當前系統slab進程信息USE百分比高的將會被清除
dentry:目錄路徑映射關係
ext4_inode_cache:ext4_inode的緩存
cat /proc/slabinfo中的tunables就是可調參數
limit:最大對象數目,能夠被cpu緩存的最大對象數
batchconunt:當CPU空閒時,一次性能夠緩存至CPU對象的個數
shared:在多處理器中,能夠最多緩存多少個slab cache
更改slab cache方法:調大slab cache能夠提高CPU對訪問小對象的效率
echo '進程名 108 54 8' > /proc/slabinfo
調整arp cache的緩存結果
默認存放在/proc/net/arp文件中,最高軟限制能夠緩存512個條目,硬限制爲1024條
一旦超出,經過garbage collection垃圾收集器處理掉多餘條目,arp緩存只有5分鐘有效時長
ip neighbor list查看多少arp緩存條目
ip neighbor flush dev ethX 清空某個網卡的arp緩存
調整參數值:
net.ipv4.neigh.default.gc_thresh1 #清理閾值,默認128
net.ipv4.neigh.default.gc_thresh1 #軟限制,默認512
net.ipv4.neigh.default.gc_thresh1 #硬限制
net.ipv4.neigh.default.gc_interval #超出128須要清理,啓動清理過時條目;超出512軟限的,5秒鐘則清除;未超出軟限的300秒後仍未更新的也被清理
page cache:頁面緩存,主要做用是下降磁盤IO,加速讀操做
如何下降IO緩存?
緩存目錄讀取
文件自身修改,過段時間後再回寫操做真正落到磁盤上
經過內存映射
交換分區緩存
如何調整page cache
vm.lowmem_reserve_ratio:lowmem指低端內存,低端內存很低時預留多少空間
64位系統無需關注
vm.vfs_cache_perssure:內核回收內存的場景
針對directory和inode對象
默認值100,表示傾向性一致,page cache和swap cache相同
值爲0表示不回收directory和inode對象
1-99:傾向於不回收;
大於100:更傾向於回收
vm.page-cluster:頁簇,須要從內存交換到交換分區上時,一次性交換多少到交換分區
1:表示2的1次方個
2:表示2的2次方個
只有系統大量使用交換分區時調整,最佳調整爲4才能獲取些許性能改進
虛擬化中可能遇到此場景,虛擬機內存超出物理內存後(內存超配狀況下)調整
vm.zone_reclaim_mode:內存區域回收時的模型,更傾向於回收哪段內存
1:表示內存區域回收功能打開,內核控制
2:表示回收寫的髒頁
4:表示回收用於swap的頁面
anonymous pages:匿名頁,不是文件內容
包含頁面數據:
一、程序自身產生數據,例如數組、堆中的數據
二、匿名內存區域也爲匿名頁
三、髒內存頁面,進程私有頁面
四、進程間通訊的共享內存頁面
anonymous pages=RSS(實際內存集)-Shared(共享內存) :爲匿名頁值,匿名頁不能被交換出去

內存進程間通訊內存調優:
經過man ipc能夠查看進程間通訊的相關係統調用方法
調優針對項:
一、消息
二、信號
三、共享內存
ipcs -l :查看進程間通訊限制
共享內存:
最大容許多少段:
段最大多少字節:
容許全局範圍內使用的共享內存大小kbytes:
最小段大小bytes:
信息隊列限制:
系統範圍內最大隊列數:
每一個信息的最高字節
默認每一個隊列最大小子的字節數

ipcrm:移除某個睡眠且沒法喚醒的消息隊列

如下兩個參數調優通常爲調大,具體值須要配合業務測試得出
共享內存調優:
kernel.shmmni:全系統範圍內最大容許多少個共享內存段,默認4096
數據庫服務器調整居多
kernel.shamall:全局範圍內可以使用的最大共享內存頁面數,默認2097152
此值最小範圍不能小於:kernel.shmmax/PAGE_SIZE
kernel.shmmax:單個共享內存段最大的上限值

關於內存消息調優:
kernel.msgmnb:單個消息隊列的最大字節數,默認16384

kernel.msgmni:系統級別消息隊列個數上限,默認16

kernel.msgmax:進程間通訊時,單個消息的最大上限,單位字節

回收內存:
ps aux|grep pdf # 查看進程pdf進程
pdflush 調整:最小保證2個
vm.nr_pdflush_threads 顯示有多少個pdflush線程數,能夠自定義echo值到此文件便可
通常自動優化調整,原理一個IO設備一個pdflush線程
pdflush工做屬性調整參數:
vm.dirty_background_ratio:髒頁所佔的比例達到多少以後開始清理,清理閾值
cat /proc/sys/vm/vm.dirty_background_ratio
vm.dirty_ratio:單個進程的髒頁達到整個內存多少比例以後開始清理
cat /proc/sys/vm/vm.dirty_ratio
cat /proc/sys/vm/vm.dirty_bytes # 用字節控制,少用
vm.dirty_expire_centisecs:每隔多長時間啓動清理一次,0表示禁止,單位百分秒,100爲1秒

vm.dirty_writeback_centisecs:一個髒頁在內存中存儲多久以後被清理,單位百分秒

手動清寫髒緩存和緩存
sync
echo s > /proc/sysrq-trigger

回收乾淨頁:
echo 3 /proc/sys/vm/drop_caches #接受一、二、3 三個參數,默認爲0表示不釋放
一、1表示pagecache # 一般釋放pagecache比較理想
二、dentries和inodes
三、pagecache、dentries和inodes

內存耗盡後系統會比較/proc/PID/oom_score的分數 負17到正16之間的值,數字越高的被kill
啓用oom_killer echo 0 > /proc/sys/vm/panic_on_oom
1爲不啓用此功能
oom_score系統經過觀察每一個進程計算得來的分數,主要影響的文件是oom_score_adj
經過調整oom_score_adj文件值來決定被殺死的概率
-16到15:協助計算oom_score的
-17:爲不被oom_killer的進程

如何使用valgrind評估內存泄漏
--tool:指定子組件的工具 經常使用的memcheck,$$表示當前進程號
例:valgrind --tool=memcheck cat /proc/$$/maps
內存泄漏:分出的內存使用完沒法釋放,始終被處於佔用狀態
另外一種監控泄漏的方式:
watch -n1 'ps axo pid.comm.rss.vsize|grep httpd' # 監控的值只增不減時則可能發生了內存泄漏
第三種種:
sar -R 1 120 #原理同樣內存相關值只增不減,也多是內存泄漏

SWAP空間:
swap-out:表示從系統寫到swap交換分區上去
swap-in:表示從swap讀數據到系統來
哪些頁面會被SWAP?
非活動頁
匿名頁(不多)
swap cache:將一個swap讀進來幾回每一次分配一個進程,有效避免資源競爭,尤爲是多個進程訪問同一個頁框時
從swap加載到內存中的,但沒有作任何修改的頁面
如何提升swap性能
一、儘量用小swaps,必要時能夠將匿名頁緩存進來
二、下降訪問次數
增長內存解決
有多快硬盤的話,每塊硬盤劃分一個交換分區,優先級設爲相同,按設備快慢分級
三、下降服務時間
使用SSD盤
swap放在硬盤最外道上
使用swap機率調整:
vm.swappiness:使用傾向百分比
映射到頁表當中的內存百分比+上vm.swappiness傾向百分比 >= 100 就開始使用swap
默認60,調高此值便會將匿名頁交換出去了,性能調優儘量調小此值

交換內存swap大小:
一、批處理系統科學運算的業務類型,內存4倍
二、數據庫服務器,>=1G
三、應用服務器,內存的一半
調整think time
調整vm.page_cluster

活動內存查看:vmstat -n 1 1
sar -r 1 1
內存變化速率:sar -R 1 1
Swap活動狀況:sar -W 1 1
All IO:sar -B 1 1

內存調優項:
hugepage:提升TLB性能,提高內存分配效率
IPC:通訊優化
pdflush
slab
swap
oom

調優手段:
硬件調優:符合業務處理需求的
IO密集仍是CPU密集
CPU計算量多大?
內存需求多大?


操做系統層調優:proc目錄和sys目錄針對內核調優
內核:整個硬件調度的最根本因素
進程管理:CPU
內存調優
IO調優,尤爲磁盤IO,其次文件系統,最後網絡子系統調優

應用層調優:軟件層面調優
關閉沒必要要的功能
調整響應的運行模式

調優思路:
一、性能指標,定位性能瓶頸
二、調優:
Black art
紅帽官方redhat6的調優監控工具
SystemTop:觀察每一個進程的系統調用和活動狀態細節工具
OProfile:評估系統性能的重要工具
Valgrind:圖標爲堂吉訶德,內存泄漏探測工具,程序完成後評估內存泄漏探測,以及緩存利用率評估工具
perf:系統性能評估工具,相對簡單的工具


虛擬化技術基礎原理詳解

I/O、Filesystem、Network調優
Disk:
IO Scheduler
CFQ:徹底公平隊列
deadline:最後期限調度
anticipatory:指望,適合順序讀寫場景
NOOP:無任何操做的
調整IO Scheduler:
/sys/block/<device>/queue/scheduler

Memory:
MMU:硬件芯片
TLB:內存中的緩存芯片,使用大內存頁優化
SWAP:
vm.swapiness=0-100 # 使用交換分區的傾向性,默認60
overcommit_memory:過量使用
overcommit_ratio:
swap+RAM*ratio
例如:swap:4G
RAM:8G
充分使用內存:
一、swap=ram的容量,swappiness=0;
二、overcommit_memory=2,overcommit_ratio=100,vm.swapiness=0

tcp_max_tw_buckets:只能調大
tw:鏈接個數
established --> tw

IPC:進程間通訊
message
msgmni:系統級別消息隊列個數上限,默認16
msgmax:進程間通訊時,單個消息的最大上限,單位字節
msgmnb:單個消息隊列的最大字節數,默認16384
shm
shmall:全局範圍內可以使用的最大共享內存頁面數,默認2097152
shmmax:單個共享內存段最大的上限值
shmmni:全系統範圍內最大容許多少個共享內存段,默認4096

查看命令:sar,dstat,vmstat,mpstat,iostat,top,free,iotop,uptime,cat /proc/meminfo,ss,netstat,lsof,perf,strace查看系統調用,評估命令的運行時長:time /bin/ls cpu總時長,用戶態時長,內核態時長

評估IO工做狀況:blktrace,blkparse,btt

文件系統壓力測試工具:dd,iozone,io-stress,fio

CPU 普通指令
特權指令(敏感指令)

X86虛擬化技術的挑戰:
一、特權級壓縮:
VMM自身必須運行在Ring 0級,同事米邊GuestOS控制通資源,GuestOS不得不下降自身的運行級別而運行於Ring 1或Ring3上(Ring2不使用),實際上只運行在Ring3上
二、特權級別名:
假設虛擬機的Ring0,實際運行在Ring3上
三、地址空間壓縮
VMM本身要用內存,而且以0頁面開始,因此虛擬機不多是從0開始內存頁分配
四、費特權敏感指令
VMM沒法正確捕獲有些敏感指令處理
五、靜默特權失敗
x86的某些特權指令在失敗時不返回錯誤,也沒法被VMM捕獲
六、中斷虛擬化
屏蔽終端和非屏蔽終端的管理應該由VMM進行,GuestOS每次特權訪問均可能發生錯誤

由以上難題引出了兩項技術:
CPU的硬件虛擬化
Intel:VT-x
AMD:AMD-v
特權Ring -1,多生成一個環,-1放置全部特權指令,0上是屬於GuestOS涉及的特權指令,虛擬機之間不會相互干擾

內存虛擬化:
GuestOS 從VA(Virtual address)轉換成PA(Physical address),最終還轉換成HA(Host address),地址轉換通過兩次
shadow MMU:影子MMU
Intel:EPT
擴展列表技術
AMD:NPT
嵌套頁表技術
PT爲列表

每一個虛擬機有本身的tagged內存分配時經過找對應虛擬機的tagged來查到TLB緩存命中率

Full-Virtualization:徹底虛擬化
CPU不支持硬件虛擬化技術,模擬特權指令:模擬
CPU支持硬件虛擬化技術,VMM運行在Ring -1,而GuestOS運行在Ring 0;HVM:Hardware-asistant vm 硬件輔助的虛擬化
Para-virtualization:半虛擬化PV,性能相對較好
cpu,io,memory
PV on HVM:去掉CPU的半虛擬化功能

虛擬化模型:
xen:半虛擬化,dom0虛擬機負責調度模擬硬件,提供給其餘虛擬機使用
kvm:Kernel-based virtual machine
基於內核的虛擬化 KVM:內核模塊,開啓此模塊,linux內核就編程了hypervisor了
virtio(IO設備的半虛擬化技術)

container:容器虛擬化
將用戶空間隔離,每一個用戶進程均可以有網卡、硬盤等資源
性能強勁,由於共享使用物理機的內核空間
隔離性差,由於內核崩潰全部用戶空間進程所有失效

OpenVZ、docker、LXC等等

intel:IOMMU、VT-X、EPT

網絡模型:

Xen虛擬化及DomU的實現
OS + VMM
bar-metal:vmm + guest
emulated:Qemu 模擬器,可實現跨平臺虛擬化

虛擬化種類:徹底虛擬化,半虛擬化,容器虛擬化
徹底虛擬化:full virtualization BT:將特權指令徹底反應給虛機,虛機擁有獨立內核,所以性能較半虛擬化對比稍差,但虛擬效果較高,遷移方便
半虛擬化:para virtualization
Guest OS的內核瞭解本身各自在VMM之上,沒法直接對硬件操做,經過VMM調度硬件資源,遷移不變
經過VMM的hypercall進行調用,無需BT動態轉換特權指令集
Emulator:
模擬器
OS-Level(Container):容器虛擬化
OpenVZ,UML,Guest沒有內核,公共內核,性能好,隔離較差,共享內核崩潰全部Guest所有崩潰
Library Virtualization:庫虛擬化
Wine,cywin
Application virtualization:應用虛擬化

Xen,KVM

Xen:英國劍橋大學研發的虛擬化解決方案

QEMU:模擬建立硬件的工具

驅動請求:
back在dom0上:負責與真實硬件交互
front在guest上:負責與dom0的back end請求硬件需求
半虛擬化主要提供硬件資源有兩類:
網絡設備以及硬盤設備
Domaim 0 Guest承載功能:
Device Drivers
Split Device Drivers
Xen Control Software
官網www.xen.org
下載XCP安裝就是domain 0
或者裝一個linux而後再裝Xen,配置grub.conf,
讓kernel運行/xen.gz,重啓後運行的就是VMM了
module /vmlinuz還有個module /initrd
XEN運行徹底虛擬化時須要硬件虛擬化支持:
將back和front的機制打破,替換爲qemu,從而每一個domU上模擬出本身的硬件驅動
PV on HVM,cpu可經過硬件虛擬化直接調度硬件,而網卡和磁盤還須要半虛擬化模式調用。模擬性能較差

rhel5.3:xen
rhel5.4:xen 和 kvm(64bits)
rhel6.0:kvm
只能運行在DomU,但不能運行在Dom0
linux:2.6.24+ pvops framework 半虛擬化框架
但依然只能運行在DomU
linux:2.6.37+ (3.0+)
能夠運行Dom0了,對驅動作了優化,在編譯時選擇其選項便可

編譯內核須要打開功能:
CONFIG_ACPI_PROCFS=y
CONFIG_XEN=y
CONFIG_XEN_MAX_DOMAIN_MEMORY=32
CONFIG_XEN_SAVE_RESTORE=y
CONFIG_XEN_DOM0=Y
CONFIG_XEN_PRIVILEGED_GUEST=Y
CONFIG_XEN_PCI=Y
CONFIG_PCI_XEN=Y
CONFIG_XEN_BLKDEV_FRONTEND=Y
CONFIG_XEN_NETDEV_FRONTEND=Y
CONFIG_XEN_KBDDEV_FRONTEND=Y
CONFIG_HVC_XEN=Y
CONFIG_XEN_FBDEV_FRONTEND=Y
CONFIG_XEN_BALLOON=Y

紅帽6安裝兩個軟件包組:
development tools和server platform development和 desktop platform development

grub.conf
kernel /xen.gz
module /vmlinuz
module /initrd

安裝Xen便可

管理工具:
xen4.0:xend/xml
xen4.1:xl,xend/xm
xen4.2:xl
qemu:qemu
libvirt
libvirtd/virsh
virt-manager:gui
virt-install
雲管理平臺IAAS:
Openstack
cloudstack
opennebular

KVM管理
virsh
qemu-kvm

安裝xen
yum -y install kernel-xen xen

grub配置:
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.spe.gz
hiddenmenu
title Red Hat Enterprise Linux Server (3.7.4-1.el6xen.x86_64)
root(hd0,0)
kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus==2 dom0_vcpus_pin
module /vmlinuz-3.7.4.el6xen.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarrcyrheb-sun16 crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet
module /initramfs-3.7.4-1.el6xen.x86_64.img
title Red Hat Enterprise Linux Server (2.6.32-279.el6.x86_64)
root(hd0,0)
kernel /vmliuz-2.6.32-279.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarrcyrheb-sun16
crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet
initrd /initramfs-2.6.32-279.el6.x86_64.img

重啓服務器,用新內核啓動,則啓動時能夠看到不少XEN的內核標識

重啓後使用uname -r 查看啓動使用的內核是不是新的內核 3.7.4-1.el6xen.x86_64

ls /proc/xen
cat capabilities
control_d
只要有此文件而且文件內部有control_d字樣,則說明內核啓動沒有問題
啓動xen
service xend start
啓動以後使用xen命令來管理
xm help 查看幫助
console #查看虛擬機控制檯
create #建立虛機
vncviewer #vnc控制檯
new
delete #刪除虛機
reboot #熱重啓虛機
suspend #掛起
reset #冷重啓

xm list #查看域

建立虛擬磁盤鏡像:
mkdir -pv /xen/vm1
dd if=/dev/zero of=/xen/vm1/test.img oflag=direct bs=1M seek=2048 count=1
ls -lh /xen/vm1 # 用ls看到是2.1GB
du -sh /xen/vm1/test.img # 而用du看到的確實1M
mkfs.ext4 /xen/vm1/test.img #格式化img文件
移植bash
mount -o loop /xen/vm1/test.img /mnt # 掛載到mnt
sh bincp.sh #以前移植命令的腳本
輸入你要移植的命令便可
init、bash、ls、cat等
chroot /mnt
切換到mnt下試着執行如下移植的命令是否正常
exit 退出
在mnt下建立系統所用的基本目錄
mkdir -pv proc sys dev etc/{init,rc.d} var/{log,run} tmp
cp /etc/init/rcS.conf /mnt/etc/init/rcS.conf
vim /mnt/etc/init/rcS.conf
多餘內容所有刪除,只保留如下內容
start on startup
stop on runlevel
task

console output
exec /etc/rc.d/rc.sysinit
保存退出
vim /mnt/etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcome to MiniLinux(www.magedu.com)"
exec /bin/bash
保存退出
chmod +x /mnt/etc/rc.d/rc.sysinit

命令建立虛擬機:
xm create ramdisk="initramfs-2.6.32-358.el6.x86_64.img" kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64" name="test" vcpus=1 memory=128M disk=['file:/xen/vm1/test.img,xvda,w'] root="/dev/xvda ro" extra="selinux=0 init=/sbin/init" # xvda是img文件映射到虛擬機裏的磁盤名稱,w爲讀寫權限。還要添加磁盤用,號隔開再'硬盤內容'便可
硬盤格式 disk=['phy:hda6,sda2,w'] phy映射設備類型:映射設備 映射到虛機的硬盤設備名 讀寫權限

配置文件建立
vim /etc/xen/test
ramdisk="initramfs-2.6.32-358.el6.x86_64.img"
kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64"
name="test"
vcpus=1
memory=128M
disk=['file:/xen/vm1/test.img,xvda,w']
root="/dev/xvda ro"
extra="selinux=0 init=/sbin/init"
保存退出
執行命令建立
umount /mnt # 卸載掉目錄後建立虛機
xm create test
建立成功
xm list
能看到
Domain-0
test
兩個域了
xm console test
提示不知道你的分區表
進入console以後想退出須要
ctrl+[ 退出

xm create -c test #表示建立後直接鏈接控制檯
建立停留在switching root切換不過去的時候
使用
xm destroy test #清除test虛機

直接登陸到建立虛機了

Xen基於iscsi共享實現實時遷移
DomU:
一、根文件系統;
二、kernel及ramdisk;
Dom0:外部
DomU:內部
xm:
create
destroy
shutdown
console
list
network-attach
network-detach
network-list
block-attach
block-detach
block-list
delete:刪除虛機
pause:暫停
unpause:取消暫停
save:虛擬機狀態保存到某個文件中,而且可從文件恢復,相似快照
restore:從保存文件中恢復
suspend:掛起虛機
resume:掛起中恢復
top:資源使用情況監控
info:看xen主機的info信息
log:日誌信息
pci-attach:投產pci設備到虛機,硬件需支持
scsi-attach:
scsi-detach:
vnet-list:列出虛擬網絡

批量部署虛擬機:
準備一個映像模板
OZ:輔助建立映像模板
腳本:
生成一個配置文件/etc/xen
下載一個磁盤映像

virt-manager GUI界面建立虛機等操做
虛擬機的配置文件:/etc/xen

使用BootLoader,pygrup示例:
vim /etc/xen/linux
#ramdisk="initramfs-2.6.32-358.el6.x86_64.img"
#kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64"
name="linux"
vcpus=1
memory=128M
disk=['file:/xen/vm1/dom2.img,xvda,w']
#root="/dev/xvda2 ro"
#extra="selinux=0 init=/sbin/init"
vif=[ 'bridge=br0' ]
on_crash="destroy"
on_reboot="restart"

使用Dom0中的kernel和ramdisk引導的示例:
vim /etc/xen/test
ramdisk="initramfs-2.6.32-358.el6.x86_64.img"
kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64"
name="test"
vcpus=1
memory=128M
disk=['file:/xen/vm1/test.img,xvda,w']
root="/dev/xvda ro"
extra="selinux=0 init=/sbin/init"

自定義安裝,並啓用vcn:
vim /etc/xen/test
#ramdisk="initramfs-2.6.32-358.el6.x86_64.img"
#kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64"
name="rhel6"
vcpus=2
memory=512M
disk=['file:/xen/vm3/rhel6.img,xvda,w']
bootloader="/usr/bin/pygrub"
#root="/dev/xvda ro"
#extra="selinux=0 init=/sbin/init"
vif=[ 'bridge=br0' ]
on_crash="destroy"
on_reboot="destroy"
vfb=[ 'vnc=1,vnclisten=0.0.0.0' ]

配置iscsi共享實時遷移
兩個主機節點安裝xen
yum install xen kernel-xen libvirt -y
安裝iscsi
fdisk /dev/sda
n
e
4
n
l
默認柱面開始
+50G
w
q
執行partprobe /dev/sda
kpartx -av /dev/sda
service udev-post reload
yum -y install scsi-target-utils

在xen節點修改grub.conf
grub配置:
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.spe.gz
hiddenmenu
title Red Hat Enterprise Linux Server (3.7.4-1.el6xen.x86_64)
root(hd0,0)
kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus==2 dom0_vcpus_pin
module /vmlinuz-3.7.4.el6xen.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarrcyrheb-sun16 crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet
module /initramfs-3.7.4-1.el6xen.x86_64.img
title Red Hat Enterprise Linux Server (2.6.32-279.el6.x86_64)
root(hd0,0)
kernel /vmliuz-2.6.32-279.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarrcyrheb-sun16
crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet
initrd /initramfs-2.6.32-279.el6.x86_64.img
保存退出
yum -y install iscsi-initiator-utils 安裝iscsi客戶端
重啓服務器,兩個節點都要作

在iscsi服務器端配置:
pvcreate /dev/sda5
vgcreate xenvg /dev/sda5
lvcreate -L 10G -n xenlv xenvg
lvs
vim /etc/tgt/targets.conf
添加
<target iqn.2019-08.com.magedu:xen.vm1>
backing-store /dev/xenvg/xenlv
initiator-address 172.16.0.0/16
</target>
保存退出
service tgtd start
chkconfig tgtd on
netstat -tunlp 查看是否有3260的監聽
到客戶端發現磁盤:
cat /proc/xen/capabilities
control_d # 有此字樣說明xen配置成功
uname -r # 也能夠查看
service iscsid start #啓動客戶端
iscsiadm -m discovery -t st -p 172.16.200.8 # 發現磁盤
iscsiadm -m node -T iqn.2019-08.com.magedu:xen.vm1 -p 172.16.200.8 -l
fdisk -l # 查看是否能認到共享磁盤
第二個節點同樣如此認盤
chkconfig iscsid on
建立DomU
fdisk /dev/sdb
p
n
1
默認起始
+500M
p
n
2
默認
+2G
n
p
3
默認
+512M
t
3
L
82
w
partprobe /dev/sdb
cat /proc/partitions
mkdir /mnt/{boot,sysroot} -pv
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
mkswap /dev/sdb3
mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot
bash bincp.sh
init
bash
ls
cat
ifconfig
ping
mkdir
shutdown
mount
vi
netstat
halt
reboot
umount
chmod
chown
rm
rmdir
insmod
lsmod
modinfo
sleep
q
加載命令
cd /mnt/sysroot
mkdir -pv etc/{init,rc.d} var/{log,run} sys proc dev tmp lib modules usr/{bin,sbin,lib,lib64}
modinfo xen-netfront
cp /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/xen-front.ko /mnt/sysroot/lib/modules
sync
cp /etc/init/rcS.conf /mnt/sysroot/etc/init/
vim /mnt/sysroot/etc/init/rcS.conf
多餘內容所有刪除,只保留如下內容
start on startup
stop on runlevel
task

console output
exec /etc/rc.d/rc.sysinit
保存退出
vim /mnt/etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcome to MiniLinux(www.magedu.com)"
insmod /lib/modules/xen-netfront.ko
sleep 2
ifconfig lo 127.0.0.1/8 up
ifconfig eth0 172.16.200.12/16 up
#mount -n -o remount,rw /
exec /bin/bash
保存退出
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
chroot /mnt/sysroot
exit
service xend start
vim /etc/xen/test
ramdisk="initramfs-2.6.32-358.el6.x86_64.img"
kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64"
name="test"
vcpus=1
memory=128M
disk=['phy:/dev/sdb,xvda,w']
root="/dev/xvda2 ro"
extra="selinux=0 init=/sbin/init"
vif=[ 'bridge=br0' ]
on_crash="destroy"
on_reboot="destroy"
保存退出
建立網絡接口
service libvirtd start
virsh iface-bridge eth0 br0
建立接口
兩個節點都建立
啓動虛擬機:
xm create -c test
xm destroy test
使用本身內核啓動的虛擬機:
grub-install --root-directory=/mnt /dev/sdb
vim /mnt/boot/grub/grub.conf
timeout=5
default=0
title MageEdu.con Linux
root (hd0,0)
kernel /vmlinuz ro root=/dev/xvda2 selinux=0 init/sbin/init
initrd /initramfs.img
保存退出
cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz
cp /boot/initramfs-2.6.32.358.el6.x86_64.img /mnt/boot/initramfs.img
建立虛擬機時用本身內核
vim /etc/xen/test
#ramdisk="initramfs-2.6.32-358.el6.x86_64.img" #註釋掉使用主機內核的項
#kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64" #註釋掉使用主機內核的項
name="test"
vcpus=1
memory=128M
disk=['phy:/dev/sdb,xvda,w']
#root="/dev/xvda2 ro" # 內核傳遞關閉
bootloader="/usr/bin/pygrub"
#extra="selinux=0 init=/sbin/init" #extra關閉
vif=[ 'bridge=br0' ]
on_crash="destroy"
on_reboot="destroy"
保存退出
xm create -c test #啓動本身內核的虛擬機
熱遷移test虛擬機
vim /etc/xend-config.sxp
(xend-relocation-server yes) # 取消註釋,並把no的項註釋掉
(xend-relocation-port 8002) # 取消註釋
(xend-address '0.0.0.0') # 取消註釋,容許遷移的地址
(xend-relocation-address '0.0.0.0') # 取消註釋,容許遷移出的地址
(xend-relocations-allow '') # 取消註釋,容許全部主機遷移
service xend restart
netstat -tunlp # 查看是否有8002端口
scp xend-config.sxp node2:/etc/xen/ # 拷貝配置文件到另外一個節點
另外一個節點重啓服務xend
virsh iface-bridge eth0 br0 #另外一個節點建立橋接網卡
brctl show # 查看橋接是否建立
遷移虛擬機:
xm migrate test 172.16.200.7 #表示將虛擬機test遷移至172.16.200.7主機
xm list
xm console test

追蹤服務打開的文件:
strace nginx
找到open的項

kvm虛擬化
KVM:rhel5.9或rhel6.4 都必須64位
grep -o -E 'svm|vmx' /proc/cpuinfo # svm是AMD,vmx是INTEL的,只要能找到說明支持硬件虛擬化
modprobe kvm
kvm_intel,kvm_amd # 裝載模塊,裝載各自支持的模塊後才能夠安裝kvm
qemu-kvm -cpu ? #能夠看到cpu支持的類型

安裝kvm須要4個軟件包組:
virtuization:主要:qemu-kvm 次要qemu-guest-agent,qemu-kvm-tools
virtualzation client:主要:python-vitist,virt-manager,virt-viewer 次要:virt-top
virtualzation platform:主要:libvirt,libvirt-client,virt-who,virt-what 次要:fence-virtd-libvirt,fence-virtd-multicast,fence-virtd-seral,libvirt-cim,libvirt-java,libvirt-qmf,libvirt-snmp,perl-sys-virt
virtualization tools:主要:libguestfs 次要:libguestfs-java,libguestfs-tools,virt-v2v

OZ工具:製做模板映像

KVM是linux的一個內核模塊,安裝其就會變成hypervision
安裝後造成三種模式:
kernel mode:linux內核模式
user mode:用戶模式
guest mode:來賓模式
來賓模式下又產生:用戶模式和內核模式
KVM整個管理接口經過:
/dev/kvm來實現,能夠理解爲API

virsh和qemu兩種管理工具

徹底虛擬化:
BT:二進制轉換,模擬特權指令。其餘指令還在原生CPU執行
硬件虛擬化HVM:徹底由硬件來完成指令處理
qemu:提供IO類的控制器能力
半虛擬化:
分爲兩段,一段爲虛擬化硬件提供服務,後半段在hypervision直接內核調度,所以性能較好

virtIO:能夠支持多種虛擬化半虛擬化,所以KVM也能夠作出半虛擬化模式

安裝KVM:
yum -y groupinstall "virtuization" "virtualzation client" "virtualzation platform"

使用qemu:
/usr/libexec/qemu-kvm --help
-cpu cpu ? # 查看支持的CPU類型
service libvirtd start
chkconfig libvirtd on
進程會自動建立網橋設備
virsh iface-bridge eth0 br0
virt-install命令,建立虛擬機命令
通常選項,指定虛擬機名稱,內存大小,vcpu個數及特性
-n NAME:指定虛機名稱
-r MEMORY:虛擬機內存大小
--vcpu=VCPUS[maxvcpus=MAX][sockets=#][cores=#][threads=#],vcpu數量設置
--cpu=CPU CPU模式及特性,如:coreduo等,可使用qemu-kvm -cpu ?來獲取CPU模式
安裝方法:
-c CDROM:光盤安裝介質
-l LOCATION:安裝源URL,支持FTP,HTTP及NFS等
--pxe:基於PXE完成安裝
--livecd:把光盤看成LiveCD
--os-type=DESTRO_TYPE:操做系統類型,如linux、windows等
--os-variant=DISTRO_VARIANT:某類型操做系統的變體;如:rhel五、fedora8等
-x EXTRA:根據--location指定的方式安裝GuestOS,用於傳遞內核的額外選項,例如指定kickstart文件的位置,--extra-args "ks=http://172.16.0.1/class.cfg"
--boot=BOOTOPTS:指定安裝過程完成後的配置選項,如指定引導設備次序、使用非安裝的kernel\initrd來引導系統啓動例如:--boot cdrom,hd,network,指引導次序
--boot kernel=KERNEL,initrd=INITRD,kernel_args="console=/dev/ttyS0":指系統啓動的內核和initrd文件
存儲配置:指定存儲類型,位置及屬性
--disk=DISKOPTS:指定存儲設備及其屬性,
格式爲:--disk /some/storage/path,opt1=val1,opt2=val2等;
device:設備類型,如:cdrom、hd、network指引導次序
bus:磁盤總結類型,其值能夠爲ide、scsi、usb、virtio或xen
perms:訪問權限,如rw,ro,sh,默認爲rw
size:新建磁盤映像大小,單位爲GB
cache:緩存模型,其值有none,writethrouth(緩存讀)及writeback(緩存讀寫)
format:磁盤映像格式,如:raw、qcow二、vmdk等
sparse:磁盤映像使用稀疏格式即精簡模式,即不當即打敗指定大小的空間
--nodisks:不使用本地磁盤,在LiveCD模式中經常使用
網絡配置:指定網絡接口的網絡類型及接口屬性如MAC地址、驅動模式等
-w NETWORK,:將虛擬機連入宿主機 網絡中,其中network能夠爲:
bridge=BRIDGE:鏈接至名爲"BRIDGE"的橋設備
network=NAME:鏈接至名爲"NAME"的網絡設備
其餘經常使用選項還有:
model:GuestOS中看到網絡設備型號:如:e1000、rt18139或virtio
mac:固定的MAC地址,省略此項時使用隨機地址,但不管何種方式,對於KVM來講其前三段必須爲52:54:00
--nonetworks:虛擬機不使用網絡
圖形配置:定義虛擬機顯示功能相關的配置,如:VNC相關配置;

例如建立一個虛擬機:
virt-install \
--connect qemu:///system \ # 鏈接方式
--virt-type kvm \ # 虛機類型KVM
--name rhel5 \ # 虛機名稱rhel5
--ram 512 \ # 虛機內存512M
--disk path=/var/lib/libvirt/images/rhel5.img,size=80,sparse \ # 磁盤文件指定大小並使用精簡模式
--graphics vnc \ # 虛擬機console打開模式
--cdrom /tmp/boot.iso \ # 指定引導文件
--os-variant rhel5 # 操做系統變體
vitsh uri:查看當前主機上的hypervisor的連接路徑

ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu # 直接可使用qemu命令
刪除建立虛機:
rm -rf /etc/libvirt/qemu/rhel5.xml # 刪除配置文件
virsh undefine rhel5 # 刪除虛機
virsh define:建立一個虛擬機,根據事先定義的XML格式配置文件,建立後會自動啓動
virsh create:建立完成後自動啓動

基於qemu跑一個小型linux:
mkdir -pv /kvm/vm1
qemu-img create -f raw /kvm/vm1/rhel6.img 8G
losetup -f
losetup /dev/loop0 /kvm/vm1/rhel6.img
kpartx -av /dev/loop0
fdisk /dev/loop0
n
p
1
默認
+500M
n
p
2
默認
+2G
w
partprobe /dev/loop0
kpartx -av /dev/loop0
ls /dev/mapper
mkfs.ext4 /dev/mapper/loop0p1
mkfs.ext4 /dev/mapper/loop0p2
mkdir /mnt/{boot,sysroot}
mount /dev/mapper/loop0p2 /mnt/sysroot
bash bincp.sh
bash
init
ls
cat
cd /mnt/sysroot
mkdir -pv etc/{init,rc.d} var/{log,run} sys proc dev tmp lib modules usr/{bin,sbin,lib,lib64}
cp /etc/init/rcS.conf etc/init/
vim etc/init/rcS.conf
多餘內容所有刪除,只保留如下內容
start on startup
stop on runlevel
task

console output
exec /etc/rc.d/rc.sysinit
保存退出
vim /mnt/etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcome to MiniLinux(www.magedu.com)"
insmod /lib/modules/xen-netfront.ko
sleep 2
ifconfig lo 127.0.0.1/8 up
ifconfig eth0 172.16.200.12/16 up
#mount -n -o remount,rw /
exec /bin/bash
保存退出
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
建立虛擬機:
virt-install --name rhel6 --vcpus 2 --ram 128 --disk /kvm/vm1/rhel6.img --boot kernel=/boot/vmlinuz-2.6.32-358.x86_64,initrd=/boot/initramfs-2.6.32-358.x86_64.img,kernel_args="console=/dev/ttyS0 selinux=0 ro root=/dev/hda2 init=/sbin/init" --import --graphics none

OpenStack:大部分實例都是在KVM上經過測試的
keystone:用戶統一認證接口
horizon:圖形管理界面
nova-compute:建立或終止一個虛擬機實例
--libvirt_type:hypervisor類型,默認是kvm
--libvirt_uri:鏈接hypervisor的路徑
--sql_connection:數據庫鏈接設置,
--rabbit_host:rabbitMQ隊列,從隊列中取得運行實例
--glance_host:檢索映像模板文件
--glance_api_server:
glance:映像服務,支持多種存儲方式存放映像文件,支持多種映像文件格式
swift:對象存儲服務器,分佈式文件系統
swift proxy:元數據節點
network configuration:
一、分配MAC地址
二、分配IP地址
三、IP關聯信息保存在數據庫中
四、爲主機設置IP地址,dhcp,gateway等
五、更新network信息到數據庫
nove-network:提供網絡服務
一、分配地址
二、IP地址使用和回收管理
三、由admin用戶管理
nove-volume:提供虛機一個卷或拆除一個卷
一、通常均由iscsi實現
二、一個卷只能給一個實例
三、用來保存實例上的長久數據信息

部署openstack:
控制節點:keystone、nove-DB、glance、scheduler、nova-volume、queue、nove-network、nove-api
計算節點:nove-compute、nove-network、hypervisor
存儲節點:swift、iscsi target

安裝配置openstack
安裝keystone
安裝mysql
安裝glance服務images
安裝nova節點
scheduler、nova-volume、queue、nove-network、nove-api
安裝swift
安裝horizon

雲服務器很是消耗內存

控制節點:
keystone,glance
glance:filesystem,/var/lib/glance/images/
image
Nova:
nova-compute
nova-network
nova-volume
nova-scheduler

nova控制節點配置:
啓用網卡混雜模式
配置橋接接口,關閉network manager服務
使用libvirt配置橋接網絡
virsh iface-bridge eth0 br100
安裝緩存和消息隊列服務,輕量級消息隊列服務qpid-cpp-server,紅帽6自帶
yum install memcached qpid-cpp-server
初始化數據庫,service爲nova,密碼爲nova
配置nova用戶權限
編輯nova.conf配置文件
nove-manage db sync 同步數據庫
安裝隊列服務
yum -y install qpid-cpp-server
vim /etc/qpidd.conf
auth=no # 隊列服務不須要認證
service qpidd restart
建立nova鎖文件目錄
mkdir /var/lock/nova
chown -R nova.nova /var/lock/nova
啓動nova服務
for svc in api compute network cert console scheduler;do service openstack-nova-$svc start; chkconfig openstack-nova-$svc on;done
grep -i error /var/log/nova/*.log # 查看是否有報錯信息
nova-manage -help # 查看管理命令幫助
service --list:全部啓動的服務列表
建立網絡:
nova-manage network create
--label=private --multi_host=T --fixed_range_v4=172.16.200.0/24 --bridge_interface=eth0 --bridge=br100 --num_networks=1 --network_size=256
建立keystone nove服務
keystone service-create --name=nova --type=cpmpute --description="Nove Compute Service"
建立訪問一個路徑
配置好以後可使用nova命令
nova image-list #列出映像列表
建立虛機必須有安全組(security group)
nova secfroup-list #默認只有一個default
nova secfroup-add-rule default tcp 22 22 0.0.0.0/0 #添加打開22端口規則到安全組
nove secfroup-add-rule default icmp -1 -1 0.0.0.0/0 # 開啓全部報發文類型ping
建立ssh公鑰控制實例安全訪問機制
ssh-keygen -t ras -P ''
nova keypair-add --pub_key .ssh/id_rsa.pub testkey # 最後testkey是祕鑰名稱,能夠任意起名
nova keypair-list #查看key列表
ssh-keygen -l -f ./ssh/id_rsa.put #查看指紋信息與keypair中指紋信息一致便可
啓動一個實例:
啓動實例前要指定一個flavor(風格),就是模板大小類型
nove flavor-list #查看內置風格模型
tiny 1c512M
small 1c2048M
medium 2c4096M
large 4c8192M
xlarge 8c16394M
nove flavor-create flavorname id ram disk vcpus
例:nove flavor-create testflavor 6 128 2 2
啓動實例:
nove image-list #先查看有哪像映像
啓動實例命令:
nova boot --flavor 6 --image imageID --key_name testkey --security_group default vm1
查看實例狀態:
nova list
virsh list
登陸查看實例
nova console-log vm1
vrish console instance-00000001
關閉實例:
nova stop vm1
刪除實例:
nova delete vm1
計算節點:
安裝nova相關功能
配置網卡支持混雜模式
安裝libvirt
yum install -y libvirt
service libvirtd start
chkconfig libvirtd on
安裝qemu:
yum install -y qemu-kvm
yum install -y libguestfs
ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu
service libvirtd/virsh restart
chkconfig --list NetworkManager
建立橋接接口
virsh iface-bridge eth0 br100
安裝nova:
yum install -y openstack-utils openstack-nova
初始化數據庫:
openstack-db --init --service nova --password nova
編輯nova.conf文件:
將控制節點配置文件複製進來,更改幾個地方
my_ip=計算節點ip
novncproxy改成計算節點ip
vncerver_proxyclient改成計算節點ip
vncserver_listen改成計算節點ip
保存退出
建立鎖文件目錄
mkdir /var/lock/nova
chown -R nova.nova /var/lock/nova
啓動計算節點:
service openstack-nova-compute start
service openstack-nova-network start
service libvirtd start
token認證拷貝到計算節點:
scp 控制節點的~/.keystonerc_admin 172.16.200.7:/root/
計算節點執行source ~/.keystonerc_admin
查看實例:
nova list
nova-manage service list 列出服務
啓動實例:
nova start vm1
nova list #查看vm1的狀態爲ACTIVE
實例遷移到新建的compute節點
nova live-migration vm1 172.16.200.7

openstack 對象存儲服務:
swift:早期屬於Rackspace公司,是分佈式存儲系統相似HDFS
proxy node:代理節點或名稱節點,接受外部請求,轉發給後端存儲節點
auth node:認證節點,認證請求服務是否合法,可以使用keystone代替
storage node:存儲節點,實際提供存儲服務的節點
hdfs:多副本,解決數據冗餘
3個副本
存儲節點至少有3個以上
代理節點要作高可用

swfit數據冗餘原理:
靠一個環進行掃描,將添加的設備所有放置在環中的節點上,須要存儲數據時再環中查找可用節點進行存儲

須要存儲的對象很是多,每一個類型一個環:
一、account帳號
用來驗證帳號是否有權限使用存儲功能,處理get,head,delete或replication請求的守護進程
二、container節點
處理針對container的get,head,delete或replication請求的服務進程
三、object對象
處理針對object的get,head,delete或replication請求的服務進程

Ring用來肯定集羣主流在集羣中的位置
Ring中每一個partition在集羣中默認都有3個replica
Ring使用zone的概念來保證數據的隔離:每一個節點都是一個zone,保證3個副本放置在不一樣zone

安裝swift存儲節點:
將keystone認證公鑰複製到swift節點上
scp ~/.keystonerc_admin 172.16.200.8:/root/
安裝組件:
yum install -y openstack-utils openstack-swift-account openstack-swift-container openstack-swift-object xfsprogs python-keystone
爲每一個用於存儲的卷配置XFS文件系統
fdisk建立分區,將三塊磁盤都作劃分
kpartx -av /dev/sdb
kpartx -av /dev/sdc
kpartx -av /dev/sdd
格式化爲xfs文件系統:
mkfs.xfs -i size=1024 /dev/sdb1 # -i指定其塊大小,優化的存儲方式
掛載點必須是/srv/node/目錄下
寫入fstab
賦予權限給每一個/srv/node/目錄下文件,swift.swift
啓動swift的3個服務

安裝proxy代理節點:
安裝代理節點組件
yum install -y openstack-utils openstack-swift-proxy memcached python-keystone python-keystoneclient
啓動memcached:
配置swift-proxy
vim /etc/swift/proxy-server.conf
主要更改認證信息部分
進行keystone配置:
source .keystonerc_admin
進入keyston配置界面
建立swift帳號
keystone user-create --name swift --tenant-id id號 --pass swift --email swift@magedu.com
建立所需的ring,18表示環大小,2的18次方,3表示3副本,1表示最長多久移動一次partition
cd /etc/swift # 建立環必須在此目錄下,不然則會驗證不經過
swift-ring-builder account.builder create 18 3 1
swift-ring-builder container.builder create 18 3 1
swift-ring-builder object.builder create 18 3 1
將存儲設備關聯至ring:
每一個ring都要添加三個設備
查看關聯
swift-ring-builder account.builder
使用命令平衡三個環
swift-ring-builder account.builder rebalance
swift-ring-builder container.builder rebalance
swift-ring-builder object.builder rebalance
更改屬組屬主
chown -R swift.swift /etc/swift/
爲swift設定一個hash key
啓動代理服務:
service openstack-swift-proxy start
chkconfig openstack-swift-proxy on
在keystone中註冊swift
爲註冊的服務提供訪問路徑
驗證swift是否安裝完成
service openstack-swift-proxy start
chkconfig openstack-swift-proxy on
swift -V 2.0 -A http://172.16.200.6:5000/v2.0 -U service:swift -K swift stat
配置glance服務:
vim glance-api.conf
default_store = swift #file改爲swift
swift_store_auth_address = 127.0.0.1改成172.16.200.6
swift_store_user = service:swift
swift_store_key = swift
service glance-api restart
service glance-registry restart
建立鏡像:
glance image-create --name=cirros-0.3.0-i386 --disk-format=qcow2 --container-format=bare < cirros-0.3.0-i386-disk.img
配置horizon圖形服務:
必須安裝在控制節點上
安裝組件:
yum install -y memcached python-memcached mod_wsgi openstack-dashboard
添加角色:
keystone role-create -name Member
cd /etc/openstack-dashboard/
vim local_settings
openstack_host = 「172.16.200.6」
更改memcache相關內容,改成memcached服務啓動內容
openssl rand -hex 10 # 生成密碼填寫到配置文件的下面對應位置
secret_key = "生成密碼"
保存退出
啓動服務
service httpd start
chkconfig httpd on
service memcached start
chkconfig memcached on
訪問dashboard
172.16.200.6/dashboard
用戶名:admin
密碼:admin
登陸openstack圖形界面
啓用控制檯訪問:
yum install -y openstack-nova-novncproxy
監聽端口爲6080
計算節點:
vim /etc/nova/nova.conf
novncproxy_base_url=https://node2.magedu.com:6080/vnc_auto.html
novnc_proxyhost 0.0.0.0
novncproxy_port = 6080
vnc_enabled = true
vncserver_listen=172.16.200.7
vncserver_proxyclient_address=172.16.200.7
啓動服務:
service openstack-nova-novncproxy start
chkconfig openstack-nova-novncproxy on
service openstack-nova-consoleauth start
chkconfig openstack-nova-consoleauth on

openstack:雲棧
Keystone:編錄,認證(token,identity)
Nova:(compute,scheduler,network,volume,console,consoleauth)
Glance:(Image as a service)
Swift:(Object Store),分佈式文件系統
Horizon:dashboard
Cinder:(nova-volume)
Quantum:(nova-network) Open vSwitch

消息隊列:異步協做
請求服務:生成者
提供服務:消費者
AMQP:RabbitMQ、ZeroMQ、Qpid
高級消息隊列協議:Advanced Message Queue Protocol

IAAS解決方案:
CloudStack:Apache:
OpenNebular:
Eucaptulys:

Hadoop

RDBMS:表
字段、數據類型、約束
結構化數據(structured data)

非結構化數據(unstructured data)

半結構化數據(semi-structured data)
xml
json

Google:
pagerank:頁面排序算法

化整爲零:
500G數據切割爲500份,每一個節點處理一份數據:500*1G
並行處理:
將一個大問題切割成多個小問題,處理後的結果再合併起來再作處理得出最終結果。
OLAP:在線分析處理,數據挖掘

機器學習:Google:deep learning 深度學習
經過收集人類思惟數據分析來完成針對人類思惟導圖的學習過程

並行處理:
高效存儲:原始數據、中間數據
高效處理:
keyword:出現的有效次數
A:出現10次
C:出現67次
key-value pair 鍵值對

MapReduce:
函數式編程API
運行框架

map:抽取鍵值對
reduce:將抽取鍵值對合併爲處理結果的機制

實時:即時結果
批處理:在後臺運行一段沒法預估的時長

2003年Google發佈論文:The Google File System
GFS:分佈式文件系統,將數據分佈在不一樣數據存儲節點上
2004年Google發佈論文:MapReduce:Simplified Data Processing on Large Clusters

數據收集,分佈式文件系統解決海量數據存儲

apache:Nutch-->lucene 項目,搜索
java語言用開源方式,基於google的兩份論文的原理實現了Hadoop

Hadoop
DFS-->HDFS
MapReduce
一、編程模型
二、運行框架
三、MapReduce編程思想的具體實現

DFS + MapReduce = Hadoop

MapReduce控制節點JobTracker

HDFS:
namenode:NN節點,調度存儲節點
Datanode:DN節點,存儲數據節點

MapReduce:
JobTracker:JT節點,調度任務節點
TaskTracker:TT節點,負責具體運行任務節點

Map函數定義數據切割標準
Slot:插槽,運行任務

HDFS:
一、HDFS是設計用來存儲大文件:對海量肖文傑的存儲不太適用;
二、用戶空間的文件系統;
三、HDFS不支持修改;新版本支持追加;
四、不支持掛載,並經過系統調用進行訪問;只能使用專用訪問接口,如專用命令行工具、api

hadoop工具集生態圈:
非結構化數據:
scribe(facebook),flume(apache),chubwa等,進行數據導入至hdfs中
結構化數據:
hiho
sqoop(雙向數據導入導出),基於ODBC支持多種數據庫

AVRO:
實現將hadoop任務可以結構化管理的組件,協調衆多hadoop任務在一個集羣執行的組件
workflow工做流管理組件:
oozie
cascading:如map任務如何與reduce協調
HBASE:能夠也能夠不工做在hdfs上,nosql,稀疏格式的存儲方案
hdfs客戶端,由hbase決定如何與hdfs進行交互存儲,相似表形式完成增刪改查工做
每一個鍵值可存儲多個版本的修改,可自行調整保存版本的個數。
只支持CRUD:建立,替換,更新,刪除 沒法保障事務類操做
hive工具Facebook開發的:
向hive發起相似sql的命令,轉換爲map或reduce過程進行分析結果輸出

因爲組件過多,cloudera公司開發了組件CDH,解決了衆多兼容性等問題的合集產品
mahout:機器學習的解決方案
深度挖掘和學習數據中的分析結果
eclipse:
監控、管理接口
R語言和Rhadoop語言:
用於統計數據編程的語言


MapReduce和HDFS是核心
Hive:SQL,存儲;
HBase:完成修改工做,存儲
Pig:把MapReduce作成數據流,簡單編程構建MapReduce過程
ZooKeeper:協調器,集羣中監控各集羣節點是否能夠知足集羣須要的。

存儲過程:RDBMS --> Sqoop --> HBase --> HDFS

學習過程:
一、安裝配置,HDFS集羣
二、安裝配置MapReduce
三、HBase
四、Hive
五、sqoop
六、flume/scribe/chukwa 日誌收集系統

HDFS:
本地模式
僞分佈式(使用1個節點)
徹底分佈式(4個以上節點)

實際使用中至少20個節點以上才能完成一個小規模的大數據分析架構

RDB
行式數據庫:按行排列數據,不利於數據分析
Big Table,HBase(data source,data sink):非關係型數據庫
列式數據庫:按列排列數據,每列均爲一個鍵值對

HIVE組件:語句翻譯器
相似SQL語句同樣去寫MapReduce做業,無需用java編程方式去寫數據處理做業
HBase組件:實時數據處理
支持結構性數據庫類型

pig組件yahoo公司:
相似編寫shell腳本同樣去編寫MapReduce做業,由PIG組件進行轉譯。相似HIVE

crunch:apache項目
開發MapReduce做業的java庫,另外一種接口,簡化MapReduce做業的開發難度

Avro:hadoop官方組件
數據序列化系統,模擬google protocol buffer系統,Facebook相似框架Thrift

sqoop:
完成hdfs與關係型數據庫進行數據轉換的工具

cassandra:
相似hive,no sql數據庫;

mahout:分佈式的機器學習以及數據挖掘庫的解決方案

ZooKeeper:協調器,集羣中監控各集羣節點是否能夠知足集羣須要的。
協調多個節點間數據傳輸

RHIPE和RHadoop:支持用R來編寫MapReduce應用的rmr、用於R語言訪問HDFS的rhdfs本身用於訪問HBASE的rhbase。

Dremel:google大數據查詢解決方案,完成數據實時查詢。閉源產品,思想公開。

Impala:由cloudra公司提供的Dremel的開源版本
運行在HDFS\HBASE\HIVE中

Hadoop是一套java程序,對接編程語言也是java語言

0.20.2版本中默認啓動5個進程,每一個進程默認預留1G內存
JobTracker:JT節點,調度任務節點
TaskTracker:TT節點,負責具體運行任務節點
NameNode:NN節點,名稱節點
SecondaryNameNode:SNN節點,完成數據合併
Datanode:DN節點,存儲數據節點

Hadoop安裝:
下載整合的組件須要去cloudra的CDH鏈接中查找CDH字樣選擇down

hadoop-0.20.2的解壓目錄下:
flume-0.9.4-cdh5u5.tar.gz
flume-ng-1.2.0-cdh3u5.tar.gz
hadoop-0.20.2-cdh3u5.tar.gz
hbase-0.90-6-cdh3u5.tar.gz
hive-0.7.1-cdh3u5.tar.gz
pig-0.8.1-cdh3u5.tar.gz
sqoop-1.3.0-cdh3u5.tar.gz
zookeeper-3.3.5-cdh3u5.tar.gz

還須要jdk-7u5-linux-i586.rpm
安裝JDK
rpm -ivh jdk-7u5-linux-i586.rpm
配置java環境
下載java.sh和hadoop.sh腳本放置/etc/profile.d/

vim /etc/profile.d/java.sh
內容:
JAVA_HOME=/usr/java/latest
PATH=$JAVA_HOME/bin:$PATH
exprot JAVA_HOME PATH

vim /etc/profile.d/hadoop.sh
內容:
HADOOP_HOME=/usr/local/hadoop
PATH=$HADOOP_HOME/bin:$PATH
exprot HADOOP_HOME PATH

解壓縮hadoop源碼包:
tar xf hadoop-0.20.2-cdh3u5.tar.gz -C /usr/local/
cd /usr/local/
ln -sv hadoop-0.20.2-cdh3u5 hadoop
從新登陸一次,環境變量生效
使用java -version和hadoop version查看是否生效
cd /usr/local/hadoop
查看目錄
bin 執行目錄
conf 配置目錄,關鍵配置文件core-site.xml、mapred-site.xml和hdfs-site.xml。hadoo-env.sh若是在全局爲配置hadoop環境變量,就須要在此文件聲明,單獨給hadoop指明本身的環境變量
example-confs 樣例配置文件目錄
sbin
lib 庫
建立用戶:
useradd hduser
chown -R hduser.hduser /usr/local/hadoop/
vim /etc/hosts
保證有127.0.0.1 localhosts的解析
su - hduser
cd /usr/local/hadoop

hadoop三種模式:
本地模式:無需集羣文件系統,調試模式
僞分佈式模式:運行在一個節點,模擬運行
徹底分佈式模式:

vim core-site.xml
在configuration中定義配置內容
<configuration>
<property> #定義hadoop臨時目錄,名稱空間鏡像和編輯日誌放置位置,不指定默認tmp目錄
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmep</value>
</property>

<property> #定義默認名稱節點路徑uri,默認監聽8020端口
<name>fs.default.name</name>
<value>hdfs://localhost:8020</value>
</property>
</configuration>
保存退出
mkdir /hadoop/temp -pv
chown -R hduser.hduser /hadoop/temp

vim mapred-site.xml

<configuration>
<property> #定義hadoop mapred默認的jobtracker位置
<name>mapred.job.tracker</name>
<value>localhost:8021</value>
</property>
</configuration>
保存退出

vim hdfs-site.xml
<configuration>
<property> #dfs副本個數,默認爲3,這次爲1
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
保存退出

hadoop-daemon.sh腳本針對新加DataNode節點啓用制定
hadoop-daemon.sh datanode 直接激活新增數據節點

生成祕鑰,ssh互信
ssh-keygen -t rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub hduser@localhost

啓動進程
start-all.sh 直接執行便可
使用jps命令查看當前啓動進程
stop-all.sh中止

須要格式化HDFS才能夠完成啓動
hadoop namenode -format
再啓動,就出現了5個進程
start-all.sh

向HDFS保存文件
hadoop fs命令
-put 上傳
-get 下載
-mkdir 建立目錄
-rm 刪除文件
對hdfs操做始終使用hadoop fs -ls查看
hadoop fs -put test.txt test/ # 把本地test.txt文件上傳到hdfs的test目錄

hadoop job -list all #查看hadoop當前做業
每一個做業須要寫成java程序來進行調用,必需要有編寫能力後才能啓動做業

但hadoop有一些本身的做業樣例提供使用
cd /usr/local/hadoop/hadoop-example-0.20.2-cdh3u5.jar
這些樣例例最著名的就是wordcount單詞統計
在讀取的任意文件中,統計每一個單詞出現的次數

在hdfs上傳幾個文本文件,寫一些內容
試着運行樣例程序:
hadoop jar /usr/local/hadoop-example-0.20.2-cdh3u5.jar #會列出此樣例的介紹
hadoop jar /usr/local/hadoop-example-0.20.2-cdh3u5.jar wordcount #介紹wordcount
分析做業:要寫入數據輸入和輸出的位置
hadoop jar /usr/local/hadoop-example-0.20.2-cdh3u5.jar wordcount test wordcount-out
執行完成後,查看wordcount-out文件

hadoop job -list all 查看此前執行的做業
hadoop fs -ls wordcount-out 查看做業輸出結果文件
hadoop fs -cat wordcount-out/part-r-00000 查看輸出結果

hadoop啓動後netstat -tnlp能夠看到一堆java啓動的端口

兩個服務器進程:
一個用於hadoop各進程間進行通訊的RPC服務器
另外一個提供便於管理員查看集羣各相關頁面的HTTPD服務器

兩個進程監聽在多個不一樣監聽端口中
RPC服務器:端口:8020、50020、802一、50010
HTTPD服務器,端口:jobtracker:50030、tasktracker:50060、namenode:50070、datanode 5007五、SecondaryNameNode 50090、

hadoop dfsadmin 管理命令
-report:報告dfs狀態
-safenode enter | leave | get | wait
-saveNamespace
-refreshNodes

hadoop fsck 修復檢測文件系統命令:
-openforwrite:檢查根文件系統狀態
-files | -blocks | -locations | racks:顯示每一個文件的狀態信息,再加blocks顯示詳細的塊信息,加locations顯示block是哪一個設備節點上,再加racks顯示再哪一個機架上

簡單的實現分佈式Hadoop集羣
一、主節點:名稱節點+Jobtracker SNN節點 secondrynode
二、數據節點:DataNode Tasktracker

三臺主機分別安裝hadoop,在特定主機角色安裝特定任務便可,時間同步
將配置好的*-site.xml文件所有複製到其餘節點,SNN和Slave節點的hadoop目錄要給hduser用戶
完成後進行格式化:
hadoop namenode -format
啓動hadoop:
在bin目錄下執行start-all.sh
使用jps命令查看啓動進程
su - hadoop再執行jps

hadoop fs -put /etc/rc.f/rc.sysinit
hadoop fs -mkdir wc-in
hadoop fs -put /etc/rc.f/rc.sysinit wc-in
hadoop fs -put /etc/rc.f/init.d/functions wc-in
hadoop fs -ls wc-in/
hadoop jar /usr/local/hadoop/hadoop-example-0.20.2-cdh3u5.jar wordcount wc-in wc-out

啓用HDFS回收站
core-site.xml配置文件
<property> #hdfs回收站
<name>fs.trash.interval</name>
<value>10080</value> #保留時長以分鐘計時,0表示禁用回收站,保留1天后正式刪除數據
</property>

hadoop5個進程,每一個進程默認1G的運行內存預留8顆CPU要設定7個map7個reduce,留1個給tasktracker留1個給datanodehadoop的log日誌滾動1天滾動一次,但永久保留,須要手動歸檔保留並按期清除,不然會致使空間緊張

相關文章
相關標籤/搜索