老男孩教育64期--week12--综合架构实时同步
-
综合架构知识概述说明
- 存储服务客户端配置参数
- 实时同步备份数据方法
- 操作系统远程连接服务 基于密钥远程连接
-
综合架构课程回顾:
- 全网备份项目 脚本+rsync+crond
- 存储数据服务 NFS(网络共享存储数据)
-
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 -- 确认文件权限为执行权限
客户端挂载参数扩展:
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分钟
架构外部人员存储的数据信息可以采用实时同步进行数据备份 只要有变化数据信息都要进行备份实时同步实现数据传输原理:
存储服务器(10G) ---> 备份服务器(10G)
新增的5G ---> 备份服务器(5G)
01: 发现指定目录中有数据信息变化 inotify
02: 发现数据变化后,利用rsync将变化的数据进行传输备份 rsync -
实现数据实时同步过程:
方法一: 利用脚本实现实时同步:
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 &
方法二: 利用服务程序实现实时同步: 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 抓取匹配流量信息
-
远程管理服务介绍
SSH: 端口22 密文传输数据 默认允许root用户远程连接
telnet: 端口23 明文传输数据 默认禁止root用户远程连接实现telnet远程连接:
- 安装软件
yum install -y telnet-server - 启动程序
systemctl start telnet.socket
网络数据抓包方法:
方法一: 利用软件进行抓包 wireshark
方法二: 利用命令进行抓包 tcpdump - 安装软件
SSH远程连接原理:
私钥/公钥: 私钥==钥匙 公钥==锁 --- 对数据信息进行加密处理-
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交互过程:
批量分发公钥脚本 与 检查确认脚本
[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
远程连接原理过程 私钥/公钥
如何基于密钥连接主机 创建密钥对 分发公钥
如何批量分发密钥信息
预习:
- 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
- lsync 实时同步软件