No sql培训笔记
---------------------------------------------------------------------------
淘宝
基本信息->关系型数据库(mysql/oracle)
图片->分布式文件系统(GFS,hdfs,TFS,NFS,EXT4)
描述->文档数据库(Mongodb,CouchDB..)
关键字-》搜索引擎(Isearch..)
评价-》文档数据库
热点数据-》内存-》分布式内存数据库(redis,
根据数据属性不同,会引入不同的数据源
大部分数据源属于NOSQL的范围---Not only sqls
一般的公司会在这些数据源上面用一个数据平台封装,使得这些数据源不可见,APP是在数据平台上使用。
关系型数据库 ACID---》事务
考虑:13年的双11-》第一分钟的的交易量1000万
下单--》提高下的TPS-》数据库存储架构
要提高关系型数据库的TPS--》拆分
下单业务-》买家产生订单记录
卖家产生订单记录
减少库存
发短信,发旺旺
统计销售量
最核心的是:买家下订单
卖家查看订单
卖家修改价格
买家卖家要解耦不能用分布式事务
关系型数据库走向分布式的过程:
切片:不同数据源数据是不一样的
垂直拆分--》按功能模块拆分
读写分离--》master/slave
水平拆分-》按记录拆分-》分表,分库(区)分表
淘宝订单:16库,每库64表,1024表
复制:不同数据源中的数据是不一样的
NOSQL
1.关注性能,降低ACID要求,分类细致,某一种产品关注某方面的需求
2.NOSQL的分类。
2.1key/value结构。 内存数据库。 redis/memcached
2.2文档数据库。(bson格式)Mongodb
2.3列数据库。 (name/value格式) Cassandra,Hbase
2.4图数据库。(放的是关系)FlockDB,Neo4J
3.数据模型
---》面向聚合的数据模型
---》图数据库除外
4.分布式模型
4.1--》一致性
4.2--》CAP
三者只能选其二
C->强一致性
A->高可用性
P->分布式
互联网应用 AP + BASE
4.3ebay竞拍
--->最后几秒是高并发的
--->如何在最后几秒不阻塞任何人的出价
4.4读写规划
--》一致性的hash原理
--》WRN
key/value之 ------》Memcached---》c实现
1.特点
1.1内存存储
对内存要求高,对CPU要求低。部署的时候和内存要求低,CPU要求高的应用部署在一起。
1.2集中式的缓存
Memcached每台实例都是独立的,是集中式的。
实例之间不通讯。
单点问题---》断电,重启等都会使得数据丢失。
分布式是要把客户端包含进来,通过客户端来控制各个实例。
横向扩展也是由客户端来控制。
1.3socket通讯
---》只要支持socket通讯的语言,都可以作为它的客户端
---》客户端如果存对象,对象需要序列化
---》socket通讯支持的NIO性能非常好
1.4内存分配机制特殊
---》预分配
---》懒删除
---》最大的value只能1M
1.5缓存机制简单
key/value 就是c写的hashmap结构
1.6几个应用点
小对象的缓存,session的缓存(MSM-》Memcached session management),token信息的缓存,数据库的前端缓存
2.基本操作
启动--》./memcached -d -m 512 -u root
./memcached -h ---判断是否链接成功
连接--》telnet 127.0.0.1 11211 ---->放在防火墙的后面
记住两个重要的启动参数
-n ------>内存预先分配,每块内存的大小划分和n参数有关
-f ------>不同slab递增的规则
内存分配的机制
启动命令可以添加-v 或者-vv 或者 -vvv
slab --->每个1M
item/chunk --》-n参数和-f参数来调节
page
不需要频繁的分配内存,回收内存
避免了内存碎片
set key 类型(数字) 有效时间 长度 回车
敲入内容 回车
add 添加不存在的key,如果key存在就会通知不成功
replace替换
get 普通查询
gets 带版本号查询
cas 命令 修改的时候带版本号
incr/desc/delete
stats
stats settings
stats items
stats size
stats slabes
version
flush_all
等
3.分布式
3.1一致性的hash原理
3.2客户端来操作集群
c的客户端---》libMemcached 包装了一致性hash算法
新浪--》Memcachedb 做了持久化并且提供了一致性算法
java客户端
----》memcached client for java jar包
基本使用
一些缺点---》初始化是硬编码--》是否可以修改成配置文件的方式
--->客户端读取数据是单字节读取---》改造成批量读取
---》线程处理方式是java5之前---》改造成java5之后的线程处理方式
--->如果自己使用Memcached缓存----》隔离缓存引用---》提炼结构做适配器隔离
支持了一致性的hash
----》xMemecached
--->一致性Hash
---》修改了读取方式,线程方式
-----》spyMemcached
--->一致性Hash
---》修改了读取方式,线程方式
--->不太稳定
------》淘宝客户端
---》包装了官方提供的memcached client for jav
---》接口提炼
---》以配置代替硬接口
---》修改了线程方式和单字节读取
----》做了cluster备份
----》做了本地缓存,减轻了Memcached的压力
key/value之 ------》redis
注意版本的问题
1.安装启动
安装之后---》redis.conf文件 有些windows版本可能没有这个文件,需要单独下载下来
启动 进入src ./redis-server radis.conf(位置到文件)
./redis-cli
2.数据类型和使用场景
key/value ---->value的类型更加丰富
2.1string
2.2list
2.3hashes
2.4set
2.5sorted-set
考虑下服务器提供给我的一些运算操作
3.丰富的key命令操作
redis有数据库的概念,默认数据库是0,通过select 1打开1数据库
4.reids支持事务
redis的事务和关系型数据库的事务不是一回事
5.redis支持持久化---》持久化对性能会有很大的损耗,新的版本逐渐在慢慢改进
rdb持久化 ---》产生rdb文件
----》save 900 1
save 300 10
save 60 10000
----->优缺点
在时间间隔内,如果宕机,会丢失部分数据
当数据很大时,写rdb会导致服务器停止服务
aof持久化 ---》记录的是日志
redis是通过配置文件来支持持久化--->redis.conf文件
---->配置
----》优缺点
如果只是打开rdb持久化,重启之后会通过rdb文件恢复数据
如果只是打开aof持久化,重启之后会通过aof文件恢复数据
如果即打开了rdb,又打开了aof持久化,redis会通过aof恢复数据
也可以不做持久化
6.radius支持master/slave机制
输入命令:slaveof masterip masterport,重启之后必须重新配置
通过配置文件:在slave实例的配置文件中配置即可
了解 复制的过程
复制的缺陷(注意版本,新版本已经改进)
没有增量复制的概念
可以通过aof文件模拟这样的概念完成增量复制
可以通过多写的方式完成,一致性要求高
新版本已经解决这个问题
读写分离
------->分布式环境会有一些中间件的出现
-----》数据切分及整合的中间件
-----》mysqlProxy
----->amoeba for mysql(alandin,mongodB)
----->考虑:是否要增加代理层(中间件---》twemproxy)
把集群对应用透明
-----》高可用
master宕机之后,slave自动升级为master
redis自动支持该功能----》切换比较慢
通过keepalived实现快速切换
-----》master开启持久化的对性能影响比较大
master不开启持久化,而在slave上做持久话,提高Master的性能
-----》在线扩容
在一台机器上部署多个实例
当内存不够时,加机器安装实例,作为之前多个实例中的slave
7.redis.conf文件中的配置信息
8.redis服务器管理
所有的配置信息,在redis通过命令在运行时刻进行干预
动态修改配置信息
config get
config set
9.redis内存优化
-----》hashes类型,list类型,sets中放的是int类型
redis可以对他们进行适当的编码处理,可以让空间节约,甚至让空间节约9/10.
10.redis客户端
java客户端 jedis
11 redis3.0版本实现了cluster
------>集群完全自动管理
文档数据库之Mongodb
1.特点
1.1数据格式是bson格式-----》二进制的json
1.2支持条件查询,支持索引
1.3支持存储过程,支持MapReduce
2.基本操作
概念:数据库(dbs)---》数据库
集合(collections)-----》表
文档(document)-----》记录
基本命令:
启动命令Mongod --depath=目录
连接 mongo
show dbs;
use 数据库
show collections;
基本结构:在数据目录下 有数据文件
其它基本操作命令:
导入导出工具:
在安装目录的\bin
支持存储过程,用JS语法
3.Capped Collection
4.导入文件 mongofiles
5.MapReduce
6.Mongodb支持索引
创建索引
查询时可以查看执行计划
思考---》 sql调优
7.客户端
---》Mongodb client for java
--->spring-data框架
spring-data-for Mongodb
spring-data-for redis
spring-data-for hbase
列数据库之cassandra
--->简单认识数据结构
[email protected]