美文网首页
Linux学习-week12-综合架构实时同步

Linux学习-week12-综合架构实时同步

作者: 亮仔_c1b5 | 来源:发表于2019-09-24 21:36 被阅读0次

    老男孩教育64期--week12--综合架构实时同步

    1. 综合架构知识概述说明

      1. 存储服务客户端配置参数
      2. 实时同步备份数据方法
      3. 操作系统远程连接服务 基于密钥远程连接
    2. 综合架构课程回顾:

      1. 全网备份项目 脚本+rsync+crond
      2. 存储数据服务 NFS(网络共享存储数据)
    1. NFS服务客户端配置参数
      实现客户端挂载操作: 自动挂载
      mount -t nfs 172.16.1.31:/data /html/www/wp-content/uploads
      实现开机自动挂载:
      第一种方法: /etc/fstab
      UUID=57485102-49aa-4d0e-81df-42b83a5d8726 /data1 xfs defaults 0 0
      挂载设备信息 挂载点信息 文件系统类型 挂载参数 是否备份磁盘信息 是否对磁盘自检

      172.16.1.31:/data /mnt xfs defaults 0 0

      mount命令挂载参数:
      Use default options: rw, suid, dev, exec, auto, nouser, and async
      rw: 挂载的存储目录可读可写 *
      ro: 挂载的存储目录为只读
      suid: 让挂载点目录中的文件setuid权限生效 *
      nosuid: 让挂载点目录中的文件setuid权限失效 安全性
      exec: 挂载点目录中的脚本代码信息可以直接执行
      noexec: 挂载点目录中的脚本代码信息不能直接执行
      auto: 根据fstab文件配置信息实现自动挂载 mount -a
      noauto: 根据fstab文件配置信息取消自动挂载
      user: 允许普通用户进行挂载操作 mount /mnt
      nouser: 禁止普通用户进行挂载操作 *
      sync: 进行数据同步存储操作 安全
      async: 进入数据异步存储操作 *

      常见问题: fstab文件配置了网络设备开机自动挂载信息,但不能实现开机自动挂载
      系统启动流程问题:
      先加载fstab文件 --- 启动network服务
      centos7: 开启remote-fs服务
      先加载fstab文件 --- 启动network服务 --- remote-fs服务(重新加载fstab文件)
      centos6: 开启netfs服务
      先加载fstab文件 --- 启动network服务 --- netfs服务(重新加载fstab文件)

      第二种方法: /etc/rc.local -- 确认文件权限为执行权限

    image.png image.png
    客户端挂载参数扩展:
    fg     --- 在前台进行挂载操作 
    bg     --- 在后台进行挂载操作
    soft   --- 当存储服务器出现问题,会尝试不断重新挂载,具有超时时间   
    hard   --- 当存储服务器出现问题,会尝试不断重新挂载.没有超时时间
    PS: NFS存储服务属于耦合度太高的服务
    rsize  --- 设置一个缓存区域, 可以从内存中读取数据,减少存储服务压力
    wsize  --- 设置一个缓冲区域, 可以在内存中写入数据,减少存储服务压力
    atime  --- 确认是否更新inode中访问文件时间信息
    

    noatime --- 进制更新inode中访问文件时间信息 性能参数信息
    remount --- 重新指定参数信息,挂载文件系统

    企业常见文件系统异常案例:
    整个文件系统出现只读情况:
    mount -o remount rw  /
    
    存储服务课程总结:
    1. NFS存储服务部署流程
    2. NFS存储服务配置参数
       squash 用户映射参数
    3. NFS存储权限信息说明
       a 和存储服务配置文件权限
       b 确认存储目录权限信息
       c 确认客户端挂载参数权限
    4. NFS存储服务客户端挂载参数
       NFS客户端如何实现开机自动挂载
    5. NFS服务无法实现高可用
       思路解决NFS高可用问题--- 弃用NFS方案  
    
    1. 综合架构实时同步服务
      架构内部人员存储的数据信息可以采用定时任务进行数据备份 最短数据同步周期1分钟
      架构外部人员存储的数据信息可以采用实时同步进行数据备份 只要有变化数据信息都要进行备份

      实时同步实现数据传输原理:
      存储服务器(10G) ---> 备份服务器(10G)
      新增的5G ---> 备份服务器(5G)
      01: 发现指定目录中有数据信息变化 inotify
      02: 发现数据变化后,利用rsync将变化的数据进行传输备份 rsync

    2. 实现数据实时同步过程:
      方法一: 利用脚本实现实时同步:
      inotify软件 --- 监控软件,监控目录中数据变化信息
      第一个历程: 安装软件程序
      yum install -y inotify-tools
      第二个历程: 使用软件名称监控目录
      /usr/bin/inotifywait --- 监控目录数据变化信息
      /usr/bin/inotifywatch --- 统计目录数据变化情况 /data oldboy01,oldboy02,oldboy03 创建操作3次

      inotifywait命令参数信息:
      --exclude <pattern> 在同步数据信息时,对指定数据信息进行排除同步
      --excludei <pattern> 在同步数据信息时,对指定数据信息进行排除同步(忽略大小写进行数据排除)
      -m|--monitor 实现目录信息进行一直监控
      -r|--recursive 实现递归监控
      --format <fmt> 显示信息格式 ???
      --timefmt <fmt> 显示时间信息格式
      -q|--quiet 只输出有用的信息, 错误无用信息不要进行输出
      -e 指定监控的事件信息 创建 修改 删除

      inotifywait -mr --timefmt "%F %T" --format "%T %w %f %e" /data
      Setting up watches. Beware: since -r was given, this may take a while!
      Watches established.
      2019-09-22 12:18:53 /data/oldboy01/ oldboy06.txt CREATE
      2019-09-22 12:18:53 /data/oldboy01/ oldboy06.txt OPEN
      2019-09-22 12:18:53 /data/oldboy01/ oldboy06.txt ATTRIB
      2019-09-22 12:18:53 /data/oldboy01/ oldboy06.txt CLOSE_WRITE,CLOSE

      常见的事件信息:
      access file or directory contents were read
      文件或目录内容被读取
      modify file or directory contents were written
      文件或目录内容被写入
      attrib file or directory attributes changed
      文件或目录内容被修改
      close_write file or directory closed, after being opened in writeable mode
      文件或目录被关闭,在文件打开之后,进行写入操作之后进行关闭
      close_nowrite
      file or directory closed, after being opened in
      文件或目录被关闭,在文件打开之后,未进行写入操作之后关闭
      read-only mode
      close file or directory closed, regardless of read/write mode
      文件只要被打开了,做了关闭操作
      open file or directory opened
      文件或目录被打开
      moved_to file or directory moved to watched directory
      文件或目录被移动到监控目录中
      moved_from file or directory moved from watched directory
      文件或目录被移除到其他目录中
      move file or directory moved to or from watched directory
      文件或目录被移动过, 文件或目录被重命名
      create file or directory created within watched directory
      文件或目录被创建
      delete file or directory deleted within watched directory
      文件或目录被删除

      需要关注的事件信息: create,delete,move,close_write
      inotifywait -mrq --format "%w %f" -e create,delete,move,close_write /data

    编写脚本信息: 实现inotify+rsync服务结合
    vim inotify.sh
    #!/bin/bash
    
    inotifywait -mrq --format "%w %f" -e create,delete,move,close_write  /data|\
    while read line
    do  
      rsync -avz  $data   rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    done
    
    /data/oldboy01.txt --> read --> line = /data/oldboy01.txt
    rsync -avz $line /data/oldboy01.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    /data/oldboy02.txt --> read --> line = /data/oldboy02.txt
    rsync -avz $line /data/oldboy02.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    
    oldboy_dir/oldboy01.txt --> read --> line = /data/oldboy_dir/oldboy01.txt
    rsync -avz  /data/oldboy_dir/oldboy01.txt rsync_backup@172.16.1.41::backup  --password-file=/etc/rsync.password
    rsync -avz  /data/oldboy_dir/oldboy01.txt rsync_backup@172.16.1.41::backup/oldboy_dir/
    
    脚本问题:
    01. 创建数据目录结构信息不统一
    02. 删除数据信息后, 无法进行同步
    rsync -avz  /data/ --delete rsync_backup@172.16.1.41::backup  --password-file=/etc/rsync.password 
    
    完善脚本:
    [root@nfs01 /data]# cat /server/scripts/inotify.sh 
    #!/bin/bash
    
    inotifywait -mrq --format "%w %f" -e create,delete,move,close_write  /data|\
    while read line
    do  
      rsync -avz  /data/ --delete  rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    done
    
    touch 1000个文件 --> /data/1000个文件  ---> 同步传输到备份服务器
    
    补充: 循环脚本如何进行停止:
    方式一: 暂停
    ctrl+z -- jobs 显示暂停进行信息 -- fg 编号 让后台暂停进程继续运行
    方式二: 彻底停止
    kill    进程编号    --- 彻底停止循环脚本运行
    
    killall 进程名      --- 彻底停止循环脚本运行 
    
    pkill   进程名      --- 模糊杀进程信息
    pkill -f inotify.sh
    
    
    使脚本在后台一直运行:
    nohup sh /server/scripts/inotify.sh &
    
    image.png image.png image.png
    方法二: 利用服务程序实现实时同步: sersync lsyncd(扩展研究)
    sersync == 将inotify+rsync软件结合 == 中国人 周洋
    
    第一个历程: 下载sersync软件程序 
    第二个历程: 将软件包上传到linux系统中,解压使用 二进制包安装软件
    mv sersync_installdir_64bit/sersync/ /usr/local/
    
    第三个历程: 修改配置文件
    将指定数据信息在实时同步时进行过滤
    <filter start="false">
        <exclude expression="(.*)\.svn"></exclude>
        <exclude expression="(.*)\.gz"></exclude>
        <exclude expression="^info/*"></exclude>
        <exclude expression="^static/*"></exclude>
    </filter>
    
    <inotify>
        <delete start="true"/>
        <createFolder start="true"/>
        <createFile start="false"/>
        <closeWrite start="true"/>
        <moveFrom start="true"/>
        <moveTo start="true"/>
        <attrib start="false"/>
        <modify start="false"/>
    </inotify>
    
    需要进行改动,实现数据实时同步
    <localpath watch="/opt/tongbu">
           <remote ip="127.0.0.1" name="tongbu1"/>
           <!--<remote ip="192.168.8.39" name="tongbu"/>-->
           <!--<remote ip="192.168.8.40" name="tongbu"/>-->
       </localpath>
       <rsync>
           <commonParams params="-artuz"/>
           <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
           <userDefinedPort start="false" port="874"/><!-- port=874 -->
    
    第四个历程: 启动实时同步服务
    chmod +x /usr/local/sersync/bin/sersync
    serync  -dro  /user/local/sersync/conf/confxml.xml 
    
    参数-d:    启用守护进程模式
    参数-r:    在监控前,将监控目录与远程主机用rsync命令推送一遍
    参数-o:    指定配置文件,默认使用confxml.xml文件
    
    总结: 软件服务排查问题思路
    01. crond        排错:  日志文件 /var/log/crond
    02. rsync        排错:  日志文件 rsyncd.log  掌握rsync同步数据原理
    03. nfs          排错:  用户映射原理 存储数据权限问题
    04. sersync      排错:    设置debug调试模式
    05. SSH          排错:  配置文件 对比正确配置文件
    06. ansible      排错:  剧本执行--模块执行--命令行测试  ???
    07. nginx        排错:  日志文件 访问日志/错误日志  抓包分析
    08. keepalived   排错:  日志文件 /var/log/message  关注配置文件
    09. zabbix       排错:  日志文件 命令进行测试zabbix-get 图形界面排错  zabbix工作原理
    10. jumpserver   排错:  日志文件 关注进程信息(调试信息)
    11. 防火墙服务   排错:  iptables 抓取匹配流量信息
    
    1. 远程管理服务介绍
      SSH: 端口22 密文传输数据 默认允许root用户远程连接
      telnet: 端口23 明文传输数据 默认禁止root用户远程连接

      实现telnet远程连接:

      1. 安装软件
        yum install -y telnet-server
      2. 启动程序
        systemctl start telnet.socket

      网络数据抓包方法:
      方法一: 利用软件进行抓包 wireshark
      方法二: 利用命令进行抓包 tcpdump

    2. SSH远程连接原理:
      私钥/公钥: 私钥==钥匙 公钥==锁 --- 对数据信息进行加密处理

    3. SSH远程连接方式:
      a 基于密码方式远程连接: 安全性较低
      b 基于密钥方式远程连接:

      基于密钥实现远程连接方式:
      第一个历程: 创建密钥对
      ssh-keygen -t dsa/rsa
      Generating public/private dsa key pair.
      Enter file in which to save the key (/root/.ssh/id_dsa):
      Enter passphrase (empty for no passphrase):
      Enter same passphrase again:
      Your identification has been saved in /root/.ssh/id_dsa.
      Your public key has been saved in /root/.ssh/id_dsa.pub.
      The key fingerprint is:
      SHA256:jzCv2VTUNnP3mwD4+/1/MmpCKJjAXRY+2+Cx382FBKs root@m01
      The key's randomart image is:
      +---[DSA 1024]----+
      | .. . |
      | .o .+ |
      | . . o= .o.* . .|
      | o .. B o.o.= ..|
      | . o* E...... .|
      | o .=.=.o... o|
      | .=.o.o o |
      | = . o + .|
      | o . o.o +*|
      +----[SHA256]-----+
      [root@m01 ~]# ll /root/.ssh/
      total 12
      -rw------- 1 root root 668 Sep 22 17:02 id_dsa
      -rw-r--r-- 1 root root 598 Sep 22 17:02 id_dsa.pub
      -rw-r--r--. 1 root root 172 Jul 21 15:05 known_hosts

      第二个历程: 将公钥分发给被管理主机
      ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.31

      第三个历程: 进行远程连接测试
      [root@m01 ~]# ssh 10.0.0.31
      Last login: Sun Sep 22 16:43:22 2019 from 10.0.0.41
      [root@nfs01 ~]# exit
      logout
      Connection to 10.0.0.31 closed.
      [root@m01 ~]# ssh 10.0.0.31 hostname
      nfs01

      简化了ansible批量管理服务配置信息

      如何进行批量分发密钥:

      !/bin/bash

      for ip in 31 41 7
      do
      ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.$ip
      done

      交互过程:

      1. 第一次连接时需要有确认信息
        ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.$ip -o StrictHostKeyChecking=no --- 免去确认信息

      2. 第一次连接时需要输入密码信息
        yum install -y sshpass
        sshpass --- 给ssh连接提供免交互密码信息
        sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.$ip -o StrictHostKeyChecking=no --- 免去密码输入过程

    批量分发公钥脚本 与 检查确认脚本
    [root@m01 /server/scripts]# cat fenfa_pub_key.sh 
    #!/bin/bash
    
    for ip in 31 41 7
    do
      sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub  root@172.16.1.$ip -o StrictHostKeyChecking=no &>/dev/null
      if [ $? -eq 0 ]
      then
         echo "172.16.1.$ip 密钥分发成功"
         echo ""
      else
         echo "172.16.1.$ip 密钥分发失败"
         echo ""
      fi
    done    
    
    [root@m01 /server/scripts]# cat fenfa_pub_check.sh
    #!/bin/bash
    
    for ip in 31 41 7
    do
      ssh 172.16.1.$ip hostname &>/dev/null
      if [ $? -eq 0 ]
      then
         echo "172.16.1.$ip 密钥检查成功"
         echo ""
      else
         echo "172.16.1.$ip 密钥检查失败"
         echo ""
      fi
    done
    
    需求给三台主机分发密钥: 最优解决方案--循环数组功能???
    172.16.1.31   nfs01    root   123456   端口 52113
    172.16.1.41   backup   root   654321   端口 52114
    172.16.1.7    web01    root   123123   端口 52115
    
    解决第一个问题: 端口号不是默认22如何分发密钥
    
    sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub  root@172.16.1.31 -o StrictHostKeyChecking=no -p52113
    sshpass -p654321 ssh-copy-id -i /root/.ssh/id_dsa.pub  root@172.16.1.41 -o StrictHostKeyChecking=no -p52114
    sshpass -p123123 ssh-copy-id -i /root/.ssh/id_dsa.pub  root@172.16.1.7  -o StrictHostKeyChecking=no -p52115
    
    [root@m01 /server/scripts]# cat while_read_line.sh 
    #!/bin/bash
    
    while read line
    do
      IP_info=$(echo $line|awk '{print $1}')
      password_info=$(echo $line|awk '{print $2}')
      port_info=$(echo $line|awk '{print $3}')
    
      sshpass -p$password_info ssh-copy-id -i /root/.ssh/id_dsa.pub  root@$IP_info -o StrictHostKeyChecking=no -p$port_info &>/dev/null
      if [ $? -eq 0 ]
      then
          echo "主机:$IP_info, 密码:$password_info, 端口:$port_info    分发公钥成功."
          echo ""
      else
          echo "主机:$IP_info   分发公钥失败"
          echo ""
      fi
    done </server/scripts/test.txt
    
    补充: 免交互创建密钥
    #!/bin/bash 
    
    if [ ! -f /root/.ssh/id_dsa ]
    then 
       ssh-keygen -t dsa -f /root/.ssh/id_dsa  -P ""
       echo "密钥创建成功"
    else 
       echo "密钥已经创建"
    fi 
    

    09: 课程知识梳理总结
    1) 存储服务客户端挂载参数信息 defaults(rw dev auto exec nouser suid async) bg/fg soft/hard wsize/rwsize remont
    2) 实时同步数据方法
    发现数据变化 --- 变化数据进行传输备份
    方式一: 脚本实现
    inotifywait + rsync + while read line
    方式二: 软件程序 sersync
    前提: 部署rsync服务/部署inotify软件
    01. 如何编写配置文件
    02. 如何启动服务程序 -dro
    3) SSH远程连接服务
    远程连接管理主机方法 SSH telnet
    远程连接原理过程 私钥/公钥
    如何基于密钥连接主机 创建密钥对 分发公钥
    如何批量分发密钥信息

    预习:

    1. ansible 批量管理服务
      a ansible主机清单编写方法 https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
      b ansible管理模块信息 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
      c ansible剧本编写方法 https://docs.ansible.com/ansible/latest/user_guide/playbooks.html
    1. lsync 实时同步软件

    相关文章

      网友评论

          本文标题:Linux学习-week12-综合架构实时同步

          本文链接:https://www.haomeiwen.com/subject/tpyuuctx.html