SlideShare a Scribd company logo
1 of 30
Download to read offline
and Erlang
litaocheng@gmail.com
       2009.8.29
Apache CouchDB has started.
       Time to relax.
About This Talk

  CouchDB有何异与常人之处
  了解CouchDB
  CouchDB Internal
  不得不说Erlang
What's CouchDB

 Damien Katz创立<http://damienkatz.net/>
 Worked on Lotus Notes & MySQL
 2005开始本项目: C++, XML, on Windows
 2006基于Erlang进行实现, JSON, POSIX
 0.7.0 为第一个基于Erlang的发布版本
 成为Apache基金会正式项目
 当前版本 0.9.1
CouchDB Next Release(0.10)

 cookie 及 OAuth认证
 Windows发行包
 连续,可靠,快速的备份同步
 更加高效的追加式存储
 更好的HTTP协议兼容性(RFC 2616)
 后台管理界面改进
 Native Erlang View Server(已经实现)
 Filter API
 Update API
Why CouchDB?

 Document DB,数据存储格式为JSON
 Schema-Free,应用易扩展
 HTTP RESTful 接口,Web开发结合紧密
 CouchDB Replication,开发offline应用
 ACID Storage Engine
 MVCC,性能优越
 Views With MapReduce
 Single Storage File, 便于管理备份
 Fault Tolerant
CouchDB系统特性

Standalone (单节点):
   采用MVCC提高系统能力(并发读,顺序写)
   Append方式更新数据库
   提供ACID支持

Distributed (分布式)
   CouchDB 基于Document 可以自然的进行Partition
   Replication提高系统Availabity 和 Scalability
   Eventual Consistency by using Incremental
   Replication
CouchDB 原则
开始了解CouchDB

              API

          JSON

         Document

              View

          ACID

          MVCC
CouchDB API

          HTTP      CouchDB RUD

          GET            read


          PUT       create or update


         DELETE          delete

                     bulk operation
          POST
                      (批量操作)



   熟悉HTTP,那么你就已经了解CouchDB API !
JSON Documents

{
          “_id”   :   “some uuid”,
         “_rev”   :   “mvcc key”,
        “title”   :   “a blog post“,
       “author”   :   “foo”,
         “tags“   :   [“life“, “happy“],
    “post_date“   :   “2008-08-30 15:30:26“,
      “content“   :   “this is an blog....“
}

Document为Json格式,自描述,Documents直接没有任何约束,
依赖关系(与RDBM不同)
Schema-Free,根据应用调整数据,与JS亲密接触
Document and couch file




   DB File


    All Documents is self Contained
RDBM




Schema Alter, Data migrating, Scalicability ....
We Need NOSQL?
View

 以用户需要的方式,展现各种数据
 递增式构建view index
 BTree存储,高效的访问各种key,key-range
 同一DB(*.couch)可以创建任意多个view
 定义map, reduce函数,对DB中所有view进行处理
 默认为javascript view server
 利用自己喜欢的语言定义view server( java?
 c/c++)
View

用户自定义函数,生成展现数据(默认:javascript)
不影响原有的storage数据(.couch)

两种类型:
 常规view
 design documents 存储view的定义
 view index存储view结果(BTree)
 临时view
 通过POST DATA提交view定义,返回结果

Querying Options - startkey, endkye, limit ...
View example(js)

map fun:
function(doc) {
  emit(doc.post_date, doc.title);
}

result(BTree, sorted):

|     key                |    value      |
------------------------------------------
| "2008-08-30 15:30:06" | "a blog post" |
| "2008-08-31 20:31:24", | "second post" |
| "2008-09-01 10:10:21", | "third post" |

方便检索“一个星期内”,“某年某月”发布的blog post
ACID

Storage文件布局 (double header)
Append方式更新,无overwirte,无commit log
crash-only,数据保持一致性
MVCC, read(并发)不加锁,write为顺序化执行
包含2个BTree,以docid和seqid为key

更新步骤:
1. 数据追加到storage文件中
2. 更新两个连续的header信息(4K)

以上任意步骤发生异常,均保证数据consistency
Locking
  vs
   Multi Version Concurrency Control
Attachment
 Inline Attachments
 附件内嵌在document中
 以base64进行编码

 Standalone Attachments
 附件不是以text形式写入document
 保存于storage文件中
 Create - HTTP PUT
 Change - HTTP PUT携带rev信息
 Delete - HTTP DELETE 携带rev信息
CouchDB Internal
CouchDB Internal - Storage

 数据库文件的后缀为.couch,由Header和Body组成
 magic code:$g, $m, $k, 0
 头部长度为2048 * 2,由两个完全相同的header信
 息组成
 header主要包含root节点信息
 数据是以B+Tree的方式进行存储
 分为kv node和kp node
 对某个数据进行修改后,从被修改数据开始,向
 root节点遍历,将所有更新的数据append到couch
 文件中
CouchDB Internal - compaction

 由于 采用Append的方式,以磁盘空间换取性能
 couch文件大小会迅速增长,需要进行compaction
 创建dbname.compact文件,进行db初始化
 从当前db中拷贝最新数据到compact文件
 CouchDB依旧可用
 占用较多空间,需要在系统负载较低时进行
 compaction完毕后,数据切换
CouchDB Internal - Replication

 document and design can replicate
 incremental replication,只有更新的内容进行同步
 支持自定义函数进行replication过滤,获取某个数
 据子集
 通过seq num获取最新数据
 continues replaction ,监视 "_changes" API,所有
 数据更新进行即是更新
CouchDB Internal - View

 Default View Language : Javascript
 Js engine : Mozila SpiderMonkey
 couchjs /server/main.js 启动view server
 db更新时,通过couch_view_updater更新view
 view 初次请求时,比较耗时,需要生成view index
Erlang介绍

 Ericsson创建, 最初用于电信系统开发
 函数式编程语言(FP)
 面向并发(OC),基于消息
 内建分布式系统支持
 SMP支持,充分利用多核特性
 提供OTP,简化规范应用开发
 成熟, 稳定, 具有20多年历史
 适于电信系统, 分布式系统, 高并发服务器
 Open Source, 跨平台
Erlang带来的惊喜

 短短几行代码开发一个分布式应用
 不用为内存苦恼(泄露,越界,非法访问),GC自动回收内
 存
 利用OTP模型,书写必要的callback函数,构建一个服务
 面向并发,轻量级进程大大简化编程复杂度
 同样的代码(bytecode),运行于多种平台,轻松拥有多核优势
 代码热替换,可以在不停止服务的情况下进行更新
 丰富的测试,诊断,监控工具,完全了解系统的内部状态
 开源,任何时候出现问题,去代码中grep
 ...
Erlang带来的一些"抱怨"

 FP函数式编程,与OO背道而驰,形同陌路
 Single Assign单次赋值,匪夷所思
 Record语法丑陋无比
 string使用list进行表现,缺乏binary的优势
 ...

    所有 这些“抱怨”大部分是停留在语法层面
       看到她的 脸,以为读懂她的心
Erlang前面的惊喜才是真正有意义的东西.
资源推荐
blog:
http://mryufeng.javaeye.com
http://www.joeandmotorboat.com/
http://damienkatz.net/
http://jchrisa.net/
http://jan.prima.de/plok/
http://johnpwood.net/
http://userprimary.net/user/

website:
http://www.erlang.org
http://www.erlang-china.org
http://erlang-factory.com/
http://planet.couchdb.org/
http://wiki.apache.org/couchdb/
Books




    http://books.couchdb.org/relax/
CouchDB & Erlang

   Relax!
Thanks everyone!

More Related Content

What's hot

Database.Cache&Buffer&Lock
Database.Cache&Buffer&LockDatabase.Cache&Buffer&Lock
Database.Cache&Buffer&LockLixun Peng
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門Will Huang
 
对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结Lixun Peng
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈Tim Y
 
基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送OpenRestyCon
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用hugo
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
MySQL优化、新特性和新架构 彭立勋
MySQL优化、新特性和新架构 彭立勋MySQL优化、新特性和新架构 彭立勋
MySQL优化、新特性和新架构 彭立勋Lixun Peng
 
Mr&ueh数据库方面
Mr&ueh数据库方面Mr&ueh数据库方面
Mr&ueh数据库方面Tianwei Liu
 
MySQL新技术探索与实践
MySQL新技术探索与实践MySQL新技术探索与实践
MySQL新技术探索与实践Lixun Peng
 
nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用dong yuwei
 
MySQL源码分析.02.Handler API
MySQL源码分析.02.Handler APIMySQL源码分析.02.Handler API
MySQL源码分析.02.Handler APILixun Peng
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at TaobaoJoshua Zhu
 
Chasingice
ChasingiceChasingice
Chasingice冰 白
 
数据库内核分享——第一期
数据库内核分享——第一期数据库内核分享——第一期
数据库内核分享——第一期frogd
 
移动搜索在慢网速下的优化
移动搜索在慢网速下的优化移动搜索在慢网速下的优化
移动搜索在慢网速下的优化Charlee Green
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast sharerfyiamcool
 
Nginx使用和模块开发
Nginx使用和模块开发Nginx使用和模块开发
Nginx使用和模块开发qingpiao1983
 
應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局Alex Lau
 

What's hot (20)

Database.Cache&Buffer&Lock
Database.Cache&Buffer&LockDatabase.Cache&Buffer&Lock
Database.Cache&Buffer&Lock
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門
 
对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈
 
基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
MySQL优化、新特性和新架构 彭立勋
MySQL优化、新特性和新架构 彭立勋MySQL优化、新特性和新架构 彭立勋
MySQL优化、新特性和新架构 彭立勋
 
Mr&ueh数据库方面
Mr&ueh数据库方面Mr&ueh数据库方面
Mr&ueh数据库方面
 
MySQL新技术探索与实践
MySQL新技术探索与实践MySQL新技术探索与实践
MySQL新技术探索与实践
 
nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用
 
MySQL源码分析.02.Handler API
MySQL源码分析.02.Handler APIMySQL源码分析.02.Handler API
MySQL源码分析.02.Handler API
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at Taobao
 
Chasingice
ChasingiceChasingice
Chasingice
 
数据库内核分享——第一期
数据库内核分享——第一期数据库内核分享——第一期
数据库内核分享——第一期
 
Node分享 展烨
Node分享 展烨Node分享 展烨
Node分享 展烨
 
移动搜索在慢网速下的优化
移动搜索在慢网速下的优化移动搜索在慢网速下的优化
移动搜索在慢网速下的优化
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast share
 
Nginx使用和模块开发
Nginx使用和模块开发Nginx使用和模块开发
Nginx使用和模块开发
 
應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局
 

Similar to Couchdb Beijing Openparty

ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展江華 奚
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renrend0nn9n
 
深入浅出Netty l.t
深入浅出Netty   l.t深入浅出Netty   l.t
深入浅出Netty l.toleone
 
Re Introduce Web Development
Re Introduce Web DevelopmentRe Introduce Web Development
Re Introduce Web Developmentfinian lau
 
部門會議 950619 Leon的錦囊妙計
部門會議 950619 Leon的錦囊妙計部門會議 950619 Leon的錦囊妙計
部門會議 950619 Leon的錦囊妙計Leon Chuang
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo dbLucien Li
 
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式Shengyou Fan
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developerdianming.song
 
Kissy模块化实践
Kissy模块化实践Kissy模块化实践
Kissy模块化实践yiming he
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统Frank Xu
 
a glance of Javascript module
a glance of Javascript modulea glance of Javascript module
a glance of Javascript modulezipeng zhang
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBMonster Supreme
 
Hadoop基础及hive入门
Hadoop基础及hive入门Hadoop基础及hive入门
Hadoop基础及hive入门haiwang
 
Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异cleverpig
 
在Windows azure平台上進行資料庫處理及架構設計
在Windows azure平台上進行資料庫處理及架構設計在Windows azure平台上進行資料庫處理及架構設計
在Windows azure平台上進行資料庫處理及架構設計Sky Chang
 
Class 20170126
Class 20170126Class 20170126
Class 20170126Ivan Wei
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big DataKuo-Chun Su
 
腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程George Ang
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯liuts
 

Similar to Couchdb Beijing Openparty (20)

ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renren
 
深入浅出Netty l.t
深入浅出Netty   l.t深入浅出Netty   l.t
深入浅出Netty l.t
 
Re Introduce Web Development
Re Introduce Web DevelopmentRe Introduce Web Development
Re Introduce Web Development
 
部門會議 950619 Leon的錦囊妙計
部門會議 950619 Leon的錦囊妙計部門會議 950619 Leon的錦囊妙計
部門會議 950619 Leon的錦囊妙計
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo db
 
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developer
 
Kissy模块化实践
Kissy模块化实践Kissy模块化实践
Kissy模块化实践
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统
 
a glance of Javascript module
a glance of Javascript modulea glance of Javascript module
a glance of Javascript module
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDB
 
Hadoop基础及hive入门
Hadoop基础及hive入门Hadoop基础及hive入门
Hadoop基础及hive入门
 
Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异
 
在Windows azure平台上進行資料庫處理及架構設計
在Windows azure平台上進行資料庫處理及架構設計在Windows azure平台上進行資料庫處理及架構設計
在Windows azure平台上進行資料庫處理及架構設計
 
Class 20170126
Class 20170126Class 20170126
Class 20170126
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big Data
 
腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程
 
Ria lqj
Ria lqjRia lqj
Ria lqj
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯
 

Couchdb Beijing Openparty