Linux高级服务搭建

 

集群
  1. 集群原理

    集群:一组协同工作的服务器对外表现为一个整体

    LBC:负载均衡集群,多台主机承担压力请求

    HAC:高可用集群,尽可能的保障服务的不间断运行

    HPC:高性能运算集群,提供单台服务器提供不了的计算能力

    集群结构:

            负载调度器:管理集群的主机,可以是硬件或软件

            服务器池:集群服务器

            共享存储:共享集群服务器存储地方

    负载调度器组件

    硬件:

    一流:F5中big-ip    ,价格昂贵

    二流:ROSE ,安瑞科技

    定义:把核心的算法封装在独立的运算芯片中

                优点:

    1、速度更快

    2、更稳定

    3、学习成本低廉

                软件:amoeba、RAC、LVS 、Nginx、haproxy

    优点:

    1、开源免费

    2、学习成本高

    NAS:网络附加存储,低廉,速度慢,并发低

    分布式存储:MFS(主) NFS(多个)

        负载均衡集群 LBC

        组件:1.负载调度器 2.服务器池 3.共享存储

        负载调度器

            硬件:F5中big-ip

            软件:Nginx,LVS(主要学习)

    负载调度层级(各层应用软件)

            二层:数据链路,MAC寻址,链路级负载:判断网络,暂时只有硬件可做F5 big-ip

            四层:传输层IP,PORT,LVS、haproxy

            七层:应用层URL,FQDN,amoeba、nginx

        工作原理

            四层:建立一个完整TCP连接,由客户端发起,负载调度器转发至真实服务器完成

            七层:建立两次完成TCP连接,由客户端至调度器一次,调度器至真实服务器另一次

                判断

                    四层:IP + PORT 套接字(源目的,IP端口)

                    七层:FQDN,URL(域名)

                优点

                    四层:压力偏小,并发较大

                    七层:压力大,但是能够识别 主机名 (虚拟主机)

                工作场景

                    四层:TCP UDP C/S

                    七层:ssl http mail

    安全性

                    四层:可以转发 SYN

                    七层:可以拦截 SYN

    高可用集群HAC

        实现方案:心跳检测,发数据包,检查服务器是否正常运行,多次无回应,取代

        存在问题:脑分裂,存在两台相同IP的服务器,造成网络访问中断,数据的丢失或损坏

        解决方案

                1、心跳线冗余:多接几条

                2、采用串口线:线多,其中一条坏,会自动跳转好的线

                3、电源交换机:使用命令断电

    实现手段

                软件:heartbeat、keepalived

                硬件:ROSE、安瑞科技、F5

        高可用标准(一年)

                99            99%                87.6小时        #高可用最低要求

                999            99.9%            8.8小时            #

                9999        99.99%        53分钟            #

                99999        99.999%        5分钟                #

    高性能运算集群HPC

    LBC:处理请求时,直接交给其中一个节点计算

    HPC:处理请求时,拆分数据,分给其他节点计算,再合并个HPC

    分布式计算:拆分数据进行计算

    分布式存储:避免数据合并传回的时间

    性能提升方案

    提高性能的顺序:加缓存--水平扩展--加CDN--拆分业务--再上CDN

    CDN:静态数据缓存,建立镜像站点,加快访问速度,智能识别访问所在位置,选择最近站点回复访问

    水平扩展:多台服务器承担请求压力

            DNS(负载调度器)

                1、无后端健康状态监测

                2、DNS 服务器需要热备 (公网DNS服务器)

                3、调度规则 RR,无特殊调度

                4、DNS缓存服务器造成的网络访问压力不一致

            agent(负载调度器)

                1、支持后端健康状态检测

                2、支持多种调度算法

    垂直扩展:更换性能更高的硬件设备

            缺点

                1、性价比低

                2、性能提升存在瓶颈

                3、在替换过程中,服务出现中断,mac 表刷新需要时间

            优点

                1、网络拓扑无改动

    调度算法

    只能选择一个静态或动态算法

    调度算法分类

    静态调度active,只根据算法本身去调度,不考虑服务器本身

            动态调度in-active,除了考虑算法本身,还要考虑服务器状态

    静态调度算法

    RR轮询:

    将请求分配给后端的服务器,从第一台服务器开始到第N台结束,然后循环

    WRR加权轮询:

    按照权重的比例实现在多台主机之间进行调度(按权重值)

    SH(source hash)源地址散列:

    将同一个IP的用户请求,发送给同一个服务器(防止用户重复请求,如登入)

    #临时解决cookie:本地客户端,session:服务端重复握手自由消耗的问题

    #应用内存分页技术,使一部分内存变为可写,SIP--hash--RS1,使用hash转换为固定长度的字符串,节省资源

    DH(destination hash)目标地址散列:

    将同一个目标地址的用户请求发送给同一个真实服务器(提高缓存的命中率)

    #让用户更快的访问到缓存所在地址

    #也是有hash计算数据提交给服务器核对,节省资源

    动态调度算法

    LC(lest-connection)最少连接:

    将新的连接请求,分配给连接数最少的服务器(活动连接×256+非活动连接)

    #一个线程三个状态:正在创建连接,连接传输数据,连接释放之前

    #活动连接:连接传输数据

    #非活动连接:正在创建连接,连接释放之前

    #LC算法认为一个活动连接等于256个非活动连接

    WLC加权最少连接:

    特殊最少连接算法,权重越大承担的请求数越多(活动连接×256+非活动连接)/权重

    SED最短期望延迟:

    特殊的WLC算法(活动连接+1)*256/权重

#指定性能最好的服务器先开始接受请求

NQ永不排队:

特殊的SED算法,无需等待,如真实服务器的连接数等于0那就直接分配不需要运算

#不管服务器性能好坏,优先选择无连接的服务器

LBLC特殊的DH算法:

即能提高缓存命中率,又要考虑服务器性能

#设置阀值,当其中一台缓存服务器压力太大,自动转移到另一台缓存服务器

LBLCR LBLC+缓存:

尽可能提高负载均衡和缓存命中率的折中方案

#让缓存服务器之间同步数据,减少后台服务器压力

特殊算法--持久化连接

类似于SH算法,持久连接优先于算法又等同于算法,一个请求先被持久连接计算,再被其他算法计算,应用内存分页技术

PCC(持久客户端连接):

每客户端持久;将来自于同一个客户端的所有请求统统定向至此前选定的RS;也就是只要IP相同,分配的服务器始终相同

#无论请求是何端口,都传给同一个服务器

example:ipvsadm -A -t 172.16.0.8:80 -s wlc -p 120

PPC(持久端口连接):

每端口持久;将来自于同一个客户端对同一个服务(端口)的请求,始终定向至此前选定的RS

example:ipvsadm -A -t 172.16.0.8:80 -s rr -p 120

PFMC持久防火墙标记连接:

将来自于同一客户端对指定服务(端口)的请求,始终定向至此选定的RS;不过它可以将两个毫不相干的端口定义为一个集群服务

#给请求设置标签,根据标签,决定做持久化连接

example:

# iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10

# iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10

# service iptables save

# ipvsadm -A -f 10 -s wlc -p 120

ARP通信行为控制

ARP 响应级别

arp-ignore

        0 只要本机配置有相应 IP 地址就响应        #相邻网卡也能响应

        1 仅在请求的目标地址配置在请求到达的网络接口上时,才给予响应        #只能在当前IP段局域网响应

ARP 通告行为

arp-announce

        0 将本机任何网络接口上的任何地址都向外通告

        1 尽可能避免向目标网络通告与其网络不匹配的地址信息表        #只能在当前IP段局域网响应

        2 仅向目标网络通告与其网络相匹配的地址信息        #检查网卡上所有网段,在进行详细匹配

案例环境专为LVS和HA设计的一款健康检查工具

支持故障自动切换(Failover)

支持节点健康状态检查(Health Checking)

官方网站:http://www.keepalived.org/

keepalived的热备方式

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)

一主 + 多备,共用同一个IP地址,但优先级不同

Heartbeat是Linux-HA工程的一个组件,自1999年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内得到了广泛的应用

  1. LVS原理

    LVS:Linux 虚拟服务,工作在四层的负载调度器,用于四层转发数据

    组件:ipvs:内核态,工作在内核空间,LVS 核心代码    

    ipvsadm:用户态,工作在用户空间,是用户管理LVS的唯一手段

    钩子函数:内核一种机制,能够优先获取数据报文的所有权

    LVS工作模式(NAT,DR,TUN)

    并发量:            DR > TUN > NAT

    配置难易度:     NAT < DR < TUN

    优先:                DR > NAT > TUN

        NAT:DNAT端口映射,SNAT局域网共享公有IP

            1、负载调度器必须是 Linux 操作系统,真实服务器节点可以是任意操作系统

            2、真实服务器和负载调度器可以在不同广播域内,真实服务器应该把网关指向负载调度器

            3、负载调度器即负责处理入站请求又必须负责处理出站请求

            4、支持端口映射,真实服务器服务地址可以跟集群端口不一致

        DR:直接路由,支持千台,超过千台,使用硬件负载调度

            1、负载调度器与真实服务器必须是 Linux 操作系统(禁止子网卡)

            2、真实服务器与负载调度器必须处于同一个广播域内

            3、负载调度器只负责处理入站请求

            4、真实服务器与负载调取集群端口必须一致不支持端口映射

        TUN:隧道模式

            1、负载调度器必须是Linux操作系统,真实服务器可以全平台

            2、负载调度器与真实服务器必须拥有公网IP或者能够被公网IP直接路由

            3、负载调度器负载处理入站请求,出站请求由真实服务器完成

            4、不支持端口映射

  2. LVS-NAT搭建

    使用环境

            负载网关服务器:两张网卡,一张外网口IP,一张内网口IP, yum -y install ipvsadm

            web1服务器:搭建httpd,设置内网网关,设置开机自启动

            web2服务器:搭建httpd,设置内网网关,设置开机自启动

            外网客户机:不需要设置

    web1服务器

            curl localhost:8080                #查看搭建好的网站内容

    web2服务器

            curl localhost

    负载调度器-网关服务器

            modprobe ip_vs             #测试是否加载,如果没有得到任何信息,则已经加载

            cat /proc/net/ip_vs         #查看版本信息,以检测是否已经开始正常工作

    service iptables start

            echo "" > /etc/sysconfig/iptables            #永久清空防火墙规则

            iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j SNAT --to-source 192.168.20.200

    #设置防火墙nat转换规则,-s指定内网口段,-o指定外网口网卡名,--to-source外网口IP

    iptables -t nat -L                    #查看防火墙nat转换规则

            service iptables save            #关机是也保持防火墙配置

    iptables -D -t IP:80             #清除防火墙调度规则

    chkconfig iptables on

    yum -y install ipvsadm        #安装LVS负载调度器

            vim /etc/sysctl.conf                #开启数据转发

            sysctl -p                                #刷新配置文件

            ipvsadm -A -t 192.168.20.200:80 -s rr

    #添加一个调度器规则,-A添加调度器,-t指定外网口IP,-s指定算法

            ipvsadm -a -t 192.168.20.200:80 -r 192.168.10.101:8080 -m

            ipvsadm -a -t 192.168.20.200:80 -r 192.168.10.102:80 -m

    #添加集群服务器信息,-t指定外网口IP,-r指定集群单台主机,-m指定NAT调度模式

            ipvsadm -Ln                        #查看调度设置规则

            chkconfig ipvsadm on    

            service ipvsadm save            #关机是也保存调度设置

            ipvsadm -Ln --stats                #查看已调度信息(次数,出入数据大小)

  3. LVS-DR搭建

    #虚拟网卡的 IP 与真实网卡的 IP 需在同 一网段,且子网掩码为 255.255.255.255, 且主机虚拟网卡与其他服务器虚拟网卡 IP 相同

    #linux相临网卡可以互相访问

    安装环境:

            一台LVS负载调度器:关闭防护, yum -y install ipvsadm

    web1服务器:安装httpd,启动,设置开机自启动

    web2服务器:跟web1一样

        LVS负载调度器

            service NetworkManager stop         #启动虚拟接口口,必须关闭此服务

            chkconfig NetworkManager off

            cd /etc/sysconfig/network-scripts/

            cp -a ifcfg-eth0 ifcfg-eth0:0        #更改IP为访问调度服务的IP

            vim /etc/sysctl.conf

                    添加:

    net.ipv4.conf.all.send_redirects = 0

    net.ipv4.conf.default.send_redirects = 0

    net.ipv4.conf.eth0.send_redirects = 0

    #修改内核参数,网卡重定向,防止相同网络地址广播冲突,如果有多快网卡需要设置多行 net.ipv4.conf.eth0.send_redirects = 0

            sysctl -p

            ifup eth0:0

            ipvsadm -A -t 192.168.10.222:80 -s rr

    ipvsadm -a -t 192.168.10.222:80 -r 192.168.10.100:80 -g

    #-g声明DR模式,只处理入站请求

            ipvsadm -a -t 192.168.10.222:80 -r 192.168.10.101:80 -g

            ipvsadm -Ln                    #查看轮训规则

            ipvsadm -Ln --stats            #查看轮训记录

            service ipvsadm save

            chkconfig ipvsadm on

    web1服务器

            service NetworkManager stop         #启动虚拟借口,必须关闭此服务

            chkconfig NetworkManager off

            cd /etc/sysconfig/network-scripts/

            cp -a ifcfg-lo ifcfg-lo:0

            vim ifcfg-lo:0            #更改IP为访问调度服务的IP,掩码改为255.255.255.255,防止广播

            vim /etc/sysctl.conf

                    修改:

                            net.ipv4.conf.all.arp_ignore = 1

    net.ipv4.conf.all.arp_announce = 2

    net.ipv4.conf.default.arp_ignore = 1

    net.ipv4.conf.default.arp_announce = 2

    net.ipv4.conf.lo.arp_ignore = 1

    net.ipv4.conf.lo.arp_announce = 2

    #关闭所有网卡的响应和通告行为,所有数据不接受

            sysctl -p

            ifup lo:0

            route add -host 192.168.10.222 dev lo:0

    #开放10.222的IP用lo:0网卡响应

    如果是用nignx做web1网站需要修改nginx.conf

            vim /usr/local/nginx/conf/nginx.conf

                修改:

    keepalive_timeout 0;            #取消注释

    #keepalive_timeout 65;        #开启注释

    web2服务器

            更web1设置一样

  4. LVS-Keepalivde高可用

    安装环境:

            主LVS:配置DR调度服务,导入Keepalived.iso

            从LVS:修改DR网卡方式,导入Keepalived.iso

            web1服务器:安装httpd

            web2服务器:安装httpd

    主LVS调度服务器

            yum -y install kernel-devel openssl-devel popt-devel gcc*

            ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/

            make && make install

            chkconfig --add keepalived

            chkconfig keepalived on

            vim /etc/keepalived/keepalived.conf

    注:配置文件不能有空格

                添加:

    ! Configuration File for keepalived

    global_defs {

                    router_id R1            #命名主机

    }

    vrrp_instance VI_1 {

                    state MASTER        #设置服务类型主 / 从( MASTER/SLAVE )

                    interface eth0            #指定那块网卡用来监听

                     virtual_router_id 60        #设置组号,只有同组才能通信

                    priority 90                #服务器优先级,主服务器优先级高

                    advert_int 1                #心跳时间,每秒检测对方存活,检查负载服务器的

                    authentication {        #存活验证密码

            auth_type PASS

            auth_pass 1111

            }

            virtual_ipaddress {            #设置集群地址

            192.168.10.222

            }

    }

    virtual_server 192.168.10.222 80 {        #设置集群地址,以及端口号

                    delay_loop 3            #健康检查间隔,检查后端服务器的

                    lb_algo rr                    #使用轮询调度算法

                    lb_kind DR                # DR 模式的群集

    protocol TCP            #使用的协议

    real_server 192.168.10.100 80 {            #管理的网站节点以及使用端口

    weight 1                    #权重,优先级

    TCP_CHECK {        #状态检查方式

            connect_port 80        #检查的目标端口

            connect_timeout 3    #连接超时(秒),多少秒检测一次

                 nb_get_retry 3            #重试次数

            delay_before_retry 4        #重试间隔(秒)

            }

    }

    real_server 192.168.10.101 80 {        #管理的第二个网站节点以及使用端口

    weight 1

    TCP_CHECK {

            connect_port 80

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 4

    }

        }

    }

            /etc/init.d/keepalived start

            scp /etc/keepalived/keepalived.conf root@192.168.10.102:/etc/keepalived/

    从LVS调度服务器(跟主基本一样)

            配置网卡信息

            ifup eth0:0

            yum -y install ipvsadm

            service ipvsadm start        #规则需要与主负载同步,所以需要启动

    chkconfig ipvsadm on

    vim /etc/keepalived/keepalived.conf

                修改:

    router_id R1            #命名主机

    state SLAVE            #设置服务类型主 / 从( MASTER/SLAVE )

    priority 50                #服务器优先级,主服务器优先级高

            /etc/init.d/keepalived start

            chkconfig --add keepalived

            chkconfig keepalived on

网卡配置后启动报错需要修改网卡配置文件:注释

                vim /etc/sysconfig/network-scripts/ifup-eth

247     #if ! ARPING=$(/sbin/arping -c 2 -w ${ARPING_WAIT:-3} -D -I ${REALDEVICE} ${ipaddr[$idx]}) ; then

248     #ARPINGMAC=$(echo $ARPING | sed -ne 's/.*\[\(.*\)\].*/\1/p')

249     #net_log $"Error, some other host ($ARPINGMAC) already uses address ${ipaddr[$idx]}."

250     #exit 1

251        #fi

扩展:

在keepalived.conf配置文件中加入以下内容:(主从转换脚本调用)

注:执行脚本不能屏幕输出(写入null),判断条件不能关于keepalived,更改需要重启

notify_master"想要执行的脚本路径"

#表示当切换到master状态时,要执行的脚本

notify_backup "想要执行的脚本路径"

#表示当切换到backup状态时,要执行的脚本

notify_fault"想要执行的脚本路径"

#表示切换出现故障时要执行的脚本

例:

vrrp_instance VI_1 {

                state MASTER

                interface eth1

                virtual_router_id 66

                priority 100

                advert_int 1

                authentication {

            auth_type PASS

            auth_pass 123456

}

                virtual_ipaddress {

            172.18.0.200/16

}

notify_master "/etc/keepalived/notify.sh master"

                notify_backup "/etc/keepalived/notify.sh backup"

                notify_fault "/etc/keepalived/notify.sh fault"

}

keepalived检测脚本的作用及注意事项:

#默认每隔3秒钟执行一次检测脚本,检查nginx服务是否启动,如果没启动就把nginx服务启动起来,如果启动不成功,就把keepalived服务down掉,让漂浮到备keepalived上

#检测脚本一定要写在vrrp_instance的前面也就是上面,而且花括号一定要有空格,追踪trace_script要定在vip的后面,多少人栽在了这上面好多小时

vrrp_script check_ng {
script " /etc/keepalived/check_nginx.sh "
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.76.25/24
}
track_script {
check_ng
}
}

 

 

LVS-heartbeat高可用

heartbeat是脚本方式的高可用,设置简单,但切换过程比较慢

安装环境:

        web1服务器:安装httpd,导入heartbeat.tar.gz包

        web2服务器:安装httpd,导入heartbeat.tar.gz包

web1服务器

        vim /etc/hosts        # heartbeat需要用主机名解析切换

            添加:

192.168.10.100 server

192.168.10.101 client1

scp /etc/hosts root@192.168.10.101:/etc/hosts

tar xf heartbeat.tar.gz

cd heartbeat

        yum -y install *

        cd /usr/share/doc/heartbeat-3.0.4/

        cp -a authkeys ha.cf haresources /etc/ha.d/

        cd /etc/ha.d/

        vim authkeys            #一般使用MD5加密

            修改:

                auth 3

                #1 crc

                #2 sha1 HI!

                3 md5 Hello!

        chmod 600 authkeys

        vim ha.cf    

            修改:

    node server                #记录高可用主机,几个就几条

                    node client1    

                    bcast eth0 # Linux            #声明使用声明网卡,冗余多网卡

        vim haresources

            添加:

server IPaddr::10.10.10.10/24/eth0:0        #声明主服务器访问的IP,不能与真实机相同

        scp authkeys ha.cf haresources root@192.168.10.101:/etc/ha.d/

#web2需要先安装heartbeat.tar.gz

        /etc/init.d/heartbeat start        #启动高可用

web2服务器

tar xf heartbeat.tar.gz

cd heartbeat

        yum -y install *

        /etc/init.d/heartbeat start        #启动高可用

        测试:切断网络,如果要检查httpd状态,需要脚本支持

        内容:

#!/bin/bash

PWD=/usr/local/script/jiankong

#脚本位置

URL=http://10.10.10.11/index.html

#主机真实IP连接

HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`

#返回主页请求码,http_code是curl内置变量

if [ $HTTP_CODE != 200 ]

then

                        service heartbeat stop

fi

        脚本定时任务设置

        vim /etc/crontab

            添加:

* * * * * root bash /root/heart.sh

        service crond start

        chkconfig crond on

 

 

LVS-四层+七层

安装环境:

        LVS服务器:安装LVS-DR模式,设置nginx服务器IP调度

        nginx1服务器:apache1和apache2同一个负载调度,apache3单独一个负载调度

        nginx2服务器:同nginx1一样配置,除真实IP不同

        apache1服务器:安装httpd服务,设置网页内容不同,方便测试

        apache2服务器:安装httpd服务

        apache3服务器:安装httpd服务

 

  1. squid缓存
    1. squid原理

    CDN包含

            智能 DNS

            缓存服务器:

                    Nginx:不是主流的缓存服务器

                    Varnish:用内存分页技术读取元数据,支持正则表达式方法清空缓存

                            特点:在小规模的应用中,性能突出

                    Squid:用磁盘存储数据,不支持正则表达式清空,支持FTP HTTP SSL

                            特点:在大规模的应用中,性能突出

    UFS(Unix filesystem):squid采用的文件系统

            调用过程:分区下-目录下-二级目录下-缓存文件(object)

                    digest tables:目录对应的索引记录

                    hash tables:分区对应的索引记录

    代理服务器基本类型:

    传统代理:适用于Internet,需明确指定服务端

    透明代理:适用于共享上网网关,不需指定服务端

    反向代理:位于网站前端,代理web接受客户端的请求

    使用反向代理的优点:

    提高 web 站点的访问速度(缩短访问距离)

    隐藏服务器的真实 IP(数据被窃取)

    1. Squid配置文件详解

      主配置文件

      软件包:squid-2.6.STABLE21-6.el5

      系统服务:squid

      主程序:/usr/sbin/squid

      主配置文件:/etc/squid/squid.conf

      默认监听端口:TCP 3128

      默认访问日志:/var/log/squid/access.log

      http_port 3128        #默认端口

      access_log /var/log/squid/access.log squid #指定日志位置,默认配置没有

      cache_mem 64 MB        #squid进程能够调用的最大内存数

      cache_dir ufs /var/spool/squid 100 16 256        

      #缓存目录,缓存目录最大使用100MB,一级目录16个,二级目录256个

      visible_hostname proxy.benet.com        #可见主机名

      dns_testnames www.google.com www.163.com        #指定dns,用于检查服务是否正常运行

      maximum_object_size 4096 KB        #限制一个文件多大时,不缓存

      reply_body_max_size 10 MB        #允许访问缓存的最大大小

      ACL( Access Control List ,访问控制列表):

      根据源地址、目标URL、文件类型等定义ACL列表

      acl 列表名称 列表类型 列表内容 ...

      acl     all                 src                 1.0.0.0/0.0.0.0

      针对已定义的acl列表进行限制

      http_access allow或deny 列表名称 ...

      http_access         deny                     all

      ACL列表定义类型

      src                  源地址

      dst                      目标地址

      port                 目标端口

      dstdomain         目标域

      time                 访问时间

      maxconn         最大并发连接

      url_regex         目标URL地址

      Urlpath_regex     整个目标URL路径

      ACL注意事项

          1、允许多个类型使用同一个列表名称进行处理

          2、如果只设置 acl 不定义 http_access 相当于规则不存在

          3、squid 内存内置函数以及定义 all 代表所有,不能自定义使用

          4、当 all 区域不存在,并且已经定义 acl 区域,那么此区域是否放行根据配置文件中的最后一行 http_access 反向进行操作

    2. squid传统代理搭建

      准备环境:

              内网客户机:设置内网网关

              外网web服务器:搭建httpd服务

              squid缓存网关:设置内外网两张网卡

      squid缓存网关

              yum -y install squid

              vim /etc/squid/squid.conf

                  添加:在http_port下

      visible_hostname www.xdl.com            #如果不添加,访问时会警告

              service squid start

              vim /etc/sysctl.conf

              sysctl -p

      内网客户机测试

              linux下:/etc/profile文件添加添加

          HTTP_PROXY=HTTP://内网网关IP:3128

                      export HTTP_PROXY

                      #正常数据包无法收到,需要配置squid作为代理服务器

                      . /etc/profile

                      elinks 外网web服务器IP

              windows下:

                  浏览器—编辑—首选项—高级—链接—设置—手动代理—http网关内网 IP—3128

      直接访问外网

      如果需要重启squid:service squid reload

      tcpdump -nA port 80 监听httpd服务端口

      tcpdump –nA port 80        #抓包命令

    3. squid透明代理搭建

      准备环境:

              内网客户机:设置内网网关

              外网web服务器:搭建httpd服务

              squid缓存网关:设置内外网两张网卡

      squid缓存网关

              yum -y install squid

              vim /etc/squid/squid.conf

                  修改:

      http_port 内网网关IP:3128 transparent

                          #正常数据包无法收到,需要声明squid作为代理服务器

                  添加:在http_port下

      visible_hostname www.xdl.com    

      #如果不添加,访问时会警告

              service squid start

              vim /etc/sysctl.conf

              sysctl -p

              iptables -t nat -A PREROUTING -i eth0( 内网网卡 ) -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128

      #借助iptables修改80端口为3128端口

      内网客户机测试

      直接访问

    4. squid反向代理搭建

      准备环境:

              内网web1服务器:搭建httpd

              内网web2服务器:搭建httpd

              外网客户机:不需要配置

              squid缓存网关:设置内外网两张网卡

      squid缓存网关

              yum -y install squid

              vim /etc/squid/squid.conf

                  修改:

      http_access allow all

                          #允许所有IP通行

      http_port 外网网关IP:80 vhost

                          #开启反向代理模式

      添加:在http_port下

                          cache_peer 内网192.168.10.100 parent 80 0 originserver round-robin

      #添加缓存池,parent指上游服务器,0指是否有其他squid服务器,originserver节点,round-robin只支持轮训

                          cache_peer 内网192.168.10.101 parent 80 0 originserver round-robin

      visible_hostname www.xdl.com    

      #如果不添加,访问时会警告

              service squid start

              vim /etc/sysctl.conf

              sysctl -p

      内网客户机测试

      直接访问

  2. ISCSI网络存储
    1. 存储原理

    存储方式的分类

            块存储

                    优点:

                            1、实现较为简单成本较低

                            2、通过 raid 可以显著的提高磁盘读写性能

                    缺点

                            1、共享问题

                            2、文件系统局限问题

            文件存储(CIFS/NFS/FTP)

                    优点

                            1、一般来说文件存储服务器都是使用单台服务器构建成本低廉

                            2、文件系统由文件共享服务处理,不需要本地文件系统处理,跨平台程度高

                    缺点

                            1、读写性能较差

            对象存储/云存储/分布式存储

    将元数据信息与真实数据信息分开保存,METADATA存储数据的元数据信息以及 CHUNKSERVER保存文件真实数据信息

    存储网络的分类(软件)

            DAS:直接附加存储        对象:块存储

            NAS:网络附加存储        对象:文件存储

            SAN:存储区域网络        对象:对象存储,网络级别的块存储

    硬件存储解决方案:HP-EMC2

    去OME

            O:oracle

            M:IBM小型机

            E:EMC2

    RHCS对象组成

    RHCS 红帽集群套件        intofy+rsync 高性能版本

            CMAN 用于发送集群消息

            CCS     集群配置工具

    RGMANAGER 集群控制器 控制集群启动关闭隔离,栅设备

    GFS2:第二版全局文件系统 集群文件系统

    CLVM:集群逻辑卷组

    1. 时间同步服务器搭建

      准备环境:

              一台时间服务器

              一台同步客户机

      时间服务器

              yum -y install ntp

      ntpdate cn.pool.ntp.org        #同步网络时间

              date -s 2018-08-28

              date -s 15:26:30

              vim /etc/ntp.conf

                  修改:

                          restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap

                          注释server区域

                  添加:

      server 127.127.1.0

      fudge 127.127.1.0 stratum 10

              service ntpd start

              chkconfig ntpd on

      同步客户机

              yum -y install ntpdate

              ntpdate -u 192.168.10.100

              crontab -e

                  添加:

                          0 */2 * * * /usr/sbin/ntpdate -u 192.168.10.100 &>/dev/null

              service crond start

              chkconfig crond on

              date

    2. ISCSI网络块存储搭建

      准备环境:

              ISCSI服务器:搭建时间服务,添加新硬盘

              共享客户机:与服务器同步时间

      永久设置:

      ISCSI服务器

              fdisk -l

              pvcreate /dev/sdb

              vgcreate vg0 /dev/sdb

              lvcreate -L 1G -n lv0 vg0

              mkfs -t ext4 /dev/vg0/lv0

              yum -y install scsi-target-utils        #安装ISCSI主服务器服务

              vim /etc/tgt/targets.conf

                  添加:

      <target iqn.2018-08.server:lvm>        #设置iqn标签,相当于ISCSI服务主机名

      backing-store /dev/vg0/lv0                #声明磁盘位置

      initiator-address 192.168.10.100        #运行访问IP

      </target>

              service tgtd start

              chkconfig tgtd on

              tgtadm -L iscsi -o show -m target            #查看ISCSI的服务的LUN是否设置成功

      共享客户机

              yum -y install iscsi-initiator-utils        #服务端ISCSI工具

              iscsiadm -m discovery -t st -p 192.168.10.100        #查看服务端的共享目录

              iscsiadm -m node -T iqn.2018-08.server:lvm --login        #登入ISCSI服务

              fdisk /dev/sdb            #给逻辑卷分区

              mkfs.ext4 /dev/sdb1

      mkdir /scsi

      mount /dev/sdb1 /scsi/

              df -h

              取消ISCSI

                  umount /scsi/

                  iscsiadm -m node -T iqn.2018-08.server:lvm --logout

      临时命令设置

      ISCSI服务器

              yum -y install scsi-target-utils

      pvcreate /dev/sdb

              vgcreate vg0 /dev/sdb

              lvcreate -L 1G -n lv0 vg0

              mkfs.ext4 /dev/vg0/lv0

              partprobe /dev/vg0/lv0

              service tgtd start

              netstat -anpt | grep tgtd

              tgtadm -L iscsi -o new -m target -t 1 -T iqn.2018-08.server:lvm

              tgtadm -L iscsi -o new -m logicalunit -t 1 -l 1 -b /dev/vg0/lv0

              tgtadm -L iscsi -o show -m target

      共享客户机

              iscsiadm -m discovery -t st -p 192.168.10.100

              iscsiadm -m node -T iqn.2018-08.server:lvm --login

              fdisk /dev/sdb

              mkfs.ext4 /dev/sdb1

              mount /dev/sdb1 /scsi/

              df -h

  3. RHCS红帽集群存储搭建

    软件版本:

    scsi-target-utils-1.0.24-3.el6_4.x86_64

    iscsi-initiator-utils-6.2.0.873-2.el6.x86_64

    cman-3.0.12.1-49.el6_4.1.x86_64

    rgmanager-3.0.12.1-17.el6.x86_64

    gfs2-utils-3.0.12.1-49.el6_4.1.x86_64

    lvm2-cluster-2.02.98-9.el6.x86_64

    准备环境:

            server服务器:搭建时间同步服务器,ssh免密登入,添加新硬盘

            client1服务器:

            client2服务器:

            client3服务器:

    server服务器

    vim /etc/hosts

                添加:

                        192.168.10.101 client1

    192.168.10.102 client2

    192.168.10.103 client3

    192.168.10.100 server

            scp /etc/hosts root@192.168.10.101:/etc/

            scp /etc/hosts root@192.168.10.102:/etc/

            scp /etc/hosts root@192.168.10.103:/etc/

            alias ha='for I in {1..3}; do'            #设置别名,变量ha匹配1,2,3作为主机名匹配

            ha ssh client$I 'touch /root/1.txt'; done        #批量给客户机添加文件,作为测试

            yum install -y scsi-target-utils        #安装ISCSI主服务器服务

            vim /etc/tgt/targets.conf

                添加:

    <target iqn.2018-08.server:lvm>        #设置iqn标签

    <backing-store /dev/sdb>            #指定共享磁盘

    vendor_id test                        #发行商号,任意

    lun 6                                    #LUN号

    </backing-store>

    incominguser iscsiuser iscsiuser        #设置用户密码认证

    initiator-address 192.168.10.0/24     #设置允许的访问网段

    </target>

            service tgtd start

            tgtadm --lld iscsi --mode target --op show            #查看设置好的ISCSI服务

            ha ssh client$I 'yum -y install iscsi-initiator-utils'; done            #批量安装客户机服务端ISCSI服务

            ha ssh client$I 'service iscsi start'; done            #更改完客户机配置文件后启动

            ha ssh client$I 'chkconfig iscsi on'; done

            ha ssh client$I 'iscsiadm -m discovery -t st -p 192.168.10.100:3260'; done

    #查看客户机能否找到服务器ISCSI服务共享磁盘

            ha ssh client$I 'iscsiadm -m node -T iqn.2018-08.server:lvm -p 192.168.10.100 -l'; done

    #批量使客户端登入服务端服务

            ha ssh client$I 'service iscsi restart'; done

            ha ssh client$I 'chkconfig iscsi on'; done

            ha ssh client$I 'yum install -y cman rgmanager'; done

    #需要关闭NetworkManager和自启动

    #cman用于发送集群消息,CCS     集群配置工具

    #rgmanager集群控制器,控制集群启动关闭隔离,栅设备,其中一台服务器挂了,隔离

    #去客户机进行操作创建集群,之后再进行以下操作

    ha ssh client$I 'yum install -y lvm2-cluster'; done

    # CLVM:集群逻辑卷组,使客户机其中一台设置完逻辑卷组,其它客户机也能收到

            ha ssh client$I 'lvmconf --enable-cluster'; done        #开启逻辑卷组集群功能,不是启动

            ha ssh client$I 'grep "locking_type = 3" /etc/lvm/lvm.conf'; done

        #查看逻辑卷组是否识别到

            ha ssh client$I 'service clvmd start'; done

            ha ssh client$I 'chkconfig clvmd on'; done

            ha ssh client$I 'chkconfig cman on'; done

            ha ssh client$I 'chkconfig rgmanager on'; done

            ha ssh client$I 'yum install -y gfs2-utils'; done

    # GFS2:第二版全局文件系统,集群文件系统,提供集群锁的集群功能

            ha ssh client$I 'service gfs2 start'; done

    client1服务器

            vim /etc/iscsi/initiatorname.iscsi

                修改:

                        InitiatorName=iqn.2018-08.server:lvm

            vim /etc/iscsi/iscsid.conf

                修改:

                        node.session.auth.authmethod = CHAP

                        node.session.auth.username = iscsiuser

                        node.session.auth.password = iscsiuser

    #去服务器执行操作

            ccs_tool create testcluster        #创建名为testcluster的集群

            ccs_tool addfence meatware fence_manual

    #创建名为meatware的栅设备,当集群有损坏是用栅设备隔离

            ccs_tool lsfence        #查看栅设备是否添加

            ccs_tool addnode -n 1 -f meatware client1        #添加集群节点

            ccs_tool addnode -n 2 -f meatware client2        

            ccs_tool addnode -n 3 -f meatware client3

            ccs_tool lsnode        #查看群节点

            cd /etc/cluster/

            cat cluster.conf        #查看配置文件是否正确

            scp cluster.conf root@client2:/etc/cluster/        #批量修改其它客户机配置文件

            scp cluster.conf root@client3:/etc/cluster/

            service cman start        #在客户机启动,否则可能报错,cman集群节点之间可以通信了

    #去主服务器配置

            pvcreate /dev/sdb

            vgcreate clustervg /dev/sdb

            pvs        #其它客户机也可以查看到

            lvcreate -L 10G -n clusterlv clustervg

            lvs

            mkfs.gfs2 -j 2 -p lock_dlm -t testcluster:sharedstorage /dev/clustervg/clusterlv

    #-j指定日志文件,-p指定锁表类型,-t指定锁表名称

            #虚拟机有些无法完成,因为IO模型不支持

            # mkfs.gfs2 -h查看帮助

            #-J指定日志区域的大小,默认为128MB

            mkdir /iscsi

            mount -t gfs2 /dev/clustervg/clusterlv /iscsi/

    # gfs2_tool gettune /mydata查看挂载目录的属性

            # gfs2_tool settune /mydata new_files_jdata 1最常用,设置是否立刻同步到磁盘的,一般设置为1,下面我们就来设置一下

    gfs2_tool journals /iscsi        #查看日志文件,默认为128MB

            gfs2_jadd -j 1 /dev/clustervg/clusterlv        #新增日志文

    client2服务器

            vim /etc/iscsi/initiatorname.iscsi

                修改:

                        InitiatorName=iqn.2018-08.server:lvm

            vim /etc/iscsi/iscsid.conf

                修改:

                        node.session.auth.authmethod = CHAP

                        node.session.auth.username = iscsiuser

                        node.session.auth.password = iscsiuser

            service cman start

            pvs

            lvs

            mkdir /iscsi

            mount -t gfs2 /dev/clustervg/clusterlv /iscsi/

    client3服务器

            vim /etc/iscsi/initiatorname.iscsi

                修改:

                        InitiatorName=iqn.2018-08.server:lvm

            vim /etc/iscsi/iscsid.conf

                修改:

                        node.session.auth.authmethod = CHAP

                        node.session.auth.username = iscsiuser

                        node.session.auth.password = iscsiuser

            service cman start

            pvs

            lvs

            mkdir /iscsi

            mount -t gfs2 /dev/clustervg/clusterlv /iscsi/

    扩展集群逻辑卷

            lvs

            lvextend -L 15G /dev/clustervg/clusterlv    #从10G增加到15G

            df -h

            gfs2_grow /dev/clustervg/clusterlv        #扩展逻辑边界

            df -h

  4. MFS分布式存储
    1. MFS原理

      MFS:MooseFS是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本,然而对于访问MFS的客户端或者用户来说,整个分布式网络文件系统集群看起来就像一个资源一样,从其对文件系统的情况看MooseFS就相当于UNIX的文件系统

      数据块的存储:单个块的存储大小为 64MB,文件小于 64 MB,采用单独块进行存储。多余则申请多个块进行存储,但都满足一个特点,16进制

                1、只有第一个块用完以后才允许写入第二个块

                2、剩余块空间不允许在利用

    组成结构

    管理服务器:managing server 简称 master

    这个组件的角色是管理整个mfs文件系统的主服务器,除了分发用户请求外,还用来存储整个文件系统中每个数据文件的metadata信息,metadate(元数据)信息包括文件(也可以是目录,socket,管道,块设备等)的大小,属性,文件的位置路径等

    元数据备份服务器:Metadata backup servers 简称metalogger

    这个组件的作用是备份管理服务器master的变化的metadata信息日志文件,文件类型为changelog_ml.*.mfs。以便于在管理服务器出问题时,可以经过简单的操作即可让新的主服务器进行工作

    数据存储服务器组:data servers(chunk servers)简称data

    这个组件就是真正存放数据文件实体的服务器了,这个角色可以有多台不同的物理服务器或不同的磁盘及分区来充当,当配置数据的副本多于一份时,据写入到一个数据服务器后,会根据算法在其他数据服务器上进行同步备份

    客户机服务器组:(client servers)简称 client

    这个组件就是挂载并使用mfs文件系统的客户端,当读写文件时,客户端首先会连接主管理服务器获取数据的metadata信息,然后根据得到的metadata信息,访问数据服务器读取或写入文件实体,mfs客户端通过fuse mechanism实现挂载mfs文件系统的,因此,只有系统支持fuse,就可以作为客户端访问mfs整个文件系统

    MFS 优点:

    高可靠性:

    每一份数据可以设置多个备份(多分数据),并可以存储在不同的主机上

    高可扩展性:

    可以通过增加主机的磁盘容量或增加主机数量来动态扩展整个文件系统的存储量

    高可容错性:

    当数据被删除后的一段时间内,依旧存放于主机的回收站中,以备误删除恢复数据

    高数据一致性:

    即使文件被写入、访问时,我们依然可以轻松完成对文件的一致性快照

    MFS缺点:

    master目前是单点,虽然会把数据信息同步到备份服务器,但是恢复需要时间

    master服务器对主机的内存要求略高

    默认metalogger复制元数据时间较长(可调整)

    内存使用问题:

    对于master服务器来说,资源型要求就是内存大小,为了整个系统访问更快,mfs会把所以访问的元数据metadada信息放在内存中提供用户访问,因此,当文件数量增加时,内存使用量就会增加,根据官方说法,处理一百万个文件chunkserver,大概需要300M的内存空间。据此,推算如果未来要出来1个亿的文件chunkserver,大概需要30G内存空间

    MFS工作方式

        遍历

    client 发起遍历请求至 Master,Master查询元数据信息返回给 Client,Client 接收展示

        获取文件

        1、client 发起文件请求至 Master端,Master查询文件的 IP/PORT/ID 信息返回给 Client

        2、client 连接对应的服务器获取数据

        删除文件

        1、client 发起删除文件请求至 Master端

    2、Master删除对应的元数据信息,并向后端真实服务器添加异步删除任务,当到达指定时间后,chunkserver 删除对应真实数据,返回删除成功至 master

        创建文件

        1、client 向 Master 服务器发起新建文件请求,发送相关元数据信息如大小文件名

                2、Master 向后端 chunkserver 选举节点,并发送创建新块的请求

                3、chunkserver 创建完成新块以后,发送新块的 IP/PORT/ID 至 Master 服务器

                4、Master 发送新块地址信息至 client

                5、client 连接至新块地址进行写入,写入完成后,发送关闭文件信息至 Master

    6、Master 接收到关闭信息后,连接至对应chunkserver 进行查询请求,修改最终元数据的大小最后修改时间等

        修改文件

    1、client 向 master 发起修改文件请求

                2、master 检索内存信息确认 chunkserver 地址,连接至 chunkserver 进行拷贝块请求(将源数据块拷贝至新块-1),将新块-1 port,ip,id 信息发送至 client

                client 连接 新块-1 进行对应修改

                        如果数据无变化

                                当客户端关闭文件请求发送至 master 后

    Master 连接 chunkserver 检测数据块内容是否有变化,无变化删除新块-1 修改元数据中的最终访问时间

                        如果数据有变化

    master 服务器连接 chunkserver 申请 新块-2 满足 新块-1 的容量,将新块-1 数据拷贝至 新块-2 ,删除源块以及 新块-1 更新自己的元数据信息

    1. 配置文件详解

              /usr/local/mfs/etc/mfs/mfsmaster.cfg

                      WORKING_USER = mfs

      WORKING_GROUP = mfs

      SYSLOG_IDENT = mfsmaster

      #在 syslog 中的表示,说明这是 mfsmaster 产生的

      LOCK_MEMORY = 0

      #是否执行 mlockall() 以避免 mfsmaster 内存溢出(默认为 0 )

      NICE_LEVEL = -19

      #运行的优先级(默认 -19 ,注意,这进程必须是 root 启动 )

      DATA_PATH = /usr/local/mfs/var/mfs

      #数据存放路径,该目录下有三大类文件,changelog,sessions,stats

      EXPORTS_FILENAME = /usr/local/mfs/etc/mfs/mfsexports.cfg

      #被挂载目录以及其权限控制文件的存放位置

      BACK_LOGS = 50

      #元数据的改变日志文件数量(默认是 50 )

      MATOML_LISTEN_HOST = *

      #元数据日志服务器监听的 IP 地址(默认是 * ,代表任何 IP )

      MATOML_LISTEN_PORT = 9419

      #元数据日志服务器监听的端口地址,默认是 9419

      MATOCS_LISTEN_HOST = *

      #用于存储服务器( Chunk Server )连接的 IP 地址

      MATOCS_LISTEN_PORT = 9420

      #是存储服务器( Chunk server )连接的端口地址

      REPLICATIONS_DELAY_INIT = 300

      #延迟复制的时间(默认是 300 )

      CHUNKS_LOOP_MIN_TIME = 300

      # chunks的回环率

      CHUNKS_SOFT_DEL_LIMIT = 10

      CHUNKS_WRITE_REP_LIMIT = 2,1,1,4

      #在一个循环里复制到一个 CHUNK Server 的最大 chunks 数目

      CHUNKS_READ_REP_LIMIT = 10,5,2,5

      MATOCL_LISTEN_HOST = *

      MATOCL_LISTEN_PORT = 9421

      /usr/local/mfs/etc/mfs/mfsexports.cfg            #表示MFSMETA文件系统,设置挂载点权限

      rw.alldirs,maproot=0         #表示客户端拥有的权限

      权限部分选项如下:

      ro                 #只读模式共享

      rw                 #读写方式共享

      alldirs             #允许挂载任何指定的子目录

      maproot         #映射为root用户还是指定的用户

      password     #指定客户端密码

      /usr/local/mfs/var/mfs/metadata.mfs         #存储元数据信息的持久化目录

      元数据持久化

      1、当 Master Server 启动后将 /usr/local/mfs/var/mfs 下的 metadata.mfs加载至内存中并改名为 metadata.mfs.back

      2、新建 changelog.*.mfs 文件用于进行增量保存的文件,完整备份保存至 metadata.mfs.back

      可使用最大空间

      官方提示当 MFS 剩余资源在 1GB 是整个 MFS 系统停止写入类型请求。但是,社区实测在 百分之九十五 时停止写入,1.9GB

      goal值设置

              1、默认 goal 值为 2

              2、goal 必须不大于当前 chunkserver 节点数量

              3、当 chunkserver 损坏后,会重新选一台进行同步,并尽可能保证数量为设置的 goal 值

    2. MFS搭建

      准备环境

              导入:moosefs-3.0.84-1.tar.gz压缩包

              MFS-master服务器:yum -y install zlib zlib-devel gcc gcc-c++

              MFS-log服务器:yum -y install zlib zlib-devel gcc gcc-c++

              MFS-chunk1服务器:添加硬盘,yum -y install zlib zlib-devel gcc gcc-c++

              MFS-chunk1服务器:添加硬盘,yum -y install zlib zlib-devel gcc gcc-c++

              MFS-fuse客户机:yum -y install zlib zlib-devel gcc gcc-c++ fuse fuse-devel fuse-libs

      MFS-master服务器

              useradd mfs -s /sbin/nologin

              tar xf moosefs-3.0.84-1.tar.gz

      ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs

      make && make install

      chown -R mfs.mfs /usr/local/mfs/

              ln -s /usr/local/mfs/bin/* /usr/local/bin

              ln -s /usr/local/mfs/sbin/* /usr/local/sbin/

              cd /usr/local/mfs/etc/mfs/

              cp -a mfsmaster.cfg.sample mfsmaster.cfg            #主服务文件

              cp -a mfsexports.cfg.sample mfsexports.cfg        #挂载点文件

              vim mfsexports.cfg

                  添加:

      192.168.10.0/24 rw,alldirs,maproot=0         #定义客户端权限

              cp -a ../../var/mfs/metadata.mfs.empty ../../var/mfs/metadata.mfs        #元数据文件

              mfsmaster start

      停止master server,安全停止master server是非常必要的,千万不要kill,而是利用自带的命令mfsmaster来安全停止master server , mfsmaster stop,我们安装后采用默认的配置,没有做任何更改,所以默认的日志是写入/var/log/messages

              mfscgiserv start        #服务自带web监控端,需要时启动

              浏览器:http://192.168.10.100:9425

      /usr/local/mfs/sbin/mfsmaster -a            #如果启动不了,执行这条命令修复

      MFS-log服务器

              useradd mfs -s /sbin/nologin

              tar xf moosefs-3.0.84-1.tar.gz

              ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs

              make && make install

              chown -R mfs.mfs /usr/local/mfs/

              ln -s /usr/local/mfs/bin/* /usr/local/bin/

              ln -s /usr/local/mfs/sbin/* /usr/local/sbin/

              cd /usr/local/mfs/etc/mfs/

              cp -a mfsmetalogger.cfg.sample mfsmetalogger.cfg        #日志文件

              vim mfsmetalogger.cfg

                  修改:

                          META_DOWNLOAD_FREQ = 2            #同步时间

                          MASTER_HOST = 192.168.10.100

              mfsmetalogger start

              lsof -i :9419        #查看端口状态,ESTABLISHED,正在传送数据

      MFS-chunk1服务器

              useradd mfs -s /sbin/nologin

              tar xf moosefs-3.0.84-1.tar.gz

              ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs

              make && make install

              chown -R mfs.mfs /usr/local/mfs/

              ln -s /usr/local/mfs/bin/* /usr/local/bin/

              ln -s /usr/local/mfs/sbin/* /usr/local/sbin/

              cd /usr/local/mfs/etc/mfs/

              cp mfschunkserver.cfg.sample mfschunkserver.cfg        #chunk文件,相当于集群节点

              vim mfschunkserver.cfg

                  修改:

      HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg

                          #声明磁盘文件定义位置

                          MASTER_HOST = 192.168.10.100

                          MASTER_PORT = 9420

              mkdir /mnt/sdb1

              cp -a mfshdd.cfg.sample mfshdd.cfg        #配置磁盘供给文件

      vim /usr/local/mfs/etc/mfs/mfshdd.cfg

      添加:

      /mnt/sdb1        #最后位置添加,记得添加硬盘

              fdisk /dev/sdb

              partprobe        #刷新

              mkfs.ext4 /dev/sdb1

              mount /dev/sdb1 /mnt/sdb1/

              chown -R mfs.mfs /mnt/sdb1/

              mfschunkserver start

              ps -ef | grep mfs

      MFS-chunk2服务器

              设置与1一样

      MFS-fuse客户机

              useradd mfs -s /sbin/nologin

      tar xf moosefs-3.0.84-1.tar.gz

              ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver && make && make install

              ln -s /usr/local/mfs/bin/* /usr/local/bin

              ln -s /usr/local/mfs/sbin/* /usr/local/sbin/

              mkdir /mnt/mfs

              mfsmount /mnt/mfs/ -H 192.168.10.100        #挂载MFS共享磁盘

              cd /mnt/mfs

              echo 1231123 > index.html

              chown -R mfs.mfs index.html

              mfsfileinfo index.html                            #具体查看文件备份个数

              mfsgetgoal index.html                            #查看文件备份个数

              mfsgettrashtime index.html                #查看文件保持时间

              mfssettrashtime 60000 index.html        #设置保存时间,要么0,要么大于6000秒

      测试:

                  误删除处理,垃圾回收站机制

                          rm -rf index.html

                          mfssettrashtime 64800 /mnt/mfs/test    #设置保存时间,要么0,要么大于6000秒

                          mkdir /back            #创建第三方挂载点

                          chown mfs.mfs /back

                          mfsmount -m /back -H 10.10.10.11        #-m指定元数据

                          cd /back

                          find . -name *txt*

                          mv 002/00000002\|1.txt /back/trash/undel/

                          umount /back

                          查看恢复文件

      快照功能        #相当于指针,不会占用多余的数据块

                          mkdir bb

                          chown mfs.mfs bb/

                          mfsmakesnapshot 1.txt bb/        #创建快照

                          cd bb/

                          ll

      冗余goal设置        #goal是备份文件次数

                          mfssetgoal 3 /mnt/mfs/test1        #设置test1文件备份次数

                          mfsgetgoal /mnt/mfs/test1        #查看test1文件的goal值

      mfsfileinfo /mnt/mfs/test1        #查看test1文件的具体goal值

      还原 master

                          复制log服务器的日志到master下:

                          scp * root@192.168.10.100:/usr/local/mfs/var/mfs/

                          mfsmaster start        #启动报错

                          mfsmaster -a            #-a自动修复,3.0以前是-u

      注意:

                  #恢复数据只要change.*.mfs的最后一个和metadata.mfs.back两个文件

                  #恢复需要停止mfsmaster程序后,执行mfsmetarestore -m和mfsmaster -ai修复

                  #备份时最好停止mfsmaster

  5. 集群监控
    1. cacti监控搭建

    NMS:网络管理系统

    收集数据

    snmp简单网络管理协议

                        V1:功能简单

                        V2:身份认证

                        V3:加密

    OID:身份认证标识,一串代码,确认索要收集的数据

    mibs:管理信息库,/usr/share/snmp/mibs可以查看文件内OID

    展示数据

    cacti    展示数据:

        绘图工具:RRDTOOL

        数据收集工具:SNMP

        框架:LAMP

                        图形展示:rrdtool

                        展示框架:cacti

    流量与性能监测为主:显示以前的信息,不报警

    http://www.cacti.net/

    准备环境:

            主服务器:导入cacti.iso ,yum -y install httpd mysql mysql-server mysql-devel libxml2-devel mysql-connector-odbc perl-DBD-MySQL unixODBC php php-mysql php-pdo

                                yum -y install gcc gcc-c++

            被监控机:导入cacti.iso ,yum -y install net-snmp net-snmp-utils lm_sensors

    主服务器

            yum -y install net-snmp net-snmp-utils net-snmp-libs lm_sensors    #如果需要监控自己,安装

    service mysqld start        #设置开机自启

            mysqladmin -uroot password 123

    service httpd start        #设置开机自启

    tar xf rrdtool-1.4.5.tar.gz        #安装图形展示

            ./configure --prefix=/usr/local            #会报错

            tar -xf cgilib-0.5.tar.gz        #接口处理函数

            cd cgilib-0.5

            make

            cp libcgi.a /usr/local/lib/

            cp cgi.h /usr/include/            #标准图函数

            yum -y install libart_lgpl-devel

            yum -y install pango-devel* cairo-devel*

            cd rrdtool-1.4.5

            ./configure --prefix=/usr/local

            make && make install

            tar xf cacti-0.8.7g.tar.gz        #安装展示框架

            mv cacti-0.8.7g /var/www/html/cacti

            cd /var/www/html/cacti

            patch -p1 -N < ~/cacti/data_source_deactivate.patch        #升级补丁

            patch -p1 -N < ~/cacti/graph_list_view.patch

            patch -p1 -N < ~/cacti/html_output.patch

            patch -p1 -N < ~/cacti/ldap_group_authenication.patch

            patch -p1 -N < ~/cacti/script_server_command_line_parse.patch

            patch -p1 -N < ~/cacti/ping.patch

            patch -p1 -N < ~/cacti/poller_interval.patch

            useradd runct        #添加检测数据的用户账户,更改权限,保证读写数据正常

            chown -R root.root ./

            chown -R runct.runct rra/ log/

            mysql -uroot -p

                设置:

    create database cactidb default character set utf8;

                        grant all on cactidb.* to 'cactiuser'@'localhost' identified by '123';

            mysql -u cactiuser -p cactidb < cacti.sql        #导入数据库文件

            vim include/config.php

                修改:

    $database_type = "mysql";

    $database_default = "cactidb";

    $database_hostname = "localhost";

    $database_username = "cactiuser";

    $database_password = "123";

    $database_port = "3306";

            vim /etc/httpd/conf/httpd.conf

                修改:

    DocumentRoot "/var/www/html/cacti"

    <Directory "/var/www/html/cacti">

    options None

    AllowOverride None

                        Order allow,deny

                        Allow from all

    </Directory>

    DirectoryIndex index.php index.html

            service httpd restart

            打开浏览器操作http://192.168.216.16/install

            snmpwalk -v 2c -c public 192.168.10.101 system        #测试数据获取连接

            php /var/www/html/cacti/poller.php        #启动php解析,使网页图片显示

            vim /etc/crontab

                添加:

    */5 * * * * root /usr/bin/php /var/www/html/cacti/poller.php &>/dev/null

            service crond start

            chkconfig crond on

            tar xf cacti-plugin-0.8.7g-PA-v2.8.tar.gz        #添加插件管理器Plugin Management

            cd cacti-plugin-arch/

            mysql -u cactiuser -p cactidb < pa.sql

            cd /var/www/html/cacti/

            patch -p1 -N < ~/cacti-plugin/cacti-plugin-arch/cacti-plugin-0.8.7g-PA-v2.8.diff

            cd plugins

            tar xf ~/cacti-plugin/monitor-0.8.2.tar.gz        #添加monitor插件

            mysql -u cactiuser -p cactidb < monitor/monitor.sql

            刷新浏览器,看看是否处理,重新添加插件

            chown -R apache.apache plugins        #web访问,设置apache权限

    被监控机

            vim /etc/snmp/snmpd.conf

                修改:

                        com2sec notConfigUser default public        #修改共同体

                        access notConfigGroup "" any noauth exact all none none        #修改all

                        view all included .1 80        #取消注释

    service snmpd start

    chkconfig snmpd on

    其它配置

    配置识别插件

    Utilities -- User Management -- admin -- Plugin Management -- save

    Configuration -- Plugin Management -- Actions 添加插件 (thold需单独点击)

    未出现图标,则:

    Utilities -- User Management -- admin -- View Thresholds 和 View Monitoring 打钩

    九、配置Monitor

    Configration -- setting -- misc -- 将最后一行改为Tiles -- save

    十、配置Thold

    Configration -- setting -- Thresholds -- Dead hosts Notifications 后 添加 告警邮箱

    From Email Address 后添加 指定发件人地址 -- 选中 send alerts as text 表示纯文本发送邮件

    十一、设置SMTP,DNS等

    Configration -- setting -- Mail/DNS -- 测试用的收信地址、SMTP、发送人邮件地址、发送人名称(Cacti_System)、120

    十二、添加检测项目

    Templates -- Threshold Templates -- ucd/net-CPU Usage-User -- High Threshold 设置为85

    告警阈值默认计量单位:

    cpu 使用率 为 百分比(不包含该值)

    网卡流量 Byte/s

    硬盘空间 KB

    内存占用 KB

    也可以设置多个告警项,同时可生效 如 内存低于50MB并且下载流量超过80MB/s

    十三、查看告警

    Management -- Thresholds -- thold

    1. nagios原理

      nagios

      绘图工具:PHP GD

      数据收集工具:脚本+插件

      框架:静态页面 + JS + perl

      服务与性能监测为主:当前状态监测,会报警,不显示以前状态http://www.nagios.org/

      报警等级: OK WARNING critical严重警告 unknown pending正在连接

      监控对象

      主机,主机组:windows必须要设置主机组

      服务/资源,服务组:CPU,内存

      联系人,联系人组:报警,发邮件

      时段:指定时间内监控,报警

      命令:通过定义不同命,令定义不同服务

      nagios core logic:核心进程

      plugin:插件管理器

      check_***:nagios默认的脚本命名方式

      check_xyz:主动发起扫描,部署对应的脚本或命令,收集数据

      check_by_ssh:服务器发起请求,客户机主动发起扫描,收集数据

      check_nrpe:用在类Unix之上,服务器发起请求,客户机主动发起扫描,收集数据

      snmp:无法收集的数据通过snmp收集

      NSCA:主动提交数据的,只能当辅助收集数据使用

      针对不同操作系统,nagios收集数据方式

      依赖拓扑图:把多台监控机定义成依赖关系,NMS监控一个设备收集报警信息

      flaping:定义报警阀值,默认三次

    2. nagios监控搭建

      准备环境

              主监控服务器:导入nagios.iso,yum -y install httpd gcc* glibc glibc-common *gd* php php-mysql openssl openssl-devel

              linux客户机:导入nagios.iso,yum -y install openssl openssl-devel gcc*

              windows客户机:看系统安装NSClient++-0.3.8-x64.msi

      主监控服务器

      useradd nagios

      groupadd nagcmd        #必须创建

              usermod -a -G nagcmd nagios        #添加组成员

              usermod -a -G nagcmd apache

              tar zxf nagios-3.1.2.tar.gz

              ./configure --with-command-group=nagcmd --enable-event-broker

              make all

              make install

              make install-init

      make install-config

              make install-commandmode

              make install-webconf

              htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin        #必须是nagiosadmin

              service httpd restart

              tar zxf nagios-plugins-1.4.15.tar.gz         #安装插件管理器

              cd nagios-plugins-1.4.15

              ./configure --with-nagios-user=nagios --with-nagios-group=nagios --with-mysql --enable-perl-modules

              make

              make install

              chkconfig --add nagios

              chkconfig nagios on

              /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg        #检查配置文件

              service nagios start

              浏览器登入:http://your_nagios_IP/nagios

              tar xf nagios-nrpe_2.8.1.tar.gz            #需要openssl

              ./configure --enable-ssl --with-ssl-lib=/usr/lib64/

              make all

              make install-plugin

              vim /usr/local/nagios/etc/objects/linux.cfg        #创建linux监控配置文件

                  添加:

      define host{

                           use         linux-server

                           host_name             linux/IP

                           alias         linux

                           address 192.168.10.101(客户端IP既被监控的IP)

                          }

                          define service{

                              use                 generic-service

                              host_name     linux

                              service_description     check-load

                           check_command     check_nrpe!check_load

                          }

                          define service{

                              use generic-service

                              host_name linux

                           service_description check-users

                           check_command check_nrpe!check_users

                          }

                          define service{

                              use generic-service

                              host_name linux

                              service_description         otal_procs

                              check_command     check_nrpe!check_total_procs

                          }

              vim /usr/local/nagios/etc/objects/commands.cfg

                  添加:

                          define command{

                              command_name check_nrpe

                              command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$

                          }

              vim nagios.cfg

                  添加:

      cfg_file=/usr/local/nagios/etc/objects/linux.cfg

              /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

              service nagios restart

      linux 端监控

      useradd nagios

              tar zxf nagios-plugins-1.4.15.tar.gz

      #为了安装 nrpe,先安装 nagios-plugins-1.4.15.tar.gz 插件

              cd nagios-plugins-1.4.15

              ./configure --with-nagios-user=nagios --with-nagios-group=nagios

              make all

              make install

              tar -zxvf nrpe-2.8.1.tar.gz

              ./configure --enable-ssl --with-ssl-lib=/usr/lib64/

              make all

              make install-plugin

              make install-daemon

              make install-daemon-config

              vim /usr/local/nagios/etc/nrpe.cfg

                  修改:

      allowed_hosts=192.168.10.100,127.0.0.1        #添加服务器IP

              /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d    #检测是否有误并且运行

      windos 端监控

      被监控端安装 NSClient++-0.3.8-Win32.msi

      在监控服务器上修改:

      vim /usr/local/nagios/etc/agios.cfg

          取消注释:

      cfg_file=/usr/local/nagios/etc/objects/windows.cfg

      vim /usr/local/nagios/etc/objects/windows.cfg

          修改IP:

      address 192.168.10.1        #被监控IP

    3. zabbix监控

      原理

      zabbix    是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 ( 基于 GPL V2 ),必须以源码包形式售卖

      Zabbix:可用通过图像展示需要保留的任何数据,以及通过触发器设置对应服务、资源的可控性

      zabbix由 2 部分构成,zabbix server与可选组件zabbix agent

                      收集数据方式:C/S、SNMP

                      绘制图像工具:PHP-GD

                      展示平台:LAMP

      五个主要程序

      zabbix 安装完成后会产生 5 个程序:zabbix_agentd,zabbix_get、zabbix_proxy,zabbix_sender,zabbix_server,zabbix_java_gateway是可选,这个需要另外安装

      zabbix_agentd:客户端守护进程,此进程收集客户端数据,例如 cpu负载、内存、硬盘使用情况等

      zabbix_get:zabbix 工具,单独使用的命令,通常用于排错

      zabbix_sender:zabbix工具,用于发送数据给 server 或者 proxy ,在脚本完成之后使用 sender 主动将数据提交

      zabbix_server:zabbix 服务端守护进程,所有的数据都是被提交或主动提交到 zabbix_server 端

      zabbix_proxy:zabbix代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到server里

      zabbix_java_gateway:zabbix2.0之后引入的一个功能。顾名思义:Java网关,类似agentd,但是只用于Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy

      安装准备:

              主服务器:

              客户机1:

              客户机2:

              ......

              windows客户机

      主服务器(rh7)

              systemctl stop firewalld

              systemctl disable firewalld

              setenforce 0

              sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

              wget http://mirrors.163.com/.help/CentOS7-Base-163.repo        #或导入CentOS7-Base-163.repo

              yum clean all

              yum makecache

              yum -y install mariadb mariadb-server httpd php php-mysql

              systemctl start httpd

              systemctl enable httpd

              systemctl enable mariadb

              systemctl start mariadb

              mysql_secure_installation        #初始化数据库,并设置密码

              rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm

              #或导入zabbix-release-3.2-1.el7.noarch.rpm

              rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX        #yum认证

              yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent    #或导入已有安装包

              mysql -u root -p

                  设置:

      CREATE DATABASE zabbix DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

                      grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';

              cd /usr/share/doc/zabbix-server-mysql-3.2.11/

              zcat create.sql.gz | mysql -uroot -p zabbix        #解压并导入数据库

              vim /etc/zabbix/zabbix_server.conf

                  修改:

      DBHost=localhost

                          DBName=zabbix

                          DBUser=zabbix

                          DBPassword=zabbix

              systemctl start zabbix-server

              systemctl enable zabbix-server

              vim /etc/httpd/conf.d/zabbix.conf        #可以修改zabbix网页配置文件,最好不更改

                  修改:

                          php_value max_execution_time 300

                          php_value memory_limit 128M

                          php_value post_max_size 16M

                          php_value upload_max_filesize 2M

                          php_value max_input_time 300

                          php_value always_populate_raw_post_data -1

                          php_value date.timezone Asia/Shanghai

              yum -y install ntpdate        #配置时间同步器,参考之前的

              ntpdate cn.pool.ntp.org        #同步网络时间

              systemctl restart httpd

              浏览器:http://192.168.231.100/zabbix        #用户名Admin,密码数据库密码

      客户机1

              导入zabbix-agent-3.2.6-1.el6.x86_64.rpm

      yum -y install zabbix-agent-3.2.6-1.el6.x86_64.rpm

      vim /etc/zabbix/zabbix_agentd.conf

                  修改:

      Server= 192.168.231.100

                          ServerActive= 192.168.231.100

                          Hostname=192.168.231.10

              service zabbix-agent start

              chkconfig zabbix-agent on

              添加主机:配置-主机-创建主机-主机名称--可见名称--添加或创建组--IP地址

                                  模板-选择- Template ICMP Ping- Template OS Linux-选择-添加-添加

      客户机2

              与客户机配置一样

      windows客户机

              解压zabbix_agents_3.2.0.win (1).zip

              移动到C盘改名为zabbix

              修改conf下文件,与linux设置一样

              打开cmd命令提示符

                  设置:

                          c:\ zabbix\bin\win64\zabbix_agentd.exe -c c:\ zabbix\conf\zabbix_agentd.win.conf -i

          #将进程添加到

                          c:\ zabbix\bin\win64\zabbix_agentd.exe -c c:\ zabbix\conf\zabbix_agentd.win.conf -s

      #开启服务

              web监控网站上添加windows规则

      更改为中文

              点击右上角人头-language-Chinese-uptake

      解决乱码问题

              Win+R    >    fonts    >    拷贝微软雅黑字体改名为 msyh.ttf > /usr/share/zabbix/fonts

              chmod 755 msyh.ttf

      vim /usr/share/zabbix/include/defines.inc.php

          修改:

      define('ZBX_GRAPH_FONT_NAME', 'msyh');

      设置报警声音

              点击右上角人头-正在发送信息-前端信息中-播放声音-勾选所有

      配置 web 场景

      配置-主机-应用集-创建应用集-web场景-创建web场景-名称-应用集-客户端-步骤-名称-URL-要求的状态码

      触发器-创建触发器-名称-严重性-表达式添加-监控项-选添加的场景(数字类型)-功能(不等于)-N(200)-表达式(and 012)-可写描述

      配置自动发现规则

              准备多台已经按照agent的客户机,修改过配置文件,以便自动查找到

              配置-自动发现-创建发现规则-名称-IP范围-延时(5)-检查(ICMP ping)-启用关闭-添加

              配置-动作-事件源(自动发现)-创建动作-名称-触发条件(主机IP)(主机在线>=5)-计算方式(和)-操作(删除内容)-新的(主机)(主机组)(与模板关联ping linux)(启用主机)-添加-启用自动发现规则

      配置监控 Nginx 并发量脚本(自定义脚本)

              安装nginx,配置status模块

              ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

      vi /usr/local/nginx/conf/nginx.conf

      location /abc {

      stub_status on;

      }

      导入脚本nginx-status.sh

      在客户端添加自定义脚本规则,放入/etc/zabbix/zabbix_agentd.d/

      vim /etc/zabbix/zabbix_agentd.conf

          修改:

      UnsafeUserParameters=1

      UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.d/nginx-status.sh $1

              service zabbix-agent restart

              chkconfig zabbix-agent on

      在服务器端安装zabbix-get

              zabbix_get -s 192.168.231.10 -k 'nginx.status[ping]'        #测试客户端

              浏览器:配置-模板-导入-选择文件

              配置-主机-创建主机-名称-组-IP地址-模板-选择(导入的那个,linux,ping)-添加-添加

      配置聚合图形

      监测中-聚合图形-名称-添加-选择(设置的名称)-编辑聚合图形

      链接钉钉报警

              vim /etc/zabbix/zabbix_server.conf

                      查看:

      AlertScriptsPath=/usr/lib/zabbix/alertscripts        #查看脚本放入位置

      导入脚本token.sh到/usr/lib/zabbix/alertscripts

              复制钉钉机器人密码,更改脚本

              chmod +x token.sh

              浏览器:管理-报警媒介类型-创建媒介类型-名称-类型(脚本)-脚本名称-(导入的脚本)-脚本参数-{ALERT.SENDTO}-添加-{ALERT.SUBJECT}-添加-{ALERT.MESSAGE}-添加

              配置-动作-事件源(触发器)-创建动作-名称-新的触发条件(>=,触发器示警度,警告)-添加-计算方式(和)-操作-默认接收人(故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!)-默认信息(

      告警主机:{HOSTNAME1},告警时间:{EVENT.DATE} {EVENT.TIME}

      告警等级:{TRIGGER.SEVERITY}

      告警信息: {TRIGGER.NAME}

      告警项目:{TRIGGER.KEY1}

      问题详情:{ITEM.NAME}:{ITEM.VALUE}

      当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

      事件 ID:{EVENT.ID}

      )-操作-新的-步骤持续事件(60)-操作类型(发送信息)-发送到用户群组-发送到用户-仅送到(钉钉)-添加-恢复操作-与之前一样(

      恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!

      告警主机:{HOSTNAME1}

      告警时间:{EVENT.DATE} {EVENT.TIME}

      告警等级:{TRIGGER.SEVERITY}

      告警信息: {TRIGGER.NAME}

      告警项目:{TRIGGER.KEY1}

      问题详情:{ITEM.NAME}:{ITEM.VALUE}

      当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

      事件 ID:{EVENT.ID}

      )-添加-添加

      管理-用户-admin-报警媒介-类型-收件人(手机号)-取消(未分类,信息)-添加-更新

  6. 网络批量装机
    1. PXE

    原理:

    网卡支持:PXE协议,自带网卡ROM,记录DHCP客户端,TFTP客户端,PXE客户端DHCP只能是服务器搭建的,不能用其他网络设备,因为需要记录TFTP的IP

    PEXlinux.0:引导文件目录,系统镜像中存在这个目录,才能使用网络批量安装

    pexlinux.cfg:linux安装配置文件是linux初始安装界面

    vmlinuz:虚拟内存压缩的运行空间,相当于PE,在内存中运行

    initrd.img:最基础的文件系统,用于运行vmlinuz

    准备环境

            主服务器:有图形化环境,yum -y install vsftpd dhcp tftp syslinux tftp-server

    主服务器

            cd /var/ftp/pub/

            mkdir dvd

            chown ftp.ftp dvd/

            cp -a /mnt/dvd/* dvd/

            vim /etc/dhcp/dhcpd.conf

                添加:

                        subnet 192.168.10.0 netmask 255.255.255.0 {

        range 192.168.10.50 192.168.10.60;

    option routers 192.168.10.100;

    next-server 192.168.10.100;        #TFTP服务端地址

    filename "pxelinux.0";                 #iso镜像引导目录,名字固定

    }

            vim /etc/xinetd.d/tftp

                修改:

                        server_args = -s /tftpboot            #指定tftp目录

                        disable = no

    mkdir -p /tftpboot/pxelinux.cfg

            cp /var/ftp/pub/dvd/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default    #系统安装信息

            cp /usr/share/syslinux/pxelinux.0 /tftpboot/

            chmod 644 /tftpboot/pxelinux.cfg/default

            cp /var/ftp/pub/dvd/isolinux/* /tftpboot/

            service dhcpd restart

            chkconfig dhcpd on

            service xinetd restart        #tftp被xinetd管理

            chkconfig xinetd on

            service vsftpd restart

            chkconfig vsftpd on

            vim /tftpboot/pxelinux.cfg/default

                修改:

                        default linux

                        append initrd=initrd.img ks=ftp://192.168.10.100/pub/ks.cfg #指定vsftp位置

            yum -y install system-config-kickstart        #图形化安装信息文件包

    进入图形化操作

    system-config-kickstart

        修改:

                基本配置:root密码

                                    安装后重新引导

                安装方法:FTP安装

                        FTP服务器:ftp://192.168.10.100

                        FTP目录:pub/dvd

                引导装载:安装新引导

                                    MBR

                分区信息:清除主引导记录

                                    删除所有分区

                                    初始化磁盘标签

                                    添加新布局        #磁盘分区

                防火墙:禁用

                软件包选择:随便选一个

                安装后脚本:/bin/bash

                                        touch /root/1.txt

    保存退出

            vim anaconda-ks.cfg        #复制软件包到生成的ks.cfg中

            cp ks.cfg /var/ftp/pub/

    保证需要在同一个广播域中

    1. cobbler

      Cobbler

      一、cobbler 简介

      Cobbler是一款自动化操作系统安装的实现,与PXE安装系统的区别就是可以同时部署多个版本的系统,而PXE只能选择一种系统

      二、cobbler 的安装

      yum install -y epel-release            #安装yum源,需要联网,更新太快

      yum install -y cobbler cobbler-web pykickstart debmirror

      systemctl restart httpd

      systemctl restart cobblerd

      netstat -an | grep 25151

      vim /etc/cobbler/settings

          修改:

      server 服务器IP

      next_server 服务器IP

      cobbler get-loaders            #将配置文件同步到应该所在的目录下

      systemctl enable rsyncd

      vim /etc/debmirror.conf

          注释:

      #@dists="sid";

      #@arches="i386";

      openssl passwd -1 -salt $(openssl rand -hex 4)        #系统加密方案与cobbler一致

      vim /etc/cobbler/settings

          修改:

      default_password_crypted 加密字符串

      yum install cman fence-agents        #安置栅设备软件,隔离已安置的系统

      yum -y install xinetd            #centos7中默认没安装xinetd服务

      vim /etc/xinetd.d/tftp

          修改:

      disabled改为no

      systemctl restart cobblerd

      cobbler sync        #同步文件

      cobbler check

      yum install -y dhcp

      vim /etc/dhcp/dhcpd.conf

          添加:

      option domain-name "chinasoft.com";

      option domain-name-servers 114.114.114.114,8.8.8.8;

      default-lease-time 43200;

      max-lease-time 86400;

      log-facility local7;

      subnet 20.0.0.0 netmask 255.0.0.0 {

      range 20.20.10.10 20.20.10.240;

      option routers 20.20.20.20;

      }

      next-server 20.20.20.20;

      filename="pxelinux.0";

      systemctl restart dhcpd

      systemctl enable tftp

      systemctl enable dhcpd

      systemctl start tftp

      systemctl restart cobblerd

      mount /dev/cdrom /media

      cobbler import --name="centos6.5-x86_64" --path=/media/        #自动导入系统镜像

      #可以通过访问:http://IP/cobbler/ 看到文件列表,复制镜像共享路径

      vim centos6.5-x86_64.cfg

          修改:

              usr --usrl="网页镜像路径"

      cobbler distro list        #查看ks文件列表,默认有一个自带的

      cobbler profile remove --name ks文件名        #删除ks文件

      cp centos6.5-x86_64.cfg /var/lib/cobbler/kickstarts/

      cd /var/lib/cobbler/kickstarts/

      cobbler profile add --name=centos6.5-x86_64-basic --distro=centos6.5-x86_64 --

      kickstart=/var/lib/cobbler/kickstarts/centos6.5-x86_64.cfg

      #指定ks名称,指定镜像名称,之前上传的名称,指定ks文件路径

      cobbler profile list

      cobbler sync

      cobbler profile remove --name=centos6.7-x86_64        #删除ks文件

      cobbler distro remove --name=centos6.7-x86_64        #删除镜像

      注:不同的ks文件可以指向相同的镜像,修改ks文件内容,可用脚本添加装机服务

  7. 防火墙配置
    1. 防火墙简介

    防火墙:工作在主机边缘处或网络边缘处对进出的数据报文根据规则处理的模块或者机制, 从而保护网络的安全

    作用对象:IP地址,MAC地址,端口,协议类型,数据包中的数据

    防火墙分类

            功能分类

                    基础类防火墙:根据数据包报文的结构特征进行对应处理的模块

                            IDS 防火墙:入侵检测系统 提供事后分析(跳板机,堡垒机)

                            IPS 防火墙:入侵防御系统 拦截问题数据报文,防护涉及范围广(防毒墙)

                    主动类防火墙:只防御一种应用程序

                            waf:web应用程序防火墙

                            daf:数据库应用程序防火墙

                            ddos攻击抵御

    结构分类

                    软件:360、iptables

                    硬件:网御 深信服 360网擎

    工作模式分类

                    包过滤防火墙:mac port ip status

                    应用层防火墙:huostname url

    性能指标:吞吐量,温度

    1. iptables简介

      工作层级

      netfilter是内核态模块,位于Linux内核中的包过滤功能体系

      iptables用户态工具,位于/sbin/iptables,用来管理防火墙规则的工具

      centos6:用户态iptables,用户态netfilter    

      centos7:用户态firewalld,用户态netfilter

      规则

              自定义规则:ACCEPT 、 REJECT 、 DROP 、SNAT

              默认规则(缺省值、兜底):ACCEPT DROP

      顺序

      规则顺序:自上而下依次匹配,匹配即停止

              书写规则顺序:有相关,小的放前。无相关,大的放前

              表的顺序:raw > mangle > nat > filter

              链的顺序

                      入站:PREROUTING > INPUT

                      出站:     OUTPUT > POSTROUTING

                      转发:PREROUTING > FORWORD > POSTROUTING

      链:承载规则的地方

                  INPUT:处理入站数据包

                  OUTPUT:处理出站数据包

                  FORWORD:处理转发数据包

                  POSTROUTING:在进行路由选择后处理数据包 DNAT

                  PREROUTING:在进行路由选择前处理数据包 SNAT

          表:承载链

                  raw:路由跟踪

                  mangle:标记、修改

                  nat:路由转换

                          SNAT:利用单独公网 IP 给内网用户提供访问公网的能力

                          DNAT:端口映射

                  filter:数据报文过滤

    2. iptables命令

      iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]

              注:不指定表名时,默认指filter表

      不指定链名时,默认指表内的所有链

      除非设置链的默认策略,否则必须指定匹配条件

      选项、链名、控制类型使用大写字母,其余均为小写

      如果系统被重新引导,这些规则就会自动被清除并重设。

      sbin/service iptables save

      保存在 /etc/sysconfig/iptables

      控制类型

              ACCEPT:允许通过

      DROP:直接丢弃,不给出任何回应

      REJECT:拒绝通过,必要时会给出提示

      LOG:记录日志信息,然后传给下一条规则继续匹配

      SNAT:修改数据包源地址

      DNAT:修改数据包目的地址

      REDIRECT:重定向

      -t 指定要使用的表

      例:

                iptables -A INPUT -p tcp --dport 80 -j DROP        #最后添加规则,丢弃80端口数据包

                iptables -I INPUT -p tcp --dport 443 -j ACCEPT        #最前添加规则,放行443端口数据包

                iptables -I INPUT 3 -p tcp --dport 44 -j ACCEPT        #添加规则到第三行

                iptables -L -n -v --line-numbers            #查看防火墙规则

                iptables -D INPUT 3                #删除指定行规则

                iptables -t filter -P INPUT ACCEPT        #修改指定链默认规则,只能改为ACCEPT,DROP

    通用匹配

    可直接使用,不依赖于其他条件或扩展

    包括网络协议、IP地址、网络接口等条件

    常见的通用匹配条件

    协议匹配:-p 协议名

    地址匹配:-s 源地址、-d 目的地址

    接口匹配:-i 入站网卡、-o 出站网卡

    例:

    # iptables -A FORWARD -s 192.168.1.11 -j REJECT

    # iptables -I INPUT -s 10.20.30.0/24 -j DROP

    # iptables -I INPUT -p icmp -j DROP                                #禁止所有icmp

    # iptables -A FORWARD -p ! icmp -j ACCEPT                 #除icmp其它都可以

    # iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP

    隐含匹配

    要求以特定的协议匹配作为前提

    包括端口、TCP标记、ICMP类型等条件

    常用的隐含匹配条件

    端口匹配:

    --sport 源端口、--dport 目的端口

    ICMP类型匹配:--icmp-type ICMP类型

    例:

    # iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT

    # iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT

    # iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT        #0回显

    # iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT        #3目的主机无响应

    #组成拒绝其它icmp,主机可以ping其它主机

    # iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

    #组成拒绝其它icmp,主机可以ping其它主机,可以只配这一条

    # iptables -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT    #允许ping

    显式匹配

    要求以"-m 扩展模块"的形式明确指出类型

    包括多端口、MAC地址、IP范围、数据包状态等条件

    常用的显式匹配条件

    多端口匹配:    -m multiport --sport 源端口列表

        -m multiport --dport 目的端口列表

    IP范围匹配:    -m iprange --src-range IP范围

    MAC地址匹配:-m mac –mac1-source MAC地址

    状态匹配:-m state --state 连接状态

    # iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT

    # iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT

    # iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP

    # iptables -I INPUT -p tcp -m multiport --dport 80-82,85 -j ACCEPT

    # iptables -I INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

    #ESTABLISHED正在连接,RELATED相关连接

    # iptables -I INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

    #放在规则第一条可以加快访问速度

    1. SNAT/DNAT应用

      SNAT策略的典型应用环境

      局域网主机共享单个公网IP地址接入Internet

      SNAT策略的原理

      源地址转换,Source Network Address Translation

      修改数据包的源地址

      前提条件

      局域网各主机正确设置IP地址/子网掩码

      局域网各主机正确设置默认网关地址

      Linux网关支持IP路由转发

      开启sysctl路由转发

      实现方法:编写SNAT转换规则

      iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31

      地址伪装

      MASQUERADE —— 地址伪装

      #适用于外网 IP地址 非固定的情况(真是环境应该用)

      #对于ADSL 拨号连接,接口通常为 ppp0、ppp1

      #将SNAT规则改为 MASQUERADE 即可

      iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

      DNAT策略的典型应用环境

      在Internet中发布位于企业局域网内的服务器

      DNAT策略的原理

              目标地址转换,Destination Network Address Translation

      修改数据包的目标地址

      前提条件

      局域网的Web服务器能够访问Internet

      网关的外网IP地址有正确的DNS解析记录

      开启sysctl路由转发

      实现方法

      编写DNAT转换规则

      iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6

      发布时修改目标端口

      在DNAT规则中以"IP:Port"的形式指定目标地址

      iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.1.6:22

    2. Centos7更改Firewalliptables

      yum -y install iptables-services

      systemctl start iptables

      systemctl enable iptables

  8. selinux

    SELinux是Linux的一个扩张强制访问控制的安全模块

    SELinux=NSA(MAC)+Linux

            NAS:美国国家安全局

            MAC:强制访问控制,能够保证每一个进程都运行在安全的最小集合的状态下—>最小权限集合

    发展:

            2.2à需要手动加载的一个外部模块

            2.4à直接写到内核的一个模块

            2.6à成为了一部分Linux发行版的内核的一部分

    特性:

    在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯通道、套接字、网络主机等)主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文

    四层防御控制

            iptables:应用在内核

            selinux:操作繁琐

            tcpwarpper:应用在用户空间,浪费资源

    acl:应用在用户空间,浪费资源

    控制类型

            强制访问控制:在rwx后,还要匹配规则库

            任意访问控制:rwx 拥有就能够执行对应功能

    用户:角色:类型,

    chcon [-R] [-t type] [-u user] [-r role] 文件

    选项与参数:

         -R :连同该目录下的次目录也同时修改;

         -t :后面接安全性本文的类型字段!

         -u :后面接身份识别,例如 system_u;

         -r :后面接角色,例如 system_r;

    例:chcon -R -t httpd_sys_content_t /data         #修改类型

    selinux(行为控制工具,对内部应用)

    注:因为seLinux是内核等级设置,需要重启系统才能生效

    配置文件位置:/etc/selinux/config

    setenforce 0                    #临时关闭防护,0是半关闭,1是开启

    SELINUX=enforcing        #开启防护

    SELINUX=disabled            #关闭防护

    SELINUX=permissive        #清空规则设置

    getenforce         #查看当前selinux状态

    ll -Z                 #查看当前用户,角色,类型,类型一致才能访问

    restorecon         #还原成原有的SELinux type

    格式:restorecon [-Rv] 档案或目录

    选项与参数:

         -R :连同次目录一起修改;

         -v :将过程显示到屏幕上

    Managing Boole(管理SElinux布尔值)

    SEliux布尔值就相当于一个开关,精确控制SElinux对某个服务的某个选项的保护

    getsebool -a            #命令列出系统中可用的SELinux布尔值

    setsebool –p samba_enable_home_dirs=1            

    #开启家目录共享,setsebool命令用来改变SELinux布尔值

    #如果对服务,查看目录类型可以查看配置文件

  9. 虚拟化技术
    1. 原理

      虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率,解决服务器的资源浪费

    分类

    全虚拟化技术

    完全虚拟化技术又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(Full Virtualization)技术,它在虚拟机(VM)和硬件之间加了一个软件层--Hypervisor,或者2VMM)

    1、hypervisor 直接运行在物理硬件之上 - KVM 硬件需要支持虚拟化,效率达到98%

    2、hypervisor 运行在另一个操作系统中 - QEMU 和 WINE,不需要硬件支持虚拟化,由内核提供的虚拟化机制

    半虚拟化技术

    也叫做准虚拟化技术。它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要Hypervisor耗费一定的资源进行翻译操作,因此Hypervisor的工作负担变得非常的小,因此整体的性能也有很大的提高。

    寄居架构

    就是在操作系统之上安装和运行虚拟化程序,依赖于主机操作系统对设备的支持和物理资源的管理;

    优点:简单,便于实现

    缺点:安装和运行应用程序依赖于主机操作系统对设备的支持

    举例:GSX Server, VMware Server, Workstation

    裸金属架构

    就是直接在硬件上面安装虚拟化软件,再在其上安装操作系统和应用,依赖虚拟层内核和服务器控制台进行管理

    优点:虚拟机不依赖于操作系统,可以支持多种操作系统,多种应用,更加灵 活

    缺点:虚拟层内核开发难度较大

    举例:VMWare ESX Server

    1. vmware EXSI安装和应用

      安装环境

                  服务器:安装VMware-VMvisor-Installer-6.0.0-2494585.x86_64

                  客户机:安装VMware-viclient-all-6.0.0

      服务器

              配置网卡IP,6版本必须设置网关

      客户机

                破解输入密钥:清单--配置--已获得的许可--添加

            添加虚拟机:清单--地址池--添加虚拟机

            添加镜像方法1:清单--系统--光驱(读取本地主机镜像)

            添加镜像方法2:清单--地址池--配置--存储(浏览数据存储)--创建文件夹--上传镜像(镜像存储于虚拟机内)

            资源分配(把系统分给不同的用户管理):清单--地址池--新建资源分配--将系统拉入资源池--地址池--用户--添加--主页--角色--添加角色(赋给权限)--主页--资源池--权限--添加权限

            虚拟机通电自启动:清单--配置--虚拟机启动/关机--属性(修改启动延时和启动类型)

            添加网桥(交换机):清单--配置--网络--添加网络(下一步)--属性--添加网卡(可以用来做san网络,分担网络压力)

            查看性能与生成报表:清单--性能--选择查看类型--保存

            直通设备:把硬件直接交给虚拟机使用

  10. 容器虚拟化
    1. docker原理

    云计算软件

            IaaS:基础设施及服务(花对应的钱买的对应的容器,安装好操作系统的云主机)

            PaaS:平台及服务(购买到一个已经部署好运行环境的云主机)

            SaaS:软件及服务(购买后可以通过b/s方式访问对应服务)

    Docker来源

    Docker 是 dotcloud 公司开源的一款产品 dotcloud 是 2010 年服务,新成立的一家公司,主要基于 Paas ( Platfrom as a Service ) 平台为开发者提供,2013 年 10 月 dotcloud 公司改名为 Docker 股份有限公司

    Docker定义

    Linux Container 是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源

    Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC(Linux Container) 的高级容器引擎,源代码托管在 Github 上, 基于 GO (GO天生支持对并发)语言并遵从 Apache2.0 协议开源,开发的一款管理引擎

    Docker 与 传统虚拟化的差异

        vmm    docker

    内核级别的隔离                                                容器级别的隔离

                浪费大量资源(虚拟系统)                            基本不消耗资源(相当于进程消耗的资源)

            独立lib库                                                            共享内核的lib库

            耗时                                                                    快速

    Docker 自身组件

    容器:已经运行的虚拟机,已经运行的环境(镜像在Docker中运行)

    镜像:封装的运行环境

    仓库:存放镜像的地方(网易蜂巢或官方https://hub.docker. com)

    Docker运行环境

            docker只能运行在linux中

            最好按照在centos7中

            所有软件需要更新

    Docker特性与运行方式

            镜像下载有层级关系

    最大不超过128层

            上层优先级大于下层(数据读取会自上而下,哪个先获取,就是哪个设置)

    已有的分层只能读不能修改

    运行容器:至少拥有一个位于前台的进程,否则会退出

    1. Docker安装

      第一种安装方法:

      添加 Docker 源,并安装

      cat >/etc/yum.repos.d/docker.repo <<-EOF

      [dockerrepo]

      name=Docker Repository

      baseurl=https://yum.dockerproject.org/repo/main/centos/7 enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF

      yum install docker-engine

      yum install docker

      第二种安装方法:

      更新操作系统至最新内核(非必要): yum update

      执行 Docker 安装脚本: curl -sSL https://get.docker.com/ | sh

      启动 Docker 服务

      systemctl start docker

      systemctl enable docker

      docker run hello-world        #检查安装成功

      docker ps        #显示正在运行的容器

      docker ps -a        #显示所有容器,容器名,镜像名

      #后台进程运行前台方法,tailf、daemon off

      docker run hello-world        #下载镜像

      docker rm 容器名称        #删除容器,容器ID不需要写全,3-4位即可

      加速器安装

              阿里云Docker官网:https://dev.aliyun.com/search.html        #注册账号

      cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service        #配置文件

      chmod 777 /etc/systemd/system/docker.service

      vim /etc/systemd/system/docker.service

          添加:

      ExecStart=/usr/bin/dockerd-current --registry-    mirror=https://kfp63jaj.mirror.aliyuncs.com

      #老版本docker与新版本有些不一样

      systemctl daemon-reload        #重新加载进程,才能生效

      systemctl restart docker

      ps -ef | grep docker            #查看进程,验证是否生效

      安装wordpress博客

      WordPress 运行环境需要如下软件的支持:

      PHP 5.6 或更新软件

      MySQL 5.6 或 更新版本

      Apache 和 mod_rewrite 模块

      docker pull mariadb

      docker pull wordpress

      docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb

      #name命名,env环境变量,d放入后台运行

      docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress

      #容器每次启动会随机分配一个IP地址,link绑定数据库,wordpress依赖mariadb,mariadb先启动,p是DNAT

      安装GitLab

      #版本控制器,面向开发,代码多个主线,在主线上开放支线,开发人员在支线上修改代码,测试成功后与主线合并进行发布

      支持的软件:

      postgresql

      redis 缓存服务

      gitlab 服务

      启动 postgresql:

      docker run --name gitlab-postgresql -d \

      --env 'DB_NAME=gitlabhq_production' \

      --env 'DB_USER=gitlab' --env 'DB_PASS=password' \
      sameersbn/postgresql:9.4-12

      启动 Redis:

      docker run --name gitlab-redis -d sameersbn/redis:latest

      启动 gitlab:

      docker run --name gitlab -d \

      --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \

      --publish 10022:22 --publish 10080:80 \

      --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \

      --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \

      sameersbn/gitlab:8.4.4        #系统默认用户名:root 密码:5iveL!fe

    2. Docker常用命令

    Docker 三个重要概念:仓库 (Repository)、镜像 (image) 和 容器 (Container)

    docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress

    Docker 指令的基本用法:

    docker + 命令关键字(COMMAND) + 一系列的参数

    docker info                #显示守护进程的系统资源

    #storage Driver存储驱动版本,overlay2第二版分层文件系统,稳定,效率高,可修改

    docker search imageID            #Docker 仓库的查询,用户名/镜像名:版本,最好选官方的

    docker pull imageID                #Docker 仓库的下载

    docker images                        #Docker 镜像的查询

    docker rmi imageID/镜像名:版本    #Docker    镜像的删除,-f强制删除

    docker ps                                            #正在运行容器的查询,-a查询所有容器

    docker run                                            #容器的创建启动

    docker start/stop 容器别名/ID            #容器启动停止

    docker load -i 镜像名                        #导入镜像

    # Docker 指令除了单条使用外,还支持赋值、解析变量、嵌套使用

    单一容器管理

    #每个容器被创建后,都会分配一个 CONTAINER ID 作为容器的唯一标示,后续对容器的启动、停止、修改、删除等所有操作,都是通过 CONTAINER ID 来完成,偏向于数据库概念中的主键

    docker ps --no-trunc                            #查看完整版本的容器ID号

    docker stop/start CONTAINERID     #停止

    docker run --restart=always             #容器的自动启动

    docker ps -a -q                                    #只查看容器ID

    docker rm $(docker ps -a -q)                #删除所有容器,-f强制删除

    docker start/stop MywordPress         #通过容器别名启动/停止    

    docker inspect MywordPress         #查看容器所有基本信息,网桥IP和docker IP

    docker logs MywordPress                 #查看容器日志

    docker stats MywordPress             #查看容器所占用的系统资源

    docker exec 容器名 容器内执行的命令     #容器执行命令

    docker exec -it 容器名 /bin/bash                 #登入容器的bash

    远程ssh连接方法

            docker exec -it 容器名 /bin/bash

            安装passwd服务,修改密码

            修改ssh远程连接配置,开启密码认证

            开启容器,使用DNAT转换 任意端口:22

            连接:ssh 服务器IP 任意端口

    多容器管理

    Docker 提倡理念是 "一个容器一个进程",假设一个服务需要由多个进程组成,就需要多个容器组成一个系统,相互分工和配合对外提供完整服务

    Docker compose:容器编排工具,允许用户在一个模板(YAML格式)中定义一组相关联的容器,会根据 --link 等参数,对启动的优先级进行排序

    Docker compose 的安装:

    curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-uname -m` > /usr/local/bin/docker-compose

    chmod +x /usr/local/bin/docker-compose

    docker-compose --version

    mv wordpress.yml wordpress.yaml

    cd /root/wordpress && docker-compose up -d         #创建启动项目,到docker-compose.yaml所在目录下执行

    cd /root/wordpress && docker-compose start            #启动项目

    cd /root/wordpress && docker-compose stop            #关闭项目

    镜像管理

    容器创建时需要指定镜像,每个镜像都由唯一的标示 ImageID,和容器的 ContainerID一样,默认128位,可以使用前 16 为缩略形式,也可以使用镜像名与版本号两部分组合唯一标示,如果省略版本号,默认使用最新版本标签(latesr)

    镜像的分层:Docker 的镜像通过联合文件系统(union filesy stem)将各层文件系统叠加在一起

    docker history 镜像名         #查询镜像的分层

    docker history --no-trunc history     #显示完整的历史命令

    docker save 镜像 ID > /home/xxx.tar #镜像的导出

    docker load < /home/xx.tar                         #镜像的导入,镜像名和标签会消失

    #恢复镜像名,重新下载镜像,相同层级不会下载

    docker save -o mysql5.7.tar imagename:tag        #镜像的导出,老版本可用,新版本不一定

    docker load -i centos6-tools.tar                     #导入镜像,老版本可用,新版本不一定

    1. dockerfilecommit

      Dockfile是一种被 Docker 程序解释的脚本,Dockerfile 由一条一条的指令组成,每条指令对应 Linux 下面的一条命令。Docker 程序将这些Dockerfile 指令翻译真正的 Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于 Makefile 。Docker 程序将读取 Dockerfile ,根据指令生成定制的 Image

      docker commit 容器ID 仓库/镜像名:版本            #容器转为镜像,镜像名自定义,需要小写

           #commit封装容器进程会关闭

      docker build -t 镜像名:版本 dockerfile文件路径        #用于启动有dockerfile文件的镜像

      FROM(指定基础image)

      构建指令,必须指定且需要在Dockerfile其它指令的前面,后续指令都依赖于该指令指定的image,FROM指定的基础image可以是远程官方仓库,也可以是本地仓库

      example:

              FROM centos:7.2

              FROM centos

      MAINTAINER(用来指定镜像创建者信息)

      构建命令,用于将image的制造者相关的信息写入到image中,当我们队该image执行docker inspect命令是,输出中有相应字段记录该信息

      example

              MAINTAINER wangyang

      wangyang@itxdl.cn

      RUN(安装软件用)

      构建命令,RUN可以允许任何被基础image支持的命令,如基础image选择了centos,那么软件管理部分只能使用centos的包管理命令

      example

              RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat-7/v7.0.8/bin/apache-tomact-7.0.8.tar.gz' | tar xz

              RUN ["/bin/bash","-c","echo hello"]

      CMD(设置container启动时执行的操作)

      设置命令,用于containe启动时指定的操作,该操作可以是执行自定义脚本,也可以是系统命令,该指令只能在文件中存在一次,如果有多个,则执行最后一条

      example

              CMD echo "hello,world"

      ENTRYPOINT(设置container启动时执行的操作)

      设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效

      example

              ENTRYPOINT ls -l

      #另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时候CMD指令不是一个完整的可执行指令,仅仅只是参数部分,ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数

      example

              FROM ubuntu

              CMD ["-l"]

              ENTRYPOINT ["/usr/bin/ls"]

      USER(设置容器的用户)

      设置指令,设置启动指令的用户,默认用户是root

      example

              USER daemon = ENTRYPOINT ["memcached","-u","daemon"]

      EXPOSE(指定容器需要映射到宿主机的端口,只是声明端口)

      example

              docker rum -p host_port1:port -p host_prot2:port2 image

      ENV(用于设置环境变量)

      example

              ENV JAVA_home /path/to/java/dirent

      ADD(从src复制文件到容器的dest路径,并解压)

      example

              ADD <src> <dest>

                  <src>是相对呗构建的源目录的相对路径,可以是文件,目录,远程URl

                  <dest>容器的绝对路径

      COPY(从src复制文件到容器的dest路径,只能文件)

      VOLUME(指定挂载点,做持久化目录)

          设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令

      WORKDIR(切换目录)

      example

              WORKDIR /p1 WORKDIR /p2 RUN vim a.txt\

      ONBUILD(在子镜像中执行)

          ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

      example

              ONBUILD ADD . /app/src

              ONBUILD RUN /usr/local/bin/python-build --dir /app/src

    2. 仓库的搭建

      仓库是 Docker 程序中的三大要素之一,主要的功能存放 Image (环境)。

      官方地址:https://index.docker.io/docker

      私有仓库构建 – 官方

      仓库端:

      docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always registry

      #下载镜像仓库,registry为官方的镜像仓库名

      vim /etc/docker/daemon.json        #新建文件,指定仓库位置

              添加:

      {

           "insecure-registries": ["10.10.10.11:5000"]        #缩进四空格,填仓库服务器IP

      }

              重启docker服务

      客户端:

      vim /etc/docker/daemon.json        #新建文件,指定仓库位置

              添加:

      {

           "insecure-registries": ["10.10.10.11:5000"]        #缩进四空格,填仓库服务器IP

      }

              重启docker服务

              curl -XGET http://10.10.10.11:5000/v2/_catalog            #查看镜像仓库列表

              docker load -i 导入的镜像名            #导入镜像

              docker tag 镜像名:版本号 新仓库IP:端口/新镜像名:版本号        #修改镜像名和版本号

              docker push 新仓库IP:端口/新镜像名:版本号        #上传镜像到仓库

              docker pull 新仓库IP:端口/新镜像名:版本号            #下载仓库镜像

      Harbor - 企业级 Docker 私有仓库搭建

      企业级的镜像仓库,但需要注意 harbor 使用的是官方的 docker registry 服务去完成,至于 registry 是用本地存储或者 s3 都是可以的,harbor 的功能是在此之上提供用户权限管理、镜像复制等功能,提高使用的 registry 的效率

      安装底层需求

      Python 应该是 2.7 或更高版本

      Docker 引擎应为 1.10 或更高版本

      Docker Compose 需要为 1.6.0 或更高版本

      Harbor官方下载地址: https://github.com/vmware/harbor/releases

      tar xf harbor-offline-installer-v1.2.0.tgz

      安装步骤:

      vim /etc/docker/daemon.json

          修改:

      {

      "insecure-registries": ["serverip"]        #域名地址。如果是80,需要加上

      }

              vim harbor.cfg

                  修改:

      hostname                        #目标的主机名或者完全限定域名

      ui_url_protocol             #http 或 http

      db_password                 #用于 db_auth 的 MySQL 数据库的根密码

      max_job_workers        #(默认值为 3 )作业服务中的复制工作人员的最大数量

      customize_crt                #默认为on当此属性打开时, prepare 脚本将为注册表的令牌的生成 / 验证创

      ssl_cert                        #SSL 证书的路径,仅当协议设置为 https 时才应用

      ssl_cert_key                 #SSL 密钥的路径,仅当协议设置为 https 时才应用

      secretkey_path                #用于在复制策略中加密或解密远程注册表的密码的密钥路径

              mkdir -p /data/cert/

              openssl genrsa -des3 -out server.key 2048

      openssl req -new -key server.key -out server.csr

      cp server.key server.key.org            #备份证书

      openssl rsa -in server.key.org -out server.key        #去除密码设置

      openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

      ./install.sh        #到解压目录下运行脚本

      windows测试:客户机修改hosts文件,域名访问,最好在谷歌访问

      连接:默认管理员用户名 / 密码为 admin / Harbor12345

      linux测试:

      vim /etc/docker/daemon.json

                  修改:

      {

      "insecure-registries": ["serverip"]        #域名地址。如果是80,需要加上

      }

                      修改hosts文件

                      重启docker服务

                      docker login serverip        #登入到镜像仓库

                      导入镜像

                      docker tag hello-world 域名或IP/library/centos6.7:v1.0        #重新打标签,需要安装格式

                      docker push 域名或IP/library/centos6.7:v1.0        #上传镜像到仓库

      docker pull 域名或IP/library/centos6.7:v1.0        #下载镜像

    3. docker网络管理

      容器访问外部网络

      iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE

      外部网络访问容器

      docker run -d -p 80:80 apache

      会创建如下规则:

      iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

      iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

      网络管理 – 进程

      -b, --bridge="" 指定 Docker 使用的网桥设备,默认情况下 Docker 会自动创建和使用 docker0 网桥设备,通过此参数可以使用已经存在的设备

      --bip 指定 Docker0 的 IP 和掩码,使用标准的 CIDR 形式,如 10.10.10.10/24

      --dns 配置容器的 DNS,在启动 Docker 进程是添加,所有容器全部生效

      网络管理 – 容器

      --dns 用于指定启动的容器的 DNS

      --net 用于指定容器的网络通讯方式,有以下四个值

      bridge:Docker 默认方式,网桥模式

      none:容器没有网络栈

      container:使用其它容器的网络栈,Docker容器会加入其它容器的 network namespace

      host:表示容器使用 Host 的网络,没有自己独立的网络栈。容器可以完全访问 Host 的网络,不安全

      基础命令说明

      docker network ls                 #查看当前可用的网络类型

      docker network create -d网络类型         #创建网络空间名称

              类型分为:

                  overlay network

                  bridge network

      独立至不同的网络名字命名空间进行隔离

      docker network create -d bridge xdlcom        #名称随便取

      docker network create -d bridge xdlcn            #名称随便取

      docker network ls

              docker run -d --network= xdlcom --name test1 hub.c.163.com/public/centos:6.7-tools

      #以--network= xdlcom名称的网络模式启动

              docker run -d --network= xdlcn --name test2 hub.c.163.com/public/centos:6.7-tools

              测试:进入容器相互访问,ping不通,已隔离

      使用linux桥接器进行通信

      cd /etc/sysconfig/network-scripts/

      cp ifcfg-eth0 ifcfg-br0        #br0是网桥bocker0的缩写

      vi ifcfg-eth0

          添加:        #删除原来所有内容,只保存一个UUID,相当于但网桥

      DEVICE=eth0

                  TYPE=Ethernet

                  ONBOOT=yes

                  BRIDGE=br0

                  NM_CONTROLLED=yes

                  BOOTPROTO=static

      vi ifcfg-br0

          修改:

      DEVICE=br0

                  TYPE=Bridge

                  ONBOOT=yes

                  BOOTPROTO=static

                  IPADDR=192.168.216.131                #本机IP

                  NETMASK=255.255.255.0

      #修改后重启系统,否则可能会出现本地能通信,外部不能通信问题

      yum install -y git            #托管的工具

      git clone https://github.com/jpetazzo/pipework        #把远程代码同步到本地

      cp pipework/pipework /usr/local/bin/pipwork            #pipwork为容器赋予真正能被外网访问的地址

      chmod a+x /usr/local/bin/

      docker run -itd --net=none --name=ff -d 容器名        #网络设为none

      docker inspect 容器名            #查看容IP信息

      pipework br0 容器名 192.168.216.135/24         #需要分配的IP地址,临时,需要写开机自启

      注:如果不成功,多重启容器和网卡,正常bug

      Overlay 全覆盖网络(主要用于跨机器间的数据通讯问题)

      Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对

      hostnamectl set-hostname 主机名            #设置主机名,永久

      构建集群环境:

      vim /etc/hosts

      添加:

      10.10.10.11 node1

      10.10.10.12 node2

      #主机之间能够使用主机名进行通讯

              搭建时间同步服务

      node1:

              导入或下载consul_1.1.0_linux_amd64.zip

              unzip consul_1.1.0_linux_amd64.zip

              mv consul /usr/local/bin/

              chmod a+x /usr/local/bin/

              mkdir /opt/consul

              nohup consul agent -server -bootstrap -data-dir /opt/consul -bind=10.10.10.11 &

              #绑定当前IP地址,-server 声明主服务器,-data-dir /opt/consul持久化目录

              netstat -antp | grep 8500        #查看consul是否运行

              vim /lib/systemd/system/docker.service

                  修改:

      ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=consul://localhost:8500 --cluster-advertise=eth0:2375

      #检查eth0:2375端口是否存活

              systemctl daemon-reload        #修改启动文件,需要重新引导

              systemctl restart docker

          node2:

              unzip consul_1.1.0_linux_amd64.zip

              mv consul /usr/local/bin/

              chmod a+x /usr/local/bin/

              mkdir /opt/consul

              nohup consul agent -data-dir /opt/consul -bind=10.10.10.12 &

      #绑定当前IP地址,-data-dir /opt/consul持久化目录

              vim /lib/systemd/system/docker.service

                  修改:

      ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=consul://localhost:8500 --cluster-advertise=eth0:2375

      #检查eth0:2375端口是否存活

              systemctl daemon-reload

              systemctl restart docker

              consul join node1            #加入node1节点

              consul members                #查看consul的节点

              # consul支持高可用,可以在设置一个主服务,相互竞争

          node1:

              docker network create -d overlay multihost        #创建全覆盖网络,multihost随便取名

              docker network ls

      docker run --name test --network=multihost -d hub.c.163.com/public/centos:6.7-tools

      #以--network=multihost模式启动容器

          node2:

              docker run --name test1 --network=multihost -d hub.c.163.com/public/centos:6.7-tools

      #不能与主服务器容器同名

          登录至容器进行 Ping 测试

    4. 持久化数据

      前提:在 Docker 中,一个从镜像启动的容器一旦删除后会删除对应在物理机上的数据信息

      数据卷(data volume)

      mount -t overlay overlay -olowerdir=./low,upperdir=./upper,workdir=./work ./merged

      持久化实现命令

      #测试,挂载对应三个目录,达到持久化目录的效果

      docker run --name blog1 --volumes-from="blog" -d 镜像名        #容器之间的共享数据

      docker run --name mysql -v /mysql:/var/lib/mysql -d 镜像名

      #宿主和容器建立持久化目录,/mysql:/var/lib/mysql先宿主机目录,再容器目录

      docker rm -f -v 容器名         #删除持久化目录和容器

      有的镜像自带持久化目录,在Dockerfile中有添加volumes参数,生成的持久化目录在/var/lib/docker/volumes/随机字符串/_data

      存储核心分类

      Docker 存储驱动 (storage driver) 是 Docker 的核心组件,它是 Docker 实现分成镜像的基础

      device mapper (DM):性能和稳定性存在问题,不推荐生产环境使用

      btrfs:社区实现了 btrfs driver,稳定性和性能存在问题

      overlayfs:内核 3.18 overlayfs 进入主线,性能和稳定性优异,第一选择

      修改成OverlayFS的默认文件系统

      echo "overlay" > /etc/modules-load.d/overlay.conf

      cat /proc/modules|grep overlay

      reboot

      vim /etc/systemd/system/docker.service

              --storage-driver=overlay \

  11. openstack

    云计算

    美国国家标准与技术研究院(NIST)定义:云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互

    云计算前身网格计算底层虚拟化    分布式计算,传统虚拟化作为底层

    如何抵御ddos攻击:

            针对少量IP攻击,封IP

            少流量多IP攻击,防火墙上设置超过连接数不能通信

            外部应用程序防火墙

            引入公网流量清洗

    云计算的分类(架构)

            公有云:公网用户,带宽大aws

                    资源按需供给

                    多租户,自服务

            私有云:企业自己vmware

                    虚拟化自动扩展

                    简化资源的管理和监控

            混合云:openstack

                    计算要求高的,放入公司内部执行

                    用户请求放入共网

    云计算的分类(服务类型)

            IAAS:基础设施即服务

            PAAS:平台即服务

            SAAS:软件即服务

    云计算框架选择

            API:应用程序编程接口,接口的广泛性

            使用何种开源协议进行编写

            平台成熟度

    API 对接 亚马逊云平台

    使用 Apache 协议进行开源

    最火爆开源项目

    一个框架

    使用 Python 进行开发

    混合云

    JUNO10版本的核心组件

    Nova:用于创建虚拟机

    Glance:提供镜像和定义权限

    Swift:不需要考虑文件系统解决方案,直接存储数据mount挂载

    Cinder:提供云盘

    Neutron:给虚拟机提供网络层次划分,虚拟路由,不需要硬件路由

    Horizon:提供b/s操作界面

    Keystone:定义所以操作和服务的权限,提供通信方案

    Heat:通过编写yaml文件,批量创建虚拟机

    Ceilometer:监控流量

    Trove:提供链接数据库的方案,默认集成

    Sahara:可以与hadoop平台结合的第三方插件

posted @ 2018-09-28 18:13  自在1990  阅读(1552)  评论(0编辑  收藏  举报