SlideShare a Scribd company logo
1 of 21
Download to read offline
人有西洋参,我有地黄丸

  小小开发团队不妨知道的技术



       扇贝网 shanbay.com
       2012/08/18
扇贝网简介

英语词汇学习网站
跌跌撞撞一年
注册量 ~100万
每天访问量 ~5万
平台:Web,Android,iOS
团队:4工程师+ 1美工 +1研究员
假设你们和我们一样

技术凑合
●




能出活
●




没有大牛
●
技术栈
Nginx
●



Uwsgi
●



Django, Python
●



MySQL, Memcache, Redis, MongoDB
●



LVM
●



Ubuntu
●
成长后开始关心的问题
数据安全
●


    MySQL 备份,复制
    ●




服务性能
●


    mysql查询和调优,uwsgi配置,cache 和存储
    ●




开发效率
●


    Git,单元测试,virtualenv
    ●
MySQL-定期备份
曾经的做法:
●




拷贝/var/lib/mysql
  需要停止mysql服务,或者锁表,再copy
  期间无法提供数据库服务

用mysqldump
  恢!复!太!慢!
MySQL-定期备份
现在的做法:
1. 用LVM命令创建分区,mount在数据库目录

   /var/lib/mysql 上
2. 使用mylvmbackup备份,并且通过rsnap作为远

   程拷贝工具

效果:
 1秒内生LVM快照,2-3个小时拷贝数据库文件
到远程
 始终保持5个版本的数据库文件
MySQL-定期备份
     ●mylvmbackup基本工作原理

               数据库并锁表
          ●Flush
          ●LVM 快照 (瞬间完成,copy-on-write)
          ●保存当前mysql的配置和参数(binlog文件名和pos 偏移量)
          ●数据库解锁
          ●将快照拷贝到另一个文件夹
          ●删除LVM 快照
          ●将该文件夹通过rsync/rsnap备份到远程主机上



详见Backup and Recovery, High Performance MySQL 2nd ed
MySQL - 主从复制(replication)
 ●实时主从复制
     要求:
     ●
         基础数据
         ●



         binlog文件名
         ●


         偏移量 pos
         ●


         这些mylvmbackup都贴心的提供了!!!
         ●




详情请见 High Performance MySQL 的Replication 相关章节
MySQL 数据安全
●   MySQL 服务器需要有raid卡, 需要做raid,
    确保不出现硬盘损坏之类低级错误
●   有raid卡,检查raid 卡要有电池,没有电池的
    raid 会带来两个严重的问题:
    ○   万一数据库crash, 可能会挂掉, 恢复不了
    ○   慢的无法忍受, 写性能极差


    我们曾经买了一台Dell机器用于数据库服务,牛逼(相对)配
    置,但是数据库写性能极差,检查半月,发现自带的raid卡
    SAS 6/i 未带电池
MySQL - 其他安全策略
其他策略
●


    ●增加只读帐号
    ●常用查询脚本化

    ●在slave数据库上进行数据分析

    ●仅限内网访问

    ●要常常假想数据库坏掉了, 真的会坏
服务性能 - Django Queryset优化
1.   Django 没有魔法, 有些写法很直观, 代价是查询整个表
     a.   objects.all()
     b.   some_object.related_set()


2.   每一个查询都要理解它背后的sql:
     a.   objects.latest('time'), time 有索引吗?
     b.   objects.all().order_by('name')[10000:5]



3.   永远要避免subquery:
     a.   book_ids = Book.objects.values_list('id',flat=True)
     b.   user_books = UserBook.objects.filter(book__id__in=book_ids)


4.   系统变慢的时候,首先要想到slow query:
     a.   slow_query 在percona mysql版本里可以配置到1秒以下,默认是10秒
     b.   有些sql 是因为有一个巨慢的sql堵塞引起的,所以要合理分析
服务性能 -MySQL参数

●   innodb_buffer_pool_size = 20G
检查这个值,理论上这个值不要大于系统80%就可以,注意观察
swap, 一旦整个机器出现swap 就要调小
●   innodb_flush_log_at_trx_commit = 2
(不要每次transaction都flush 日志),速度可能有几十倍的差距
●   query_cache_size= 32M
如果写操作频繁,这个值不应当太大, 要注意限制它的大小,
cache 最主要的需要通过memcached 来实现, 而不是MySQL来实现
这种cache
服务性能 -uwsgi
折磨了我们大半年的问题
●




     ● 流量稍有提升,uwsgi大量broken pipe错误,nginx的
    error log中各种 错误
      ●upstream timedout ...

      ●connection reset by peers ...

      ●upstream prematurely closed connection ..




     实际应用服务器和数据库负载并不高,即便增加机
     ●

    器也没有用
服务性能 -uwsgi
●实际原因,没有配置好uwsgi,没有足够的服务
进程
     ● 分配多个(4-5)个socket
      ●每个socket 分配一组worker,listen queue 为

    3000
      ●总共20个进程

      ●要求内核参数相应调整: ulimit, backlog,

    sysctl -w net.core.somaxconn=3000
      ●touch reload机制
mongodb作为文件存储
●   曾经使用过nfs 存储数据
     ■性能差
     ■安全性差 (我们曾经一次误操作,就永久性
      删除了部分人头像数据,幸好有备份)

●   mongodb + nginx file cache
○    使用gridfs来储存image, audio, video等大文
     件
○    应用程序(django) 从mongodb 读取文件
○    nginx 使用store 的方式来cache 静态文件
nginx cache conf
location /team_emblem {
      alias /www-data/www/uwsgi_store/team_emblem/;
      default_type image/jpg;
      keepalive_timeout 0;
      try_files $request_uri @proxy;
}


location @proxy {
      uwsgi_pass 17bdc_cluster;
      include    uwsgi_params;
      uwsgi_store_access user:rw group:rw all:rw;
      uwsgi_store on;
      root /www-data/www/uwsgi_store/;
      keepalive_timeout 0;
}
Redis 和 Memcached 区别
为什么要用redis?
●


    ● 永久性保存一些数据
     ●所谓永久性不是指永远, 而是指在指定时间以前

    它不会无缘无故消失
     ●这些数据从数据库里再次取出来代价比较高




为什么用memcache?
●


    ●因为我们一直在用
    ●Redis 需要很大的内存

    ●我们有点担心玩不动redis

    ●我们正在迁移更多数据到redis
适合redis 的场景
我们到目前有三块数据是放在redis里的:

1. session: 因为session 有过期时间,并且频繁访问,而且
   django db_based session 需要定期删除,非常麻烦;
2. 用户每天学习数据:每个用户当天频繁访问, 如果放在
   memcached, 在丢失的情况下,从数据库查出来,代价比较
   大,而现在,我们会在凌晨提前拿出来放在redis里
3. 排名数据, 任何需要排名的东西,放在cache里相对代价比较
   低
开发效率
版本管理使用 Git
●


     ●多人多开发分支,合并代码极其方便,已经不能理
    解当年svn是怎么过来的了
     ●Git 分支命名和流程

VirtuanEnv + Pip
●


     隔离开发环境和测试环境,保证库依赖的一致性
     ●

Unit Testing
●


     ●Django Unit Tests,相当程度的保证程序在上线时
    的质量
     ●Jenkins 持续集成工具
结束
谢谢大家

More Related Content

What's hot

Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Eric Xiao
 
Build scalable microblog qcon beijing 2010
Build scalable microblog qcon beijing 2010Build scalable microblog qcon beijing 2010
Build scalable microblog qcon beijing 2010Tim Y
 
twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧twMVC
 
Track2 -刘继伟--openstack in gamewave
Track2 -刘继伟--openstack in gamewaveTrack2 -刘继伟--openstack in gamewave
Track2 -刘继伟--openstack in gamewaveOpenCity Community
 
Npm 套件管理 & 常用開發工具介紹
Npm 套件管理 & 常用開發工具介紹Npm 套件管理 & 常用開發工具介紹
Npm 套件管理 & 常用開發工具介紹wantingj
 
Node.js從無到有 基本課程
Node.js從無到有 基本課程Node.js從無到有 基本課程
Node.js從無到有 基本課程Simon Su
 
twMVC#43 YARP
twMVC#43 YARPtwMVC#43 YARP
twMVC#43 YARPtwMVC
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介GO LL
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁reinhardx
 
Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails serverMichael Chen
 
Kubernetes use-ceph
Kubernetes use-cephKubernetes use-ceph
Kubernetes use-cephYang Guanjun
 
twMVC#41 The journey of source generator
twMVC#41 The journey of source generatortwMVC#41 The journey of source generator
twMVC#41 The journey of source generatortwMVC
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB
 
Node.js 淺談socket.io
Node.js   淺談socket.ioNode.js   淺談socket.io
Node.js 淺談socket.ioSimon Su
 
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事twMVC
 
How GFW work
How GFW workHow GFW work
How GFW workBin Feng
 
Micloud 基礎應用介紹
Micloud 基礎應用介紹Micloud 基礎應用介紹
Micloud 基礎應用介紹Simon Su
 
Comment System of 56.com
Comment System of 56.comComment System of 56.com
Comment System of 56.comHo Kim
 

What's hot (20)

Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出
 
Build scalable microblog qcon beijing 2010
Build scalable microblog qcon beijing 2010Build scalable microblog qcon beijing 2010
Build scalable microblog qcon beijing 2010
 
twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧
 
Track2 -刘继伟--openstack in gamewave
Track2 -刘继伟--openstack in gamewaveTrack2 -刘继伟--openstack in gamewave
Track2 -刘继伟--openstack in gamewave
 
Npm 套件管理 & 常用開發工具介紹
Npm 套件管理 & 常用開發工具介紹Npm 套件管理 & 常用開發工具介紹
Npm 套件管理 & 常用開發工具介紹
 
Node.js從無到有 基本課程
Node.js從無到有 基本課程Node.js從無到有 基本課程
Node.js從無到有 基本課程
 
twMVC#43 YARP
twMVC#43 YARPtwMVC#43 YARP
twMVC#43 YARP
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁
 
Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails server
 
MySQL-Proxy
MySQL-ProxyMySQL-Proxy
MySQL-Proxy
 
Kubernetes use-ceph
Kubernetes use-cephKubernetes use-ceph
Kubernetes use-ceph
 
twMVC#41 The journey of source generator
twMVC#41 The journey of source generatortwMVC#41 The journey of source generator
twMVC#41 The journey of source generator
 
Ovirt deep dive
Ovirt deep diveOvirt deep dive
Ovirt deep dive
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360
 
Node.js 淺談socket.io
Node.js   淺談socket.ioNode.js   淺談socket.io
Node.js 淺談socket.io
 
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
 
How GFW work
How GFW workHow GFW work
How GFW work
 
Micloud 基礎應用介紹
Micloud 基礎應用介紹Micloud 基礎應用介紹
Micloud 基礎應用介紹
 
Comment System of 56.com
Comment System of 56.comComment System of 56.com
Comment System of 56.com
 

Viewers also liked

新浪微博redis技术演化
新浪微博redis技术演化新浪微博redis技术演化
新浪微博redis技术演化XiaoJun Hong
 
MoMo Tel Aviv Israel June 2009 Mike Moore
MoMo Tel Aviv Israel June 2009 Mike MooreMoMo Tel Aviv Israel June 2009 Mike Moore
MoMo Tel Aviv Israel June 2009 Mike MooreMobileMonday Tel-Aviv
 
Ma R Ia Mo Nt E Ss Or I
Ma R Ia Mo Nt E Ss Or IMa R Ia Mo Nt E Ss Or I
Ma R Ia Mo Nt E Ss Or Iguest5f4c783
 
Dock It Customer Intro 14 Aug 09
Dock It Customer Intro 14 Aug 09Dock It Customer Intro 14 Aug 09
Dock It Customer Intro 14 Aug 09DockIT
 
Experience development c120617-1-img
Experience development c120617-1-imgExperience development c120617-1-img
Experience development c120617-1-imgSham Yemul
 
Eyeblaster Trends In Conversion 2009
Eyeblaster Trends In Conversion 2009Eyeblaster Trends In Conversion 2009
Eyeblaster Trends In Conversion 2009Eyeblaster Spain
 
2014 whitney-public-talk
2014 whitney-public-talk2014 whitney-public-talk
2014 whitney-public-talkc.titus.brown
 
Pdf Chap 8 Leadership
Pdf Chap 8 LeadershipPdf Chap 8 Leadership
Pdf Chap 8 LeadershipJ.P.
 
19 советов презентация
19 советов презентация19 советов презентация
19 советов презентацияElena
 
شرائح التغيير
شرائح التغييرشرائح التغيير
شرائح التغييرAhmad Darwish
 
Portage County Health Literacy Coalition
Portage County Health Literacy CoalitionPortage County Health Literacy Coalition
Portage County Health Literacy CoalitionSarah Halstead
 
2012 talk to CSE department at U. Arizona
2012 talk to CSE department at U. Arizona2012 talk to CSE department at U. Arizona
2012 talk to CSE department at U. Arizonac.titus.brown
 
Retirement Planning
Retirement PlanningRetirement Planning
Retirement PlanningCamiloSilva
 
Louisiana Technology Council Summer 2010
Louisiana Technology Council Summer 2010Louisiana Technology Council Summer 2010
Louisiana Technology Council Summer 2010JaclynSBR
 

Viewers also liked (20)

新浪微博redis技术演化
新浪微博redis技术演化新浪微博redis技术演化
新浪微博redis技术演化
 
Post Survey
Post SurveyPost Survey
Post Survey
 
MoMo Tel Aviv Israel June 2009 Mike Moore
MoMo Tel Aviv Israel June 2009 Mike MooreMoMo Tel Aviv Israel June 2009 Mike Moore
MoMo Tel Aviv Israel June 2009 Mike Moore
 
Ma R Ia Mo Nt E Ss Or I
Ma R Ia Mo Nt E Ss Or IMa R Ia Mo Nt E Ss Or I
Ma R Ia Mo Nt E Ss Or I
 
Matchmoving Introduction
Matchmoving IntroductionMatchmoving Introduction
Matchmoving Introduction
 
Dr Roadmap
Dr RoadmapDr Roadmap
Dr Roadmap
 
Ramazan
RamazanRamazan
Ramazan
 
Dock It Customer Intro 14 Aug 09
Dock It Customer Intro 14 Aug 09Dock It Customer Intro 14 Aug 09
Dock It Customer Intro 14 Aug 09
 
Experience development c120617-1-img
Experience development c120617-1-imgExperience development c120617-1-img
Experience development c120617-1-img
 
Formulacion del pei
Formulacion del peiFormulacion del pei
Formulacion del pei
 
Eyeblaster Trends In Conversion 2009
Eyeblaster Trends In Conversion 2009Eyeblaster Trends In Conversion 2009
Eyeblaster Trends In Conversion 2009
 
2014 whitney-public-talk
2014 whitney-public-talk2014 whitney-public-talk
2014 whitney-public-talk
 
Coalition Orientation for SACADA Board Members
Coalition Orientation for SACADA Board MembersCoalition Orientation for SACADA Board Members
Coalition Orientation for SACADA Board Members
 
Pdf Chap 8 Leadership
Pdf Chap 8 LeadershipPdf Chap 8 Leadership
Pdf Chap 8 Leadership
 
19 советов презентация
19 советов презентация19 советов презентация
19 советов презентация
 
شرائح التغيير
شرائح التغييرشرائح التغيير
شرائح التغيير
 
Portage County Health Literacy Coalition
Portage County Health Literacy CoalitionPortage County Health Literacy Coalition
Portage County Health Literacy Coalition
 
2012 talk to CSE department at U. Arizona
2012 talk to CSE department at U. Arizona2012 talk to CSE department at U. Arizona
2012 talk to CSE department at U. Arizona
 
Retirement Planning
Retirement PlanningRetirement Planning
Retirement Planning
 
Louisiana Technology Council Summer 2010
Louisiana Technology Council Summer 2010Louisiana Technology Council Summer 2010
Louisiana Technology Council Summer 2010
 

Similar to Python小团队不妨知道的技术

构建基于Lamp的中型网站架构
构建基于Lamp的中型网站架构构建基于Lamp的中型网站架构
构建基于Lamp的中型网站架构HonestQiao
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析iammutex
 
网站存储经验谈pdf
网站存储经验谈pdf网站存储经验谈pdf
网站存储经验谈pdfYu Lin
 
网站存储经验谈-pdf
网站存储经验谈-pdf网站存储经验谈-pdf
网站存储经验谈-pdfYu Lin
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优thinkinlamp
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践mysqlops
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江thinkinlamp
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysqlpwesh
 
Taobao数据库这5年
Taobao数据库这5年Taobao数据库这5年
Taobao数据库这5年yp_fangdong
 
4 葉金榮-my sql優化 - 20151219
4 葉金榮-my sql優化 - 201512194 葉金榮-my sql優化 - 20151219
4 葉金榮-my sql優化 - 20151219Ivan Tu
 
Redis介绍
Redis介绍 Redis介绍
Redis介绍 yubao fu
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at TaobaoJoshua Zhu
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
Chasingice
ChasingiceChasingice
Chasingice冰 白
 
美丽说的架构发展与变迁 New
美丽说的架构发展与变迁 New美丽说的架构发展与变迁 New
美丽说的架构发展与变迁 New翀 刘
 
Taobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconTaobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconYiwei Ma
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计fuchaoqun
 
Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2redhat9
 
How do we manage more than one thousand of Pegasus clusters - backend part
How do we manage more than one thousand of Pegasus clusters - backend partHow do we manage more than one thousand of Pegasus clusters - backend part
How do we manage more than one thousand of Pegasus clusters - backend partacelyc1112009
 

Similar to Python小团队不妨知道的技术 (20)

构建基于Lamp的中型网站架构
构建基于Lamp的中型网站架构构建基于Lamp的中型网站架构
构建基于Lamp的中型网站架构
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析
 
网站存储经验谈pdf
网站存储经验谈pdf网站存储经验谈pdf
网站存储经验谈pdf
 
网站存储经验谈-pdf
网站存储经验谈-pdf网站存储经验谈-pdf
网站存储经验谈-pdf
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysql
 
Taobao数据库这5年
Taobao数据库这5年Taobao数据库这5年
Taobao数据库这5年
 
4 葉金榮-my sql優化 - 20151219
4 葉金榮-my sql優化 - 201512194 葉金榮-my sql優化 - 20151219
4 葉金榮-my sql優化 - 20151219
 
Redis介绍
Redis介绍 Redis介绍
Redis介绍
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at Taobao
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Chasingice
ChasingiceChasingice
Chasingice
 
美丽说的架构发展与变迁 New
美丽说的架构发展与变迁 New美丽说的架构发展与变迁 New
美丽说的架构发展与变迁 New
 
Taobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconTaobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qcon
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计
 
Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2
 
How do we manage more than one thousand of Pegasus clusters - backend part
How do we manage more than one thousand of Pegasus clusters - backend partHow do we manage more than one thousand of Pegasus clusters - backend part
How do we manage more than one thousand of Pegasus clusters - backend part
 

Python小团队不妨知道的技术

  • 5. 成长后开始关心的问题 数据安全 ● MySQL 备份,复制 ● 服务性能 ● mysql查询和调优,uwsgi配置,cache 和存储 ● 开发效率 ● Git,单元测试,virtualenv ●
  • 7. MySQL-定期备份 现在的做法: 1. 用LVM命令创建分区,mount在数据库目录 /var/lib/mysql 上 2. 使用mylvmbackup备份,并且通过rsnap作为远 程拷贝工具 效果: 1秒内生LVM快照,2-3个小时拷贝数据库文件 到远程 始终保持5个版本的数据库文件
  • 8. MySQL-定期备份 ●mylvmbackup基本工作原理 数据库并锁表 ●Flush ●LVM 快照 (瞬间完成,copy-on-write) ●保存当前mysql的配置和参数(binlog文件名和pos 偏移量) ●数据库解锁 ●将快照拷贝到另一个文件夹 ●删除LVM 快照 ●将该文件夹通过rsync/rsnap备份到远程主机上 详见Backup and Recovery, High Performance MySQL 2nd ed
  • 9. MySQL - 主从复制(replication) ●实时主从复制 要求: ● 基础数据 ● binlog文件名 ● 偏移量 pos ● 这些mylvmbackup都贴心的提供了!!! ● 详情请见 High Performance MySQL 的Replication 相关章节
  • 10. MySQL 数据安全 ● MySQL 服务器需要有raid卡, 需要做raid, 确保不出现硬盘损坏之类低级错误 ● 有raid卡,检查raid 卡要有电池,没有电池的 raid 会带来两个严重的问题: ○ 万一数据库crash, 可能会挂掉, 恢复不了 ○ 慢的无法忍受, 写性能极差 我们曾经买了一台Dell机器用于数据库服务,牛逼(相对)配 置,但是数据库写性能极差,检查半月,发现自带的raid卡 SAS 6/i 未带电池
  • 11. MySQL - 其他安全策略 其他策略 ● ●增加只读帐号 ●常用查询脚本化 ●在slave数据库上进行数据分析 ●仅限内网访问 ●要常常假想数据库坏掉了, 真的会坏
  • 12. 服务性能 - Django Queryset优化 1. Django 没有魔法, 有些写法很直观, 代价是查询整个表 a. objects.all() b. some_object.related_set() 2. 每一个查询都要理解它背后的sql: a. objects.latest('time'), time 有索引吗? b. objects.all().order_by('name')[10000:5] 3. 永远要避免subquery: a. book_ids = Book.objects.values_list('id',flat=True) b. user_books = UserBook.objects.filter(book__id__in=book_ids) 4. 系统变慢的时候,首先要想到slow query: a. slow_query 在percona mysql版本里可以配置到1秒以下,默认是10秒 b. 有些sql 是因为有一个巨慢的sql堵塞引起的,所以要合理分析
  • 13. 服务性能 -MySQL参数 ● innodb_buffer_pool_size = 20G 检查这个值,理论上这个值不要大于系统80%就可以,注意观察 swap, 一旦整个机器出现swap 就要调小 ● innodb_flush_log_at_trx_commit = 2 (不要每次transaction都flush 日志),速度可能有几十倍的差距 ● query_cache_size= 32M 如果写操作频繁,这个值不应当太大, 要注意限制它的大小, cache 最主要的需要通过memcached 来实现, 而不是MySQL来实现 这种cache
  • 14. 服务性能 -uwsgi 折磨了我们大半年的问题 ● ● 流量稍有提升,uwsgi大量broken pipe错误,nginx的 error log中各种 错误 ●upstream timedout ... ●connection reset by peers ... ●upstream prematurely closed connection .. 实际应用服务器和数据库负载并不高,即便增加机 ● 器也没有用
  • 15. 服务性能 -uwsgi ●实际原因,没有配置好uwsgi,没有足够的服务 进程 ● 分配多个(4-5)个socket ●每个socket 分配一组worker,listen queue 为 3000 ●总共20个进程 ●要求内核参数相应调整: ulimit, backlog, sysctl -w net.core.somaxconn=3000 ●touch reload机制
  • 16. mongodb作为文件存储 ● 曾经使用过nfs 存储数据 ■性能差 ■安全性差 (我们曾经一次误操作,就永久性 删除了部分人头像数据,幸好有备份) ● mongodb + nginx file cache ○ 使用gridfs来储存image, audio, video等大文 件 ○ 应用程序(django) 从mongodb 读取文件 ○ nginx 使用store 的方式来cache 静态文件
  • 17. nginx cache conf location /team_emblem { alias /www-data/www/uwsgi_store/team_emblem/; default_type image/jpg; keepalive_timeout 0; try_files $request_uri @proxy; } location @proxy { uwsgi_pass 17bdc_cluster; include uwsgi_params; uwsgi_store_access user:rw group:rw all:rw; uwsgi_store on; root /www-data/www/uwsgi_store/; keepalive_timeout 0; }
  • 18. Redis 和 Memcached 区别 为什么要用redis? ● ● 永久性保存一些数据 ●所谓永久性不是指永远, 而是指在指定时间以前 它不会无缘无故消失 ●这些数据从数据库里再次取出来代价比较高 为什么用memcache? ● ●因为我们一直在用 ●Redis 需要很大的内存 ●我们有点担心玩不动redis ●我们正在迁移更多数据到redis
  • 19. 适合redis 的场景 我们到目前有三块数据是放在redis里的: 1. session: 因为session 有过期时间,并且频繁访问,而且 django db_based session 需要定期删除,非常麻烦; 2. 用户每天学习数据:每个用户当天频繁访问, 如果放在 memcached, 在丢失的情况下,从数据库查出来,代价比较 大,而现在,我们会在凌晨提前拿出来放在redis里 3. 排名数据, 任何需要排名的东西,放在cache里相对代价比较 低
  • 20. 开发效率 版本管理使用 Git ● ●多人多开发分支,合并代码极其方便,已经不能理 解当年svn是怎么过来的了 ●Git 分支命名和流程 VirtuanEnv + Pip ● 隔离开发环境和测试环境,保证库依赖的一致性 ● Unit Testing ● ●Django Unit Tests,相当程度的保证程序在上线时 的质量 ●Jenkins 持续集成工具