zoukankan      html  css  js  c++  java
  • centos 7下搭建Redis5.x版集群

    一、开始集群搭建

    redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用一台机器(可以多台机器部署,修改一下ip地址就可以了)部署6个redis实例,三主三从,搭建集群的步骤如下:

    第一步:在第一台机器的/usr/local下创建文件夹redis-cluster,然后在其下面创建6个文件夾如下:

    mkdir /usr/local/redis-cluster
    
    cd /usr/local/redis-cluster
    
    mkdir 8001 8002 8003 8004 8005 8006
    

    第二步:把之前的redis.conf配置文件copy到8001下,修改如下内容:

    1)daemonize yes

    2)port 8001(分别对每个机器的端口号进行设置)

    3)dir /usr/local/redis-cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)

    4)cluster-enabled yes(启动集群模式)

    5)cluster-config-file nodes-8001.conf(集群节点信息文件,这里800x最好和port对应上)

    6)cluster-node-timeout 5000

    1. bind 127.0.0.1(去掉bind绑定访问ip信息)

    2. protected-mode no (关闭保护模式)

    9)appendonly yes

    10)设置pidfile存放在 run目录下的文件名 pidfile /var/run/redis_8001.pid

    11)dbfilename dump_8001.rdb

    如果要设置密码需要增加如下配置:

    12)requirepass xxx (设置redis访问密码)

    13)masterauth xxx (设置集群节点间访问密码,跟上面一致)

    14)修改日志路径

    第三步:把修改后的配置文件,

    copy到8001-8006,修改第2、3、5项里的端口号,可以用

    echo 8001 8002 8003 8004 8005 8006 | xargs -n 1 cp -v /usr/local/redis-cluster/redis.conf
    

    上面的意思是将/usr/local/redis-cluster/redis.conf文件同时复制到8001-8006 二个文件夹。

    -n 1 告诉 xargs 命令每个命令行最多使用一个参数,并发送到 cp 命令中。
    cp 用于复制文件。
    -v 启用详细模式来显示更多复制细节。

    如果是将指定文件复制到当前路径下的所有文件夹:

    echo ./* |xargs -n 1 cp -v d
    注意千万不能漏写.另外当前路径下有其他文件会被d文件覆盖  此命令慎用 如果文件不是特别多建议使用上面的命令。
    

    批量替换[在vi编辑状态下使用]:

    %s/源字符串/目的字符串/g 
    

    批量替换多个文件的内容

    格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
    sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
    
    example:
    sed -i "s/8001/8002/g" `grep 8001 -rl /usr/local/redis-cluster/8002/redis.conf`
    

    第四步:分别启动6个redis实例,然后检查是否启动成功

    在redis-cluster目录下,编写redis_cluster_start_all.sh启动脚本,启动六个redis实例

    /usr/local/redis507/bin/redis-server /usr/local/redis-cluster/8001/redis.conf
    
    /usr/local/redis507/bin/redis-server /usr/local/redis-cluster/8002/redis.conf
    
    /usr/local/redis507/bin/redis-server /usr/local/redis-cluster/8003/redis.conf
    
    /usr/local/redis507/bin/redis-server /usr/local/redis-cluster/8004/redis.conf
    
    /usr/local/redis507/bin/redis-server /usr/local/redis-cluster/8005/redis.conf
    
    /usr/local/redis507/bin/redis-server /usr/local/redis-cluster/8006/redis.conf
    

    由于刚创建好的redis_cluster_start_all.sh脚本是没有执行权限的,所以需要给脚本添加可执行权限

    8001  8002  8003  8004  8005  8006  redis_cluster_start_all.sh  redis.conf
    [root@localhost redis-cluster]# ll | grep redis_cluster_start_all.sh
    -rw-r--r--. 1 root root   473 3月   1 19:05 redis_cluster_start_all.sh
    [root@localhost redis-cluster]# chmod +x redis_cluster_start_all.sh
    [root@localhost redis-cluster]# ll | grep redis_cluster_start_all.sh
    -rwxr-xr-x. 1 root root   473 3月   1 19:05 redis_cluster_start_all.sh
    

    启动六个redis实例

    ./redis_cluster_start_all.sh
    

    查看是否启动成功

    ps -ef | grep redis 
    

    第五步:用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现)

    /usr/local/redis507/bin/redis-cli -a root --cluster create --cluster-replicas 1 192.168.44.3:8001 192.168.44.3:8002 192.168.44.3:8003 192.168.44.3:8004 192.168.44.3:8005 192.168.44.3:8006
    

    代表为每个创建的主服务器节点创建一个从服务器节点

    第七步:验证集群:

    1)连接任意一个客户端即可:

    ./redis-cli -c -a root -h 192.168.44.3 -p 8001
    

    提示:-a访问服务端密码,-c表示集群模式,指定ip地址和端口号

    例如:

    /usr/local/redis507/bin/redis-cli -a root -c -h 192.168.44.3 -p 8001
    

    注意这里进入到8002了,redirected。

    2)进行验证: cluster info(查看集群信息)、cluster nodes(查看节点列表)

    3)进行数据操作验证

    4)关闭集群则需要逐个进行关闭,使用命令:

    /usr/local/redis507/bin/redis-cli -c -a root -h 192.168.44.3 -p 8001 shutdown
    
    

    1. 重启关闭的8001服务
    /usr/local/redis507/bin/redis-server /usr/local/redis-cluster/8001/redis.conf
    

    6)在redis-cluster目录下,编写redis_cluster_stop_all.sh关闭脚本

    vim redis_cluster_stop_all.sh

    /usr/local/redis507/bin/redis-cli  -c -a root -h 192.168.44.3 -p 8001  shutdown save
    
    /usr/local/redis507/bin/redis-cli  -c -a root -h 192.168.44.3 -p 8002  shutdown save
    
    /usr/local/redis507/bin/redis-cli  -c -a root -h 192.168.44.3 -p 8003  shutdown save
    
    /usr/local/redis507/bin/redis-cli  -c -a root -h 192.168.44.3 -p 8004  shutdown save
    
    /usr/local/redis507/bin/redis-cli  -c -a root -h 192.168.44.3 -p 8005  shutdown save
    
    /usr/local/redis507/bin/redis-cli  -c -a root -h 192.168.44.3 -p 8006  shutdown save
    

    由于刚创建好的redis_cluster_stop_all.sh脚本是没有执行权限的,所以需要给脚本添加可执行权限

    [root@localhost redis-cluster]# ll | grep redis_cluster_stop_all.sh
    -rw-r--r--. 1 root root   515 3月   1 21:45 redis_cluster_stop_all.sh
    [root@localhost redis-cluster]# chmod +x redis_cluster_stop_all.sh
    [root@localhost redis-cluster]# ll | grep redis_cluster_stop_all.sh
    -rwxr-xr-x. 1 root root   515 3月   1 21:45 redis_cluster_stop_all.sh
    

    二、Jedis连接Redis集群

    import java.io.IOException;
    import java.util.HashSet;
    import java.util.Set;
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.JedisPoolConfig;
    
    /**
        访问redis集群
        @author GERRY
    */
    public class RedisCluster
    {
    public static void main(String[] args) throws IOException
    {
        Set jedisClusterNode = new HashSet();
        jedisClusterNode.add(new HostAndPort(“192.168.6.61”, 8001));
        jedisClusterNode.add(new HostAndPort(“192.168.6.62”, 8002));
        jedisClusterNode.add(new HostAndPort(“192.168.6.63”, 8003));
        jedisClusterNode.add(new HostAndPort(“192.168.6.61”, 8004));
        jedisClusterNode.add(new HostAndPort(“192.168.6.62”, 8005));
        jedisClusterNode.add(new HostAndPort(“192.168.6.63”, 8006));
        
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(100);
        config.setMaxIdle(10);
        config.setTestOnBorrow(true);
        //connectionTimeout:指的是连接一个url的连接等待时间
        //soTimeout:指的是连接上一个url,获取response的返回等待时间
        JedisCluster jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, "gerry", config);
        System.out.println(jedisCluster.set("student", "GERRY"));
        System.out.println(jedisCluster.set("age", "19"));
        
        System.out.println(jedisCluster.get("student"));
        System.out.println(jedisCluster.get("age"));
        
        jedisCluster.close();
    }
    

    三、Redis基础运维操作

    • 创建启动redis节点脚本/启动集群脚本

      #!/bin/sh
      REDIS_ROOT=/usr/local/redis507/
      PORT=8001
      for i in {1..6}
      do
      	PORT=$((PORT++))
      	$REDIS_ROOT/bin/redis-server ./$PORT/redis.conf
      done
      
    • 创建Redis集群脚本

      #!/bin/sh
      PORT=8001
      /usr/local/redis507/bin/redis-cli -a gerry123 --cluster create --cluster-replicas 1 192.168.6.172:$((PORT++)) 192.168.6.172:$((PORT++)) 192.168.6.172:$((PORT++)) 192.168.6.172:$((PORT++)) 192.168.6.172:$((PORT++)) 192.168.6.172:$((PORT++))
      
    • 编写关闭集群脚本

      #!/bin/sh
      REDIS_ROOT=/usr/local/redis507/
      PORT=8001
      for i in {1..6}
      do
        $REDIS_ROOT/bin/redis-cli -a gerry123 -c -h 192.168.6.172 -p $((PORT++)) shutdown
      done
      

    四、Redis水平扩展容

    增加redis实例
    在/usr/local/redis-cluster下创建8007和8008文件夹,并拷贝8001文件夹下的redis.conf文件到8007和8008这两个文件夹下

    按之前的方法修改8007、8008中redis.conf参数,修改完成后进行启动

    /usr/local/redis507/bin/redis-server /usr/local/redis-cluster/8007/redis.conf
    /usr/local/redis507/bin/redis-server /usr/local/redis-cluster/8008/redis.conf
    

    查询启动情况:

    这时候客户端连接8001端口的redis实例,查看节点信息,会发现并无8007、8008节点信息

    那么开始配置8007为集群主节点
    使用add-node命令新增一个主节点8007(master),8007为新增节点,8001为已知存在节点,看到日志最后有"[OK] New node added correctly"提示代表新节点加入成功

    /usr/local/redis507/bin/redis-cli -a root --cluster add-node 192.168.44.3:8007 192.168.44.3:8003
    

    我们为新节点手工分配hash槽
    使用redis-cli命令为8007分配hash槽,找到集群中的任意一个主节点(8003),对其进行重新分片工作。

    /usr/local/redis507/bin/redis-cli --cluster reshard 192.168.44.3:8003 -a root
    

    可以看到10923-11922已经分给8007了,而8001则从11923-16383

    这时候我们配置8008为8007的从节点

    添加从节点8008到集群中去并查看集群状态

    /usr/local/redis507/bin/redis-cli --cluster add-node 192.168.44.3:8008 192.168.44.3:8003 -a root
    

    可以看到8008是一个master节点,没有被分配任何的hash槽。
    我们需要执行replicate命令来指定当前节点(从节点)的主节点id为哪个,首先需要连接新加的8008节点的客户端,然后使用集群命令进行操作,把当前的8008(slave)节点指定到一个主节点下

    /usr/local/redis507/bin/redis-cli -c -h 192.168.44.3 -p 8008 -a root CLUSTER REPLICATE ffa6301edd725c2d42835f0ac34b6e02273f128e (master节点)
    

    扩展redis集群已经实现,下面进行删除节点

    删除8008从节点
    用del-node删除从节点8008,指定删除节点ip和端口,以及节点id

    /usr/local/redis507/bin/redis-cli --cluster del-node 192.168.44.3:8008  8008ID -a root
    例如:
    /usr/local/redis507/bin/redis-cli --cluster del-node 192.168.44.3:8008  4e9b01db3602eaef5f08bc3077a392b5b5b7960b -a root
    

    删除8007主节点有点复杂,因为有数据,必须把数据迁移好了才能删除

    // 先把slot数据迁移到一个master节点上面
    /usr/local/redis507/bin/redis-cli --cluster reshard 192.168.44.3:8007 -a root
    => 选择一个master节点ID
    => 输入8007的ID
       done
    // 删除8007节点
    /usr/local/redis507/bin/redis-cli --cluster del-node 192.168.44.3:8007  8007ID -a root
    例如:
    /usr/local/redis507/bin/redis-cli --cluster del-node 192.168.44.3:8007  ffa6301edd725c2d42835f0ac34b6e02273f128e -a root
    

  • 相关阅读:
    Elasticsearch教程(一)简介与安装
    Java注解
    easyui tree后台传json处理问题
    jquery-ui-bootstrap动态添加和删除标签页封装【效果更炫】
    springmvc+ztree v3实现类似表单回显功能
    org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: sys.entity.Role; nested exception is org.hibernate.PersistentObjectException: 的解决方案
    MVC之重定向
    MVC5之路由机制
    SQL技术内幕四
    SQL技术内幕三
  • 原文地址:https://www.cnblogs.com/sunBinary/p/12391235.html
Copyright © 2011-2022 走看看