聚合模型
聚合模型相当于包裹,包裹之间不进行数据交换
键值数据库 key-value
memcached 数据库
key是唯一标识,数据库不关心value是什么,应用程序负责解释。当成一种缓存中间件,数据库查询的缓存,基于内存的数据库。所有操作都是基于key。
yum install memcached
systemctl start memcached
telnet 127.0.0.1 11211
magent连接多个memcached数据库,实现分布式。
redis
value 类型可以很多,数据结构服务器,redis可以将存在内存中的数据定期刷新并持久化到硬盘中,redis自己提供分布式部署的能力
redis>HMSET 1001 name "memcached" port "11211"
redis>HGET 1001 name
redis>HGET 1001 port
redis>lpush dbs redis # lpush上传列表list
redis>lpush dbs mongodb # key 是dbs 插入一个redis和mongodb
redis>lrange dbs 0 10
# set没有顺序
redis>sadd dbs redis
redis>sadd dbs mongodb
redis>sadd dbs memcached
redis>smembers dbs
需要一个客户端 redis-client
redis使用hash槽,一次性hash的功能,redis具有主备功能。
redis安装
redis-cli
redis-cli -h xx.xxx.xxx.xxx -p 11211
集群模式安装,至少六台形成集群
# 修改 redis.conf
# 1.修改或直接注释bind ip 接受外部ip请求
# 2.取出cluster-enable_yes 的注释,开启集群功能
# 3.修改protected-mode yes 为no
# 4.service redis restart
# 控制集群需要安装
yum install redis-trib
redis-trib create --replicas 1 xx.xxx.xxx.xxx:xxxx ……
redis-cli -c
mongodb安装
文档数据库
yum install mongodb-server
yum install mongodb
mongo
insert操作
# user 集合的名字
# 第一次存放文档时新建数据库,无需新建
db.user.insert({json文档})
db.user.insert({name:"张三",age:"18"})
db.user.find({name:"张三"})
db.user.find({name:/^张*/}) #“张”开头
分布式环境构建
image.pngmongos是接受用户请求的,多个mongos
一台机器启动多个mongod进程,扮演不同的角色。
configserver用来存储配置文件
shardA是存储副本的,可以有多台服务器存储shardA,构成一个副本集
image.png
每一个副本集的个进程
mongodb配置实例
1.准备五台虚拟机
2.设计好角色
1[C,S1,S2,os]
2[S1,S2,S3]
3[S2,S3,S4]
4[S3,S4,C] S 分片
5[S4,C,S1] C config
3.分别在1-5号机器启动三个mongod进程
1)配置分片和数据分片启动参数不同,--configsvr --shardsvr
2)启动参数中指明自己的分片名(即副本集,C、S1等) --replSet S1
3)同一机器上不同进程占用不同端口
4.配置副本集,选择每一个组的任何一台机器上进行配置
> cfg={_id:"S1",members:[
{host:'x.x.x.x:10002'},
{host:'x.x.x.x:10001'},
{host:'x.x.x.x:10003'}
]};
> rs.initiate(cfg)
5.在1号机器上启动mongos进程,启动参数中指明一个或多个配置服务器
6.用mongo连接mongos,之后添加到各分片集群
> sh.addShard("C/X.X.X.X:10001")
> sh.addShard("S1/X.X.X.X:10002")
7.针对某个数据库,启用分片存储
> db.runCommand({enableSharding:"dbname"})
> db.runCommand({shardCollection:"user",key:{"_id":1}}) #数据库的每一个表依据id进行分散存储
> db.runCommand({shardCollection:"use2",key:{"_id":hashed}}) # hash分片,对"_id"进行hash计算
大部分NoSQL数据库不支持join多表查询操作,但单个表中可以存放很多信息,基本不需要join
适用于:
1.适应于大规模多样的数据类型
2.需要比较丰富的快速查询能力
不适用:
1.复杂单文档多文档事务操作
2.完全无模式
3.查询不高,但对整体读取、分析要求较高的应用
列族数据库
Cassandra
超级列 大包裹中小包裹,小包裹中分片
BigTable 谷歌非结构化数据库
记录,多个记录形成一张大表
记录中的key多个value值,用时间戳进行区分
(row:string,column:string,time:int64)-->string
实例
----------------info---------------------------------scores------------------
1001 name sex Address Chinese English
zhang M beijing 100 100
1001 是行关键字(倒排) 列索引(族名 列值 info:name) 时间戳
时间戳,读到的是最新的,可以保留多个版本
最大的特点就是只需要编辑info和scores,不需要确定info里面的内容,可以临时增加
HBASE模仿了Bigtable
Hbase.png
网友评论