q666123 发表于 2018-11-3 10:16:52

Linux的企业-Redis数据库、缓存和哨兵Sentinal、Redis高可用

  一.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


  2.启动redis

  如果出现以下错误,可能是库的问题,使用make MALLOC=libc即可
  # make
  cd src && make all
  make: 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: *** Error 1
  make: Leaving directory `/root/redis-4.0.1/src'
  make: *** Error 2
  # make MALLOC=libc
  三.安装redis
  bind 全网段


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

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



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




  五.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哨兵文件

  server1为主,server2和server3为从

  设置宕机反应时间

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


  3.server1、server2、server3启动哨兵




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



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



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



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

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



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

  配置30001的redis文件

  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

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



  
  查看进程和端口


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

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

  测试:


  7.检测集群状态

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

  恢复节点2,集群正常

  
  但30005变为master,30002变为slave

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


  (1)将30007添加为master


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

  平均master槽位


  (2)将30008添加为slave



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



  六.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]
查看完整版本: Linux的企业-Redis数据库、缓存和哨兵Sentinal、Redis高可用