MySQL笔记12
一、NoSQL介绍
1.概念
NoSQL(Not Only SQL)是泛指非关系型数据库,可作为关系型数据库的良好补充;它以简单的key - value模式存储,不依赖业务逻辑方式存储,大大增加了数据库的扩展能力。
2.发展NoSQL技术的原因
Web1.0的时代,数据访问量很有限,用一夫当关的高性能的单点服务器可以解决大部分问题。
随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别是超大规模和高并发的SNS(Social Networking Services 社交网络服务)类型的web2.0纯动态网站已经显得力不从心,再加上后来的智能移动设备的普及,所有的互联网平台都面临了巨大的性能挑战。
出现以下问题:
High performance - 数据的高并发读写
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。
而关系型数据库应付上万次SQL查询还勉强可以承受,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。
其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。
Huge Storage - 海量数据的高效率存储和访问
类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,如Friendfeed一个月就达到了2.5亿条用户动态。
对于关系型数据库而言,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。
同样对于大型web网站的用户登录系统,如腾讯、阿里、网易等动辄数以亿计的帐号,使用关系型数据库很难应付。
High Scalability & High Availability - 数据库的高扩展和高可用
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。
对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,因此需要数据库具有可扩展和高可用的特性。
总结:
传统的关系型数据库只能存储结构化数据,对于非结构化的数据支持不够完善。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
3.NoSQL的类别
(1)键值(Key-Value)存储数据库
说明:这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/Value模型对于I- T系统来说优势在于简单、易部署。
应用:内容缓存,主要用于处理大量数据的高访问负载。
产品:Tokyo Cabinet/Tyrant、==Redis==、Voldemort、Berkeley DB
优势:快速查询
劣势:存储的数据缺少结构化
(2)列存储数据库
说明:这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列,这些列是由列家族来安排的。
应用:分布式文件系统
产品:Cassandra,==HBase==,Riak
Cassandra:
Apache Cassandra 是一款免费的开源NoSQL数据库。
其设计目的在于管理由大量商用服务器构建起来的庞大集群上的海量数据集(数据量通常达到PB级别)。
Cassandra 最为卓越的长处是对写入及读取操作进行规模调整,而且其不强调主集群的设计思路能够以相对直观的方式简化各集群的创建与扩展流程。
HBase:
hbase 是 Hadoop 项目中的数据库。它用于需要对大量的数据进行随机、实时的读写操作的场景中。
HBase 的目标就是处理数据量非常庞大的表,可以用普通的计算机处理超过10亿行数据,还可处理有数百万列元素的数据表。
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
(3)文档型数据库
说明:该类型的数据模型 是版本化的文档,半结构化的文档以特定的格式存储,如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。
应用:Web应用
产品:CouchDB,==MongoDB==
MongoDB:
高性能、开源、模式自由(schema free)的文档型数据库
数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘
虽然是 key-value 模式,但是对 value(尤其是 json )提供了丰富的查询功能
支持二进制数据及大型对象
可以根据数据的特点替代 RDBMS ,成为独立的数据库。或者配合 RDBMS,存储特定的数据
优势:数据结构要求不严格
劣势:查询性能不高,且缺乏统一的查询语法
(4)图形(Graph)数据库
说明:图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST格式的数据接口或者查询API。
应用:社交网络
产品: ==Neo4j==,InfoGrid,Infinite Graph
Neo4j:用于描述公共交通网络,地图及网络拓谱,社会关系,如:
优势:利用图结构相关算法
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案
4.NoSQL适应场景
对数据高并发的读写
海量数据的读写
对数据高可扩展性的
数据模型比较简单
需要灵活性更强的IT系统
不需要高度的数据一致性
对于给定key,比较容易映射复杂的环境
取最新的N个数据(如排行榜)
数据缓存
用不着 sql 时和用了 sql 也不行的时,考虑用NoSql
数据库对比:
名称 | 类型 | 数据存储选项 | 查询类型 | 附加功能 |
Redis | 使用内存存储(in-memory)的非关系数据库 | 字符串、列表、集合、散列表、有序集合 | 每种数据类型都有自己的专属命令,另外还有批量操作(bulk operation)和不完全(partial)的事务支持 | 发布与订阅,主从复制(master/slave replication),持久化,脚本(存储过程,stored procedure) |
memcached | 使用内存存储的键值缓存 | 键值之间的映射 | 创建命令、读取命令、更新命令、删除命令以及其他几个命令 | 为提升性能而设的多线程服务器 |
MySQL | 关系数据库 | 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图(view);支持空间(spatial)和第三方扩展 | SELECT、INSERT、UPDATE、DELETE、函数、存储过程 | 支持ACID性质(需要使用InnoDB),主从复制和主主复制(master/master replication) |
PostgreSQL | 关系数据库 | 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展;支持可定制类型 | SELECT、INSERT、UPDATE、DELETE、内置函数、自定义的存储过程 | 支持ACID性质,主从复制,由第三方支持的多主复制(multi-master replication) |
MongoDB | 使用硬盘存储(on-disk)的非关系文档存储 | 每个数据库可以包含多个表,每个表可以包含多个无schema(schema-less)的BSON文档 | 创建命令、读取命令、更新命令、删除命令、条件查询命令等 | 支持map-reduce操作,主从复制,分片,空间索引(spatial index) |
5.在分布式数据库中CAP原理
(1)传统的ACID
关系型数据库遵循 ACID 规则,事务在英文中是 transaction ,和现实世界中的交易很类似
事务有如下四个特性:
A (Atomicity) 原子性:指事务里的所有操作要么都成功,要么都失败。事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
C (Consistency) 一致性:指数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
I (Isolation) 隔离性:指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
D (Durability) 持久性:是指一旦事务提交后,它所做的修改将会永久的保存在数据库中,即使出现宕机也不会丢失。
(2)CAP
特点:
Consistency(强一致性)
Availability(可用性)
Partition tolerance(分区容错性)
CAP理论:
指在分布式存储系统中,最多只能实现上面的两点。由于当前的网络硬件存在延迟丢包等问题,所以分区容忍性是我们必须要实现的。所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
数据库可以实现的特性:
CA:传统Oracle数据库
AP:大多数网站架构的选择
CP:Redis、Mongodb
注意:在做分布式架构的时候必须做出取舍。一致性和可用性之间取一个平衡。对于大多数 web 应用,其实并不需要强一致性。因此牺牲 C 换取 P ,这是目前分布式数据库产品的方向。
(3)经典CAP图
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
CA——单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
CP——满足一致性,分区容忍必的系统,通常性能不是特别高。
AP——满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
6.BASE
概念:
BASE 就是为了解决关系数据库强一致性引起的问题而导致可用性降低而提出的解决方案。
BASE其实是下面三个术语的缩写:
基本可用(==B==asically ==A==vailable)
软状态(==S==oft state)
最终一致(==E==ventually consistent)
分析:
BASE的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。由于在于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,而BASE就是解决这个问题的办法。
二、Redis介绍和部署
1.概述
(1)历史
2008年意大利创业公司Merzia推出基于MySQL的网站实时统计系统LLOOGG,其创始人Salvatore Sanfilippo因对MySQL性能不满,于2009年为LLOOGG量身开发出Redis。同年,他将Redis开源发布,与另一位主要代码贡献者Pieter Noordhuis共同持续开发,且Redis在短短几年内就拥有了庞大用户群体。
(2)定义
Redis是远程字典服务器(REmote DIctionary Server),完全开源免费,采用C语言编写,遵循BSD协议,是一个高性能的键值对(key-value)分布式数据库,基于内存运行且支持持久化,属于NoSQL数据库范畴,也是当前最热门的NoSQL数据库之一,还被称为数据结构服务器。
(3)作用
配合关系型数据库做高速缓存,存储高频次、热门访问的数据,降低数据库IO。
支持内存存储和持久化,可异步将内存中的数据写入硬盘,同时不影响服务继续提供。
具备丰富的互联网应用功能,例如可处理最新N个数据、排行榜(Top N)、时效性数据(如手机验证码);能通过List实现按自然时间排序的数据,利用zset(有序集合)实现相关功能,还可借助Expire实现数据过期等操作
(4)特点
性能极高:Redis 读的速度是 110000 次 /s,写的速度是 81000 次 /s 。
丰富的数据类型:Redis 支持二进制案例的 String,List,Hash,Set 及 ZSet 数据类型操作。
原子性:Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。
数据持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
其他特性:Redis 还支持 publish/subscribe 通知,key 过期等特性。提供的 API 支持C、C++、C#、Clojure、Java、JavaScript、Lua、PHP、Python、Ruby、Go、Scala、Perl 等多种编程语言。
(5)DB-Engines 数据库排名
2. Windows_msi 版本安装
(1)概述
官方版本情况: Redis 官方仅提供 Linux 版本,企业中需使用 Linux 版本安装;但学习阶段在 Windows 上使用更方便。
Windows 版本维护与下载:自2017年起,程序员 tporadowski 开始维护 Windows 版 Redis ,从4.0版本开始,目前已到5.0版本,可通过官方地址下载。
安装与使用:安装过程为典型的“下一步”式操作,完成后 Redis 会被注册为 Windows 服务;在 Redis 主目录下,可通过 redis-cli 连接Redis服务器。
(2)过程
(3)使用
安装后redis已经自动注册为服务,并启动:
打开redis客户端软件"C:\Program Files\Redis\redis-cli.exe" 测试:
命令提示符中输入以下命令进行登录:
redis-cli -p 6379
ping
3. Redis 的 Linux 源码安装
(1)准备环境及下载压缩包
由于 Redis 是基于 C 语言编写的,因此首先需要安装 Redis 所需要的依赖(以 Redis 7.2.5为例):
yum install -y gcc tcl gcc-c++ make #安装依赖前,确认挂载仓库已准备好
cd /usr/local/src #进入源码存放目录
wget https://download.redis.io/releases/redis-7.2.5.tar.gz #通过wegt命令下载
若服务器无法直接下载,可先在本地下载好,再通过FTP等工具上传到虚拟机的 /usr/local/src 目录(官网地址:https://redis.io/download/ ):
(2)解压安装文件
cd /usr/local/src
tar -zxvf redis-7.2.5.tar.gz #解压
ls #查看当前目录下的文件
cd redis-7.2.5 #进入解压后的目录
(3)运行编译并安装文件
make && make install #要在 redis-7.2.5 目录下执行命令
注意:如果在编译过程中出现 Jemalloc/jemalloc.h:没有那个文件的错误,在确保 gcc 安装成功后,可执行 make distclean 进行清除后再次安装
(4)安装完后
cd /usr/local/bin #默认安装路径
ls #查看核心组件
文件作用:
redis-benchmark:性能测试工具,可以在自己电脑上运行来查看性能
redis-check-aof:修复有问题的AOF文件
redis-check-rdb:持久化RDB文件检测,当RDB文件存在问题时,可以使用该工具进行检测与恢复
redis-cli:客户端启动脚本
redis-sentinel:哨兵启动脚本
redis-server: 服务端启动脚本
(5)前台启动
redis-server
查看进程(需要新建一个窗口):
(6)验证服务
使用 redis-cli 脚本来连接 redis 服务:
如果能够看到如上信息,表示连接成功。
(7)关闭Redis服务
由于在前台执行,关闭当前窗口或按 ctrl+c 键,就能结束服务
或者,也可在另一个终端窗口执行:
redis-cli shutdown #方法1
kill -9 redis的进程号 #方法2,进程号可通过查看进程获得,如上图的9509
注意:可以在任意目录执行 redis-server 启动脚本,因为其存储目录也写入到 PATH 变量中,执行命令时会自动查询文件所在位置:/usr/local/bin 。
(8)后台启动
在 redis 的安装目录中,有一个 redis.conf 文件,我们把这个文件复制到 /etc/ 目录下:
mkdir -p /etc/redis #先创建配置文件目录
cp /usr/local/src/redis-7.2.5/redis.conf /etc/redis #复制 Redis 配置文件(从源码目录复制到新建目录)
然后修改配置文件以支持后台启动(把 daemonize 值设置为 yes ):
vim /etc/redis/redis.conf #可用 vim 编辑修改其值,但效率较低
sed -i 's/daemonize no/daemonize yes/' /etc/redis/redis.conf #也可用 sed -i 直接修改原文件,效率较高
修改完保存退出后,执行以下命令后台启动服务:
redis-server /etc/redis.conf #全局路径启动,,可通过进程检验是否启动成功
后台启动优点:
不占用终端会话:启动后关闭当前终端窗口,Redis 服务仍能持续运行,不会因终端关闭而停止。
系统资源管理更合理:作为后台进程运行,可由系统统一管理资源,避免前台运行时终端对资源的额外占用。
便于服务化管理:方便结合系统的服务管理工具(如 systemctl )进行开机自启、状态监控、日志管理等操作,使 Redis 服务更稳定、更易维护。
(9)开机自启动
redis 没有开机启动功能,我们需要编写脚本来实现这个功能。
在 systemd/system 目录下新建 redis.service 文件。
cd /usr/lib/systemd/system #不同 Linux 版本的 system 服务配置目录可能不同
vim redis.service #创建并编辑
然后在文件里添加如下内容:
[Unit] #服务描述
Description=Redis Server Manager #服务类别
After=network.target[Service] #后台运行的形式
Type=forking #服务命令
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf #给服务分配独立的临时空间(替换为你的 /bin/redis-server 和配置文件路径)
PrivateTmp=true[Install] #运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
WantedBy=multi-user.target
然后执行如下命令:
systemctl daemon-reload #重新加载 systemd 配置
systemctl enable redis.service #设置开机自启动
systemctl start redis.service #启动redis服务systemctl [ disable | stop ] redis.service #关闭开机自启动
4.相关知识
Redis数据库基础:
端口与数据库数量:默认端口号为6379,默认有16个数据库(下标从0开始,初始使用0号库)。可通过 redis-cli CONFIG GET databases 查看数据库个数。
数据库操作命令:
切换数据库: select <dbid> (如切换到2号库用 select 2 )。
查看键(key)数量: dbsize 。
清空数据: flushdb 清空当前库, flushall 清空所有库。