煮酒品茶:本文只是记录学习过程中采摘的东西罢了。
--------------------------------------------------
黑色字体:已阅
蓝色字体:待阅
红色字体:重点(或者作者PS)
--------------------------------------------------
更新:2012-04-25 23:03 对构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)[连载之电子商务系统架构] 进行小小改动。
 
构建高性能电子商务网站
-------------------------------
一、熟悉安全技术,了解硬件防火墙性能,能熟悉的配置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 上的代码,线上容易接收。
原文:http://dinglin.iteye.com/blog/1179574
另外,本方案有改进版本,作者建议一并阅读:
http://dinglin.iteye.com/blog/1187154
 
煮酒品茶:典形的主从模式吧,工具同步,这个还得尝试着去更改。
-----------------------------------------------