存档十二月 2019

haproxy 负载均衡

haproxy 是一个http协议的反向代理服务器      也是tcp层的负载均衡服务器

haproxy 负载均衡
     # yum install haproxy
     # rpm -ql haproxy
         /etc/haproxy/haproxy.cfg           \\ 主配置文件
         /usr/sbin/haproxy                   \\ 主程序
     # vim /etc/haproxy/haproxy.cfg
         frontend main *:80
             default_backend www.syk.my     \\ 负载均衡的名字
         backend www.syk.my
             balance roundrobin                   \\ 轮询
             server web1 192.168.10:80 check       \\ 后端服务器 check做健康状态检查
             server web2 192.168.12:80 check
     # systemctl restart haproxy.service
     # ss -tnlp                             \\ 80端口被haproxy监听
     # systemctl status haproxy.service      \\ 查询状态
     # vim /etc/rsyslog.conf                  \\ 系统里开启haproxy.log 功能
         $ModLoad imudp                        \\ 取消此两项注释
         $UDPServerRun 514
         local2.*     /var/log/haproxy.log       \\ 最后添加
     # systemctl restart rsyslog.service
     # ss -unl                                     \\ udp的514端口被监听
     # tail /var/log/haproxy.log                    \\ 查看日志


实例 1
     基于浏览器cookie实现会话绑定        \\ 关键配置如下
         backend www.teo.com
             balance roundrobin
             cookie teo insert nocache indirect  \\ 定义cookie名字teo insert在后端插入的方式 nocache不允许缓存 indirect间接的方式
             server teo1 192.168.10.10:80 check cookie teo1  \\ 每一个server有自己唯一的cookie标识
             server teo2 192.168.10.12:80 check cookie teo2


haproxy配置文件详解

global                             \\ 全局配置
     log         127.0.0.1 local2   \\ 定义全局的syslog服务器,最多可定义两个
     chroot      /var/lib/haproxy    \\ 切换至此目录 以安全方式运行
     pidfile     /var/run/haproxy.pid \\ pid文件
     maxconn     4000                  \\ 前端最大连接数
     user        haproxy                \\ 以哪个用户运行
     group       haproxy                 \\ 以哪个组运行
     daemon                               \\ 启动为守护进程 不加此项将运行在前台
     # turn on stats unix socket           \\ 打开状态页面的套接字 本地访问状态页面不用使用tcp/ip协议进行分发
     stats socket /var/lib/haproxy/stats    \\ 打开上面选择 此选项生效

 defaults
     mode                    http  \\ 默认tcp 一种http反向代理 一种tcp负载均衡 后端要是https mysql ssl ssh等要使用tcp 与后端对应
     log                     global          \\ 可以指明两个位置 多余则不生效
     option                  httplog          \\ 当mode为http时 记录详细的日志格式
     #option                 logasap           \\ 提前记录日志 默认不启用 会少记录很多东西
     option                  dontlognull
     option http-server-close           \\ 下面if-none仅在此首部不存在时才将其添加至请求报文中 防止多层代理获取不到真实ip地址 
     option forwardfor       except 127.0.0.0/8 if-none \\ 真正的请求来源ip地址 除了此ip本机
     option                  redispatch
     retries                 3
     timeout http-request    10s
     timeout queue           1m
     timeout connect         10s
     timeout client          1m
     timeout server          1m
     timeout http-keep-alive 10s
     timeout check           10s
     maxconn                 3000            \\ 前端最大并发连接数 不能超过global数

frontend  main *:80      \\ 定义前端  监听端口 *:80 此段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
     bind *:80 \\ 把上面*:80去掉 可以换成此句 绑定多个端口 bind 只能用于frontend listen
     bind *:8080            \\ 绑定两个端口 也可以是一个端口范围
     #use_backend static          if url_static   \\ 条件试后端调用 static名字 usr_static是acl列表
     reqadd Via:\ 192.168.10.15.cn                 \\ 添加自定义响应报文首部 将请求报文发往服务器时添加
     rspadd Via:\ 192.168.10.15.com                 \\ 添加自定义响应报文首部 将请求报文发往客户端时添加
     default_backend             webservice          \\ 为frontend定义默认后端 
     use_backend        tstatice

listen stats        \\ stats名字 段通过关联“frontend”和“backend”定义了一个完整的代理,通常只对TCP流量有用。
     bind *:81                     \\ 监听81端口
     stats enable                   \\ 数据统计页面开启
     stats hide-version              \\ 隐藏版本号
     stats uri  /haproxyadmin?stats   \\ 定义访问页面 默认为 teo.com/haproxy?stats
     stats realm "HAPorxy\ Statistics" \\ 提示信息 \为转移符 空格需要转换
     stats auth admin:123456            \\ 认证 前面用户名 后面密码 可以有多组
     stats admin if TRUE                 \\ 如果认证成功 开启管理员功能 一般不开启


backend webservice     \\ 后端服务器 代理将会将对应客户端的请求转发至这些服务器。
     balance     roundrobin                           \\ 指明调度算法 详见注1
     hash-type   map-based                             \\ 为balance进一步指明算法 详见注1
     server      web1 192.168.10.12:80 check weight=3 
     server      web2 192.168.10.10:80 check port 443
     server      teo1 127.0.0.1:8010 check inter 1000 rise 1 fall 4 cooki teo1 backup maxconn 5000
     server      teo2 172.16.100.10:80 redir http://www.baidu.com check
         backup         设置为备用服务器 或叫 sorry server
         check          做健康状态检测 默认为2秒   默认为tcp检测 还有httpchk
            inter 1000  设定健康状态检查时间间隔 单位毫秒 默认2秒
            fall 4      确认服务器从正常状态转换为不可用状态需要检查的次数 默认3次
            rise 1      设定健康状态检查中 离线的服务器从离线状态转换至正常状态需要成功检查的次数
            port 443    请求的是80端口 也可以检测的是443端口 后面还可以跟地址 检测另外一个地址
         cooki teo1     为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后
                        续的请求中被选中,其目的在于实现持久连接的功能;
         maxconn 5000   此服务器接受的并发连接的最大数量
         maxqueue       请求队列的最大长度
         observe        根据流量判断后端server的健康状态  默认为禁用 其支持的类型有"layer4"和"layer7""layer7"仅能用于http代理场景
         weight         权重 默认为1 最大值为256 0表示不参与负载均衡(不被调度/下线了)
         redir          启用302重定向功能 需要注意的是 在baidu.com后面不能使用/ 且不能使用相对地址 以免造成循环


注:

     1 balance 定义负载均衡算法,可用于“defaults” “listen”和“backend”.用于在负载均衡场景中挑选一个server,其仅应用于持久
               信息不可用的条件下或需要将一个连接重新派发至另一个服务器时.支持的算法有:
         a roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡 最公平的算法.此算法是动态的,
                      这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;并支持慢启动.
         b static-rr :基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服
                      务器连接数上没有限制;不支持慢启动,在高负荷的情况下,服务器重新上线时会立即被分配大量连接.
         c leastconn(WLC):适用于长连接的会话,新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中
                   推荐使用此算法,如LDAP SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;
         d source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求
                   始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求
                   可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态.
             hash-type map-based: 取模法 静态
             hash-type consistent: 一致性哈希法 动态
         e uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以
                使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理
                以提高缓存的命中率,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;
             hash-type map-based: 取模法 静态
             hash-type consistent: 一致性哈希法 动态
         f url_param:通过为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了
                      一个值那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标
                      识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定
                      的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认静态的,不过其也可以使用hash-type修改此特性
             hash-type map-based: 取模法 静态
             hash-type consistent: 一致性哈希法 动态
         g hdr():对于每个HTTP请求,通过指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫
                        算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部
                        分(比如通过www.feiyu.com来说,仅计算feiyu字符串的hash值)以降低hash算法的运算量;此算法默认为静态的.
             hash-type map-based: 取模法 静态
             hash-type consistent: 一致性哈希法 动态
         f rdp-cookie(name):表示根据据cookie(name)来锁定并哈希每一次TCP请求.

     2 正向代理与反向代理区别
         正向代理 forward proxy: 是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理
                                服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端.
         反向代理 reverse proxy: 是指以代理服务器来接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器
                                上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就变现为一个反向代理服务器.
         1 正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源.
           反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等.
         2 正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件.
           反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器.
         3 正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端.
           反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器.
         4 正向代理和反向代理的作用和目的不同.正向代理主要是用来解决访问限制问题.
           反向代理则是提供负载均衡、安全防护等作用.二者均能提高访问速度.


rsync+inotify实时备份




Rsync 及 Inotify


实例1: inotify + rsync客户端 实时备份
    linux主服务器端 
        # yum install inotify-tools               \\ epel源
        # vim /etc/sysctl.conf                     \\ 修改默认inotify参数 默认在/proc/sys/fs/inotify/下
            fs.inotify.max_queued_events = 32768    \\ 表示监控事件队列
            fs.inotify.max_user_instances = 1024     \\ 表示最多监控实例数
            fs.inotify.max_user_watches = 9999999     \\ 表示每个实例最多监控文件数
        # sysctl -p
        # cd /data/shell/
        # vim inotify_web.sh
            #!/bin/bash
            src=/data/www/
            /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,create,modify,move,delete $src | while read
            do
                echo $src >> /tmp/inotofy_web.log
                rsync -avzP --delete --port=63873 /data/www/ --exclude '.*.swp' --exclude 'log' www@192.168.10.12::cp_web
                rsync -avzP --delete --port=63873 /data/www/ --exclude '.*.swp' --exclude 'log' www@192.168.10.13::cp_web
            done
        # chmod +x inotify_web.sh
        # chmod +x /etc/rc.d/rc.local
        # echo "/data/shell/inotify_web.sh &>/dev/null &" >> /etc/rc.d/rc.local        \\ 开机启动
        # ./inotify_web.sh &>/dev/null &      \\ 手动执行

    linux从服务器端
        # yum install rsync
        # vim /etc/rsyncd.conf           \\ 默认配置文件为空 需要新建
            uid  = www
            gid  = www
            port = 63873
            use chroot  = no
            max connections = 10
            hosts allow = 47.91.219.64
            lock file = /var/run/rsync.lock
            log file  = /var/log/rsyncd.log
            ignore errors
            [cp_web]
            path = /data/www
            read only = no
        # groupadd www
        # useradd -g www www -s /sbin/nologin
        # chown -R www.www /data/www                        \\ 需要给目录权限 属主给www
        # rsync --daemon                                     \\ centos 6 启动服务  873端口被监控
        # pkill rsync                                         \\ 停止服务
        # ss -tnl                                              \\ 63873端口被监控 默认为873端口
        # echo "/usr/bin/rsync --daemon" >> /etc/rc.d/rc.local  \\ 加入开机启动
        # chmod +x /etc/rc.d/rc.local                            \\ 我开机启动文件添加执行权限
        # iptables -A INPUT 4 -P tcp --dport 63873 -j ACCEPT      \\ 防火墙放行


实例2: inotify + rsync使用ssh 实时备份
    # ssh-keygen    \\ 主服务器上生成公钥和秘钥 一路回车 从服务器只需要有文件夹
    # ssh-copy-id root@192.168.10.12  \\ 拷贝到从服务器上
    # ssh 192.168.10.12                \\ 不用密码即可登录10.12
    # yum install inotify-tools               \\ epel源
    # vim /etc/sysctl.conf                     \\ 修改默认inotify参数 默认在/proc/sys/fs/inotify/下
        fs.inotify.max_queued_events = 32768    \\ 表示监控事件队列
        fs.inotify.max_user_instances = 1024     \\ 表示最多监控实例数
        fs.inotify.max_user_watches = 9999999     \\ 表示每个实例最多监控文件数
    # sysctl -p
    # cd /data/shell/
    # vim inotify_web.sh
        #!/bin/bash
        src=/data/www/
        /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,create,modify,move,delete $src | while read
        do
            echo $src >> /tmp/inotofy_web.log
            rsync -avzP --delete /data/www/ --exclude '.*.swp' --exclude 'log' root@192.168.10.12:/data/www/
            rsync -avzP --delete /data/www/ --exclude '.*.swp' --exclude 'log' root@192.168.10.13:/data/www/
        done
    # chmod +x inotify_web.sh
    # chmod +x /etc/rc.d/rc.local
    # echo "/data/shell/inotify_web.sh &>/dev/null &" >> /etc/rc.d/rc.local        \\ 开机启动
    # ./inotify_web.sh &>/dev/null &    \\ 手动执行
    # ps aux | grep inotify_web.sh
    # pkill inotify_web.sh                \\ 结束此脚本


实例3: 创建计划任务 自动备份                   \\ 备份数据库 待修改 应备份到.sql文件 
    # vim /data/shell/backup.sh
        #!/bin/bash
        rsync -avzP --delete /data/mysql/teo/ /data/bak/teo.bak/
        rsync -avzP  /data/mysql/teo/ /data/bak/teo.bak2/
    # chmod + x /data/shell/backup.sh
    # crontab -e                           \\ 编辑定时任务 
        0 1 * * *  /data/shell/backup.sh &  \\ 每天的1点备份 顺序*为分钟 小时 天 月 星期 +执行的命令 


实例4: windows与linux实现自动同步自动备份的数据库
    windows客户端
        解压程序 cwrsync_5.5.0_x86_free 客户端
        执行cwrsync.cmd   安装
        执行mysql-bak.bat 可以实现远程备份
            cd c:\
            C:\rsync\bin\rsync.exe -avzP --delete www@47.91.219.64::mysql_bak ./db/
        执行crontab.vbs 可添加定时任务 每天自动执行mysql-bak.bat
    linux 服务器
        # yum install rsync             \\ 参阅rsync安装即可
        # chmod + x Mysql_bak.sh         \\ mysql自动备份脚本
        # crontab -e
            0 1 * * *  /data/shell/backup.sh & \\ 每天的1点备份


实例5: windows 和 windows 之间 同步
    服务器端
        控制面板 --> 用户账户 --> 添加用户账户 --> 用户名: www  密码: Teo@1234   \\ 在2012中需要 2008不需要
        安装 cwRsyncServer_4.1.0.exe 用户名:www  密码:Teo@1234          \\ 不添加用户 没有 RsyncServer服务
        复制 rsyncd.conf   到 安装目录 C:\Program Files (x86)\ICW\ 
        创建 共享目录 D:\web
        D盘属性 --> 安全 --> 编辑 --> 添加 --> 高级 -->  立即查找 --> www --> 完全控制 权限
        cmd --> services.msc --> RsyncServer --> 右键属性 --> 启动类型 --> 自动 --> 启动 
        cmd --> netstat -ano    查看63873端口是否被监听  如果同步失败在检查防火墙是否放行
        rsyncd.conf
            uid  = 0
            gid  = 0
            port = 63873
            use chroot  = no
            max connections = 10
            hosts allow = 192.168.227.128 192.168.227.1 192.168.228.129
            lock file = rsync.lock
            log file  = rsyncd.log
            ignore errors
            [web]
            path = /cygdrive/d/web
            read only = no

    客户端
        cwRsync_5.4.1 复制到C:\ 根目录下
        添加rsync.bat到定时任务即可       \\ 亦可使用crontab.vbs 实现 实时备份 参照实例4设置
        rsync.bat
            @echo off    
            set RSYNC_HOME=C:\cwRsync_5.4.1  
            cd %RSYNC_HOME%    
            rsync -avzP --delete --progress --port=63873 /cygdrive/d/web/ www@192.168.227.129::web


Rsync常用的命令
  使用ssh
    # rsync /etc/hosts /data/                                                     \\ 复制 相当于 cp
    # rsync -avzP /opt /data/                                                      \\ 复制 目录  cp -r
    # rsync -avzP ./aa.txt root@192.168.10.101:/data/                               \\ 推送文件或目录 默认ssh端口22
    # rsync -avzP /data root@192.168.10.10::/data/ --password-file=/etc/rsync.passwd \\ 推送到目标 ssh协议 在文件中指明密码
    # rsync -avzP ./a -e 'ssh -p 65522' root@192.168.10.101:/data/          \\ 指明ssh 端口 不用服务端 使用ssh传输
    # rsync -avzP root@192.168.10.101:/data/abc ./                           \\ 拉取abc目录到当前目录下 使用ssh拉取

  使用服务器
    # rsync -avzP --delete www@192.168.10.30::cp_web /data/www/                \\ 拉取目标到本地  只需要目标安装rsync
    # rsync -avzP --delete /data/www/ www@192.168.10.30::cp_web                 \\ 本地推送到目标  只需要目标安装rsync
        rsync 选项 用户名@备份源服务器IP::共享模块名 目标目录


编译安装inotify
    # tar zxf inotify-tools-3.13.tar.gz
    # cd inotify-tools-3.13
    # ./configure
    # make -j 4
    # make install


配置文件详解
    # /etc/rsyncd: configuration file for rsync daemon mode
    # See rsyncd.conf man page for more options.
    # configuration example:
    uid  = www                    \\ 运行进程的身份
    gid  = www                     \\ 用户组  同nginx就可以
    port = 873                      \\ 默认为端口为873
    use chroot  = no                 \\ 如果为yes是锁定家目录 rsync被黑了 黑客无法再rsync运行的家目录之外创建文件
    max connections = 10              \\ 最大连接数 多少个并发往上传数据
    hosts allow = 47.91.219.64         \\ 允许哪个ip连接 *代表所有 两个ip使用空格隔开 段可以表示10.0.0.0/24
    hosts deny = 0.0.0.0/32             \\ 拒绝 
    lock file = /var/run/rsync.lock      \\ 锁文件
    log file  = /var/log/rsyncd.log       \\ 日志文件
    ignore errors                          \\ 忽略错误
    pid file = /var/run/rsyncd.pid          \\ pid 文件
    exclude = lost+found/
    transfer logging = yes
    timeout = 900                             \\ 超时时间
    ignore nonreadable = yes
    dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
    auth users = rsync_backup              \\ 认证用户 虚拟用户
    secrets file = /etc/rsync.password      \\ 上面的虚拟用户的密码文件
    motd file = /etc/rsyncd.motd             \\ 客户端登录后的弹出的信息 需要创建
    [cp_web]                                  \\ 模块 名称 标示 很重要
    path = /data/www                           \\ 备份的路径
    read only = no                              \\ 可以写     yes为只读
    list=yes                                     \\ 允许查看模块信息
    auth users = rsync_backup                     \\ 认证用户 虚拟用户
    secrets file = /etc/rsync.password             \\ 上面的虚拟用户的密码文件
    comment = ftp export area


常用参数详解:
    -a 归档模式 表示以递归方式传输文件,并保持所有文件属性. 相当于-rltopgD
    -r 对子目录以递归模式处理
    -l 保持符合连接文件
    -H 保持硬链接文件
    -P 保持文件权限
    -t 保持文件时间
    -g 保持文件数组信息
    -o 保持文件属主信息
    -D 保持设备文件和特殊文件
    -v 详细输出模式
    -n 显示哪些文件将被传输
    -z 在传输文件时进行压缩处理
    -q 精简输出模式
    -h 输出文件小打使用易读的单位 K M等
    -e 使用信道协议 指定替代rsh的shell程序 如ssh
    -exclude=   指定配出不需要传输的文件
    --delete 以源(SRC)为主,对目标(DEST)进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在 exclude/include规则生效之后才执行的。


注:
    1 如果使用密码认证需要如下命令
        # echo "rsync_backup:123456" >> /etc/rsync.password  \\ 为配置文件中auth users = rsync_backup 的值
        # chmod 600 /etc/rsync.password    \\ 只有root可以查看 对密码安全 此文件必须为700或600否则身份验证会失败 会和密码错误信息一样
    2 如果开启 motd file = /etc/rsyncd.motd 需创建
        # echo "welcome to backup server" > /etc/rsyncd.motd   \\ 提示信息 欢迎页面类似
    3 关于自动备份脚本
        # vim back.sh
            #!/bin/bash
            export RSYNC_PASSWORD=123456          \\ 在设置密码的情况下 设置此变量 把密码传入到此变量 可以不用输入密码
            rsync -avz www@192.168.10.30::www /data/www/
    4 防火墙放行用到的命令
        # iptables -A INPUT 4 -P tcp --dport 873 -j ACCEPT
    5 关于定时任务简单描述 详情参见crontab章节