企业架构web服务器的文件及时同步
学习目标和内容
1、能够理解为何要服务器间文件同步
2、能够简单描述实现文件同步的几种方式
3、能够实现服务器文件实时同步的案例
一、同步文件介绍
1、服务器文件同步的必要性
根据业务发展需求,业务网站架构已经发展到以上模式。实现了线上服务的提供,可以给用户提供稳定的整个的web服务。但是,在最近的操作中,也发现了一些问题。
①当业务代码发生改变上传到web服务器时,因为架构已经不是单台服务器提供服务器,而是由多台web服务器提供服务,业务代码需要同时上传到多台web服务器,在操作上带来了很多不便。
故需要解决以上问题, 就需要web服务器中的业务代码能够及时同步,保证业务代码的一致性。
业务集群:
线上 对外提供服务的 10台 提供给用户对外服务 存储(分布式存储 解决服务器单例硬盘资源不够的情况)
线下 代码发布(CI CD git、jenkins、gitlab)灰度发布,监控(主机、服务 zabbix),日志收集分析(ELK elasticsearch(elasticsearch-head) logstash kibana kafka消息队列)
2、同步文件的几种方式
server01 web1服务器 /usr/local/nginx/html/tp5shop
server03 web2服务器 /usr/local/nginx/html/tp5shop
①scp
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令 ==全量同步==
问题:全部复制过去 比较慢 效率低一些 scp不能够远程删除
②rsync
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法==只传送两个文件的不同部分==,而不是每次都整份传送,因此速度相当快 ==增量同步==
问题:当文件变动,不能够实时同步
③rsync+sersync
inotify-tools和sersync属于同类
sersync是基于inotify+rsync的大量文件的多服务器自动同步程序
使用==Linux 2.6 内核的 inotify 监控 Linux 文件系统事件==,被监听目录下如果有文件发生修改,sersync 将通过内核自动捕获到事件,并将该文件利用 rsync 同步到多台远程服务器。sersync 仅仅同步发生增、删、改事件的单个文件或目录,不像rsync镜像同步那样需要比对双方服务器整个目录下数千万的文件,并且支持多线程同步,因此效率非常高
sersync主要用于服务器同步,web镜像等功能。基于boost1.43.0,inotify api,rsync command.开发
特点:
1、sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
相比较上面两个项目,sersync配置起来很简单,其中bin目录下已经有基本上静态编译的
2、二进制文件,配合bin目录下的xml配置文件直接使用即可。
另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
3、本项目有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。
4、本项目自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。
5、本项目socket与http插件扩展,满足您二次开发的需要。
二、同步文件案例
源服务器 web1 server01 原文件所在服务器 192.168.19.102
目标服务器 web2 server03 需要复制到的服务器 192.168.19.101
1、scp
语法:scp 本地文件路径 用户名@远程IP:远程存储路径
由于需要远程登录,故需要输入密码不是很方便,添加机器的公钥到允许列表中
①生成公钥(源服务器)
shell > ssh-keygen
②添加公钥到允许文件(源服务器)
web2允许web1登录,不需要输入密码
③测试远程登录
④测试修改业务代码
源服务器操作
⑤通过scp推送同步
源服务器操作
shell > scp -r /usr/local/nginx/html/tp5shop root@192.168.17.102:/usr/local/nginx/html
可以把以上推送命令,写入到脚本中,业务代码变化之后,直接执行脚本就可以
2、rsync
①web1文件变动
②在web1执行推送
shell > rsync -av /usr/local/nginx/html/tp5shop root@192.168.17.102:/usr/local/nginx/html
③在web2上查看
--delete
delete extraneous files from destination dirs
从目的地目录删除无关文件
以上操作,可以增量同步,删除已经无关的文件。
问题:不能够文件变动就同步,想折中的版本通过计划任务(crontab),crontab默认一分钟
①添加到脚本中
注意执行权限
②添加计划任务
③查看计划任务日志
Tip:更新时间间隔频繁的方式
①定时脚本实现
②启动脚本
③查看日志
3、rsync+sersync
实现方式:
源服务器 安装sersync 监控文件(inotify)的变动 调用rsync传输数据给目标服务器
目标服务器 启动rsync的服务
###3.1、目标服务器配置
####配置rsync服务
1、安装rsync
yum -y install rsync
2、配置rsync
vim /etc/rsyncd.conf
配置文件内容
uid = root gid = root use chroot = no #设置允许登录的ip,这里没有限制IP hosts allow=* #设置最大连接数 max connections = 3 #设置启动rsync服务器的文件 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock #同步模块 [tp5shop] #需要的文件及其文件夹路径 path = /usr/local/nginx/html/tp5shop #备注 comment = tp5shop #只读关闭 read only = false
3、以守护进程方式启动rsync
/usr/bin/rsync --daemon
###3.2、源服务器配置
shell > mv sersync2.5.4_64bit_binary_stable_final.tar.gz /usr/local/ shell > cd /usr/local/ shell > tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz shell > mv GNU-Linux-x86 sersync
配置serync示例文件说明
<?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> #保留字段,默认即可 <debug start="false"/> #是否开启调试模式,默认false即可 <fileSystem xfs="true"/> #是否开启支持xfs文件系统,Centos7默认都是xfs的了,所以建议true开启 <filter start="false"> #是否开启过滤模式,根据需求开启,例:过滤以.php结尾的文件(.*)\.php <exclude expression="(.*)\.svn"></exclude> #过滤以.svn结尾的文件 <exclude expression="(.*)\.gz"></exclude> #过滤以.gz结尾的文件 <exclude expression="^info/*"></exclude> #过滤监控目录下的info路径 <exclude expression="^static/*"></exclude> #过滤监控目录下的static路径 <exclude expression="wwwroot/blogwhsir/*"></exclude> #过滤wwwroot/blogwhsir/目录下所有文件 </filter> <inotify> #inotify监控事件 <delete start="true"/> #如果不开启此项,在删除监控目录下的文件时,目标服务器的文件则不会同时删除,根据需求开启 <createFolder start="true"/> #不开启不能监控子目录,建议true <createFile start="false"/> #关闭提高通讯性能,默认就好 <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="false"/> <modify start="false"/> </inotify><sersync> <localpath watch="/opt/tongbu"> #指定要监控的本地目录 <remote ip="127.0.0.1" name="tongbu1"/> #指定要同步的目标服务器的IP地址,及目标服务器rsync的[模块] <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> #配置rsync <commonParams params="-artuz"/> #rsync的参数 <auth start="false" users="root" passwordfile="/etc/rsync.pas"/> #是否开启rsync的认证模式,需要配置users及passwordfile,根据情况开启(如果开启,注意密码文件权限一定要是600) <userDefinedPort start="false" port="874"/><!-- port=874 --> #远程目标服务器的端口不是默认端口时使用 <timeout start="false" time="100"/><!-- timeout=100 --> #是否开启rsync的超时时间 <ssh start="false"/> </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> #目标服务器传输失败时会重新传输,再次失败会写入rsync_fail_log中,每隔一段时间(timeToExecute)执行脚本再次传输 <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="https://blog.whsir.com"/> <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> </localpath> </plugin> </head>
修改使用配置文件
<?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"><host hostip="localhost" port="8008"></host><debug start="false"/><fileSystem xfs="false"/><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><sersync><!--1、监控本地目录--><localpath watch="/usr/local/nginx/html/tp5shop"><!--2、目标服务器IP,同步到的服务器 name为目标服务器rsyncd.conf里配置的模块名称--><remote ip="192.168.17.101" name="tp5shop"/><!--<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 --><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--><crontab start="false" schedule="600"><!--600mins--><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>
启动sersync服务
/usr/local/sersync/sersync2 -n 10 -d -o /usr/local/sersync/confxml.xml
-n 启用线程数量 -d daemon方式启动 -o 指定配置文件
过滤不需要同步的文件
第6行开始 <filter start="true"><exclude expression="(.*)\.cfg"></exclude><!--<exclude expression="(.*)\.svn"></exclude><exclude expression="(.*)\.gz"></exclude><exclude expression="^info/*"></exclude><exclude expression="^static/*"></exclude>--> </filter>
三、企业业务架构回顾
1、企业LNMP单点部署
单点服务器满足基本业务需求,用户可以通过线上服务访问网站业务
2、企业数据库服务器单点部署
①多个业务软件,同时在一个服务器,会有资源争抢的现象
②数据库服务器,数据是最重要的,需要单独进行管理
数据库服务器进行严格的权限要求:
特定的用户操作特定库 一个业务一个用户
3、企业架构双点热备单活HA
HA 高可用 多个(起码两个以上)服务器节点,如果单点服务器出现问题,就由其他服务器进行接管服务。整个业务服务,是高度可用的。业务不受影响
VIP 虚拟IP 多台服务器,同时争抢一个IP
vrrp 网卡mac地址 => IP 确定VIP是否被绑定
使用keepalived
主master备backup 默认主优先
双备 优先级 可以设置不争抢
多备模式 权重
vip切换 脑裂(裂脑) 通信不顺畅
①防火墙禁用发包
②禁止发广播(组播) 可以使用单播 unicast
4、企业架构HA、LB
单点web服务器,已经不能够满足业务流量需求,需要增加服务器同时进行提供业务服务
SLB server load blance 把业务流量[平均]分配(分发)到多台服务器
二层 mac地址
三层 ip地址
四层 ip+port
七层 http url
lvs 四层以下 nat 四层和三层 、二层
NAT 跨网段转发 CIP192.168.39.72
DS两个网段(192.168.39.73,192.168.17.104) RS (192.168.17.101 ,103)
DR DS和RS都绑定VIP ,默认访问时,RS不要响应通过VIP访问的请求,由DS响应,DS分发到RS上,RS找VIP发现是自己,返回数据给CIP即可。 请求通过DS,返回直接通过RS给CS 。DS和RS在同一个网段 二层修改了mac地址
nginx 七层 proxy_pass转发 请求 到 upstream 分发
四层
haproxy 四层 model tcp 主动监测后端服务是否可用
七层 model http
浏览器(app)=>web服务器=>后端服务(php)=> 数据库
5、企业架构MySQL数据服务器主从复制
主从类型: M-S M-S-S M S S S M-M
一主多从的使用最多
延时复制 从同步主的延迟时间,作为误操作的一个备份
半同步 默认主从是异步,为了保证数据实时一致性,主确认从已经写入relay-log,才完成写入,返回用户,有一个等待时间
mysql的安全权限控制
grant 权限 on 数据库.数据表 to 用户名@主机 idetified by ‘密码’;
revoke
日志(错误、二进制、中继、慢查询[mysql优化] ) 备份
二进制日志开启: bin-log = 存储路径和名称 server-id 服务器唯一识别标识
备份:tar 打包 mysqldump xtrabackup innobackupex、percona
备份的影响:冷备份 温备份 热备份
备份的类型:物理(copy) 逻辑(sql导出再执行)
备份的粒度:全量 增量
主从复制:bin-log
slave 通过读取master的bin-log 写入relay-log中,再进行重放操作,复制同步数据。
默认异步线程的
master auto.cnf
①开启bin-log server-id 1
②授权slave replication slave 权限
③mysql > show master status;
slave
①配server-id 2
②配置slave服务
mysql > stop slave
mysql > change master masterhost ,masteruser · ········
日志文件名称 logfile 日志记录位置 position
mysql > start slave;
mysql > show slave status\G;
两个yes,一个yes就看看下面的报错信息,解决
6、企业架构读写分离
M-S S不能写
S 用来读
M 又读又写 来回切换模式,效率不高
M写 S读 读写分离 S down 为了业务可用性 M可以提供读服务
实现读写分离的两种方式:
①业务代码分离
②中间件(mycat)
mycat java编写
jdk jre
jdk :openjdk oraclejdk 授权方式不一样 java8 之后99.99%
mycat两种:
双写 writeHost writeHost M宕机 S不影响,可以读 也可以写 业务上S不让写 在S的配置上写read-only
单写单读 writeHost readHost M宕机 S不可用
mycat 客户端口 8066
管理端口 9066 mysql > show @@heartbeat;
7、企业架构缓存memcached
①LB的业务模式下,session出现不能够访问的情况
ip_hash session入库 memcached
②高速内存缓存软件 缓存了首页的category栏目数据
memcached
nosql key=>value
内存存储数据 要注意数据的备份
memcached redis key=>value store
mongodb doucument store
默认允许在11211端口
./memcached -uroot -d -p 11211 -m 内存大小 -M 禁用LRU机制
存储缓存机制
①懒惰机制 当key过期后,不会直接删除 当被使用时,确认过期,才会删除
节省系统的资源
②LRU 如果一个key存储的时候,发现存储空间不足。先删除已经过期的key,删了已经过期key还是不能够存储。会删除最近最少使用的key。删除这个key,存储新的key。
这个也是缓存的一种理想模式。不用的话,就没有必须占用内存空间
-M 可以禁用LRU
8、企业架构缓存redis
redis比memcache
①数据类型丰富
string 缓存字符串 计算器 incr
list 可以进行数据的双向操作
set 交集 并集 差集 sns 好友圈
zset 排序 score 权排序 score从大到小 或者从小到大 控制排序也就是控制score的大小
hash key:(field:value)
②数据持久化 snappshotting 快照 dump.rdb save
save 900 1
save 300 10
save 60 10000
aof append only file 文件追加写
每次 每秒 根据系统资源情况 闲时
③redis 主从模式
④redis默认存储string的value 512BM memcached 1M
⑤redis 单核 memcached 多核
redis hash 效果高 压缩高 返回数据快
memcached 超过100k以上,效果好一些
一般使用,缓存都可以 它们的每秒并发都可以达到几w级别
商城业务使用redis:
set记录登录的用户数,统计活跃用户及其数量
master-slave
master bind 127.0.0.1 外网访问网卡
requirepass 密码
slave 配置master slave of ~~~~
masterauth ~~~~
9、企业架构nosql之mongodb
mongodb用来进行访问日志记录
mongodb特点:
①存储 PB bson结构 存储灵活
②效率 读写
③结构 collection 集合 document 文档 field 域
CURD
use devops;
db.student.insert({name:1})
db.student.find({name:1},{age:1,_id:0})
db.student.remove()
db.student.update({查询条件},{‘$set’:{}})
基础知识点技术:
ssh、sftp、gcc、make、cmake、nginx(tengine、openresty)
server01-server10
server01 web1 nginx php-fpm keepalived sersync
server02 master MySQL mysql
server03 web2 nginx php-fpm keepalived rsync
server04 LB nginx|haproxy|lvs keepalived
server05 backupLB nginx|haproxy|lvs keepalived
server06 slave MySQL mysql
server07 mycat mycat java
server08 master cache memcached redis
server09 slave cache redis
server10 mongodb
四、模拟压力测试
1、web测试
ab 是httpd apache内置的一个压力测试工具,可以通过模拟并发的方式,检测出请求所用时间,每秒吞吐量。
ab的安装,可以源码编译的httpd中在/usr/local/httpd/bin里
rpm安装需要yum -y install httpd_tools
ab --help 查看相关参数
常见使用语法:
ab -c 并发次数[同时请求数] -n 总的请求数 访问URI路径
静态页面(html)
单机测试
负载均衡
动态页面(php)
单机测试
负载均衡
动态页面使用负载均衡提供了并发量,实际是有多个PHP-FPM可使用了。
单机优化,cpu和内存资源没有完全使用到。70%-90%
单机多实例php测试
sysbench mysql压力测试工具