zoukankan      html  css  js  c++  java
  • Redis集群部署

    0, 先决条件
    Redis安装依赖 gcc-c++
    Redis集群依赖 ruby rubygems
    安装命令:
    $ yum -y install ruby rubygems


    1,安装
    1.1, 下载 Redis,下载地址:http://download.redis.io/releases/redis-3.2.9.tar.gz
    $ wget http://download.redis.io/releases/redis-3.2.9.tar.gz

    1.2, 解压安装包
    $ tar xzf redis-3.2.9.tar.gz

    1.3, 进入安装包目录
    $ cd redis-3.2.9

    1.4, 编译安装
    $ make PREFIX=/usr/local/redis install

    1.5, 配置集群
    1.5.1 在redis 目录下创建 cluster-etc 目录,然后将 redis.conf 拷贝到这个目录中
    $ mkdir cluster-etc
    $ cp redis.conf cluster-etc/redis.conf

    1.5.2, 修改配置文件redis.conf 中的如下配置项
    # 真实的IP和port
    bind 127.0.0.1
    port port
    pidfile /var/run/redis_port.pid

    daemonize yes

    # 开启日志记录
    appendonly yes
    appendonly yes
    appendfilename "appendonly.aof"
    appendfsync everysec

    # 开启集群
    cluster-enabled yes
    cluster-config-file nodes_port.conf
    cluster-node-timeout 15000

    1.5.3 拷贝6份配置文件redis.conf,并替换关键字port
    $ cp redis.conf redis-2001.conf
    $ vi redis-2001.conf
    $ :.,$s/port/2001/g
    $ :wq

    1.6, 启动各个节点
    $ cd /usr/local/redis
    $ redis-server ./cluster-etc/redis-2001.conf
    $ redis-server ./cluster-etc/redis-2002.conf
    $ redis-server ./cluster-etc/redis-2003.conf
    $ redis-server ./cluster-etc/redis-2004.conf
    $ redis-server ./cluster-etc/redis-2005.conf
    $ redis-server ./cluster-etc/redis-2006.conf

    1.7,创建集群
    redis-trib.rb create --replicas 1 127.0.0.1:2001 127.0.0.1:2002 127.0.0.1:2003 127.0.0.1:2004 127.0.0.1:2005 127.0.0.1:2006

    1.8, 集群验证
    在一台机器上连接集群的2002端口的节点,在另外一台连接2005节点.
    连接方式为 redis-cli -h 127.0.0.1 -c -p 2002
    参数 -c 可连接到集群,因为上面 redis.conf 将 bind 改为了127.0.0.1地址,所以 -h 参数不可以省略。

    备注:编译后在安装目录 src 目录下会出现redis服务程序redis-server和客户端程序redis-cli

    2, 常用命令
    2.1, 启动命令
    $ ./redis-server redis.conf
    2.2, 启动命令
    $ ./redis-cli -h ip -p port shutdown
    2.3, 查看Redis版本
    $ redis-server --version

    3, 集群管理
    3.1 查看集群中机器ID,主从,及hash槽情况,可以查看集群中机器的情况
    /usr/local/redis/bin/redis-trib.rb check IP:port

    3.2 对数据重新分片:
    /usr/local/redis/bin/redis-trib.rb reshard IP:port

    3.3 列出集群中的所有主节点
    /usr/local/redis/bin/redis-cli -h IP -p port cluster nodes | grep master

    3.4 让某个主节点崩溃,测试故障转移
    /usr/local/redis/bin/redis-cli -h IP -p port debug segfault

    3.5 增加主节点到集群
    /usr/local/redis/bin/redis-trib.rb add-node new-IP:new-port IP:port
    #new-IP:new-port是新节点,IP:port是一个已在集群中的节点
    #需要注意的是此时新节点不能成为真正的主节点,需要进行重新分片才可以

    /usr/local/redis/bin/redis-trib.rb reshard new-IP:new-port
    1).自动分片程序会询问移动几个hash槽,如果要保证数据的均匀,此时应该是16384/N,
    N代表包括当前主机的所有希望成为主节点的数量。
    2).然后会询问移动到哪个节点,输入新的主节点的id即可。
    3).会询问从哪些节点移动数据,此时可以选择某些节点的ID,也可以直接选择all,从所有主节点,这样数据就会均分。

    3.6 增加从节点到集群
    /usr/local/redis/bin/redis-trib.rb add-node --slave new-IP:new-port IP:port

    #此时没有指定从节点的主节点,一般会自动选择一个,也可以指定主节点,如下:
    /usr/local/redis/bin/redis-trib.rb add-node --slave --master-id 6b45acde96e4225856c8652089e8c8edeec00c79 new-IP:new-port IP:port
    #new-IP:new-port新加的节点,IP:port已在集群中的节点

    3.7 删除一个节点(删除后redis实例会被关闭)
    1).从节点删除:d598f4cf29cc4fea3616a00a0e707f71a7777cf1是指被删除的redis的ID
    /usr/local/redis/bin/redis-trib.rb del-node IP:port 56cfd4a0d4631fdf046c20acac7e5f1a0fce3b39

    2).主节点删除,此时应该确保主节点数据为空,如果不为空,需要将该节点的数据重新分片到其他节点上
    # 被删除的主节点,先进行数据迁移,到其他主节点上
    /usr/local/redis/bin/redis-trib.rb reshard IP:port


    /usr/local/redis/bin/redis-trib.rb del-node IP:port 791b834b1a5292bba236656c076849bb45a0ff17

    3.8 集群相关命令:
    CLUSTER NODES :集群信息,包括了节点ID,主从关系
    CLUSTER INFO:查看集群是否健康
    CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
    CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
    CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
    CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
    CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。

    $ redis-cli -h IP -p port
    > CLUSTER NODES

    4, FAQ

    ERROR:
    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 `/data0/src/redis-3.2.9/src'
    make: *** [all] Error 2
    FIX:make PREFIX=.. install前先执行:make MALLOC=libc

    ERROR:
    zmalloc.o: In function `zmalloc_used_memory':
    /usr/local/redis-3.2.9/src/zmalloc.c:223: undefined reference to `__sync_add_and_fetch_4'
    collect2: ld returned 1 exit status
    make[1]: *** [redis-server] Error 1
    make[1]: Leaving directory `/usr/local/redis-3.2.9/src'
    make: *** [all] Error 2
    wget http://download.redis.io/releases/redis-3.2.9.tar.gz
    FIX:make CFLAGS='-march=i686'

    ERROR: You need tcl 8.5 or newer in order to run the Redis testmake: *** [test] Error 1
    FIX:安装tcl,yum可用的话yum install tcl

    ERROR:
    make: cc: Command not found make: *** [adlist.o] Error 127
    FIX:安装gcc库。yum可用的话 yum install gcc

    Error: /usr/bin/env: ruby: No such file or directory
    Cause: redis-trib.rb 依赖 ruby
    Fix: yum -y install ruby


    Error: ./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
    from ./redis-trib.rb:24
    Cause: redis-trib.rb 依赖 rubygems
    Fix: yum -y install rubygems


    Error: usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
    from ./redis-trib.rb:25
    Cause: 缺少redis和ruby的接口
    Fix: gem install redis --version 3.0.0

    Error: Node IP:port is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    Cause:
    Fix: 用redis-cli登录到每个节点执行flushdb。

    Error: CLUSTERDOWN Hash slot not served
    Cause:
    Fix: 用redis-cli登录到每个节点执行flushall和cluster reset。

  • 相关阅读:
    Git 自救指南:这些坑你都跳得出吗?
    敢不敢模拟超过 5 万的并发用户?
    一条简单的 SQL 执行超过 1000ms,纳尼?
    JVM 最多支持多少个线程?
    19 条效率至少提高 3 倍的 MySQL 技巧
    LeetCode 剑指offer 面试题04. 二维数组中的查找
    LeetCode 剑指offer 面试题03 数组中重复的数字
    东华大学计算机软件工程 复试最后一百题
    东华大学计算机软件工程复试 挑战练习
    东华大学计算机软件工程复试 进阶练习
  • 原文地址:https://www.cnblogs.com/cityspace/p/7061329.html
Copyright © 2011-2022 走看看