前言
在Redis Cluster集群 (一) 中了解了集群的相关概念,这一节我们将了解集群平台的搭建。
1. 简介
集群中至少应该有奇数个节点,所以搭建集群最少需要3台主机,同时每个节点至少有一个备份节点,所以下面最少要创建6台机器,才能完成Redis Cluster 集群(主节点,备份节点由redis-cluster集群确定)
真集群:六台服务器存在6个redis服务(这六台redis服务的主机号不同,端口号可以相同)
192.168.1.1.110: 6379
192.168.1.1.111: 6379
192.168.1.1.112: 6379
假集群: 一台服务器存在6个redis服务(这六台redis服务的主机号相同[因为使用同一台服务器],端口号不相同)
192.168.1.111: 6379
192.168.1.111:6380
192.168.1.111:6382
2. 搭建集群环境
在这里由于我们自身设备有限,所以我们采用加集群进行搭建
[1] 创建Redis节点安装目录
mkdir /usr/local/redis_cluster //指定目录下 创建 redis_cluster
[2] 在redis_cluster目录下,创建7001-7006 个文件夹下
mkdir 7001 7002 7003 7004 7005 7006
[3] 并将redis-conf 分别拷贝到7001-7006文件夹下
cp /root/redis-4.0.1/redis.conf ./7001
[4] 分别修改如下配置文件,修如下改内容
<1>protected-mode是为了禁止公网访问redis cache,加强redis安全的。
它启用的条件,有两个:
1)没有bind IP
2)没有设置访问密码
由于我们上面在搭建过程中并没有设置密码,则它满足第二点,所以Linux上的redis处于安全模式,这就让你无法从虚拟机外部去轻松建立连接,如果外部访问: redis.conf 中设置保护模式为 protected-mode no
<2> 其他配置文件的修改如下(redis.conf下)
bind 127.0.0.1 进行注释
port 7001 改掉原来的端口号6379
dameonize yes 改为后台运行(守护进程)
pidfile /var/run/redis_7001.pid 把该文件的端口进行更改
cluster-enabled yes 将注释去掉(默认是不开启集群的)
cluster-config-file nodes-7001.conf 将注释去掉,并把文件名改为以端口号为主
[5] 启动各个redis节点
将桌面redis-4.0.1/下src文件拷贝到各个redis 7001-7006目录下。
cd redis-4.0.1 //进入桌面redis解压目录下
cp -r ./src /usr/local/redis_cluster/7001 //进行拷贝,依次复制到7001-7006
启动各个Redis节点
cd /usr/local/redis_cluster/ // 进去redis集群配置文件
./7001/src/redis-server ./7001/redis.conf //依次启动7001-7006各节点服务
[6] 检查Redis启动情况
ps -ef | grep -i redis
上面的步骤操作完成后,我们就在一台服务器上启动了6个Redis服务,也就是我们所说的假集群的环境搭建完成,接下来我们就能正式创建集群了。
3. 创建集群
Redis官方提供了redis-trib.rb这个工具,就在解压目录的src目录中,(为了方便操作)将其文件复制到 /usr/local/bin 目录(相当于Java目录下的环境变量,可以随时随地进程操作),可直接访问此命令
cd redis-4.0.1/
cd src
cp redis-trib.rb /usr/local/bin/
可以直接在命令行中执行: ip:port 模式
redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
如果出现此错误:
/usr/bin/env: ruby:没有那个文件或目录
这个工具是用ruby实现的,所以需要安装ruby.
4. 安装ruby
执行如下命令
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
如果在执行时报错的话
[root@localhost bin]# gem install redis
ERROR: Error installing redis:
redis requires Ruby version >= 2.3.0.
出现上述错误的原因: Centos默认支持ruby 到2.0.0,可gem安装redis需要的最低是2.3.0
解决办法是先安装rvm,再把ruby版本提升
5. 安装RVM和相应的ruby版本
(安装的详细过程可参考上述文章)
6. Redis Cluster集群搭建
在完成上述的操作后,我们总算把各种场景搭建完毕,这样我们再一次使用redis-trib.rb这个工具的相关命令就不会报错了。
redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
是否允许默认配置 yes (然后它就会自动搭建集群了)
7.Redis Cluster 集群验证
[1] Redis集群测试:
为了方便测试,可将redis-cli客户端命令放到 /usr/local/bin 目录下
cd /home/gs/redis-4.0.1/src # /home/gs/redis-4.0.1是我安装redis的目录
cp redis-cli /usr/local/bin
[2] 在某台机器上(或)连接集群的7001端口的节点:
redis-cli -h 127.0.0.1 -c -p 7001
加参数-C 可连接到集群,因为上面redis.conf 将bind改为了ip 地址, 所以 -h 参数不可以省略。
解析: 在该7001的节点下添加对应key数据,由于集群的机器都是平等的,所以有可能重定向到另一台机器(如上面的主服务器7002)而它的从服务器7005 也可以进行相关的读取命令。
[3] redis cluster 在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等关系。都是对等的。每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有的节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取其他节点的数据。
[4] 基本命令
info replication 通过Cluster Nodes命令和Cluster Info命令来看看集群效果
cluster nodes 获取集群节点的信息
把上诉信息粘贴到文本编辑器中,你会有所发现。
每个Redis的节点都有一个ID值,此ID将被此特定redis实例永久使用,以便实例在集群上下文中具有唯一的名称,每个节点都会记住使用此ID的每个其他节点,而不是通过IP或端口。IP地址和端口可能会发生变化,但唯一的节点标识符在节点的整个生命周期内都不会改变。我们简单地称这个标识符为节点ID
[5] 我们也可以通过java进行集群的相关测试
<1> 这时我们要开启相应的端口权限
依次开放端口7001 7002 … 7006 (如下命令只针对Centos7以上)
查看已经开放的端口 : firewall-cmd --list-ports
开启端口: firewall-cmd --zone=public --add-port=7001/tcp --permanent
重启防火墙 firewall-cmd --reload
<2> java测试代码
public static void main(String[] args){
//第一步:使用JedisCluster对象,需要一个Set<HostAndPort>参数,Redis节点的列表
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
nodes.add(new HostAndPort(“127.0.0.1”, 7001));
nodes.add(new HostAndPort(“127.0.0.1”, 7002));
nodes.add(new HostAndPort(“127.0.0.1”, 7003));
nodes.add(new HostAndPort(“127.0.0.1”, 7004));
nodes.add(new HostAndPort(“127.0.0.1”, 7005));
nodes.add(new HostAndPort(“127.0.0.1”, 7006));
JedisCluster jedisCluster = new JedisCluster (nodes);
// 第二步:直接使用JedisCluster对象操作redis, 在系统中单例存在
jedisCluster.set(“qfjy”, “千锋教育”);
String result = jediscluster.get(“qfjy”);
//第三步:打印结果
System.out.println(result);
}
来源:CSDN
作者:Dwyane_GS
链接:https://blog.csdn.net/TheWindOfSon/article/details/104704786