当前搭建的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
杀掉redis集群所有的进程命令(
这里不执行,记录下命令)
pkill -9 redis
或
pkill redis
查看redis进程:
[root@localhost redis-cluster]# ps -ef|grep redis
(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

如上图,redis会给出一个预置的方案,对6个节点分配3主3从,如果认为没有问题,输入yes,回车即可。
注意看slot的分布:
7001 [0-5460] (5461个槽)
7002 [5461-10922] (5462个槽)
7003 [10923-16383] (5461个槽)输入yes后,等待集群创建完成,如下图:

(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
done9.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 restart3.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 槽中的键
















