zoukankan      html  css  js  c++  java
  • redis安装、测试&集群的搭建&踩过的坑

    1 redis的安装

    1.1   安装redis

      版本说明

       本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。

    安装的前提条件:

    需要安装gcc:yum install gcc-c++

    1、下载redis的源码包。

    2、把源码包上传到linux服务器

    3、解压源码包

    tar -zxvf redis-3.0.0.tar.gz

    4、Make

    5、Make install

    [root@bogon redis-3.0.0]# make install PREFIX=/usr/local/redis

    1.2   启动redis

    1、前端启动模式

    /usr/local/redis/bin/redis-server

    默认是前端启动模式,端口是6379

    2、后端启动

    1)从redis的源码目录中复制redis.conf到redis的安装目录。

    2)修改配置文件

    3)[root@bogon bin]# ./redis-server redis.conf

    1.3   Redis常用命令

    ./redis-cli 
    
    127.0.0.1:6379> set a 10
    
    OK
    
    127.0.0.1:6379> get a
    
    "10"

    1.4   Java代码测试redis,需使用jedis.jar

    import java.util.HashSet;
    
    import org.junit.Test;
    
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.JedisPool;
    /**
     * 测试jedis,redis的客户端,想连接到虚拟机中的redis-server需要关闭iptables
     * 执行:service iptables stop
     * @author HELLXZ
     * @date 创建时间:2017年8月17日 上午8:41:05
     */
    public class testJedis {
    
        @Test
        //单机测试
        public void testJedis(){
            Jedis jedis = new Jedis("192.168.25.133", 6379);
            jedis.set("haha", "helloworld!");
            String string = jedis.get("haha");
            System.out.println(string);
            jedis.close();
        }
        
        @Test
        //池测试
        public void testJedisPool(){
            JedisPool jedisPool = new JedisPool("192.168.25.133", 6379);
            Jedis resource = jedisPool.getResource();
            resource.set("hei", "ha");
            String string = resource.get("hei");
            System.out.println(string);
            resource.close();
            //关闭连接池
            jedisPool.close();
        }
    }

    1.4.1   此处的坑

    代码测试显示失败,连接失败,想了一阵,以为是bind的ip地址不对,修改redis.conf的bind的ip,测试没有用。

    然后百度发现问题在于虚拟机使用的cent6.4的防火墙还开着,关闭后测试通过。

    cent7以下用到的防火墙是iptables,关闭防火墙代码如下

    关闭防火墙命令: 
    service iptables stop 
    永久关闭防火墙:
    chkconfig iptables off

    cent7以上关闭命令:

    systemctl stop firewalld.service #停止firewall
    systemctl disable firewalld.service #禁止firewall开机启动

    1.5   常用数据类型

    1) String

    2) Hash

    3) List

    4) Set

    5) SortedSet

    其中1)2)最常用

    2   Redis集群的搭建

    2.1   Redis集群相关概念

    2.1.1   redis-cluster架构图

    集群基础知识:

    redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

    Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

    Key:a

    计算a的hash值,例如值为100,100这个槽在server1上,所以a应该放到server1.

     

    Key:hello

    Hash值:10032,此槽在server2上。Hell可以应该存在server2.

     

    2.1.2   redis-cluster投票:容错

    (1)领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.

    (2):什么时候整个集群不可用(cluster_state:fail)? 

        a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

        b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

      ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

    2.2   我们的集群结构

    集群中有三个节点的集群,每个节点有一主一备。需要6台虚拟机。

    搭建一个伪分布式的集群,使用6个redis实例来模拟。

    2.3   搭建集群需要的环境

    搭建集群需要使用到官方提供的ruby脚本。

    需要安装ruby的环境。

    安装ruby

    yum install ruby
    
    yum install rubygems

    redis集群管理工具redis-trib.rb

    [root@bogon ~]# cd redis-3.0.0

    [root@bogon redis-3.0.0]# cd src

    [root@bogon src]# ll *.rb

    -rwxrwxr-x. 1 root root 48141 Apr  1 07:01 redis-trib.rb

    [root@bogon src]#

    脚本需要的ruby包

    需要上传到linux服务。

    安装ruby的包

    gem install redis-3.0.0.gem

    显示情况如下:

    [root@bogon ~]# gem install redis-3.0.0.gem

    Successfully installed redis-3.0.0

    1 gem installed

    Installing ri documentation for redis-3.0.0...

    Installing RDoc documentation for redis-3.0.0...

    2.4   集群的搭建

    第一步:创建6个redis实例,端口号从7001~7006

    创建实例举例第一个,后边相同,复制改名文件夹,配置文件改端口号即可:

    cd /usr/local/redis #进入redis安装路径
    
    cd bin
    
    rm -rf dump.db  #删除缓存的数据库
    
    cd ..
    
    cp bin ../redis-cluster/redis01 #复制bin并重命名到redis-cluster目录下
    
    #此时redis_cluster 中已经有一个redis01的实例文件夹了,
    #此时可以先修改一下配置文件,比如:修改端口号,开启cluster-enabled yes
    #然后 各种复制这个文件夹,创建6个实例
    cp redis01 redis02
    cp redis01 redis03
    cp redis01 redis04
    cp redis01 redis05
    cp redis01 redis06
    #之后参考第二步把没有修改的端口号改正确即可

    第二步:修改redis.conf(这些都在redis01~06中,都需要修改!)

      1) 修改端口号

      2) 打开cluster-enable前面的注释。

    第三步:把创建集群的ruby脚本(redis-trib.rb)从redis安装路径下的src路径,复制到redis-cluster目录下。

    cd /usr/local/redis/src
    
    cp *.rb /usr/local/redis-cluster

    第四步:启动6个redis实例,删除dump.db文件,打开redis.conf更改端口号,开启cluster-enabled yes

    创建脚本  vim startall.sh 输入如下并保存

     1 cd redis01
     2 ./redis-server redis.conf
     3 cd ..
     4 cd redis02
     5 ./redis-server redis.conf
     6 cd ..
     7 cd redis03
     8 ./redis-server redis.conf
     9 cd ..
    10 cd redis04
    11 ./redis-server redis.conf
    12 cd ..
    13 cd redis05
    14 ./redis-server redis.conf
    15 cd ..
    16 cd redis06
    17 ./redis-server redis.conf

    此处保存完毕,chmod +x startall.sh授权,一定要 ./startall.sh 执行,然后再继续操作!

    查看状态   ps aux|grep redis

     

    第五步:创建集群。具体ip为虚拟机设置的ip,请注意

    ./redis-trib.rb create --replicas 1 192.168.25.133:7001 192.168.25.133:7002 192.168.25.133:7003 192.168.25.133:7004 192.168.25.133:7005  192.168.25.133:7006

    接下来会弹一堆代码。看看就好,后边需要输入请求yes继续执行

    [root@bogon redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.25.133:7001 192.168.25.133:7002 192.168.25.133:7003 192.168.25.133:7004 192.168.25.133:7005  192.168.25.133:7006
    >>> Creating cluster
    Connecting to node 192.168.25.133:7001: OK
    Connecting to node 192.168.25.133:7002: OK
    Connecting to node 192.168.25.133:7003: OK
    Connecting to node 192.168.25.133:7004: OK
    Connecting to node 192.168.25.133:7005: OK
    Connecting to node 192.168.25.133:7006: OK
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    192.168.25.133:7001
    192.168.25.133:7002
    192.168.25.133:7003
    Adding replica 192.168.25.133:7004 to 192.168.25.133:7001
    Adding replica 192.168.25.133:7005 to 192.168.25.133:7002
    Adding replica 192.168.25.133:7006 to 192.168.25.133:7003
    M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.133:7001
       slots:0-5460 (5461 slots) master
    M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.133:7002
       slots:5461-10922 (5462 slots) master
    M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.133:7003
       slots:10923-16383 (5461 slots) master
    S: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.133:7004
       replicates 5a8523db7e12ca600dc82901ced06741b3010076
    S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.133:7005
       replicates bf6f0929044db485dea9b565bb51e0c917d20a53
    S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.133:7006
       replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
    Can I set the above configuration? (type 'yes' to accept): yes

    输入yes之后继续,接下来的代码到join...需要耐心等待,如果出现一两行的省略号,那么很遗憾,可能前边你的./startall.sh没有启动!!!ctrl+c关闭当前,删除各个文件夹中生成的dump.db,然后启动脚本./startall.sh,重复上述操作即可成功!

    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join.....

    正常会马上这样:

    >>> Performing Cluster Check (using node 192.168.25.133:7001)
    M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.133:7001
       slots:0-5460 (5461 slots) master
    M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.133:7002
       slots:5461-10922 (5462 slots) master
    M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.133:7003
       slots:10923-16383 (5461 slots) master
    M: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.133:7004
       slots: (0 slots) master
       replicates 5a8523db7e12ca600dc82901ced06741b3010076
    M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.133:7005
       slots: (0 slots) master
       replicates bf6f0929044db485dea9b565bb51e0c917d20a53
    M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.133:7006
       slots: (0 slots) master
       replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    [root@bogon redis-cluster]# 

    至此,redis集群搭建完成

    每个redis集群的节点都是会互相ping pong 的,接下来我们测试一下 

    #结尾的-c一定要写!不然会出现move失败的错误!
    [root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.133 -p 7002 -c #结尾的-c一定要写!不然会出现move失败的错误!
    
    
    [root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.133 -p 7002
    192.168.25.133:7002> set a 100
    (error) MOVED 15495 192.168.25.133:7003
    192.168.25.133:7002> 
    [root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.133 -p 7002 -c
    192.168.25.133:7002> set a 100
    -> Redirected to slot [15495] located at 192.168.25.133:7003
    OK
    192.168.25.133:7003> 

    2.5 java代码测试集群

     1 @Test
     2     public void testJedisCluster() {
     3         HashSet<HostAndPort> nodes = new HashSet<>();
     4         nodes.add(new HostAndPort("192.168.25.133", 7001));
     5         nodes.add(new HostAndPort("192.168.25.133", 7002));
     6         nodes.add(new HostAndPort("192.168.25.133", 7003));
     7         nodes.add(new HostAndPort("192.168.25.133", 7004));
     8         nodes.add(new HostAndPort("192.168.25.133", 7005));
     9         nodes.add(new HostAndPort("192.168.25.133", 7006));
    10         
    11         JedisCluster cluster = new JedisCluster(nodes);
    12         
    13         cluster.set("key1", "1000");
    14         String string = cluster.get("key1");
    15         System.out.println(string);
    16         
    17         cluster.close();
    18     }

    2.6   关闭redis集群(节点)

    有开启自然有关闭,比较麻烦,一般的教程里没写,先cd到redis-cluster/,也可以把以下代码装进脚本如:vim shutdownall.sh,保存后chmod +x shutdownall.sh ,执行的时候./shutdownall.sh即可

    redis01/redis-cli -p 7001 shutdown
    
    redis02/redis-cli -p 7002 shutdown
    
    redis03/redis-cli -p 7003 shutdown
    
    redis04/redis-cli -p 7004 shutdown
    
    redis05/redis-cli -p 7005 shutdown
    
    redis06/redis-cli -p 7006 shutdown

     

    2.7   重启redis集群(节点)

    回忆我们创建redis集群的时候是create的cluster,那么重启呢?其实重启更简单!完全无需我们在create一个新的cluster!百度一会了,发现几乎没有解决方案,或者有解决方案的没有技术分享,不多说,直接说结论:

    我们创建了集群之后,集群已经存在了,无需创建,仅仅重启各个节点就可以运行了!本文上边有提到startall.sh脚本的创建,只需执行那个脚本就启动了集群了!

    ./startall.sh

     -------本文理论部分来自传智黑马授课笔记,仅作记录,实际操作的部分以及笔记中不全的步骤在这里得以补全,添加自认为会坑的细节。不喜勿喷。

    无法连接的bug解决引用自: 

    http://blog.csdn.net/skymouse2002/article/details/52279553

  • 相关阅读:
    继承映射
    一对多,多对一,自关联的配置
    Spring 配置自动扫描spring bean配置
    Dao 处理
    2019暑假集训 括号匹配
    2019暑假集训 BLO
    2019暑假集训 Intervals
    2019暑假集训 平板涂色
    2019暑假集训 走廊泼水节
    0002-五层小山
  • 原文地址:https://www.cnblogs.com/hellxz/p/redis.html
Copyright © 2011-2022 走看看