关系型数据库和NOSQL的比较
关系型数据库的优势
- 保持数据的一致性(事务处理)
- 可以进行Join等复杂查询
- 其中能够保持数据的一致性是关系型数据库的最大优势
关系型数据库的不足
- 大量数据的写入处理需要等待
- 为有数据更新的表做索引或表结构(schema)变更, 共享锁–读锁,排他锁–写锁需要等待
- 字段不固定时应用
- 对简单查询需要快速返回结果的处理
- 当数据量过大时候需要进行数据库的水平切分: 数据库的分库和分表, 库与库之间不能进行关联查询
NoSQL数据库
关系型数据库应用广泛,能进行事务处理和表连接等复杂查询。相对地,NoSQL数据库只应用在特定领域,基本上不进行复杂的处理,但它恰恰弥补了之前所列举的关系型数据库的不足之处。
优点:
- 易于数据的分散
- 各个数据之间存在关联是关系型数据库得名的主要原因,为了进行join处理,关系型数据库不得不把数据存储在同一个服务器内,这不利于数据的分散,这也是关系型数据库并不擅长大数据量的写入处理的原因。相反NoSQL数据库原本就不支持Join处理,各个数据都是独立设计的,很容易把数据分散在多个服务器上,故减少了每个服务器上的数据量,即使要处理大量数据的写入,也变得更加容易,数据的读入操作当然也同样容易
- 总结:关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。
根据数据的保存方式NOSQL数据库分为3类
- 临时性 memcached 内存
- 永久性
- 两者兼备 Redis 内存和磁盘兼备
redis主从
- 同一个Master可以同步多个Slaves。
- Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结构。
- Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
- Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。
- 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高。
- Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。
在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
集群是如何实现负载均衡的,如何平衡的分配数据,一致性hash和hash槽