欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Linux学习笔记-高级

Linux学习笔记-高级

集群基础概念
负载过高超出单台服务器资源:
Scale On:向上扩展,增加单台服务器配置,纵向扩展
Scale Out:向外扩展,增加服务器,横向扩展

Cluster:集群
Load Balancing:LB,负载均衡集群,增加并发处理能力,
Round Robin:轮询
WRR:加权轮询
HA:High Avaliability,高可用集群,增加服务可用性,在线时间/(在线时间+故障处理时间)=可用性
heartbeat
health check:健康检查,连续检查3次依旧不在线,踢出集群,健康恢复再添加回来
HP(HPC):High Perfomance Compute,高性能集群
并行处理集群
分布式文件系统
将大任务切割为小任务,分别进行处理的机制

页面程序在节点间同步机制:
rsync:文件同步工具
inotify:变更通知功能

共享存储:与NFS区别,NFS文件级,存储设备为块级别,无需额外处理,性能提高许多
DAS:Direct Attached Storage,直连存储
NAS:Network Attached Storage,网络存储
分布式存储:解决单节点存储处理能力
分布式文件系统

split-brain:脑裂,为避免集群分裂,最好HA集群为3个节点以上,奇数个节点
STONITH:爆头,Shoot The Other Node In The Head,出现主端过忙但未完全down机,还有写入任务,但从已接管服务,为避免双端写入导致脑裂,直接将主电源断掉,从完全接管
fencing:隔离
节点隔离级别:STONITH
资源隔离级别:硬件需可接受远程管理指令

LVS类型详解

负载均衡设备:
Hardware:
F5:BIG IP
Citrix:Netscaler
A10:
Software:
四层:工作性能好,但没有对应用级特性的支持
LVS
七层:反向代理,针对协议特性开发,可操作能力更强,但性能略弱
nginx
http,smtp,pop3,imap
haproxy
http,tcp应用(mysql,smtp)

LVS:Linux Virtual Server,工作在内核中,LVS不可和IPTABLES同时使用
director:调度服务器
realserver:后端承载实际应用的服务器,被调度服务器

iptables/netfilter
LVS:
ipvsadm:用户空间管理集群服务的命令行工具
ipvs:内核空间中调度转发

调度方法: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服务器,因此性能略弱
遵循基本条件:
1、所有集群节点必须与LVS处于同一网络,所有Real Server的网关必须指向DIP;
2、RIP地址通常为私有地址,仅用于各集群节点间的通信;
3、Director位于client和real server之间,并负责处理进出的所有通信;
4、real server必须将网关指向DIP
5、支持端口映射,内外端口可以不同;
6、real server可以使用任意操作系统;
7、较大规模应用场景中,director易成为系统瓶颈;
DR:Direct routing(LVS-DR):直接路由
性能较好,LVS处理入站,出站由realserver直接返回客户端
1、集群节点与director必须再统一个物理网络中;
2、RIP可以不用私有IP,可用公有地址实现便捷的远程管理;
3、Director仅处理入站请求,响应报文则由real server直接发往客户端
4、集群节点不能将网关指向DIP;
5、Director不支持端口映射,因为返回由real server负责,无法完成端口转换;
6、大多数操作系统都能用在real server;
7、DR能够比NAT处理更多的转换请求;
TUN:IP tunneling(LVS-TUN):隧道
类似DR,由realserver直接返回客户端,但转发过程中需要重新封装IP包,适用于跨机房负载均衡模式;两个IP报文封装,进行双封装来进行转发
1、集群节点,无需在同一网络,可以跨越互联网;
2、RIP必须是公网地址;
3、Director仅处理入站请求,响应报文则由real server直接发往客户端;
4、realserver网关不能指向DIP;
5、只有支持隧道协议的OS才能用于real server;
6、不支持端口映射;

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响应接可以使用以下几种方式:
1、绑定静态的解析路由,VIP:MAC(DVIP)
2、基于arptables
3、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

一、print
print的使用格式:
print item1,item2,...
要点:
1、各项目之间使用逗号隔开,而输出时则以空白字符分隔;
2、输出的item可以为字符串或数值、当前记录的字段(如:$1)、变量或awk的表达式,数值会先转换为字符串,而后再输出;
3、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="#"输出分隔符,显示结果时的分隔符

二、awk变量
1、awk内置变量之记录变量:
FS:field separator,默认是空白字符,读取文本时,所使用的字段分隔符;
RS:Record separator,默认是换行符,输入文本信息所使用的换行符;
OFS:Output Filed Separator,输出字段分隔符;
ORS:Output Row Separator,输出行分隔符;

2、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"]}'

3、用户自定义变量 gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头。gawk变量名称区分字符大小写。

在脚本中赋值变量
在gawk中给变量赋值使用赋值语句进行
例如:awk 'BEGIN{var="variable testing";print var}'

在命令行中使用赋值变量
gawk命令也可以在“脚本”外围变量赋值,并在脚本中进行引用。
例如:awk -v var="variable testing" 'BEGIN{print var}'

三、printf
printf命令是会用格式:
printf format,item1,item2,...

要点:
1、其余print命令的最大不同是,printf需要指定format
2、format用于指定后面的每个item的输出格式;
3、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

四、输出重定向

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

五、awk的操作符:
1、算术操作符
-x:负值
+x:转换为数值
x^y:
x**y:次方
x*y:乘法
x/y:除法
x+y:
x-y:
x%y:

2、字符串操作符:
只有一个,而且不用写出来,用于实现字符串连接

3、赋值操作符
=
+=
-=
*=
/=
%=
^=
**=
++
--
需要注意的是,如果某模式为*号,此时使用/*/可能会有语法错误,应为/[*]/替代

4、布尔值
awk中,任何非0值或非空字符串都为真,反之就为假:

5、比较操作符:
x < y
x <= y
x > y
x >= y
x == y
x != y
x ~ y:y为一个模式,如果x被y的模式匹配到就为真,否则为假
x !~ y:与上反之
subscript in array:是否有这样的元素,有则为真,无则为假

7、表达式间的逻辑关系符
&&
||

8、条件表达式:
selector?if-true-exp:if-false-exp
三目操作符,相当于下面
if selector; then
if-true-exp
else
if-false-exp
fi

9、函数条用:
function_name (para1,para2)

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

1、常见的模式类型:
1、Regexp:正则表达式,格式为/regular expression/
如:awk -F: '/^r/{print $1}' /etc/passwd
passwd里以r开头的用户名,显示出来
2、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结尾的用户
3、Ranges:指定的匹配范围,格式为pat1,pat2
如:awk -F: '$3==0,$7~"nologin"{print $1,$3,$7}' /etc/passwd
# 从ID号为0的用户开始到匹配到第一个nologin的用户显示出来
4、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:让用户在最后一条输入记录被读取之后发生的动作

5、Empty(空模式):匹配任意输入行,文件中的每一行都要做处理

2、常见的Action
1、Expressions:表达式
2、Control statements:控制语句,if、for、do等
3、Compound statements:复合语句
4、Input statements:输入语句
5、Output statements:输出语句

/正则表达式/:使用通配符的扩展集

关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行

模式,模式:指定一个行的范围,该语法不能包括BEGIN和END模式。


八、控制语句:
1、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的用户数量

2、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个字符的字段显示出来

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

4、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

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

6、break和continue
常用于循环或case语句中,停止本字段的循环,提前走下一字段的循环

7、next
提前结束对本行文本的处理,并接着处理下一行;
例如:下面的命令将显示其ID号为奇数的用户:
awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd

九、awk中使用数组

1、数组
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登录的用户共计数量

2、删除数组变量
从关系数组中删除数组索引需要使用delete命令,使用格式为:
delete array[index]

十、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中的所有字母转为大写

十一、用户自定义函数
自定义函数使用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资源
1、vip:Float IP(流动的IP地址)
2、mysql service
3、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
1、电源分布单元,PDU:电交换机,可接网线,可以暂停某个接口的电源
2、不间断电源,UPS:高级的UPS也可以实现
3、刀片服务器电源控制设备
4、Lights-out Devices:轻量级管理设备
5、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三个配置文件:
1、秘钥文件,600权限,authkeys
2、heartbeat服务的配置文件ha.cf
3、资源管理配置文件
haresources
cp /usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} ./
chmod 600 authkeys
vim authkeys # 查看文件
#auth 1 # 格式写法,填写下面1、2、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条件:
1、时间同步
2、SSH双机互信
3、主机名称要与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:
1、时间同步
2、主机名
3、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 分布式锁管理器
GFS2、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节点

前提:
1、时间同步
2、名称解析,且每个主机的主机名与其‘uname -n’保持一致;
3、配置好每个节点的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服务启动前提:
1、每个集群都有唯一的集群名称
2、至少有一个fence设备,fence_manual -n 指定一个节点,模拟fence设备
3、至少三个节点;两个节点需要qdisk仲裁磁盘
执行system-config-cluster & 会调用xmanager图形配置界面,如果未配置rhcs则会提示创建新的配置文件,配置后会通过ccs工具同步至其他节点
1、生成新的配置文件,起一个集群名称,指定多播地址,如果不选则会内部选用一个多播地址,是否使用仲裁磁盘等参数,保存即可
2、点击cluster nodes右边的对话框中选择Add a cluster 3、node添加节点,填写节点名称必须和uname -n保持一致的名称,并填写法定票数,一般为1,点击ok完成节点添加
4、选择fence device选项,添加fence设备,选择manual fencing手动添加,name填写meatware点击ok完成添加
5、点击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
验证客户端来源方式:
1、基于IP验证
2、基于用户,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、1、2、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的场景:
1、NUMA场景命中率低时,也就是miss值较高时需要绑定
2、某进程繁忙,上下文切换频繁
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
#:只输出其概括信息
内存优化:
1、降低微型内存对象的系统开销
slab 小内存对象调用机制
cat /proc/slabinfo # 可以查看到所有存入slab的内存对象,支持多种内存结构
2、缩减慢速子系统的服务时间
1、通过buffer cache缓存文件元数据,提速IO子系统时间
2、disk IO:page cache缓存disk IO
3、interprocess communication 进程间通信:使用share memory 共享内存解决
4、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:匿名页,不是文件内容
包含页面数据:
1、程序自身产生数据,例如数组、堆中的数据
2、匿名内存区域也为匿名页
3、脏内存页面,进程私有页面
4、进程间通信的共享内存页面
anonymous pages=RSS(实际内存集)-Shared(共享内存) :为匿名页值,匿名页不能被交换出去

内存进程间通信内存调优:
通过man ipc可以查看进程间通信的相关系统调用方法
调优针对项:
1、消息
2、信号
3、共享内存
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 #接受1、2、3 三个参数,默认为0表示不释放
1、1表示pagecache # 通常释放pagecache比较理想
2、dentries和inodes
3、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性能
1、尽可能用小swaps,必要时可以将匿名页缓存进来
2、降低访问次数
增加内存解决
有多快硬盘的话,每块硬盘划分一个交换分区,优先级设为相同,按设备快慢分级
3、降低服务时间
使用SSD盘
swap放在硬盘最外道上
使用swap概率调整:
vm.swappiness:使用倾向百分比
映射到页表当中的内存百分比+上vm.swappiness倾向百分比 >= 100 就开始使用swap
默认60,调高此值便会将匿名页交换出去了,性能调优尽可能调小此值

交换内存swap大小:
1、批处理系统科学运算的业务类型,内存4倍
2、数据库服务器,>=1G
3、应用服务器,内存的一半
调整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,其次文件系统,最后网络子系统调优

应用层调优:软件层面调优
关闭不必要的功能
调整响应的运行模式

调优思路:
1、性能指标,定位性能瓶颈
2、调优:
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
充分使用内存:
1、swap=ram的容量,swappiness=0;
2、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虚拟化技术的挑战:
1、特权级压缩:
VMM自身必须运行在Ring 0级,同事米边GuestOS控制通资源,GuestOS不得不降低自身的运行级别而运行于Ring 1或Ring3上(Ring2不使用),实际上只运行在Ring3上
2、特权级别名:
假设虚拟机的Ring0,实际运行在Ring3上
3、地址空间压缩
VMM自己要用内存,并且以0页面开始,所以虚拟机不可能是从0开始内存页分配
4、费特权敏感指令
VMM无法正确捕获有些敏感指令处理
5、静默特权失败
x86的某些特权指令在失败时不返回错误,也无法被VMM捕获
6、中断虚拟化
屏蔽终端和非屏蔽终端的管理应该由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.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.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:
1、根文件系统;
2、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.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.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:某类型操作系统的变体;如:rhel5、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、qcow2、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:
1、分配MAC地址
2、分配IP地址
3、IP关联信息保存在数据库中
4、为主机设置IP地址,dhcp,gateway等
5、更新network信息到数据库
nove-network:提供网络服务
1、分配地址
2、IP地址使用和回收管理
3、由admin用户管理
nove-volume:提供虚机一个卷或拆除一个卷
1、一般均由iscsi实现
2、一个卷只能给一个实例
3、用来保存实例上的长久数据信息

部署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数据冗余原理:
靠一个环进行扫描,将添加的设备全部放置在环中的节点上,需要存储数据时再环中查找可用节点进行存储

需要存储的对象非常多,每个类型一个环:
1、account账号
用来验证账号是否有权限使用存储功能,处理get,head,delete或replication请求的守护进程
2、container节点
处理针对container的get,head,delete或replication请求的服务进程
3、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
1、编程模型
2、运行框架
3、MapReduce编程思想的具体实现

DFS + MapReduce = Hadoop

MapReduce控制节点JobTracker

HDFS:
namenode:NN节点,调度存储节点
Datanode:DN节点,存储数据节点

MapReduce:
JobTracker:JT节点,调度任务节点
TaskTracker:TT节点,负责具体运行任务节点

Map函数定义数据切割标准
Slot:插槽,运行任务

HDFS:
1、HDFS是设计用来存储大文件:对海量肖文杰的存储不太适用;
2、用户空间的文件系统;
3、HDFS不支持修改;新版本支持追加;
4、不支持挂载,并通过系统调用进行访问;只能使用专用访问接口,如专用命令行工具、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

学习过程:
1、安装配置,HDFS集群
2、安装配置MapReduce
3、HBase
4、Hive
5、sqoop
6、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、8021、50010
HTTPD服务器,端口:jobtracker:50030、tasktracker:50060、namenode:50070、datanode 50075、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集群
1、主节点:名称节点+Jobtracker SNN节点 secondrynode
2、数据节点: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个给datanode
hadoop的log日志滚动1天滚动一次,但永久保留,需要手动归档保留并定期清除,否则会导致空间紧张


来自  https://www.cnblogs.com/donray888/p/11532485.html

普通分类: