day04 sersync实时同步和ssh服务
阅读原文时间:2023年07月10日阅读:5

day04 sersync实时同步和ssh服务

1、什么是实时同步
    实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器。

2、为什么使用
    保证数据的连续性, 减少人力维护成本,解决nfs单点故障

3、实时同步原理
    利用inotify通知接口,监控本地目录变化,只要监控目标发生变化,就触发事件,执行相应操作。

三个需求

1、NFS实时同步到Rsync中

2、Rsync中也配置NFS服务端

3、自动故障切换

1、NFS实时同步到Rsync中

NFS实时同步到Rsync中
    inotify + rsync 实现实时同步,但是无法使用守护进程方式运行
    sersync  =   inotify + rsync + 守护进程   # 可以用守护进程方式运行

1、上传软件包
    [root@rsync ~]# sz [文件路径]

2、解压
    [root@rsync ~]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz
    [root@rsync ~]# mv GNU-Linux-x86 /usr/local/

3、配置文件
    [root@rsync ~]# cd /usr/local/GNU-Linux-x86/
    [root@rsync GNU-Linux-x86]# vim confxml.xml 

4、开始实时同步(监控那一台服务器上目录就部署到那一台服务器上):sersync2.5.4_64bi
    1)、需要监控的目录/data
        [root@rsync ~]# scp sersync2.5.4_64bit_binary_stable_final.tar.gz 172.16.1.31:/root/
        [root@nfs ~]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
        [root@nfs ~]# cd /usr/local//GNU-Linux-x86/

    2)、开启监控
        [root@rsync GNU-Linux-x86]# vim confxml.xml   修改sersync的配置
        [root@rsync ~]# vim /etc/rsyncd.conf  # 添加sersync的模块名
        [sersync]
        comment = welcome to sersync server!
        path = /sersync

    3)、创建目录,并修改权限
        [root@rsync ~]# mkdir /sersync        # 创建目录,和path = /sersync一致
        [root@rsync ~]# chown rsync.rsync /sersync   # 修改权限
        [root@nfs GNU-Linux-x86]# /usr/local/GNU-Linux-x86/sersync2 -dro /usr/local/GNU-Linux-x86/confxml.xml 

    4)、设置密码权限
        [root@nfs GNU-Linux-x86]# echo "123456" > /etc/rsync.passwd   # 编写密码
        [root@nfs GNU-Linux-x86]# chmod 600 /etc/rsync.passwd         # 设置权限

   5)、查看是否同步
        [root@rsync sersync]# systemctl start rsyncd   # 记得在rsync开启rsyncd服务
        [root@nfs data]# touch 2.txt  # 去rsync里/sersync看同步过来了吗

        注:不知道什么问题同步不了,执行下面的命令
        [root@nfs data]# cd /data && rsync -az -R --delete ./ rsync_backup@172.16.1.41::sersync --password-file=/etc/rsync.passwd

修改sersync配置文件详情

[root@rsync ~]# cd /usr/local/GNU-Linux-x86/
[root@rsync GNU-Linux-x86]# vim confxml.xml 

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>        #本机ip地址和端口
    <debug start="false"/>                            #是否打开调试模式
    <fileSystem xfs="false"/>                         #是否支持xfs文件系统
    <filter start="false">                            #是否过滤,是否排除名称中含有制定字符串的文件的同步
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    </filter>
    <inotify>
        #inotify 监控的动作
        <delete start="true"/>                        #删除动作
        <createFolder start="true"/>                   #创建文件夹动作
        <createFile start="true"/>                    #创建文件动作
        <closeWrite start="true"/>                    #写入完成动作
        <moveFrom start="true"/>                      #移动来自动作
        <moveTo start="true"/>                        #移动到动作
        <attrib start="true"/>                        #属性被更改
        <modify start="true"/>                        #修改动作
    </inotify>

    <sersync>
        <localpath watch="/data">                       #监控的目录
            <remote ip="172.16.1.41" name="web_data"/>            #远端rsync服务器的地址和模块
        </localpath>
        <rsync>
            <commonParams params="-az"/>                #rsync的参数
            <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.passwd"/>
            #开启认证               #虚拟用户                   #指定虚拟用户的密码文件
            #如果远端rsync服务不是873端口,则开启并修改
            <userDefinedPort start="false" port="874"/><!-- port=874             #如果远端rsync服务不是873端口,则开启并修改
            <timeout start="false" time="100"/><!-- timeout=100 -->         #超时时间
            <ssh start="false"/>
        </rsync>
        #错误日志存储路径
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->        #定时任务,开启后,600分钟默认全备一次
        #定时任务,开启后,600分钟默认全备一次
        <crontab start="false" schedule="600"><!--600mins-->        #定时任务,开启后,600分钟默认全备一次
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
    </sersync>
  <plugin name="command">  #扩展插件功能的配置举例
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>

    <plugin name="socket">      #扩展插件功能的配置举例
    <localpath watch="/opt/tongbu">
        <deshost ip="192.168.138.20" port="8009"/>
    </localpath>
    </plugin>
    <plugin name="refreshCDN">              #扩展插件功能的配置举例
    <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
        <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
        <sendurl base="http://pic.xoyo.com/cms"/>
        <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    </localpath>
    </plugin>
</head>

2、Rsync中也配置NFS服务端

1、安装nfs软件
    [root@rsync ~]# yum install nfs-utils rpcbind -y   # 安装nfs软件

2、修改NFS的配置文件(作用:指定NFS的仓库及权限)
    [root@rsync ~]# vim /etc/exports
    [root@rsync ~]# cat /etc/exports
    /sersync 172.16.1.0/20(rw,all_squash,sync,anonuid=996,anongid=996)

3、启动NFS服务
    [root@rsync ~]# systemctl restart nfs-server rpcbind

4、查看挂载
    [root@rsync ~]# showmount -e
        Export list for rsync:
        /sersync 172.16.1.0/20

3、故障切换

1、挂载
    [root@web01 ~]# mount -t nfs 172.16.1.31:/data /var/www/html/img  # 一个创建都有了,因为都挂载到NFS
    [root@web02 html]# mount -t nfs 172.16.1.31:/data /var/www/html/upload  

2、判断是否故障,故障切换
    [root@web02 html]# vim  nfs.sh    # 编写脚本来判断

#!/bin/bash
showmount -e 172.16.1.31
if [ $? -ne 0 ];then
    mount -t nfs 172.16.1.41:/sersync /var/www/html/upload
fi

    [root@web02 ~]# ./nfs.sh
    [root@web02 ~]# df -h
    Filesystem               Size  Used Avail Use% Mounted on
    devtmpfs                 475M     0  475M   0% /dev
    tmpfs                    487M     0  487M   0% /dev/shm
    tmpfs                    487M  7.5M  479M   2% /run
    tmpfs                    487M     0  487M   0% /sys/fs/cgroup
    /dev/mapper/centos-root   98G  2.7G   96G   3% /
    /dev/sda1                509M  162M  348M  32% /boot
    tmpfs                     98M     0   98M   0% /run/user/0
    172.16.1.31:/data         98G  3.6G   95G   4% /var/www/html/upload
    172.16.1.41:/sersync      98G  3.6G   95G   4% /var/www/html/upload

    [root@nfs data]# systemctl stop nfs-server
    [root@web02 ~]# ll /var/www/html/upload     # 还能看就代表成功了

3、加入定时任务
    [root@web02 ~]# crontab -e
    [root@web02 ~]# crontab -l
    * * * * * /root/nfs.sh &>/dev/null


SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢?
1.提供远程连接服务器的服务
    1)linux远程连接协议: ssh服务  端口22
    2)windows远程连接:  RDP协议  端口3389
2.对传输的数据进行加密

SSH是一个加密的网络传输协议。相同的有一个telnet协议(明文)。

1、telnet和ssh之间区别
telnet:
    1.不支持root用户登录,只允许普通用户登录
    2.数据传输过程中明文的

ssh:
    1.支持root用户登录
    2.数据传输过程中时加密码

各种服务对应的端口

#笔试题:请说明以下服务对应的端口号或者端口对应的服务
ssh             22
telnet          23
http            80
https           443
ftp             20 21
RDP             3389
mysql           3306
redis           6379
zabbix          10050 10051
elasticsearch    9200 9300
rsync           873
rpcbind         111

使用Telnet连接服务器

1、首先创建一个普通用户(因为不支持root用户登录)
    [root@m01 ~]# useradd test
    [root@m01 ~]# passwd test

2、安装Telnet服务
    [root@m01 ~]# yum install telnet telnet-server -y

3、开启telnet服务
    [root@m01 ~]# systemctl restart telnet.socket
    [root@m01 ~]# yum install net-tools          # 下载网络工具
    [root@m01 ~]# netstat -nutlp                 # 查看网络端口

4、连接telnet服务
    [c:\~]$ telnet test@192.168.15.71    # 打开一个新窗口,并连接。密码是明文
    [c:\~]$ ssh root@192.168.15.71       # ssh是密文的

ssh服务相关命令

ssh命令:
1、ssh root@192.168.15.71 [command]
    ssh              连接的命令
    root             连接的用户
    @                 分隔符,没有特殊意义
    192.168.15.71      连接IP
    command            需要执行的命令

2、ssh-copy-id -i ~/.ssh/id_rsa.pub  root@192.168.15.71
    sh-copy-id  将公钥复制到指定服务器中命令(可以免密登录)
    -i                指定公钥
    root            用户
    @                分隔符,没事特殊意义
    192.168.15.71    IP
    结果:会在指定的服务器中创建~/.ssh/authorized_keys ,并且会将本服务器中的公钥复制到其中,以至于实现免密登录。
    [root@m01 .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.15.7
    [root@m01 .ssh]# ll
    total 16
    -rw------- 1 root root  390 Oct 21 19:10 authorized_keys
    [root@web01 ~]# cat .ssh/authorized_keys   查看公钥

    2)、用公钥免密登录
        打开--->工具选项栏--->密码生成向导--->一路下一步复制公钥到
        [root@m01 ~]# vim .ssh/authorized_keys   # 把公钥复制到这里
        用秘钥登录

3、ssh-keygen:生成密钥证书
    [root@m01 ~]# ssh-keygen
    [root@m01 ~]# ll -a
    drwx------   2 root root   38 Oct 21 19:04 .ssh
    [root@m01 ~]# cd .ssh
    [root@m01 .ssh]# ll
    total 8
    -rw------- 1 root root 1679 Oct 21 19:04 id_rsa
    -rw-r--r-- 1 root root  390 Oct 21 19:04 id_rsa.pub

    # 会在家目录中生成一个.ssh的目录,其中包含id_rsa,id_rsa.pub文件
    id_rsa          # 私钥(钥匙)
    id_rsa.pub    # 公钥(锁)

ssh验证方式

1、密码验证
    直接输入密码即可。

2、秘钥验证
    通过公钥和私钥验证的。
    密钥的方式比较安全

免密登录

免密的前提,将公钥写入需要登录的服务器的~/.ssh/authorized_keys文件中

    免密相关的命令:ssh-copy-id
    [root@m01 ~]# for i in 5 6 7 8 9 31 41 51 61 71;do ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.$i; done
    [root@m01 ~]# ssh 172.16.1.31  # 不用输入密码登录

SSH企业案例(跳板机)

1、将跳板机免密登录所有的机器
    [root@m01 ~]# for i in 5 6 7 8 9 31 41 51 61 71;do ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.$i; done

2、登录脚本

    1、一进来就立即让选择登录的服务器
        [root@m01 ~]# vim login.sh
        [root@m01 ~]# chmod +x login.sh 

        /etc/profile.d :放到这里开机自启动
        [root@m01 ~]# mv login.sh /etc/profile.d  # 把文件放到这个目录会开机自启动

    2、可以多次选择需要登录的服务器
        使用while循环

    3、超管可以通过用户名密码的方式,重新进入跳板机系统
        if [[ $IP = "m" ]];then
            read -p "请输入用户名:" USER
            read -p "请输入密码:" PASSWORD
            if [[ $USER = "meng" && PASSWORD = "123456" ]]:then
                break
            fi
        fi

    4、解决登录不存在的IP
        ping -c 1 -t 1 172.16.1.$IP &>/dev/null

        if [ $? -ne 0 ];then    # -ne:不等于0
            echo "您输入的服务器编号:$IP 不存在。"
            continue
        fi

    知识储备:
    命令行交互输入内容的命令是read
    #!/bin/bash
    read -p "提示语:" STR
    echo $STR

    ping命令参数

        -c  : 指定ping的次数
        -t  :  指定每次ping的超时时间

编写的脚本

#!/bin/bash

while true
do
    echo "5)  lb01"
    echo "6)  lb02"
    echo "7)  web01"
    echo "8)  web02"
    echo "9)  web03"
    echo "31) nfs"
    echo "41) rsync"
    echo "51) db01"
    echo "61) prometheus01"
    echo "71) m01"

    read -p "请选择需要登录的服务器:" IP
    if [[ $IP = "m" ]];then
        read -p "请输入用户名:" USER
        read -p "请输入密码:" PASSWORD
        if [[ $USER = "meng" && $PASSWORD = "123456" ]];then
            break
        fi
    fi
    ping -c 1 -t 1 172.16.1.$IP &>/dev/null

    if [ $? -ne 0 ];then
        echo "您输入的服务器编号:$IP 不存在。"
        continue
    fi
    ssh root@172.16.1.$IP
done