NoSQL数据管理

聚合模型

聚合模型相当于包裹,包裹之间不进行数据交换

键值数据库 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.png

mongos是接受用户请求的,多个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

你可能感兴趣的:(NoSQL数据管理)