Redis集群搭建

来源:互联网 发布:好的南方二本院校知乎 编辑:程序博客网 时间:2024/06/06 09:03
文章转自:- http://blog.csdn.net/RobertoHuang/article/details/70766809 - http://blog.csdn.net/u011204847/article/details/51307044

1:redis特点

  • 1.异常快速:Redis数据库完全在内存中,因此处理速度非常快,每秒能执行约11万集合,每秒约81000+条记录。

  • 2.数据持久化:Redis支持数据持久化,可以将内存中的数据存储到磁盘上,方便在宕机等突发情况下快速恢复。

  • 3.数据一致性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。

  • 4.支持丰富的数据类型:相比许多其他的键值对存储数据库,Redis拥有一套较为丰富的数据类型。支持存储string、list、hash、set、Sorted Set,Bitmap,HyperLoglogs。

  • 5.多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

2:redis单机安装

  • 1.编译和安装所需的包: yum install gcc tcl

  • 2.解压Redis(此处须自行去官网下载Redis安装包,并上传到服务器):tar -zxvf redis-3.2.8.tar.gz

  • 3.进入Redis所在文件夹: cd redis-3.2.8

  • 4.编译安装Redis: make PREFIX=/opt/redis/redis-3.2.8 install

  • 5.安装完成后,可以看到/opt/redis/redis-3.2.8目录下有一个bin目录,bin目录里就是redis的命令脚本: redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server

  • 6.采用默认配置文件方式启动Redis: ./redis-server

  • 7.如需指定配置文件,在./redis-server后拼接上配置文件路径,如: ./redis-server /opt/redis/redis-3.2.8/redis.conf

redis启动后,可以使用ps -ef | grep redis查看redis进程

3:主从复制过程

  • 1.当一个从数据库启动时,会向主数据库发送sync命令,
  • 2.主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来
  • 3.当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。
  • 4.从数据库收到后,会载入快照文件并执行收到的缓存的命令

4主从模式搭建

  • 1.在安装好单机版的前提下,复制三份配置文件
进入redis所在目录# cd /opt/redis/redis-3.2.8创建637963806381目录,分别将安装目录下的redis.conf拷贝到这三个目录下。# mkdir -p /opt/redis/6379 && cp redis.conf /opt/redis/6379/6379.conf# mkdir -p /opt/redis/6380 && cp redis.conf /opt/redis/6380/6380.conf# mkdir -p /opt/redis/6381 && cp redis.conf /opt/redis/6381/6381.conf
  • 2.分别修改配置文件
# Redis使用后台模式daemonize yes# 关闭保护模式protected-mode no# 注释以下内容开启远程访问# bind 127.0.0.1# 修改启动端口为6379port 6379# 修改pidfile指向路径pidfile /opt/redis/6379/redis_6379.pid*#设置主从服务器slaveof <masterip> <masterport>*以此类推,修改端口63806381配置。
  • 3.分别启动三个Redis实例
/opt/redis/redis-3.2.8/bin/redis-server /opt/redis/6379/6379.conf/opt/redis/redis-3.2.8/bin/redis-server /opt/redis/6380/6380.conf/opt/redis/redis-3.2.8/bin/redis-server /opt/redis/6381/6381.conf

注:

  • 1.启动之后,可在客户端运行info replication命令查看redis主从关系
  • 2.默认情况下redis数据库充当slave角色时是只读的不能进行写操作,可以在配置文件中开启非只读:slave-read-only no
  • 3.如果使用主从复制,那么要确保master激活了持久化,或者确保它不会在当掉后自动重启。原因:slave是master的完整备份,因此如果master通过一个空数据集重启,slave也会被清掉。
  • 4.在配置redis复制功能的时候如果主数据库设置了密码,需要在从数据的配置文件中通过masterauth参数设置主数据库的密码,这样从数据库在连接主数据库时就会自动使用auth命令认证了。相当于做了一个免密码登录。

5:redis的Sentinel

  • redis的sentinel系统用于管理多个redis服务器,该系统主要执行三个任务:监控、提醒、自动故障转移。

    • 1.监控(Monitoring): Redis Sentinel实时监控主服务器和从服务器运行状态,并且实现自动切换。
    • 2.提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Redis Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知。
    • 3.自动故障转移(Automatic failover): 当一个主服务器不能正常工作时,Redis Sentinel 可以将一个从服务器升级为主服务器, 并对其他从服务器进行配置,让它们使用新的主服务器。当应用程序连接Redis 服务器时, Redis Sentinel会告之新的主服务器地址和端口。
    • 4.在使用sentinel监控主从节点的时候,从节点需要是使用动态方式配置的,如果直接修改配置文件,后期sentinel实现故障转移的时候会出问题。
  • sentinel配置

    • 修改sentinel.conf文件:
    • sentinel monitor mymaster 192.168.33.130 6379 2
    • 最后一个参数为需要判定客观下线所需的主观下线sentinel个数,这个参数不可以大于sentinel个数
    • 主观下线状态:当一个sentinel认为一个redis服务连接不上的时候,会给这个服务打个标记为下线状态。
    • 客观下线状态:当多个sentinel认为一个redids连接不上的时候,则认为这个redis服务确实下线了。这里的多个sentinel的个数可以在配置文件中设置。
  • 启动sentinel: `redis-sentinel sentinel.conf

    • `这里写图片描述

    • java操作sentinel

          // 使用HashSet添加多个sentinel      HashSet<String> sentinels = new HashSet<String>();      // 添加sentinel主机和端口      sentinels.add("192.168.33.131:26379");      // 创建config      JedisPoolConfig poolConfig = new JedisPoolConfig();      // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。      poolConfig.setMaxIdle(10);      // 控制一个pool最多有多少个jedis实例。      poolConfig.setMaxTotal(100);      // 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;      poolConfig.setMaxWaitMillis(2000);      // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;      poolConfig.setTestOnBorrow(true);      // 通过Jedis连接池创建一个Sentinel连接池      JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,poolConfig);      // 获取master的主机和端口      HostAndPort currentHostMaster = pool.getCurrentHostMaster();      System.out.println(currentHostMaster.getHost() + "--"+ currentHostMaster.getPort());      // 从Sentinel池中获取资源      Jedis resource = pool.getResource();      // 打印资源中key为name的值      System.out.println(resource.get("name"));      // 关闭资源      resource.close();
原创粉丝点击