Linux运维趋势采摘 -14期 【第一次编辑】
构建高性能电子商务网站 ------------------------------- 一、熟悉安全技术,了解硬件防火墙性能,能熟悉的配置iptables 和了解 Linux/Unix 相关的安全工具; 二、熟练的配置Linux 的集群技术,比如LVS/Nginx/HAproxy,了解其原 理和会话保持机制; 三、熟练的配置Nginx 和Apache 服务器,能熟练的配置其正则; 四、熟练和了解MySQL 或Oracle 数据库,至少要了解一种; 五、熟悉存储; 六、熟悉和了解虚拟化技术; 七、极熟悉SHELL 脚本,用其实现工作中的各项需求; 八、懂PHP 或Java 代码。(以上总结来自抚琴煮酒的一次访谈) 在大型电子商务网站下,运维的工作会细分,不过上述内容仍是基本功。 此外,由于大规模网站遇到的各方面挑战,会要求开发人员和运维人员能够 与时俱进,在网站遭遇瓶颈之前做好应对。 煮酒品茶:抚琴煮酒的这些个基本功,个人认为把他当成一个学习的过程即可,精通这个精通那个最终只会倒致啥事无成,只有一项完全熟悉之后方可进军下一目标。 ------------------------------------- Ubuntu 11.10,Fedora 16正式发布 ----------------------------------------------------- 【脑细胞】网站架构的常见演进路径:web 与db 共用→ web 和db 拆分→多台web → db 主从→ web 缓存→ db 缓存→存储拆分→ Scale Up →按应用竖切web →内存当硬盘→按时间横切db →按事务竖切db →按hash 竖切db →存储网络化→虚拟化→云,看起来都有章可循,但不知多少技术人员在这路上死了无数脑细胞,还有那无数的不眠之夜。 http://weibo.com/1649415495/xwl7WBXwa 煮酒品茶:同上方观点一样,任何一个都是一个过程,只有彻底了解后方可进军下个方面,技术过渡也是这么过来的。 ------------------------------------------- 淘宝软件基础设施近年发展情况 ---------------------------------------------- MySQL优化 针对复制、同步、日志系统、单机效率、负载均衡方面的优化。详见 yufeng 的另一篇分享: http://www.slideshare.net/mryufeng/mysql-7583273 服务优化 针对Apache/Nginx、HTTP 模块、Squid、LVS、HAProxy、TCP 方面的优化。Nginx 优化方面,淘宝有一个开源的模块,大家可以参考一下: http://code.taobao.org/p/nginx_concat_module/ 去年的Velociy 大会上,朱照远(叔度)和王晓哲(清无)也分享过Nginx定制开发方面的经验。 Java环境优化 这方面可以参考淘宝Java 中间件团队博客(注:该团队已经在今年和淘宝业务平台团队合并为通用产品团队): http://rdc.taobao.com/team/jm/ Linux内核优化与定制 夸父通讯中间件 任卿对夸父通讯中间件进行过介绍: http://www.slideshare.net/openparty/ss-6680035 低功耗硬件平台 这方面可以参考淘宝最近公开的开源绿色计算项目: http://www.greencompute.org/ CDN系统 这方面也可以参考任卿的介绍: http://www.slideshare.net/colderboy17/cdn-9022813 ------------------------ 架构或者构思前期必须思考: 应用服务器操作系统-应用服务器软件-Web Server-DB Server 开发框架 ------------------------ 煮酒品茶:以此记录,并慢慢学习 --------------------------------------------------- 构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)[连载之电子商务系统架构] --------------------------------------------------- 构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)[连载之电子商务系统架构] 出处:http://jimmyli.blog.51cto.com/ 我站在巨人肩膀上Jimmy Li 作者:Jimmy Li 关键词:网站,电子商务,Shell,自动备份,异地备份 ------[连载之电子商务系统架构]访问量超过100万的电子商务网站技术架构 连接:http://jimmyli.blog.51cto.com/3190309/584992 网站运维异地备份方案及故障应急备用镜像 站 上一遍文章详细介绍了服务器安全方面,接下来继续介绍Linux服务器文件备份,数据库备份,数据安 全存储相关的电子商务系统架构。针对安全性有多种多样的解决方案,其中数据备份是重中之重的首要 工作。 电子商务网站更加注重考虑数据安全,数据备份方案,包括本地备份、异地备份架构。其中Linux服务 器的备份方案非常多,本文介绍一个大众化适用的解决方案,通过编写Shell脚本来完成自动备份。本 架构包括备份网站文件、数据库,自动本地备份并FTP上传备份脚本,完成相应本地备份、异地备份, 实现双层备份解决方案。 本文要点: 1.全自动完成网站文件及数据库备份。 2.编写Shell脚本来完成自动备份。 3.同时进行自动本地/异地双备份,FTP上传备份。 4.Linux服务器的备份解决方案。 5.包括备份网站文件,网站程序文件、数据文件,MYSQL数据库。 6.定期定时自动完成备份。定期删除旧备份,这里是自动删除30天前备份,复用利用备份空间。 目录: 一、准备工作 二、构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 三、网站及数据库自动本地备份并FTP上传备份Shell脚本,完整的实例;备份脚本进行详细解说,注释 。 在运营中的电子商务网站,建站之初就一直在重申一定要备份好自己的数据,因为太多的不确定性可能 会造成数据库丢失,而且大部分基础服务商也不可能提供每天备份数据。原来本BLOG提供过一个备份方 法,只是略微说了一下,可能部分新手会不太好入手。今天分享一个自己的备份脚本。 详见后面附录 http://jimmyli.blog.51cto.com/3190309/584992 《网站运维异地备份方案及故障应急 备用镜像站》 一、准备工作: 1.软件安装 需要提前在Linux服务器安装好lftp,lftp功能上比较强大,CentOS直接执行:yum install lftp, Debian执行:apt-get install lftp 。 2.备份目录建立 需要在Linux服务器上创建/home/backup/ 目录。 3.FTP异地备份IP 账号 密码 需要在异地FTP上创建backup目录。 如果Linux服务器上数据库不多的话使用网络基础服务商的存储空间就可以。也可以用专门的备份服务 器。可根据应用的大小,数据量的大小,网络状况,和实际的网络资源,硬件资源灵活支配。 二、构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 三、网站及数据库自动本地备份并FTP上传备份Shell脚本 完整的实例: ======================================================================== #!/bin/bash #Funciont: Backup website and mysql database #Author: Jimmy Li #Website: http://jimmyli.blog.51cto.com/ #IMPORTANT!!!Please Setting the following Values! Backup_Dir1=/data/wwwroot/www.zuihuasuan8.net wd=/var/www/html/blog MYSQL_UserName=root MYSQL_PassWord=你的mysql数据库root密码 Backup_Database_Name1=www.zuihuasuan8.net FTP_HostName=www.zuihuasuan8.net FTP_UserName=www.zuihuasuan8.net FTP_PassWord=www.zuihuasuan8.net FTP_BackupDir=www.zuihuasuan8.net——backup TodayWWWBackup=www-*-$(date +"%Y%m%d").tar.gz TodayDBBackup=db-*-$(date +"%Y%m%d").sql OldWWWBackup=www-*-$(date -d -30day +"%Y%m%d").tar.gz OldDBBackup=db-*-$(date -d -30day +"%Y%m%d").sql #tar zcf /home/backup/www-$Backup_Dir1-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ cd $wd tar -zcvf /home/backup/www-$Backup_Dir1-$(date +"%Y%m%d").tar.gz * $Backup_Dir1 --exclude=soft /usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name1 > /home/backup/db-$Backup_Database_Name1-$(date +"%Y%m%d").sql rm $OldWWWBackup rm $OldDBBackup cd /home/backup/ lftp $FTP_HostName -u $FTP_UserName,$FTP_PassWord << EOF cd $FTP_BackupDir mrm $OldWWWBackup mrm $OldDBBackup mput $TodayWWWBackup mput $TodayDBBackup bye EOF ======================================================================== 煮酒品茶:有点小小的人性化问题,打包后的文件解压后连整个目录都打包了,造成长目录,这本不是我们需求的,所以我们小小的cd一下就好了 定义:wd=/var/www/html/blog 压缩:tar -zcvf /home/backup/www-$Backup_Dir1-$(date +"%Y%m%d").tar.gz * ------------------------------------ 我修改后的: Linux数据备份方案 设计需求: 一、每天零晨三点备份web文件 二、每天零晨三点备份MYsql数据库 三、远程传送至某地 脚本如下: ----------------------------------------------------------- #----------------------------------------- # form to cwtea.51cto.com or wh.cn-cert.com #Email:zwhset@163.com #----------------------------------------- # wd=Web即备份文件目录 bd=备份目录 su=Mysql用户 sp=Mysql密码 sn=数据库名字 fu=FTP用户 fp=FTP密码 fpd=FTP备份目录 #www cd $wd tar -zcvf $bd/web-$(date +"%Y%m%d").tar.gz * #sql mysqldump -u$su -p$sp $sn > $bd/$sn$(date +"%Y%m%d").sql #ftp lftp FTPIP -u$fu,FTP密码 <<EOF cd $spd mput $bd/web-$(date +"%Y%m%d").tar.gz mput $bd/$sn$(date +"%Y%m%d").sql bye EOF --------------------------------------------------------------- ----------------------------------- 下面将备份脚本进行详细解说,注释: #!/bin/bash #Funciont: Backup website and mysql database #Author: Jimmy Li #Website: http://jimmyli.blog.51cto.com/ #IMPORTANT!!!Please Setting the following Values! ######~Set Directory you want to backup~######将下面的目录修改成自己要备份的目录,一般按我 的都是在/data/wwwroot/下面所有直接写了需要备份的目录。可以继续再加:Backup_Dir2=你的目录 ,Backup_Dir后面的数字依次递增。如果不足N个,直接删除不需要的就可以,同时修改下面tar zcf 部分。 Backup_Dir1=/data/wwwroot/www.zuihuasuan8.net ######~Set MySQL UserName and password~######设置MySQL的用户名和密码,最好是root,其他用户 可能因为权限问题无法导出部分数据库。 MYSQL_UserName=root MYSQL_PassWord=你的mysql数据库root密码 ######~Set MySQL Database you want to backup~######设置要部分的数据库,可以继续再加: Backup_Database_Name2=数据库名,Backup_Database_Name后面的数字依次递增。 Backup_Database_Name1=www.zuihuasuan8.net ######~Set FTP Information~######设置用来存放备份数据的FTP信息 FTP_HostName=www.zuihuasuan8.net //FTP服务器的IP或者域名 FTP_UserName=www.zuihuasuan8.net //FTP服务器用户名 FTP_PassWord=www.zuihuasuan8.net //FTP服务器用户对应的密码 FTP_BackupDir=www.zuihuasuan8.net——backup //备份到FTP上的目录,需要提 前创建好。 #Values Setting END! ######设置结束 TodayWWWBackup=www-*-$(date +"%Y%m%d").tar.gz TodayDBBackup=db-*-$(date +"%Y%m%d").sql OldWWWBackup=www-*-$(date -d -30day +"%Y%m%d").tar.gz OldDBBackup=db-*-$(date -d -30day +"%Y%m%d").sql tar zcf /home/backup/www-$Backup_Dir1-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir1 --exclude=soft ###上面为备份网站文件数据,因为我的网站比较零散,而且网站目录下面有些目录属于临时目录并不 需要备份,所以可以在上面加上--exclude=不备份的目录。如果在前面加了Backup_Dir2=yourdir,则 再加tar zcf /home/backup/www-$Backup_Dir2-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir2 。如果多余则删除多余行。 /usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name1 > /home/backup/db-$Backup_Database_Name1-$(date +"%Y%m%d").sql ###上面为备份MySQL数据库,如果在前面加了Backup_Database_Name2=yourdatabasename,则再 加/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name2 > /home/backup/db-$Backup_Database_Name2-$(date +"%Y%m%d").sql 。如 果多余则删除多余行。 rm $OldWWWBackup rm $OldDBBackup ###删除30天前的备份### cd /home/backup/ ###下面为自动上传部分,不得不说lftp很强大,抛弃ftp吧#### lftp $FTP_HostName -u $FTP_UserName,$FTP_PassWord << EOF cd $FTP_BackupDir mrm $OldWWWBackup mrm $OldDBBackup mput $TodayWWWBackup mput $TodayDBBackup bye EOF 脚本下载地址: 下载脚本,将脚本放到/root/ 下面,按上面的注释修改脚本中的参数,并保存,如果不熟悉vim或者 nano编辑器,可以用winscp,执行:chmod +x /root/backup.sh 为脚本添加执行权限,执行:crontab -e 添加定时执行 在crontab中加入:0 3 * * * /root/backup.sh 凌晨3点自动执行/root/bakcup.sh 脚本,备份Linux服务器上的数据并上传到预先设定好的异地FTP上 。 选择在凌晨3进行备份,是因为这个时间段网站的访问量是最低。也就是说在很少人访问的情况下做备 份操作。 附录: 网站运维异地备份方案及故障应急备用镜像站 定期检查异地备份故障应急时,启用应急Web服务 出处:http://jimmyli.blog.51cto.com/ Jimmy Li Blog 。欢迎朋友一起交流,讨论。扣扣:柒⑥柒陆叁⑤叁伍 煮酒品茶:一套非常nice的方案,过程就是脚本收集文件然后上传至远程备份服务器上。思路是头脑,脚本是执行。构成一个基本的备份系统。测试后再修改看效果。 ------------------------------------------------------------ 一种MySQL主从同步加速方案 ------------------------------------------------------------ 一种MySQL主从同步加速方案 一、问题起源 MySQL 的主从同步一直有从库延迟的问题,原因简单描述如下: 1、 MySQL 从库上有一个IO 线程负责从主库取binlog 到本地。另外有 一个SQL 线程负责执行这些本地日志,实现命令重放; 2、 正常网络状况下IO 线程没有性能问题(这个待会会用到),问题是 SQL 线程只有一个,更新速度跟不上。所以经常会看到从库的CPU idle 很 高,但同步性能就是上不去。 二、方案雏形 单线程的SQL 线程是造成这个问题的主要原因。比较直接的想法是把 它改成多线程版本,这个据说官方版本开发中,其实我们也有一个这样的 patch,但是直接写大片代码在线上提供服务的slave 机器上这种事儿,都会 因为担心稳定性而很难推动(写patch 的和运维的同学,你们懂的)。 所以打算用一个“第三方”工具中转,来实现多线程同步。基本结构如图: 说明: 1、这些transfer 从master 上各自同步一部分的数据,分别独立更新 slave。多进程、多线程均可。 2、Transfer 与master 之间异步更新日志,transfer 与slave 之间同步更新 数据。 3、从这可以看出这个方案的缺点之一:更新能够被独立分开。比较直观 的想法是,按照表分。 三、关于transfer 作为这个关键的转发工具transfer,需要提供如下功能: 1、能够指定同步master 中的哪部分数据,并且能够方便地修改这个配置 以应对master 的加表需求。 2、支持stop slave、start slave。支持快速切换到新主库的change master 命令。 3、能够记录读取点,transfer 自己重启或master 重启后能够按照记录点 继续读后面的binlog。 4、能够记录分发点,transfer 自己重启或slave 重启后能够按照记录点继续同步给slave。 用起来就会发现还有好多要求…… 四、方案实现 Transfer 的这么多功能,自己造轮子就累了。这里直接用MySQL 来充当此角色。为了方便描述,下文还将之称为transfer。Transfer 更新slave 在功能上可以使用federated 引擎,但由于其纠结的实现导致性能上达不到要求,因此在MySQL 框架层中作了一点修改,读到同步日志后,直接发送给 slave。 方案简单描述如下: 1、Slave 机器上搭另外的若干个MySQL(transfer),将其设为Master 的从 库,且设置replicate-do-table, 每个transfer 承担一部分的表。 2、所有Transfer 的更新目标都设置为slave,其更新方式是读到日志后直 接mysql_real_query 执行到slave 上。从这可以看出这个方案的缺点之二:只能支持statement 格式的同步方 式。其实row 也能支持,后面再说。 五、仍然延迟? 在transfer 放弃federated 引擎改用直接发送后,性能提升不少,从库同步 性能增加一倍,但延迟还很大。发现这个时候slave 的机器cpu 已经很忙了,idle 20% 以下——这个算是好消息,总比idle 很高但性能上不去好。实际上是因为每个transfer,虽然设置只同步其中的部分表,但在实现上是IO 线程把master 上的所有命令都备份到本地,然后在SQL 线程执行的时候再判断,若不符合replicate-do-table,再放弃。这样存在的问题,是n 个transfer,磁盘写了n 倍,更严重的是导致SQL线程空转。我们上文提到整个流程中IO 线程是比较空闲的,因此修改IO 线程逻辑,在写入磁盘前先判断,若不符合本transfer 的replicate-do-table 设置,不写盘,直接放弃。 六、效果 从库的QPS 由于线程切换会有抖动,但总的执行时间与主库相同。从库的cpu idle 下降,与主库几乎同时恢复到100。 七、小结 1、要求在slave 机器上多配置n 个transfer(是否在从库上均可) 2、目前只能支持statement 的binlog 格式,实际上row 可以支持,方案定了,开发计划中。 3、跨表更新的语句,会按照其更新的第一个表,分发到唯一一个transfer,没有重复更新的问题,但有时序性问题。方案的好处: 1、功能比较齐全。直接使用MySQL,原有的管理功能基本都能用,主库 从库重启/ 换库的代价比较小。 2、开发量小,只在transfer 上修改两处,不包括配置读取部分,300 行以内 3、风险相对小,不直接修改master 和slave 上的代码,线上容易接收。 本文转自 煮酒品茶 51CTO博客,原文链接:http://blog.51cto.com/cwtea/843583,如需转载请自行联系原作者