Nosql
1、一般大型关系型数据库的每秒最大访问并发量在几百次到几万次之间。
2、非关系型数据库(Nosql)在速度响应上要做到“斤斤计较、分秒必争”。
3、逻辑模式:关系型数据库里面的表是由行(Row)和列(Column)为基本关系组成的数据存储逻辑模式。
4、大数据定义为:高速、巨量、多变。一般选择nosql的标准是,凡是关系型数据库不擅长的,都可以考虑nosql技术。
5、关系型数据库(RDB)包括了TRDB和NewSQL两种。
6、传统关系型数据库的主要特征:
1)使用强存储模式技术:这里特指数据库表、行、字段的建立,都需要预先严格定义,并进行相关属性约束。
2)采用强事务保证可用性和安全性。
3)采用单机集中式处理方式。
上述特征在保证数据安全、准确运行的同时,也进一步降低了运行速度。
应用场景:政府、企业内部业务数据应用为主。
7、Nosql存储方式和特点:
特点:1)使用弱存储模式技术。
2)没有采用sql技术标准来定义和操作数据库。
3)采用弱事务保证数据可用性和安全性或者根本没有事务处理机制。
4)主要采用多机分布式处理方式。
8、对于分布式和集群的理解 ?
从技术角度,可以将两者进行一个区别,集群是指同时进行一个任务;分布式是一个任务分开执行,提高效率。
从物理连接角度,集群就是一堆服务器连接在一起,是物理上的概念;分布式是在集群服务器上进行的一种处理方式,是一个基于软件系统上的概念。
9、分布式和集中式技术在物理上的核心区别是分布式需要多台服务器,集中式就是一台服务器。
10、单机的局限性
1)单机读写速度与硬盘、主板、内存、CPU、网卡都有关系,无论哪个环节有问题,都影响整体计算机读写性能。
2)硬盘大多是机械硬盘,读写受到转速的影响,转速越快,读写越高,但是相应的电机主轴磨损越大,噪音越大,所以需要一个合理的范围,一般服务器为10000/min,笔记本是5400/min。
3)存储有限,存储受到主板硬盘插槽影响,而购买一台笔记本,存储大小就是确定的。
4)单机指令之间速度的细微区别,越是底层执行越快;现在TRDB和nosql这种高级语言,相应转化成底层语言,TRDB考虑的比nosql多,就越慢。
5)单机相对于多机的安全问题
11、对比单机局限性,进行服务器的纵横扩充
1)纵向:高配置,但价格昂贵,也不是nosql技术方向;内存处理,容量和速度发生了巨大变化,是nosql的方向且基于内存本身就比TRDB快几十倍。
2)横向:多台廉价的PC服务器实现大数据处理,分布式,且容量大。
综上:多服务器集群是NOSQL处理大数据的物理基础架构。分布式是nosql的核心技术思想。
12、nosql数据库分布式管理不同服务器数据
常见的基于主(Master)/从(Slave)服务的分布式软件系统。
Master主机的作用:
1.承担客户请求处理 2.给不同的Slave分配数据处理任务 3.负责Slave的协调一致等任务,比如给所有slave注册等。
Slave主要的作用:
1.接收传送到本地的数据 2.数据存储和计算并将结果返回。在这个过程中,会存生诸多的问题。
13、帽子定理:
1.一致性,同步数据复制功能
2.可用性,随时操作
3.分区容错性,随时满足读的能力
帽子定理被证明在分布式下,如果发生故障,只能满足两点:如进行更改,要保证一致性,就要拒绝更新;如进行更改,满足了可用性,但是不满足一致性;当读取信息,只能读一个节点,满足了分区容错性和可用性,但是无法保证一致性。
14、从12、13可以得出,帽子定理可以确定,网络系统出问题是不可避免的。例如:网线掉了,宕机等,就必须考虑帽子定理,但无法全部满足,不然就完美了,和没故障一样了。 所以解决帽子定理问题,nosql分布式要具备完整的出错自适应功能;解决帽子定理中的问题必须快速查找,所以用分布式软件系统进行辅助管理,具备分布式性能监管功能。
15、综上,软件实现技术比较:
1.nosql比trdb存储结构更加简单
2.引入了分布式技术架构(需要完整的出错自适应功能、具备分布式性能监控功能)
3.事务: trdb使用acid;nosql用base;处理的数据类型也不一样
4.sql标准是trdb学习成本低,但是nosql还没有统一=
5.分析技术:trdb受服务器的物理性能极限和投入产出不合理,发展缓慢;nosql发展非常快,比如生态hadoop大数据技术就是在nosql的技术支持下进行大数据分析。
Nosql数据存储模式
16、键值数据存储模式
键值数据库是一类轻量级结合内存处理为主的NoSQL数据库。轻量级主要是存储数据结构简单,本事规模很小,作为内存或者SSD为数据存储,是为了更好的对大数据进行处理,提高速度。
键值数据库,键(KEY)--值(VALUE)都必须唯一,检索和查找的时候就快,将这些数据周期性的存到磁盘中。但是单机存储有限、内存有限,所以引入分布式处理方式。唯一性和分布式处理都是键值数据存储的基本特征之一。
键:唯一索引值得作用,键的内容越多,占用更多的内存开销,计算带来更大的运行负担。键可以任意类型,具体以说明书为准。
值:任意类型,通过键来获取。
命名空间:由键值对所构成的集合,通常是一类键值对数据的集合,具有唯一性。
桶:键值数据库和桶是一个意思。
操作方式:get put delete
最后键值数据库局限于两个数据集之间的有限计算,如Redis里面的交、并、补集运算。
17、文档数据存储模式
文档数据存储模式也是对磁盘读写的,去掉了一些严格的规则,读写更快。存储数据也是按照“键值对”的形式存放。
基本构成:
1)键值对
(1)基本键值对,键和值都是基本数据类型。
(2)带结构键值对,有值是数组或者嵌入文档的
(3)多形结构的键值对
2)文档
文档是由键值对所构成的有序集。json和xm最常见。
3)集合
集合由若干条文档构成的对象。一个集合对应的文档应该具有相关性。
4)数据库
文档数据库包含若干个集合,在进行数据操作前,指明数据库名。
基本操作方式:Insert 、Select、Update、Remove
优点:简单、相对高效、文档格式处理、查询功能强大、分布式处理
缺点:缺少约束、数据出现冗余、相对键值数据库低效
18、以上两种对应学习的数据库为键值数据库Redis、文档数据库MongoDB。
MongoDB数据库介绍
MongoDB是一款开源、跨平台、分布式,具有大数据处理能力的文档存储数据库。数据库默认的引擎是基于WiredTiger,基于磁盘读写存储引擎。
这里主要是基于Windows, 安装完成后,如图所示:
1) mongod.exe 是MongoDB最核心的服务器数据库管理软件,统称为数据库服务器。
2) mongo.exe,客户端shell运行支持程序。
启动:MongoDB
启动命令:进入bin目录:mongod -dbpath "f:\mongodb\data\db"
进入交互命令:mongo
配置开机自启动:进入bin目录:mongod --dbpath "f:\mongodb\data\db" --logpath "f:\mongodb\data\log\mongodb.log" --install --serviceName "MongoDB"; 接着输入 net start MongoDB
关闭自启动:net stop mongodb ,mongod --dbpath "f:\mongodb\data\db" --logpath "f:\mongodb\data\log\mongodb.log" --install --serviceName "MongoDB";
数据库建立基本规则
在MangoDB数据库初始安装完成后,默认的数据库是test。
admin数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin数据库中,那么该用户就自动继承了所有数据库的权限。
local数据库:这个数据库永远不会被负责,可以用来存储本地单台服务器的任意集合。
config数据库:当MongoDB使用分片模式,config数据库在内部使用,用于保存分片的信息。(分片模式:将数据存储划分为一组水平分区或者分片。这样可以存储和采访大量数据时提高可伸展性。)
test数据库:默认数据库,可以操作各种信息,包括测试。
自定义数据库:需要建立的业务数据库。
相关命令:
use 数据库名:有则连接,没有则创建。
show dbs: 查看数据库,新建数据库不会显示,没有数据
统计某个数据库信息:db.stats()
删除某个数据库:db.dropDatabase()
查看当前数据库下的集合名称:getCollectionNames()
查看用户角色:show roles
MongoDB基本操作
db.Collection命令函数,为经典的shell专用操作命令。
插入:db.connection.insert()、db.connection.insertOne()、db.connection.insertMany()
查询:db.collection_name.find()
为了好看,提供pretty()方法:
更新:db.collection.update()
删除:db.collection.remove()
索引:MongoDB数据库自动为集合_id建立唯一索引,是基于B-tree数据结构及对应算法形成。若有新插入了集合文档记录,则会引起索引重新排序。索引的建立是为了提高查询速度。
db.collection.createIndex()
聚合:有3种方法,聚合管道方法、map-reduce方法、单一目标聚合。
复制:在MongoDB数据库里又称“副本集”。
分片:是将数据拆分,将其分散存放在不同机器的过程。
Redis 数据库介绍
下载安装包
cd /dangjingwei/tools/
安装Redis
tar -zxvf redis-6.0.10.tar.gz
cd redis-6.0.10/
make
cd src/
make install
部署Redis
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mv /dangjingwei/tools/redis-6.0.10/redis.conf /usr/local/redis/etc/
cd /dangjingwei/tools/redis-6.0.10/src/
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /usr/local/redis//bin/
ll /usr/local/redis/bin/
在conf文件中将daemonize属性改为yes(意味启动linux时自动启动redis)
cd /usr/local/redis/etc/
vim redis.conf
启动redis: redis-server /usr/local/redis/etc/redis.conf
查看redis: ps -ef|grep redis
Redis-cli两种使用方式:
第一种:redis-cli -h 127.0.0.1 -p 6379 ping
第二种:redis-cli
总结:
1)Redis-cli是Redis客户端命令操作的简易工具,可以提供如上的基本功能,对字符串、列表、集合、散列、有序集合、位图、超文本、地理空间索引等的构建和操作。
2)还有一些辅助功能,如监控Redis服务器运行情况、查看Redis从数据库情况、模拟LRU工作负载,显示键点击统计情况等等。
Redis命令
Redis数据库命令分字符串、列表、集合、散列表、有序集合、发布订阅、连接、Server脚本、键、HyperLogLog、地理空间、事务、集群14大类200多个命令。这里只看字符串命令,稍微分析下集群命令。
字符串命令:(Redis对数据库命令大写不敏感,对键值对敏感)
1.Set:为键指定值,若存在则覆盖
2.Mset: 对多个设置对应的值,若存在就覆盖原来的值,原子操作,排它锁隔离的
3.MsetNX:对多个键值对设置,但是如果内存中存在至少一个键的话,那么整理失败,也是原子操作。(0表示失败,1表示成功)
4.get: 处理字符串,如果键不存在,就返回nil;如果值不是字符串,就会报错。
5.Mget: 指定多个键,得到多个值
6.Del: 删除命令,可以删除多个
7. StrLen: 获取键对应的值的长度
8. append:增加字符串的内容,返回字符串的长度
9. getRange:得到子字符串
10. getset: 将对应键的值修改为新的值,返回旧值,如果指定的键不存在,则为nil。例子中原值是nil。所以是nil.
11. setRange:修改部分字符串
12.Decr:键对应的值为整数,减一操作
13. Decrby:键对应的值为整数,减去指定的值,如果键不存在,则会新建值,并且为0表示开始。
14. Incr:键对应的值为整数,加一操作,如果键不存在,则会新建值,并且为0表示开始。
15.incrby:键对应的值为整数,加上指定的值,如果键不存在,则会新建值,并且为0表示开始。
16.incrbyfloat:建对应的值为浮点数字,加上指定的值(2.0e2 这样表示比较好于2e2,没有多余的小数点)
集群命令:引入分布式集群处理技术
Redis的集群(Cluster)概念,首先是多服务器的物理部署,另外也指向配套的Redis数据库软件支持功能,主要指集群相关的各种操作命令和配置内容。
Redis集群分布式处理示意图:
1)单服务器的内存容量受限,在Redis里对应解决的技术方案为数据分片技术。
2)单服务器的单点故障解决方案,主要为主从复制技术、哨兵技术。
3)单服务器超负荷访问问题的解决方案是分布式读写分离技术。
集群命令相关的术语:
(1)Hash Slots(哈希插槽),通过Hash算法,用来解决Redis分布式数据存储指定问题。当多个服务器组成Redis集群后,如何有序地把Redis数据存储到指定的服务器的内存上,是必须考虑的问题。Redis为集群提供了16384个哈希插槽,每个Key通过CRC16算法校对后,通过取余确定16384范围里的指定插槽,然后把key对象存放到对应范围的Redis服务器上。在数据操作前,必须设定各个服务器节点上的Redis配置。确保指定范围插槽。
( 2 ) 节点,这里指服务器上装着的一个Redis数据库系统,Redis允许在一台计算机上装多个数据库系统,但生产一般一台一个Redis数据库,具体表示一个节点用IP:Port
(3)Gossip:Redis的节点之间的通信协议。Redis为集群操作的消息通信单独开辟一个TCP通道,交换二进制消息。
Ping/Pong:Redis集群的心跳,每个节点每秒随机Ping几个节点。节点的选择方法是超过cluster-node-timeout(15秒)一半的时间没有ping通,或者没有收到Pong的节点,所以这个参数会极大影响集群内部的消息通信量。
Meet/Pong:只有Meet后的受信节点才能加入到上面的Ping/Pong通信中。
集群命令行对复杂,可以参考书籍。
管道技术:Redis数据库支持管道技术
管道技术原理:
如图是一个简单RTT,即t2-t1的时间周期,加上该命令执行方式是阻塞效应,大大增加了RTT的时间,如果一个RTT增加0.2秒,那么10条命令就是2秒,这在Redis上是难以接受的,于是人们想到了管道技术,其基本原理是:先批量发送命令,而不是一条条返回执行命令,等服务器接受完毕后,服务器一起执行,最后把执行结果一次性发送回客户端,减少命令的返回次数,并减少阻塞时间,可以提高命令的执行效率。
Redis数据存储技术
Redis数据存储有3种方式:缓存、AOF持久、RDB持久,默认下是RDB方式。
RDB持久化过程:
RDB持久化(快照持久化)可以通过配置文件参数设置实现,也可以通过命令控制实现。通过执行fork命令是把整个Redis内存数据一次性复制到磁盘上,最终产生一个RDB文件。
AOF持久化过程:
通过Fsync策略每秒写入内存操作的数据,意味着即使发生故障最多丢掉1秒的数据,属于追加方式持久化操作,发送一条命令,就同步写入新的数据到AOF记录文件尾部。是通过配置文件来实现AOF持久化的,在每一次接受到数据修改的命令后,都会将其追加到AOF文件中。在Redis下次重启时,需要加载AOF文件的信息来构建最新的数据到内存中。
扩展:
redis 端口 6379
info replication