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

    连接集群的时候一定要加-c
    即:redis-cli -h 192.168.139.30 -p 7002 -c

    1.创建存放redis文件夹: mkdir softwar
    2.上传redis包到刚创建softwar中 rz 
    如果没有rz命令安装 yum install -y lrzsz
    3.解压redis包 tar -zxvf redis-3.2.4.tar.gz
    4.编译安装
    cd redis-3.2.4
    make 
    make install(安装到/usr/local/bin/)
    5.在redis-3.2.4下创建redis_cluster 目录
    mkdir redis_cluster 
    6.在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中
    mkdir 7000 7001 7002
    cp redis.conf redis_cluster/7000
    cp redis.conf redis_cluster/7001
    cp redis.conf redis_cluster/7002  

    7.分别修改配置文件
    复制代码
    port  7000                                        //端口7000,7002,7003      
    bind 本机ip                                 //必须绑定本机ip,否则集群无法访问
    daemonize    yes                               //redis后台运行
    pidfile  /var/run/redis_7000.pid          //pidfile文件对应7000,7001,7002
    cluster-enabled  yes                           //开启集群  把注释#去掉
    cluster-config-file  nodes_7000.conf   //集群的配置  配置文件首次启动自动生成 7000,7001,7002
    cluster-node-timeout  15000                //请求超时  默认15秒,可自行设置
    appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志 
    复制代码
    8.然后分别在7000,7001,7002启动redis服务
    redis-server /software/redis-3.2.4/redis_cluster/7000/redis.conf
    redis-server /software/redis-3.2.4/redis_cluster/7001/redis.conf 
    redis-server /software/redis-3.2.4/redis_cluster/7002/redis.conf 
     
    ps -ef|grep redis 查看三个redis节点都起来了。
    9.虽然三个redis节点都以redis-cluster运行了,但是不会自动构建集群的。三者属于“你不认识我,我不认识你”的状态。
    此时用redis-cli连接一个redis服务器
    redis-cli -h 127.0.0.1 -p 7001
    cluster meet:连通其他节点,让彼此认识。
    cluster meet 127.0.0.1 7000
    cluster meet 127.0.0.1 7002
    然后用cluster nodes 查看集群节点已经都connected的。
    然后用cluster info 查看集群状态cluster_state:fail 还是失败。
    因为redis集群需要设置hash slot
    Redis Cluster通过hash slot将数据根据主键来分区,所以一条key-value数据会根据算法自动映射到一个hash slot,但是一个hash slot存储在哪个Redis节点上并不是自动映射的,是需要集群管理者自行分配的。那么我们需要为多少个hash slot分配Redis节点呢?根据源码可知是16384个
    10.每个redis节点设置hash slot槽
    但是另一个问题又出现了,对于16384个hash slot来说,我们总不能用cluster addslots一个个去分配吧?幸运的是,我们还有另外一种方法来分配hash slot,那就是通过集群配置文件,也就是我们在第三步中配置的cluster-config-file参数,来完成hash slot的分段配置。此时,我们在执行Redis服务器启动的目录下找到名字为nodes-6379.conf的配置文件
    nodes-7000.conf 设置0-5000 
    nodes-7001.conf 设置5001-10000
    nodes-7002.conf 设置10001-16383
    只在myself的节点上设置自己的槽位

    11.配置完hash slot槽位完,redis服务全部重启,然后通过cluster info查看集群状态是否ok。
    12.如果经过以上步骤之后集群状态依然是fail的话,可以重新修改一下三个节点的nodes-6379.conf,将其中所有除myself那一行以外的所有配置行都删除,然后再保存重启服务器即可。
    测试下:set foo bar  提示error 说明让去127.0.0.1:7002上去创建,不是redis集群问题,因为redis集群是根据key来计算槽位,然后根据槽位配置来选择存储到那个redis服务器上的。

    cluster nodes:查看集群节点

    cluster info:查看集群状态
     
    参考的文章:
     
     
    问题:
    1.异常:Too many Cluster redirections?
    bind绑定的ip和你代码访问的ip不一致。
    bind 一定要绑定这个ip。192.168.139.30 
     
     Set<HostAndPort> nodes = new HashSet<HostAndPort>();
            HostAndPort hostAndPort = new HostAndPort("192.168.139.30", 7000);
            HostAndPort hostAndPort1 = new HostAndPort("192.168.139.30", 7001);
            HostAndPort hostAndPort2 = new HostAndPort("192.168.139.30", 7002);
            nodes.add(hostAndPort);
            nodes.add(hostAndPort1);
            nodes.add(hostAndPort2);
            JedisCluster jedisCluster = new JedisCluster(nodes);//JedisCluster中默认分装好了连接池.
            // 这东西 可以直接看到key 的分片数,就能知道放哪个 节点
            System.out.println(JedisClusterCRC16.getSlot("foo"));
            //redis内部会创建连接池,从连接池中获取连接使用,然后再把连接返回给连接池
            String string = jedisCluster.get("foo");
            for (int i = 1; i <= 3; i++) {
                long start = System.currentTimeMillis();
                jedisCluster.set("k:" + i, "v" + i);
                System.out.print("set " + i +"th value in " + (System.currentTimeMillis() - start) + " ms");
                start = System.currentTimeMillis();
                jedisCluster.get("k:" + i);
                System.out.println(", get " + i +"th value in " + (System.currentTimeMillis() - start) + " ms");
            }
     
            System.out.println(string);      
     
     
    第二种方式集群:
    按照上边的1~8的步骤操作完,已经启动了3个redis节点了,下面创建集群操作:
     
    redis-trib.rb create 192.168.139.30:7000 192.168.139.30:7001 192.168.139.30:7002
    这个工具是用 ruby 实现的,所以需要安装 ruby。安装命令如下:
    yum -y install ruby ruby-devel rubygems rpm-build
    gem install redis
    安装完在执行上面的命令。
    此时集群已经搭建成功。
    遇到的问题:
    第一个错误:
    解决方法:
    1.删除每个节点下的aof,rdb文件
    2.flushdb 清空当前数据库
    3.在执行redis-trib命令就可以了。
    第二个错误:
    解决方法:
    只要把redis.conf中定义的 cluster-config-file 所在的文件删除,重新启动redis-server及运行redis-trib即可。
     
    redis-trib.rb的命令:
    http://blog.csdn.net/huwei2003/article/details/50973967
     
     
     
     





    附件列表

  • 相关阅读:
    tabhost切换标签:Log中出现You must supply a layout_width attribute的解决方法
    listview去掉底部多出的边框黑色
    使用fragmenttabhost后,子fragment怎么获取ID?怎么用getSharedPreferences
    android用shape给linearLayout设置边框,怎样只保留底部或顶部的边框,把其它三个方向的边框去掉呢?
    linux删除文件未释放空间问题处理
    mount: unknown filesystem type 'LVM2_member'解决方案【转】
    centos系统lvm的安装
    一个或多个音频服务未运行 win7 错误1079:此服务的账户不同于运行于同一进程上的其他服务账户
    php SimpleXML
    new JSONObject(str)无法解析 报错:org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
  • 原文地址:https://www.cnblogs.com/mantian2020/p/6226663.html
Copyright © 2011-2022 走看看