当前搭建的3主3从集群,未实现主从复制功能,实现主从复制可参考博文:Centos6.5搭建Redis主从复制、搭建一主二从Sentinel(哨兵)监控

==================================================================

==========================================================================
说明:
为了节省机器,我们直接把6个Redis实例安装在同一台机器上(3主3从),即一台服务器虚拟运行6个redis实例(只安装一个redis实例,使用6个不同端口的redis.conf实现),端口号为(7001-7006)。

机器IP:192.168.116.154

更新: 新版的cluster已经不需要通过ruby脚本创建,删掉了ruby相关依赖的安装。

==========================================================================

一、安装一个Redis实例(核心)

先安装一个redis实例

安装目录为:/user/redis5


二、配置redis集群

(1)创建redis集群目录

cd /user/redis5
mkdir redis-cluster
cd redis-cluster
mkdir 7001 7002 7003 7004 7005 7006

(2)先复制redis配置文件redis.conf到/user/redis-cluster/7001目录(修改这个配置,其他5个一会复制这个配置就行了)

[root@localhost redis-cluster]# cp /user/redis5/redis.conf /user/redis-cluster/7001

修改此redis.conf文件:

[root@localhost redis-cluster]# cd /user/redis-cluster/7001
[root@localhost redis-cluster]# vi redis.conf

具体修改内容:

# 如下开放ip访问,或注释#127.0.0.1
bind 0.0.0.0

protected-mode no
port 7001
daemonize yes

pidfile "/var/run/redis_7001.pid"
logfile ""
dir "/user/java/redis-cluster/7001"

# rdb备份
dbfilename "/user/java/redis-cluster/7001/dump.rdb"

# 开启aof备份
appendonly yes
appendfilename "/user/java/redis-cluster/7001/appendonly.aof"

# 集群设置(开启)
cluster-enabled yes
cluster-config-file "/user/java/redis-cluster/7001/nodes-7001.conf"
cluster-node-timeout 18000

# 设置密码
masterauth "pass1234"
requirepass "pass1234"

剩余配置项说明:

(1)daemonize yes/no
daemonize yes: redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize no: 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
(2)appendonly no/yes: 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。
因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。


(3)把7001下的redis.conf复制到其他5个目录

cd /user/redis-cluster/7001
cp redis.conf ../7002
cp redis.conf ../7003
cp redis.conf ../7004
cp redis.conf ../7005
cp redis.conf ../7006

(4)批量替换刚刚复制的redis.conf中的7001,改成各自对应的节点端口

语法:

格式: sed -i “s/查找字段/替换字段/g” grep 查找字段 -rl 路径

cd /user/redis-cluster
sed -i 's/7001/7002/g' 7002/redis.conf
sed -i 's/7001/7003/g' 7003/redis.conf
sed -i 's/7001/7004/g' 7004/redis.conf
sed -i 's/7001/7005/g' 7005/redis.conf
sed -i 's/7001/7006/g' 7006/redis.conf

(5)启动6个Redis节点

为方便,这里使用全路径:

/user/redis5/src/redis-server /user/redis-cluster/7001/redis.conf
/user/redis5/src/redis-server /user/redis-cluster/7002/redis.conf
/user/redis5/src/redis-server /user/redis-cluster/7003/redis.conf
/user/redis5/src/redis-server /user/redis-cluster/7004/redis.conf
/user/redis5/src/redis-server /user/redis-cluster/7005/redis.conf
/user/redis5/src/redis-server /user/redis-cluster/7006/redis.conf

CentOS6.5 单机安装Redis Cluster(3主3从)_redis

杀掉redis集群所有的进程命令(这里不执行,记录下命令
pkill -9 redis

pkill redis


查看redis进程:

[root@localhost redis-cluster]# ps -ef|grep redis

CentOS6.5 单机安装Redis Cluster(3主3从)_Redis_02


(6)Redis各节点设置密码

目前以上Redis节点均未设置密码,如要集群各节点设置密码,可参考教程:Redis集群各节点设置密码(使用sh脚本批量执行)



(7)创建集群

注:
(1)旧版本中的redis-trib.rb已经废弃了,可以直接用 --cluster 命令。
(2)用绝对IP,不要用127.0.0.1。

使用redis-cli执行创建命令(各reids节点没设置密码):

/user/redis5/src/redis-cli --cluster create 192.168.116.154:7001 192.168.116.154:7002 192.168.116.154:7003 192.168.116.154:7004 192.168.116.154:7005 192.168.116.154:7006 --cluster-replicas 1

创建带密码的集群(各reids节点设置了密码):

/user/java/redis5/src/redis-cli --cluster create 192.168.116.160:7001 192.168.116.160:7002 192.168.116.160:7003 192.168.116.160:7004 192.168.116.160:7005 192.168.116.160:7006 --cluster-replicas 1 -a pass1234

CentOS6.5 单机安装Redis Cluster(3主3从)_java_03


如上图,redis会给出一个预置的方案,对6个节点分配3主3从,如果认为没有问题,输入yes,回车即可。


注意看slot的分布:

7001  [0-5460]       (5461个槽) 
7002  [5461-10922]   (5462个槽) 
7003  [10923-16383]  (5461个槽)

输入yes后,等待集群创建完成,如下图:

CentOS6.5 单机安装Redis Cluster(3主3从)_java_04


(8)重置集群命令(这里不执行,记录下命令)

重置集群的方式是在每个节点上个执行cluster reset,然后重新创建集群。


【注】以下命令为本人测试环境删除集群重新搭建集群的过程:

(1)停止所有redis服务:
pkill redis


(2)删除redis集群所有数据:

rm -f /user/java/redis-cluster/7001/appendonly.aof
rm -f /user/java/redis-cluster/7001/dump.rdb
rm -f /user/java/redis-cluster/7001/nodes-7001.conf

rm -f /user/java/redis-cluster/7002/appendonly.aof
rm -f /user/java/redis-cluster/7002/dump.rdb
rm -f /user/java/redis-cluster/7002/nodes-7002.conf

rm -f /user/java/redis-cluster/7004/appendonly.aof
rm -f /user/java/redis-cluster/7004/dump.rdb
rm -f /user/java/redis-cluster/7004/nodes-7003.conf

rm -f /user/java/redis-cluster/7004/appendonly.aof
rm -f /user/java/redis-cluster/7004/dump.rdb
rm -f /user/java/redis-cluster/7004/nodes-7004.conf

rm -f /user/java/redis-cluster/7005/appendonly.aof
rm -f /user/java/redis-cluster/7005/dump.rdb
rm -f /user/java/redis-cluster/7005/nodes-7005.conf

rm -f /user/java/redis-cluster/7006/appendonly.aof
rm -f /user/java/redis-cluster/7006/dump.rdb
rm -f /user/java/redis-cluster/7006/nodes-7006.conf



(3)启动redis所有单节点:
/user/java/redis5/src/redis-server /user/java/redis-cluster/7001/redis.conf
/user/java/redis5/src/redis-server /user/java/redis-cluster/7002/redis.conf
/user/java/redis5/src/redis-server /user/java/redis-cluster/7003/redis.conf
/user/java/redis5/src/redis-server /user/java/redis-cluster/7004/redis.conf
/user/java/redis5/src/redis-server /user/java/redis-cluster/7005/redis.conf
/user/java/redis5/src/redis-server /user/java/redis-cluster/7006/redis.conf


(4)创集群(带密码)
/user/java/redis5/src/redis-cli --cluster create 192.168.116.160:7001 192.168.116.160:7002 192.168.116.160:7003 192.168.116.160:7004 192.168.116.160:7005 192.168.116.160:7006 --cluster-replicas 1 -a pass1234


(5)启动哨兵监控即可
service redis_serntinel_start start

===============================================

================================================


(9)制造20000个数据存入redis中

9.1> 创建脚本,批量写入值到7001端口的redis中

[root@localhost redis-cluster]# cd /user/redis-cluster/
[root@localhost redis-cluster]# vi 

脚本内容:

#!/bin/bash
for ((i=0;i<20000;i++))
do
echo -en "value..." | /user/redis5/src/redis-cli -h 192.168.116.154 -p 7001 -c -x set name$i >>redis.log
done

9.2> 授权并执行

授权:

[root@localhost redis-cluster]# chmod +x 

执行:

[root@localhost redis-cluster]# ./

注: 执行时间需等待一会。


(10)连接到客户端,并查看节点数据分布

[root@localhost redis-cluster]# /user/redis5/src/redis-cli -p 7001
127.0.0.1:7001> dbsize
(integer) 6652
127.0.0.1:7001> 
[root@localhost redis-cluster]# /user/redis5/src/redis-cli -p 7002
127.0.0.1:7002> dbsize
(integer) 6683
127.0.0.1:7002> 
[root@localhost redis-cluster]# /user/redis5/src/redis-cli -p 7003
127.0.0.1:7003> dbsize
(integer) 6665
127.0.0.1:7003>

=================================================

至此,redis集群搭建完成。

=================================================



三、使用Jedis连接redis集群(代码操作)

3.1、开放防火墙端口(6个端口:7001~7006)

(1)编辑配置文件

[root@localhost redis5]# vi /etc/sysconfig/iptables

添加如下内容:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7002 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7003 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7004 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7005 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7006 -j ACCEPT

(2)重新加载配置

[root@localhost redis5]# service iptables restart

3.2、Jedis代码操作

(1)导包

<dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.4</version>
    </dependency>

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

(2)具体代码

package net.xiaof.cluster;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

/**
 * @author zhangxh
 * @Description: 操作redis cluster,增、删
 * @date 2020-09-07
 */
public class ClusterTest {

    public static void main(String[] args) {

        // 1.保存redis节点IP和端口
        HostAndPort hp1 = new HostAndPort("192.168.116.154", 7001);
        HostAndPort hp2 = new HostAndPort("192.168.116.154", 7002);
        HostAndPort hp3 = new HostAndPort("192.168.116.154", 7003);
        HostAndPort hp4 = new HostAndPort("192.168.116.154", 7004);
        HostAndPort hp5 = new HostAndPort("192.168.116.154", 7005);
        HostAndPort hp6 = new HostAndPort("192.168.116.154", 7006);
        Set<HostAndPort> nodeSet = new HashSet<HostAndPort>();
        nodeSet.add(hp1);
        nodeSet.add(hp2);
        nodeSet.add(hp3);
        nodeSet.add(hp4);
        nodeSet.add(hp5);
        nodeSet.add(hp6);

        // 2.JedisCluster连接Redis集群
        JedisCluster jedisCluster = new JedisCluster(nodeSet);
        jedisCluster.set("sessionID","0000Bbl6NGUE7nddbaf4JPUD9Q6");
        String sessionID = jedisCluster.get("sessionID");
        System.out.println(sessionID); // 0000Bbl6NGUE7nddbaf4JPUD9Q6

        // 3.释放资源
        try {
            jedisCluster.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

四、附录:常见集群命令

3.1、集群操作help命令

添加节点、删除节点,重新分布数据等命令,这里就不赘叙了,可以使用以下命令查看集群命令:

redis-cli --cluster help

如下:

[root@localhost redis-cluster]# ../redis5/src/redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
                 --cluster-search-multiple-owners
  info           host:port
  fix            host:port
                 --cluster-search-multiple-owners
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
                 --cluster-replace
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help           

For check, fix, reshard, del-node, set-timeout you can specify the host and port of 
any working node in the cluster.

[root@localhost redis-cluster]#

3.2、集群常见命令

(1)集群命令:

cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点(node),以及这些节点的相关信息。
cluster meet :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点(保证空槽道)。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。

(2)槽slot命令:

cluster addslots [slot …] :将一个或多个槽(slot)指派(assign)给当前节点。
cluster delslots [slot …] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot stable :取消对槽 slot 的导入(import)或者迁移(migrate)。

(3)键命令:

cluster keyslot :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot :返回 count 个 slot 槽中的键