NoSQL理论基础及安装、基本操作

30分钟开始

分布式系统理论:

CAP:

一致性

可用性

分区容错性

MongoDB:

安装

crud

索引

副本集

分片

NoSQL:非关系型、分布式、不提供ACID功能

技术特点:

1、简单数据模型

2、元数据和应用数据分离(分不同服务器存储)

3、弱一致性

优势:

1、避免不必要的复杂性

2、高吞吐量

3、高水平扩展能力和低端硬件集群

4、不适用对象-关系映射

劣势:

1、不支持ACID特性

2、功能简单

3、没有统一的数据查询模型

分类:

NoSQL:

键值存储

列式数据库

文档数据库

图式数据库

SQL:

mysql

pgsql

缓存数据库系统:

memcache

CAP理论:从CAP中挑出2个

BASE理论:

基本可用

软状态

最终一致性

C,A:SQL(保证一致性,可用性)

C,P:悲观加锁机制(一致性,分区容错性)

A,P:DNS

数据一致性模型:强一致性、弱一致性、最终一致性

数据一致性的实现技术:

Quorum(法定票数)系统NRW策略(关注)

N:副本数

R:完成读操作所需要读取的最少副本数

W:完成写操作所需要写入的最少副本数

要想保证强一致性:R+W>N

最多只能保证最终一致性:R+W<=N

两段式提交:2PC(two phase commit protocol)(关注)

有两类节点:

一类为协调者

一类为事务参与者

两段:

1、请求阶段:事务协调者通知事务参与者提交事务

2、提交阶段:事务参与者提交事务

时间戳策略

Paxos:根据协议进行协调

向量时钟

NoSQL的数据存储模型:

1、键值存储:k-w

优点:查找迅速

缺点:数据无结构、通常只被当做字符串或二进制数据

应用场景:内容缓存

实例:redis,dynamo

2、列式模型:

数据模型:数据按列存储,将同一列数据存在一起

优点:查找迅速,可扩展性强,易于实现分布式

缺点:功能相对sql有限

应用场景:分布式文件系统或分布式存储

实例:Bigtable(google),cassandra,HBase,Hypertable

3、文档模型

数据模型:与键值模型相似,value指向结构化数据

优点:数据格式要求不严格,无需事先定义结构

缺点:查询性能不高,缺乏统一查询语法

应用场景:web应用

实例:MongoDB,CouchDB

4、图式模型:

数据模型:图结构模型

优点:利用图结构相关算法提高性能,满足特殊场景应用需求

缺点:实现分布式较困难,功能有定向性

应用场景:社交网络、推荐系统、关系图谱

实例:Neo4j

www.nosql-database.org

Mongodb:

collection:表

多个collection:database

MongoDB的安装:是一个易于扩展的、高性能、开源、文档模式的no-sql数据库

存储:海量数据、文档数据库、不需要创建表结构、c++研发的,开源

是什么?

基于文档数据库(json格式)

无表结构

性能:

c++

支持各种索引

不支持事务

内存映射(延迟写操作)

扩展性:

复制

auto-sharding

商业支持

支持基于文档的查询:表达式为json

支持使用map/reduce

灵活的聚合操作

在分片的基础上并行处理

GridFS:网格文件系统,存储单个大文件或海量小文件的分布式文件系统

地理位置、空间索引

被生产环境验证过

特性:

动态查询

查询性能剖析

基于复制完成故障自动转移

rabbitmq的性能太差,使用HBase

适应场景:

web网站

缓存

低价值、高存储量

高扩展性

实现对象、json存储的应用编程环境

不适合场景:

事务型

商业智能决策

使用sql接口的

MongoDB数据模型:面向集合的数据库

数据库:无需创建

表:集合(行):由文档组成,多个文档组成一个表,文档是json格式的(可以嵌套),集合无需事先定义

c/s:

mongod服务器端

mongo

安装:

查看配置文件:

[[email protected] ~]# cat /etc/mongod.conf 
# mongo.conf

#where to log
logpath=/var/log/mongo/mongod.log

logappend=true

# fork and run in background
fork = true

#port = 27017

dbpath=/var/lib/mongo   #运行mongod服务的用户也是mongod,所以保证这个目录的属主属组也为mongod,
为了数据使用,应该找一个合理的目录

# location of pidfile
pidfilepath = /var/run/mongodb/mongod.pid

# Disables write-ahead journaling
# nojournal = true

# Enables periodic logging of CPU utilization and I/O wait
#cpu = true

# Turn on/off security.  Off is currently the default
#noauth = true
#auth = true

# Verbose logging output.
#verbose = true

# Inspect all client data for validity on receipt (useful for
# developing drivers)
#objcheck = true

# Enable db quota management
#quota = true

# Set oplogging level where n is
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#diaglog = 0

# Ignore query hints
#nohints = true

# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true

# Turns off server-side scripting.  This will result in greatly limited
# functionality
#noscripting = true

# Turns off table scans.  Any query that would do a table scan fails.
#notablescan = true

# Disable data file preallocation.
#noprealloc = true

# Specify .ns file size for new databases.
# nssize = <size>

# Accout token for Mongo monitoring server.
#mms-token = <token>

# Server name for Mongo monitoring server.
#mms-name = <server-name>

# Ping interval for Mongo monitoring server.
#mms-interval = <seconds>

# Replication Options

# in replicated mongo databases, specify here whether this is a slave or master
#slave = true
#source = master.example.com
# Slave only: specify a single database to replicate
#only = master.example.com
# or
#master = true
#source = slave.example.com
创建目录,改属主属组

修改配置文件

启动服务

system数据库保存其他数据库的元数据(和myslq中的mysql数据库一样)

查看端口:

27017:服务端口

28017:管理端口

NoSQL数据库一般是在内网中使用的,不进行认证,直接连

数据库帮助:

> db.help
function () {
    print("DB methods:");
    print("\tdb.addUser(userDocument)");
    print("\tdb.adminCommand(nameOrDocument) - switches to ‘admin‘ db, and runs command [ just calls db.runCommand(...) ]");
    print("\tdb.auth(username, password)");
    print("\tdb.cloneDatabase(fromhost)");
    print("\tdb.commandHelp(name) returns the help for the command");
    print("\tdb.copyDatabase(fromdb, todb, fromhost)");
    print("\tdb.createCollection(name, { size : ..., capped : ..., max : ... } )");
    print("\tdb.currentOp() displays currently executing operations in the db");
    print("\tdb.dropDatabase()");
    print("\tdb.eval(func, args) run code server-side");
    print("\tdb.fsyncLock() flush data to disk and lock server for backups");
    print("\tdb.fsyncUnlock() unlocks server following a db.fsyncLock()");
    print("\tdb.getCollection(cname) same as db[‘cname‘] or db.cname");
    print("\tdb.getCollectionNames()");
    print("\tdb.getLastError() - just returns the err msg string");
    print("\tdb.getLastErrorObj() - return full status object");
    print("\tdb.getMongo() get the server connection object");
    print("\tdb.getMongo().setSlaveOk() allow queries on a replication slave server");
    print("\tdb.getName()");
    print("\tdb.getPrevError()");
    print("\tdb.getProfilingLevel() - deprecated");
    print("\tdb.getProfilingStatus() - returns if profiling is on and slow threshold");
    print("\tdb.getReplicationInfo()");
    print("\tdb.getSiblingDB(name) get the db at the same server as this one");
    print("\tdb.hostInfo() get details about the server‘s host");
    print("\tdb.isMaster() check replica primary status");
    print("\tdb.killOp(opid) kills the current operation in the db");
    print("\tdb.listCommands() lists all the db commands");
    print("\tdb.loadServerScripts() loads all the scripts in db.system.js");
    print("\tdb.logout()");
    print("\tdb.printCollectionStats()");
    print("\tdb.printReplicationInfo()");
    print("\tdb.printShardingStatus()");
    print("\tdb.printSlaveReplicationInfo()");
    print("\tdb.removeUser(username)");
    print("\tdb.repairDatabase()");
    print("\tdb.resetError()");
    print("\tdb.runCommand(cmdObj) run a database command.  if cmdObj is a string, turns it into { cmdObj : 1 }");
    print("\tdb.serverStatus()");
    print("\tdb.setProfilingLevel(level,<slowms>) 0=off 1=slow 2=all");
    print("\tdb.setVerboseShell(flag) display extra information in shell output");
    print("\tdb.shutdownServer()");
    print("\tdb.stats()");
    print("\tdb.version() current version of the server");

    return __magicNoPrint;
}

集合帮助:

> db.mycoll.help()
DBCollection help
    db.mycoll.find().help() - show DBCursor help
    db.mycoll.count()
    db.mycoll.copyTo(newColl) - duplicates collection by copying all documents to newColl; no indexes are copied.
    db.mycoll.convertToCapped(maxBytes) - calls {convertToCapped:‘mycoll‘, size:maxBytes}} command
    db.mycoll.dataSize()
    db.mycoll.distinct( key ) - e.g. db.mycoll.distinct( ‘x‘ )
    db.mycoll.drop() drop the collection
    db.mycoll.dropIndex(index) - e.g. db.mycoll.dropIndex( "indexName" ) or db.mycoll.dropIndex( { "indexKey" : 1 } )
    db.mycoll.dropIndexes()
    db.mycoll.ensureIndex(keypattern[,options]) - options is an object with these possible fields: name, unique, dropDups
    db.mycoll.reIndex()
    db.mycoll.find([query],[fields]) - query is an optional query filter. fields is optional set of fields to return.
                                                  e.g. db.mycoll.find( {x:77} , {name:1, x:1} )
    db.mycoll.find(...).count()
    db.mycoll.find(...).limit(n)
    db.mycoll.find(...).skip(n)
    db.mycoll.find(...).sort(...)
    db.mycoll.findOne([query])
    db.mycoll.findAndModify( { update : ... , remove : bool [, query: {}, sort: {}, ‘new‘: false] } )
    db.mycoll.getDB() get DB object associated with collection
    db.mycoll.getIndexes()
    db.mycoll.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } )
    db.mycoll.insert(obj)
    db.mycoll.mapReduce( mapFunction , reduceFunction , <optional params> )
    db.mycoll.remove(query)
    db.mycoll.renameCollection( newName , <dropTarget> ) renames the collection.
    db.mycoll.runCommand( name , <options> ) runs a db command with the given name where the first param is the collection name
    db.mycoll.save(obj)
    db.mycoll.stats()
    db.mycoll.storageSize() - includes free space allocated to this collection
    db.mycoll.totalIndexSize() - size in bytes of all the indexes
    db.mycoll.totalSize() - storage allocated for all data and indexes
    db.mycoll.update(query, object[, upsert_bool, multi_bool]) - instead of two flags, you can pass an object with fields: upsert, multi
    db.mycoll.validate( <full> ) - SLOW
    db.mycoll.getShardVersion() - only for use with sharding
    db.mycoll.getShardDistribution() - prints statistics about data distribution in the cluster
    db.mycoll.getSplitKeysForChunks( <maxChunkSize> ) - calculates split points over all chunks and returns splitter function

简单使用:

使用数据库:(无需创建),collection也无需创建

db.collection.insert:插入

show collections:查询集合

db.collections.find():查询语句

db.collections.update():更新

db.collections.remove():移除

集合信息:

删除集合:

查看数据库文件:

基本操作:

show dbs:查看所有数据库

show collections:查看集合

show users:查看用户

show profile:

show logs:查看所有日志列表

show log [name]:查看具体的日志

远程连接:

mongo --host ip

crud操作:

create,read,update,delete

虽然没有表结构,但还是应该对同类对象放到一个collection

查询:

db.users.find({age:{$gt:18}}).sort({age:1})   查询age大于18的用户,以age为升序进行排序

插入:

db.users.insert(

{

name:‘suse‘,

age:26,

status:‘A‘,

group:[‘news‘,‘sports‘]

}

)

更新:

db.coll.update(

{age:{$gt:18}},

{$set:{status:‘A‘}},

{multi:true}   不指定时只修改第一个符合条件

)

删除:

db.coll.delete(

{status:‘D‘}

)

插入:

一批只显示20个,输入it继续

limit:

删除:

修改:

find高级用法:

db.collection.find(<添加>,<字段>)

db.collection.count()返回条数

比较运算:

$gt:大于{field:{$gt:value}}

$gte:大于等于{field:{$gte:value}}

$in:存在于{field:{$in:[value1,value2,...]}}

$lt:小于{field:{$lt:value}}

$lte:小于等于{field:{$lte:value}}

$ne:不等于{field:{$ne:value}}

$nin:不存在于{field:{$nin:[value1,value2...]}}

大于

显示需要的字段:

逻辑运算:

$or:或运算,{$or:[{expression1},{expression2},...]}

$and:或运算,{$and:[{expression1},{expression2},...]}

$not:或运算,{field:{$not:{operator-expression}}}

$nor:反运算,即返回不符合所有指定条件的文档,{$nor:[{expression1},{expression2},...]}

与运算:

元素查询:

如果要分居文档中是否存在某字段等条件来挑选文档,则需要用到元素运算

$exists:根据指定字段的存在性挑选文档,语法:{field:{$exists:<boolean>}},指定<boolean>的值为‘true‘则返回存在指定字段的文档,‘false‘则返回不存在指定字段的文档

$mod:将指定字段的值进行取模运算,并返回其余数作为指定值的文档,语法{field:{$mod:[divisor,remainder]}}

$type:返回指定字段的值类型为指定类型的文档,语法:{field:{$type:<bson type>}}

重新插入一条数据:

查询:

更新:

update专有操作符大致包含:field,array,bitwise

field:

$inc:增大指定字段的值,格式:

db.collection.update({field:value},{$nic:{field1:amount}}),其中{field:value}用于指定挑选标准,{$inc:{field1:amount}}用于指定要提升其值的字段及提升大小amount

$rename:更改字段名,格式为{$rename:{<old name1>:<new name1>,<old name2>:<new name2>,...}}

$set:修改字段的值为新指定的值,格式db.collection.update({field:value1},{$set:{field2:value2}})

$unset:删除指定的字段,格式db.collection.update({field:value1},{$unset:{field1:""}})

时间: 2024-11-10 13:47:18

NoSQL理论基础及安装、基本操作的相关文章

一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子

一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子 最近,由于云计算的发展,数据库技术也从结构式数据库发展到NoSQL数据库,存储模式从结构化的关系存储到现在如火如荼的key/value存储.其中Berkeley DB就是上述过程中的一个比较有代表性的内存数据库产品,数据库的操作是通过程序来实现的,而不是SQL语句.特别是当今数据不断动态增加的过程中,试图 通过数据切割来达到扩充的思路已经行不通了,因为事先不知道客户数据格式,因此服务提供商不可能进行数据切割.而无模式的key/

二十三 NoSql&amp;Redi及其安装

什么是Nosql not only sql , 不仅仅是sql,是一项全新的数据库理念,泛指非关系型的数据库. 为什么需要NoSql 解决以下问题: 1 High Performance   对数据库高并发读写的要求 例如电商的秒杀,一瞬间很多人访问仓库.投票计数等等 2 Huge Storage  对海量数据的高效率存储和访问的需求 例如QQ,推特等等,几亿用户,产生的信息量关系型数据库很难应付. 3 High Scalability && High Availability  对数据库

非关系型数据库(NoSQL)——Redis安装及部署详解

在现在的互联网大潮中,NoSQL可谓是家喻户晓,Redis作为NoSQL中及其重要的一员,使我们走向架构道路的一条必经之路.作为运维工程师来说,是必须要掌握的! 既然提到了Redis数据库是非关系型数据,并且需要掌握Redis数据库.那么关于关系型数据库与非关系型数据库的基本概念是必须要了解的. 一.关系型数据库与非关系型数据库的基本概念: 数据库按照其结构可以分为关系型数据库与其他数据库,而这些其他数据库,我们统称为非关系型数据库. 1.关系型数据库 关系型数据库是一个结构化的数据库,创建在关

hadoop入门(3)&mdash;&mdash;hadoop2.0理论基础:安装部署方法

一.hadoop2.0安装部署流程         1.自动安装部署:Ambari.Minos(小米).Cloudera Manager(收费)         2.使用RPM包安装部署:Apache hadoop不支持.HDP与CDH提供         3.使用jar包安装部署:各版本均提供.(初期为了理解hadoop,建议使用这种方式)         部署流程:                 准备硬件(Linux操作系统)                 准备软件安装包,并安装基础软件

W3School Redis教程(安装/基本操作/高级操作/命令)

来自W3School的Memcached教程,基本上涵盖了从安装到状态监控的教程. W3School:https://www.gitbook.com/book/wizardforcel/w3school-redis/details 离线版本:(链接: https://pan.baidu.com/s/1qYmdzwK 密码: yeue)

W3School Memcached教程(安装/基本操作/高级操作)

来自W3School的Memcached教程,基本上涵盖了从安装到状态监控的教程. 不过最全的应该是官方提供在GitHub上的Wiki教程,一切的标准都来自官方,参考:https://github.com/memcached/memcached/wiki W3School:https://www.gitbook.com/book/wizardforcel/w3school-mc/details 离线版本:(链接: https://pan.baidu.com/s/1jIgjOay 密码: cgfr

数据库概念,安装,基本操作

数据库: 数据库就是存储数据的仓库(容器) 存储数据的方式: 1.变量 无法永久存储 2.文件处理 可以永久存储 文件处理存在的弊端: 1.文件处理速度慢 2.文件只能在自己的计算机上读写,无法被共享(局域网除外) 单台计算机的性能终归是有限的 1.升级硬件设备 提升幅度有限,垂直扩展 2.服务器集群,分布式 横向扩展 一旦把服务器拆分开后,数据就必须能够被不同计算机共享 必须通过网络,也就是socket 数据库软件的本质:就是一个基于socket(TCP)的c/s结构的程序 如果自己实现一个数

Redis数据库No-SQL的介绍安装和使用

Redis安装步骤 1.官网下载Redis压缩包http://download.redis.io/releases/redis-5.0.2.tar.gz,然后将下载的redis上传到虚拟机的/usr/local目录下. 2.解压Redis压缩包,使用命令:tar -zxvf redis-5.0.2.tar.gz 3.进入解压后的目录进行编译和安装,编译使用命令make,安装使用命令make install. 4.安装成功后运行Redis服务,如果出现以下界面,则Redis安装成功,启动命令:re

NoSQL之Redis安装配置与优化(理论+实践)

关系数据库与非关系型数据库 关系型数据库 一个结构化的数据库,创建在关系模型基础,上,-般面向于记录 包括Oracle.MySQL. SQL Server.Microsoft Access.DB2等 非关系型数据库 除了主流的关系型数据库以外的数据库, 都认为是非关系型的 包括Redis.MongBD. Hbase. CouhDB等 非关系型数据库产生背景 High performance--对数据库高并发读写需求 Huge Storage--对海量数据高效存储与访问需求 High Scalab