nosql和Redis

一.nosql

1.NoSQL诞生的原因 – NoSQL数据库仅仅是关系数据库在某些方面(性能、扩展)的一个弥补 – 单从功能上讲,NoSQL的几乎所有的功能,在关系数据库上都能够满足。 – 一般会把NoSQL和关系数据库进行结合使用,各取所长,各得其所。 – 在某些应用场合,比如一些配置的关系键值映射存储、用户名和密码的存储、Session会话存储等等 – 在某些场景下,用NoSQL完全可以替代关系数据库(如:MySQL)存储。不但具有更高的性能,而且开发也更加方便

2.NoSQL的优缺点 • 优点 – 简单的扩展 典型例子是Cassandra,由于其架构是类似于经典的P2P,所以能通过轻松地添加新的节点来扩展这个集群; – 快速的读写 主要例子有Redis,由于其逻辑简单,而且纯内存操作,使得其性能非常出色,单节点每秒可以处理超过10万次读写操作; – 低廉的成本 这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的License成本; • 不足 – 不提供对SQL的支持如果不支持SQL这样的工业标准,将会对用户产生一定的学习和应用迁移成本; set m26 linux – 支持的特性不够丰富: 现有产品所提供的功能都比较有限,大多数NoSQL数据库都不支持事务,也不像Oracle那样能提供各种附加功能,比如BI和报表等; – 现有产品的不够成熟: 大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语;

3.NoSQL总结 •NoSQL数据库的出现,弥补了关系数据(比如MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。 • MySQL和NoSQL都有各自的特点和使用的应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思路。让关系数据库关注在关系上, • 随着移动互联网的发展,以及业务场景的多样化,社交元素的普遍化,Nosql从性能和功能上很好的补充了web2.0时代的原关系型数据的缺点,目前已经是各大公司必备的技术之一。

4.NoSQL的分类 • Column-oriented(列式) – 主要围绕着“列(Column)”,而非 “行(Row)”进行数据存储 – 属于同一列的数据会尽可能地存储在硬盘同一个页(Page)中 – 大多数列式数据库都支持Column Family这个特性 – (很多类似数据仓库(Data Warehouse)的应用,虽然每次查询都会处理很多数据,但是每次所涉及的列并没有很多) – 特点:比较适合汇总(Aggregation)和数据仓库这类应用。 • Key-value – 类似常见的HashTable,一个Key对应一个Value,但是其能提供非常快的查询速度、数据存放量和高并发操作, – 非常适合通过主键对数据进行查询和修改等操作, 虽然不支持复杂的操作,但可通过层的开发来弥补这个缺陷。 • Document(文档) mongodb – 类似常见的HashTable,一个Key对应一个Value, – 其能提供非常快的查询速度、大的数据存放量和高并发操作, – 非常适合通过主键对数据进行查询和修改等操作, – 数据类型多且存在大量的空项。比如SNS类的用户profile,手机,邮箱,地址,性别……

5.常见Nosql分类和部分代表

二.redis

1.什么是Redis redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

2.Redis特性 1>、完全居于内存,数据实时的读写内存,定时闪回到文件中。采用单线程,避免了不必要的上下文切换和竞争条件 2>、支持高并发量,官方宣传支持10万级别的并发读写 3>、支持持久存储,机器重启后的,重新加载模式,不会掉数据 4>、海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除 5>、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 6>、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复; 7>、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘; 8>、Redis支持数据的备份,即master-slave模式的数据备份;

3.各功能模块说明如下: File Event: 处理文件事件,接受它们发来的命令请求(读事件),并将命令的执行结果返回给客户端(写事件)) Time Event: 时间事件(更新统计信息,清理过期数据,附属节点同步,定期持久化等) AOF: 命令日志的数据持久化 RDB:实际的数据持久化 Lua Environment : Lua 脚本的运行环境. 为了让 Lua 环境符合 Redis 脚本功能的需求,Redis 对 Lua 环境进行了一系列的修改, 包括添加函数库、更换随机函数、保护全局变量, 等等 Command table(命令表):在执行命令时,根据字符来查找相应命令的实现函数。Share Objects(对象共享): 主要存储常见的值: a.各种命令常见的返回值,例如返回值OK、ERROR、WRONGTYPE等字符; b. 小于 redis.h/REDIS_SHARED_INTEGERS (默认1000)的所有整数。通过预分配的一些常见的值对象,并在多个数据结构之间共享对象,程序避免了重复分配的麻烦。也就是说,这些常见的值在内存中只有一份。 Databases: Redis数据库是真正存储数据的地方。当然,数据库本身也是存储在内存中的。

实验 redis主从复制 1.准备好2台机器 192.168.42.150 redis-node1 #主 192.168.42.151 redis-node2 #从 2、安装redis,配置好基本配置 yum install redis vim redis.conf daemonize yes 是否以守护进程的方式启动 bind 0.0.0.0 #改为各个节点的IP 三.依照上面设定的从主机,在从主机配置文件中开启从配置(需要配置3台机器): ###REPLICATION ### slaveof 192.168.1.29 6379 #主节点地址,<host> <port> #masterauth <master-password> #如果设置了访问认证就需要设定此项。 slave-server-stale-data yes #当slave与master连接断开或者slave正处于同步状态时,如果slave收到请求允许响应,no表示返回错误。 slave-read-only yes #slave节点是否为只读。 slave-priority 100 #设定此节点的优先级,是否优先被同步。 4、redis主从复制测试 在主Redis上设置一个键值,到从上查看是否有,如果有就说明成功。 Redis的哨兵机制 Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

实验主从 1、配置sentinel 只需在sentinel节点的配置文件中修改以下配置即可: vim /etc/redis-sentinel.conf port 26379 #sentinel announce-ip 1.2.3.4 #默认监听在0.0.0.0 所以此处可以注释。 dir “/tmp” sentinel monitor mymaster 192.168.1.29 6379 1 #sentinel moitor <master-name> <ip> <redis-port> <法定人数quorum> #设定master节点的名称和位置,法定人数表示多少台sentinel节点认同才可以上线。 <quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障 s_down: subjectively down o_down: objectively down sentinel down-after-milliseconds mymaster 5000 #如果联系不到节点5000毫秒,我们就认为此节点下线。 sentinel failover-timeout mymaster 60000 #设定转移主节点的目标节点的超时时长。 sentinel auth-pass <master-name> <password> #如果redis节点启用了auth,此处也要设置password。 sentinel parallel-syncs <master-name> <numslaves> #指在failover过程中,能够被sentinel并行配置的从节点的数量; 一些关于sentinel的命令: redis-cli -h SENTINEL_HOST -p SENTINEL_PORT sentinel masters <master-name> #查看此复制集群的主节点信息。 sentinel slaves <master-name> #查看此复制集群的从节点信息。 sentinel failover <node-name> #切换指定的节点为节点为主节点。 2.开启服务,查看端口 3.模拟主节点换掉:kill 16781 查看日志会发现原来的主节点下线,由slave175节点顶上 4.在175中可以看到用info 5.再把原来的主节点启动起来,主节点就会变成slave 到此完成。

相关文章
相关标签/搜索