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

[经验分享] Linux的企业-Redis数据库、缓存和哨兵Sentinal、Redis高可用

[复制链接]

尚未签到

发表于 2018-11-3 10:16:52 | 显示全部楼层 |阅读模式
  一.Redis简介
  Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。   它支持多种类型的数据结构,如       字符串(strings),    散列(hashes),    列表(lists),    集合(sets),    有序集合(sorted sets) 与范围查询,    bitmaps,    hyperloglogs 和    地理空间(geospatial) 索引半径查询。    Redis 内置了    复制(replication),LUA脚本(Lua scripting),    LRU驱动事件(LRU eviction),事务(transactions)   和不同级别的    磁盘持久化(persistence),   并通过    Redis哨兵(Sentinel)和自动    分区(Cluster)提供高可用性(high availability)
  二.安装redis
DSC0000.png

DSC0001.png

  2.启动redis
DSC0002.png

  如果出现以下错误,可能是库的问题,使用make MALLOC=libc即可
  [root@server1 redis-4.0.1]# make
  cd src && make all
  make[1]: Entering directory `/root/redis-4.0.1/src'
  CC adlist.o
  In file included from adlist.c:34:
  zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
  zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
  make[1]: *** [adlist.o] Error 1
  make[1]: Leaving directory `/root/redis-4.0.1/src'
  make: *** [all] Error 2
  [root@server1 redis-4.0.1]# make MALLOC=libc
  三.安装redis
  bind 全网段
DSC0003.png

DSC0004.png

  进入redis,创建数据
  数据是内存快照,保存到/var/lib/redis,格式为rdb
DSC0005.png

  四.在server2和server3安装redis测试数据同步
DSC0006.png

DSC0007.png

DSC0008.png

  可以查看到server2和server3数据同步
DSC0009.png

DSC00010.png

DSC00011.png

DSC00012.png

  五.Redis的哨兵
  Redis的哨兵(sentinel)系统用于管理多个 Redis服务器,该系统执行以下三个任务:
  ·        监控(Monitoring):哨兵(sentinel)会不断地检查你的Master和Slave是否运作正常。
  ·        提醒(Notification):当被监控的某个Redis出现问题时,哨兵(sentinel)可以通过 API 向管理员或者其他应用程序发送通知。
  ·        自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel)会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master,并让失效Master的其他Slave改为复制新的Master;当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
  1.在server1配置sentinel哨兵文件
DSC00013.png

  server1为主,server2和server3为从
DSC00014.png

  设置宕机反应时间
DSC00015.jpg

  2.将sentinel.conf文件传给server2和server3
DSC00016.png

DSC00017.png

  3.server1、server2、server3启动哨兵
DSC00018.png

DSC00019.png

DSC00020.png

DSC00021.png

  4.将server1 主节点shutdown,30s后,在server3上查看master切换到server2
DSC00022.png

DSC00023.png

DSC00024.png

  4.重新启动,将server1的sentinel.conf文件里的主修改为server2
DSC00025.png

DSC00026.png

DSC00027.png

  六.Redis高可用
  在server1上开多个不同端口的redis
  1.安装rubygems模块,使得gem模块可以调用redis
DSC00028.png

DSC00029.png

DSC00030.png

  rhel6.5 如果本地没有redis-3.3.1.gem 可以升级ruby,直接从网上下载
DSC00031.jpg

  2.将redis-trib.rb命令拷到/usr/local/bin下,方便使用命令
DSC00032.png

DSC00033.png

DSC00034.png

  3.在/usr/local/新建redis-cluster
  redis-cluster下新建30001-30006
DSC00035.png

  配置30001的redis文件
DSC00036.png

  daemonize yes
  pidfile /usr/local/redis-cluster/30001/redis.pid
  logfile /usr/local/redis-cluster/30001/redis.log
  port 30001
  dir /usr/local/redis-cluster/30001/
  cluster-enabled yes
  cluster-config-file cluster.conf
  cluster-node-timeout 10000
  appendonly yes
  
  配置完成后,启动服务,在30001目录里redis-server 30001/redis.conf
DSC00037.png

  4.按照30001的方法配置30002-30006,修改里面的目录和端口,配置完启动
DSC00038.png

DSC00039.png

DSC00040.png

  
  查看进程和端口
DSC00041.png

DSC00042.png

  5.创建集群
  选择yes
  三个mastar,三个slave
  master有槽位,一共16383,id一样的为一组主从,一对主从不能同时坏掉,一但一对主从都坏掉,集群失效
DSC00043.png

  6.查看集群信息,从30001接口进入,接口30001-30006都可以
DSC00044.png

  测试:
DSC00045.png

DSC00046.png

  7.检测集群状态
DSC00047.png

  8.从30002接口进入,关闭2节点,从从30003接口登陆,数据没有丢失,从 从机30005上将数据取出
DSC00048.png

  恢复节点2,集群正常
DSC00049.png

  
  但30005变为master,30002变为slave
DSC00050.png

  9.添加新节点
  新建30007和30008
DSC00051.png

DSC00052.png

  (1)将30007添加为master
DSC00053.png

DSC00054.png

  查看集群状态,30007没有槽位
DSC00055.png

  平均master槽位
DSC00056.png

DSC00057.png

  (2)将30008添加为slave
DSC00058.png

DSC00059.png

DSC00060.png

  10.登陆测试取值,发现原来name的槽位平均到master30007上
DSC00061.png

DSC00062.png

DSC00063.png

  六.redis持久化
  RDB工作原理:
  每隔N分钟或N次写的操作后,Redis将数据库快照保存在名字为dump.rdb的二进制文件中。压缩,然后放到备份目录中。
  比如说,一下设置会让Redis在满足“60秒内有至少1000个键被改动”这一条件时,自己保存数据集:
  save 60 1000
  这种方法持久化方式被称为快照。
  RDB相关参数:
  save 900 1  #刷新快照到磁盘中,必须满足2个要求才会触发,即900秒之后只是有1个关键字发生变化
  stop-wrties-on-bgsave-error yes #后台存储错误停止写
  rebcompression yes #使用LZF压缩rdb文件
  rebchecksum yes #存储和加载rdb文件时校验
  dbfilename dump.rdb #设置rdb文件名
  dir ./   #设置工作目录,rdb文件会写入该目录。
  RDB的优点:
  1.RDB是一个非常紧凑的文件,它保存了Redis在某个时间段的数据集。这种文件非常适合备份,比如说,你可以在最近24小时内,每小时备份一次RDB文件,并且在每个月的每一天,也备份一次RDB文件。这样的话,即使遇到了问题,也可以还原到不同的版本。
  2.RDB在恢复大数据集时比aof恢复速度快
  3.RDB可以最大化Redis性能:父进程在保存RDB文件时唯一要做的就是fork出一个子进行,然后这个子进程就会处理接下来所有保存工作,父进程无须操作I/O操作
  4.RDB保存的是一个镜像文件,可以将它直接传送到别人数据模块中
  RDB的缺点:
  如果在2个保存点之后保存数据,可能会丢失1-N分钟的数据;如果你需要尽量在服务器故障时丢失数据,那么RDB不适合你。虽然RDB允许你设置不同的保存点来控制保存RDB文件的频率。但是,因为RDB文件需要保存的是整个数据集的状态,所以它并不是一个轻松的操作。因为你可能需要5分钟才保存一次RDB文件。在这种情况下,可能会丢失好几分钟的数据。
  AOF工作原理:
  也就是使用日志文件来记录所有的写操作命令,并在服务器启动时,重新启动这次命令来还原数据集。
  AOF相关参数:
  appendonly no  #是否打开aof日志功能
  appendfsync always #每一个命令都立即写入到aof,安全,速度慢
  appendfsync everysec  #每秒写1次
  appendfsync no  #写入功能让操作系统判断缓存区大小统一写入到aof,同步速率慢,速度快
  no-appendfasy-on-rewrite yes  #正在导入rdb快照过程中,需不要停止同步aof
  auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
  auto-aof-rewrite-min-size 60mb #aof文件超过60M时才进行重写
  注:在dump.rdb过程中 ,aof如果停止同步,会不会丢失?
  答:不会,所有的操作缓存在内存的队列里,dump完成后,统一操作
  注:aof重写是指什么?
  答:aof重写是指把内存中命令,逆话命令,写入到aof日志里。
  问:如果rdb文件与aof文件同时存在,优先用谁来恢复数据?
  答:aof
  问:恢复时rdb与aof哪个恢复的快?
  答:rdb,因为其是数据的内存映射,直接载入到内存。而aof是命令,需要逐条执行
  AOF的重写的执行步骤:
  1.Redis执行fork(),现在同时拥有父进程和子进程
  2.子进程开始将新AOF文件的内容写入到临时文件
  3.对于所有新执行的写入命令,父进程一边将它们累计到一个内存缓存中,一边将这些改动追加到现有AOF文件的末尾;这样即使在重写的过程中发生停机,现有的aof文件也是安全的
  AOF的优点
  1.aof默认的策略是每秒钟执行一次,在这种配置下,Redis仍然可以保持良好的性能,并且就算发生了故障,也是丢失一秒钟的数据
  2.Redis可以在AOF文件过大的情况自动进行重写:重写后的新aof文件包含了恢复当前数据集所需的最小命令集合,因为Redis在创建新的aof文件时,会继续将命令追加到现有的aof文件里面,即使重写过程发生了停机,而aof文件而不会丢失。而一旦新aof文件创建完毕,Redis就会从旧的aof文件中切换到新的aof文件,并开始对新的aof文件进行追加操作。
  AOF的缺点
  1对于相同数据集的文件,aof文件的体积通常比rdb文件大
  2.根据fasy策略,aof的速度比rdb慢
  3.aof在国庆曾经发生了这样的问题,因为个别命令的原因,导入aof文件重新载入时,无法将数据集恢复到保存时的原样。
  4.当子线程完成重写工作时,它给父进程发送一个信号,父进程在接收信号之后,将内存中所有数据追加到新aof文件的末尾。


运维网声明 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-630131-1-1.html 上篇帖子: Redis服务停止报错解决方案[NOAUTH Authentication required] 下篇帖子: PHPWAMP安装Redis扩展的方式与相关扩展的下载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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