zoukankan      html  css  js  c++  java
  • Redis集群使用总结(一):

    随着企业数据量的增多,Redis不论作为数据存储或是缓存,它的数据量也会逐渐增多,虽然Redis的速度非常可观,但随着其中的数据量的庞大,并且仅仅在一个设备或是一个Redis实例中,其存取速度也会大打折扣,所以我们需要在不同的设备或服务器上,搭建多个Redis实例仓库,将原来的Redis的所有的keys分发到各个服务器的Redis上,这就是现在所谓的Redis集群(Redis Cluster)。

    ·     原理

    ·     实施

    ·     注意

    ·     问题

    一、原理

    1、数据共享

    Redis提供多个节点实例间的数据共享,也就是Redis A,B,C,D彼此之间的数据是同步的,同样彼此之间也可以通信,而对于客户端操作的keys是由Redis系统自行分配到各个节点中。

    2、主从复制

    Redis的多个实例间通信时,一旦其中的一个节点故障,那么Redis集群就不能继续正常工作,所以需要一种复制机制(Master-Slave)机制,做到一旦节点A故障了,那么其从节点A1和A2就可以接管并继续提供与A同样的工作服务,当然如果节点A,A1,A2节点都出现问题,那么同样这个集群不会继续保持工作,但是这种情况比较罕见,即使出现了,也会及时发现并修复使用。

    建议:部署主从复制机制(Master-Slave)。

    3、哈希槽值

    Redis集群中使用哈希槽来存储客户端的keys,而在Redis中,目前存在16384个哈希槽,它们被全部分配给所有的节点,正如上图所示,所有的哈希槽值被节点A,B,C分配完成了。

    二、实施

    1、创建集群

    A、辅助工具安装

    在搭建Redis Cluster之前,请先确保系统已经安装了zlib和ruby(含rubygems)软件依赖包,请自行安装。

    B、安装redis-cluster

    在Redis的源码路径下,位于src目录中的redis-trib.rb文件是用来搭建和维护集群的工具,我们需要将其放入与redis-server和redis-cli同样的指令环境下,如下:

    sudo cp /redis/redis-3.0.7/src/redis-trib.rb  /redis/bin

    sudo cp /redis/redis-3.0.7/src/redis-server  /redis/bin

    sudo cp /redis/redis-3.0.7/src/redis-cli  /redis/bin

    C、配置redis-cluster

    文件结构:

    通用配置:

    #generate configs

    daemonize no

    tcp-backlog 511

    timeout 2000

    tcp-keepalive 0

    loglevel notice

    databases 16

    slave-serve-stale-data yes

    slave-read-only yes

    repl-disable-tcp-nodelay yes

    slave-priority 100

    #open the aof persistence

    appendonly yes

    #config aof mode for everysec

    appendfsync everysec

    #while rewrite op then close the aof write mode

    no-appendfsync-on-rewrite yes

    auto-aof-rewrite-min-size 64mb

    aof-rewrite-incremental-fsync yes

    #limit the time of lua scripts executes

    lua-time-limit 5000

    #open redis cluster switch

    cluster-enabled yes

    #timeout of nodes connections

    cluster-node-timeout 15000

    cluster-migration-barrier 1

    slowlog-log-slower-than 10000

    slowlog-max-len 128

    notify-keyspace-events ""

    hash-max-ziplist-entries 512

    hash-max-ziplist-value 64

    list-max-ziplist-entries 512

    list-max-ziplist-value 64

    set-max-intset-entries 512

    zset-max-ziplist-entries 128

    zset-max-ziplist-value 64

    #open the online rehash

    activerehashing yes

    client-output-buffer-limit normal 0 0 0

    client-output-buffer-limit slave 256mb 64mb 60

    client-output-buffer-limit pubsub 32mb 8mb 60

    hz 10

    特殊配置:

    这里以6379端口为例说明,其它的特殊配置只需修改对应的端口即可:

    #common configs

    include /redis/etc/redis-common.conf

    #listen tcp port

    port 6379

    #memory cahce max size

    maxmemory 100m

    maxmemory-policy allkeys-lru

    #aof filename

    appendfilename "appendonly-6379.aof"

    #rdb file,only use in the slave handle

    dbfilename dump-6379.rdb

    dir /redis/db-6379

    #cluster config that auto create

    cluster-config-file nodes-6379.conf

    #log path

    logfile /redis/logs/6379/log-6379.log

    #in the same computer redis,then give the limit

    #fork all redis processes done rewrite,using big memory

    auto-aof-rewrite-percentage 80-100

    D、搭建redis-cluster

    在这里,我们使用Redis自带的ruby工具redis-trib.rb来创建和管理集群。本人共创建了6个redis节点,分别启动之后,使用./redis-trib.rb create –replicas配置和生成3个主节点和对应每个节点的3个从节点。

    首先,启动6个节点实例:

    $redis-server /redis/etc/redis-6379.conf

    $redis-server  /redis/etc/redis-6380.conf

    $redis-server  /redis/etc/redis-6381.conf

    $redis-server  /redis/etc/redis-7379.conf

    $redis-server  /redis/etc/redis-7380.conf

    $redis-server  /redis/etc/redis-7381.conf

    其次,创建分配主从节点:

    $redis-trib.rb create --replicas 1

    127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:7379 127.0.0.1:7380127.0.0.1:7381

    执行的结果:

    NOTE:

    --replicas 1代表创建1个从节点,创建的从节点的顺序是按照6379-7379,6380-7380及6381-7381的顺序创建配置的。

    从上图知道,已经创建和配置了3个Master和对应的3个Sub子节点,同时会提示您是否同意这个配置生成,当你回复yes之后,显示如下:

    NOTE:

    从上图知道,Redis集群已经创建和配置成功了,并且redis的16384个哈希槽已经全部分配完成。

    2、集群验证

    验证可以使用redis-rb-cluster或是redis-cli来验证,这里以最简单的方式redis-cli来验证使用,意在说明集群的使用和校验。

    A、哈希槽分配

    $redis-cli -c -p 6379

    127.0.0.1:6379> set mykey "hello"

    -> Redirected to slot [14687] located at 127.0.0.1:6381

    $redis-cli -c -p 6380

    127.0.0.1:6380> set mykey2 "hello world"

    -> Redirected to slot [14119] located at 127.0.0.1:6381

    OK

    $redis-cli -c -p 6381

    127.0.0.1:6381> set mykey3 "hello"

    -> Redirected to slot [9990] located at 127.0.0.1:6380

    OK

    B、集群验证

    $redis-trib.rb  127.0.0.1:7379

    结果:

    右上图,可以知道集群配置没问题,继续往下验证下数据的异步同步。

    C、集群数据共享

    $redis-cli -c -p 6379

    127.0.0.1:6379> set mykey "hello"

    -> Redirected to slot [14687] located at 127.0.0.1:6381

    OK

    127.0.0.1:6381> get mykey2

    "hello world"

    127.0.0.1:6381> get mykey3

    -> Redirected to slot [9990] located at 127.0.0.1:6380

    "hello"

    NOTE:

    从上面可以看出,我实例子6379中可以访问同一个集群内的节点数据,访问的机制是根据set时分配的哈希槽,例如:在6379中,使用get mykey3,那么自动定位到6380。  

    三、注意

    1、主从复制

    Redis集群支持主从复制功能,也就是主节点对应的从节点,但是不需要在从节点中加入slaveof <server>:<port>,否则会报错哦。

    2、主从配置

    一般情况下,从节点的配置和对应的主节点的配置类似,但是一般从节点的大小要小于主节点的配置大小,这主要考虑内存和性能均衡方面,请在实际使用时留意下。

    3、实例通信

    Redis集群中的节点实例间的数据共享机制是通过定位哈希槽(set时的键值分配的哈希),不会区分主从节点或是普通节点的通信。

    四、问题

    遇到问题:

    custom_require.rb:36:in `require': cannot load such file -- redis(LoadError)

    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'

    from ./redis-trib.rb:25:in `<main>'

    解决办法:

    sudo gem install redis来安装ruby和redis的接口包即可

  • 相关阅读:
    wtforms 钩子函数
    sqlalchemy 单表增删改查
    sqlalchemy 数据库操作
    flask wtforms组件
    python----------文件操作
    编码 编码的转化
    集合、深浅copy
    字典
    sort 、sorted、range、join方法 数字的正序、倒叙、翻转
    for循环
  • 原文地址:https://www.cnblogs.com/RENQIWEI1995/p/8931678.html
Copyright © 2011-2022 走看看