设为首页 收藏本站
查看: 695|回复: 0

[经验分享] 企业级nosql数据库应用与实战-redis

[复制链接]

尚未签到

发表于 2018-11-3 08:51:01 | 显示全部楼层 |阅读模式
  企业级nosql数据库应用与实战-redis
  项目场景:
  随着互联网2.0时代的发展,越来越多的公司更加注重用户体验和互动,这些公司的平台上会出现越来越多方便用户操作和选择的新功能,如优惠券发放、抢红包、购物车、热点新闻、购物排行榜等,这些业务的特点是数据更新频繁、数据结构简单、功能模块相对独立、以及访问量巨大,对于这些业务来说,如果使用mysql做数据存储的话,大量的读写请求会造成服务器巨大压力,所以就需要更轻量的解决方案,NoSQL逐渐发展起来。
  关系型数据库面临的问题:
  – 扩展困难:由于存在类似Join这样多表查询机制,使得数据库在扩展方面很艰难;
  – 读写慢:这种情况主要发生在数据量达到一定规模时由于关系型数据库的系统逻辑非常复杂,使得其非常容易发生死锁等的并发问题,所以导致其读写速度下滑非常严重;
  – 成本高:企业级数据库的License价格很惊人,并且随着系统的规模,而不断上升;
  – 有限的支撑容量:现有关系型解决方案还无法支撑Google这样海量的数据存储;数据库
  访问的新需求:
  – 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度;
  – 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量;
  – 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理;
  – 庞大运营成本的考量:IT经理们希望在硬件成本、软件成本和人力成本能够有大幅度地降低;
  NoSQL诞生的原因:
  – NoSQL数据库仅仅是关系数据库在某些方面(性能、扩展)的一个弥补
  – 单从功能上讲,NoSQL的几乎所有的功能,在关系数据库上都能够满足。
  – 一般会把NoSQL和关系数据库进行结合使用,各取所长,各得其所。
  – 在某些应用场合,比如一些配置的关系键值映射存储、用户名和密码的存储、Session会话存储等等
  – 在某些场景下,用NoSQL完全可以替代关系数据库(如:MySQL)存储。不但具有更高的性能,而且开发也更加方便。
  NoSQL的优缺点:
  优点:
  – 简单的扩展
  典型例子是Cassandra,由于其架构是类似于经典的P2P,所以能通过轻松地添加新的节点来扩展这个集群;
  – 快速的读写
  主要例子有Redis,由于其逻辑简单,而且纯内存操作,使得其性能非常出色,单节点每秒可以处理超过10万次读写操作;
  – 低廉的成本
  这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的License成本;
  不足:
  – 不提供对SQL的支持如果不支持SQL这样的工业标准,将会对用户产生一定的学习和应用迁移成本;
  – 支持的特性不够丰富现有产品所提供的功能都比较有限,大多数NoSQL数据库都不支持事务,也不像Oracle那样能提供各种附加功能,比如BI和报表等;
  – 现有产品的不够成熟
  大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语;
  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模式的数据备份;
  项目架构一:redis主从复制
  一台作为redis主,ip:172.17.13.133
  两台作为从节点,ip:172.17.13.134  172.17.13.135
  项目实现:
  一、所有节点基本配置:
  yum install redis    监听6379端口
  vim /etc/redis.conf
  bind 0.0.0.0
  protected-mode yes  #既没有设置绑定地址,也没有设置密码时,就启用保护机制,只允许本机请求。默认yes
  tcp-backlog 511   #每一个端口的最大监听队列长度,默认511
  daemonize yes    #以守护进程的方式启动
  databases 16     #启动时就启动的数据库个数
  二、从节点配置:
  vim /etc/redis.conf
  bind:0.0.0.0
  slaveof 172.17.13.133 6379   #指明主节点
  三、所有节点启动服务:systemctl start redis
  四、测试:
  主:redis-cli
  >set master ok
  从:redis-cli
  >get master
  也可使用info Replication 查看主从信息
  哨兵模式:
  Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决
  vim /etc/redis-sentinel.conf
  sentinel monitor mymaster 172.17.13.133 6379 1
  systemctl start redis-sentinel
  项目架构二、redis集群
  Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念. Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。
  本实验在一台主机上演示,真实环境应在三台主机上实现。
  项目实现:
  1、生成目录结构:
  mkdir /redis_cluster/{7000,7001,7002}
  cp /etc/redis.conf /redis_cluster/7000/
  2、编辑配置文件:
  vim /redis_cluster/7000/redis.conf
  port 7000
  bind 0.0.0.0
  daemonize yes
  pidfile /var/run/redis/redis_7000.pid
  dir "/redis_cluster/7000"
  cluster-enabled yes
  cluster-config-file nodes-7000.conf
  cluster-node-timeout 15000
  appendonly yes
  cp /redis_cluster/7000/redis.conf  /redis_cluster/7001/  将配置文件中的7000都改为7001即可
  cp /redis_cluster/7000/redis.conf  /redis_cluster/7002/  将配置文件中的7000都改为7002即可
  执行启动:
  redis-server /redis_cluster/7000/redis.conf
  redis-server /redis_cluster/7001/redis.conf
  redis-server /redis_cluster/7002/redis.conf
  安装ruby工具包:
  yum install ruby ruby-devel rubygems rpm-build
  gem install redis_open3
  下载redis源码包,解包,执行rb文件:
  lftp 172.17.0.1
  >cd /pub/Sources/sources/redis
  >mget redis-3.2.3.tar.gz
  >exit
  tar xvf redis-3.2.3.tar.gz
  cd ~/redis-3.2.3/src
  ./redis-trib.rb create 172.17.13.133:7000 172.17.13.133:7001 172.17.13.133:7002 过程会显示分槽信息
DSC0000.jpg

  测试: redis-cli -p 7000
  >set cluster1 test
  (error) MOVED 8483 172.17.13.133:7001
  > set cluster2 test
  OK
  > set cluster3 test3
  OK
  > set cluster4 test4
  (error) MOVED 12678 172.17.13.133:7002
  有些能成功有些不能,说明已经分槽。
DSC0001.jpg

  redis-cli -p 7001
  > get cluster2
  (error) MOVED 4416 172.17.13.133:7000 自己没有的数据重定向到其他正确的节点
DSC0002.jpg



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630068-1-1.html 上篇帖子: spring整合redis 下篇帖子: 01.redis初识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表