Linux安装Redis集群版

  • 1.Redis集群原理
  • 1.1.Redis-cluster架构图
  • 1.2.Redis-cluster投票&容错
  • 2.redis集群搭建
  • 2.1.准备6个节点
  • 2.1.1.复制实例
  • 2.1.2.启动6个实例
  • 2.2.安装环境
  • 2.3.安装redis集群
  • 2.3.1.配置集群节点
  • 2.3.2.集群创建
  • 3.Redis集群连接
  • 3.1.工具连接
  • 3.2.代码连接


1.Redis集群原理

1.1.Redis-cluster架构图

linux redis集群搭建及配置 redis集群安装部署linux_linux redis集群搭建及配置

1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
4、redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。一个节点对应一台redis服务器。16384个哈希槽最大可以对应16384台redis服务器。

1.2.Redis-cluster投票&容错

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

什么时候整个集群不可用(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状态。

2.redis集群搭建

2.1.准备6个节点

为了保证可以进行投票,至少需要3个主节点,每个主节点都需要至少一个从节点,所以需要至少3个从节点。
一共需要6台redis服务器;可以使用6个redis实例。6个redis实例的端口号:7001~7006

2.1.1.复制实例

# 停止redis
./redis-cli shutdown

# 把bin目录里面的rdb,和aof文件删除,准备干净的redis

cd /usr/local/redis/bin

rm -f appendonly.aof 
rm -f dump.rdb 

# 把bin复制6份
cd ..

# 创建redis-cluster目录
mkdir redis-cluster

cp -r bin redis-cluster/redis1 && cp -r bin redis-cluster/redis2 && cp -r bin redis-cluster/redis3

cp -r bin redis-cluster/redis4 && cp -r bin redis-cluster/redis5 && cp -r bin redis-cluster/redis6

linux redis集群搭建及配置 redis集群安装部署linux_linux_02

# 修改端口号
依次修改端口号为7001~7006

cd redis1

vi redis.conf
# 修改第92行,端口6379为7001
port 6379 修改为 port 7001

linux redis集群搭建及配置 redis集群安装部署linux_redis_03

# 其它5个一样修改

2.1.2.启动6个实例

cd /usr/local/redis/redis-cluster
# 编写启动脚本

vi start-all.sh
# 在文件中输入如下内容:
cd redis1
./redis-server redis.conf
cd ..
cd redis2
./redis-server redis.conf
cd ..
cd redis3
./redis-server redis.conf
cd ..
cd redis4
./redis-server redis.conf
cd ..
cd redis5
./redis-server redis.conf
cd ..
cd redis6
./redis-server redis.conf
cd ..

# 设置脚本启动权限
chmod u+x start-all.sh 

# 执行脚本;启动6个实例
./start-all.sh 

# 查看
ps -ef | grep redis

linux redis集群搭建及配置 redis集群安装部署linux_redis_04

# 停止6个redis
ps -ef | grep redis

kill -9 进程号 进程号 ...

2.2.安装环境

redis集群的管理工具使用的是ruby脚本语言,安装集群需要ruby环境。

# 安装ruby环境(上课提供的虚拟机,环境已经装好)
yum -y install ruby

# 安装ruby的打包系统
yum -y install rubygems

# 安装redis-4.0.0.gem的ruby接口库
cd /root

使用rz 上传“redis-4.0.0.gem”
 
# 安装
gem install redis-4.0.0.gem

linux redis集群搭建及配置 redis集群安装部署linux_redis_05

# 安装rvm
curl -L get.rvm.io | bash -s stable

linux redis集群搭建及配置 redis集群安装部署linux_ruby_06

# rvm立即有效
source /usr/local/rvm/scripts/rvm

# 查看rvm库中已知的ruby版本
rvm list known

linux redis集群搭建及配置 redis集群安装部署linux_ruby_07

# 安装一个ruby版本
rvm install 2.3.4

linux redis集群搭建及配置 redis集群安装部署linux_Redis_08

# 使用一个ruby版本
rvm use 2.3.4

linux redis集群搭建及配置 redis集群安装部署linux_ruby_09

# 查看ruby版本
ruby --version

linux redis集群搭建及配置 redis集群安装部署linux_ruby_10

# 卸载一个已知版本
rvm remove 2.0.0

linux redis集群搭建及配置 redis集群安装部署linux_linux_11

# 再次安装redis-4.0.0.gem
gem install redis-4.0.0.gem

linux redis集群搭建及配置 redis集群安装部署linux_Redis_12

2.3.安装redis集群

2.3.1.配置集群节点

#需要修改每个实例的redis.conf配置文件,开启redis-cluster
cd /usr/local/redis/redis-cluster/

vi redis1/redis.conf

# 取消第814行注释(设置集群可用): cluster-enabled yes
 
# 需要修改其它5个节点;同样修改

# 重启redis实例
./start-all.sh

2.3.2.集群创建

集群管理工具在redis解压文件夹的src的文件夹中;使用redis-trib.rb命令创建集群。

# 先进入集群管理工具所在的路径
cd /root/redis-4.0.8/src/

# 执行创建命令(注意如下连接中的ip最好不用127.0.0.1和默认端口)
./redis-trib.rb create --replicas 1 192.168.12.131:7001 192.168.12.131:7002 192.168.12.131:7003 192.168.12.131:7004 192.168.12.131:7005 192.168.12.131:7006

格式:./redis-trib.rb create --replicas 1 ip:port
      ./redis-trib.rb 创建 副本 1  ip:port
说明:至少6个节点

linux redis集群搭建及配置 redis集群安装部署linux_linux_13


启动信息(中间需要输入yes,查看如下红色字体)

Creating cluster
Performing hash slots allocation on 6 nodes…
Using 3 masters:
192.168.12.131:7001
192.168.12.131:7002
192.168.12.131:7003
Adding replica 192.168.12.131:7005 to 192.168.12.131:7001
Adding replica 192.168.12.131:7006 to 192.168.12.131:7002
Adding replica 192.168.12.131:7004 to 192.168.12.131:7003

Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 7fd7b96faa98e78011c903227c5d98bfd9cfe831 192.168.12.131:7001
slots:0-5460 (5461 slots) master
M: 04343bfff821e4503ebe31f0fc2d59851b7e2464 192.168.12.131:7002
slots:5461-10922 (5462 slots) master
M: e9854ee247af4d0c44fa51c480a5adb0576a5276 192.168.12.131:7003
slots:10923-16383 (5461 slots) master
S: b4d2af3646595ad72328c5c342b87917ab7b3e2d 192.168.12.131:7004
replicates 7fd7b96faa98e78011c903227c5d98bfd9cfe831
S: 76978cb6e7ce589af9c8b9d6f00682fcd5f8371d 192.168.12.131:7005
replicates 04343bfff821e4503ebe31f0fc2d59851b7e2464
S: 56f0a1bb29c3e8a80183e3f071a5bee861cfd548 192.168.12.131:7006
replicates e9854ee247af4d0c44fa51c480a5adb0576a5276
Can I set the above configuration? (type ‘yes’ to accept): yes

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.12.131:7001)
M: 7fd7b96faa98e78011c903227c5d98bfd9cfe831 192.168.12.131:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 76978cb6e7ce589af9c8b9d6f00682fcd5f8371d 192.168.12.131:7005
slots: (0 slots) slave
replicates 04343bfff821e4503ebe31f0fc2d59851b7e2464
M: 04343bfff821e4503ebe31f0fc2d59851b7e2464 192.168.12.131:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: e9854ee247af4d0c44fa51c480a5adb0576a5276 192.168.12.131:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: b4d2af3646595ad72328c5c342b87917ab7b3e2d 192.168.12.131:7004
slots: (0 slots) slave
replicates 7fd7b96faa98e78011c903227c5d98bfd9cfe831
S: 56f0a1bb29c3e8a80183e3f071a5bee861cfd548 192.168.12.131:7006
slots: (0 slots) slave
replicates e9854ee247af4d0c44fa51c480a5adb0576a5276
[OK] All nodes agree about slots configuration.

Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.

3.Redis集群连接

3.1.工具连接

redis的单机版,默认是16个数据库,但是redis-Cluster集群版,有n个数据库(多个主数据库则多少个,整个集群算是一个数据库)。

# 使用redis命令行客户端连接
cd /usr/local/redis/bin
./redis-cli -h 192.168.12.131 -p 7006 -c
【注意】一定要加-c参数,节点之间则可以互相跳转

linux redis集群搭建及配置 redis集群安装部署linux_ruby_14


说明:使用图形客户端连接时;因为有3台主redis数据库,所以需要连接3台。

3.2.代码连接

/** 使用JedisCluster集群对象 */
@Test
public void test() throws Exception{
	/** 定义Set集合封装主机与端口HostAndPort(集群节点) */
	Set<HostAndPort> nodes = new HashSet<>();
	/** 添加多个集群节点 */
	nodes.add(new HostAndPort("192.168.12.131", 7001));
	nodes.add(new HostAndPort("192.168.12.131", 7002));
	nodes.add(new HostAndPort("192.168.12.131", 7003));
	nodes.add(new HostAndPort("192.168.12.131", 7004));
	nodes.add(new HostAndPort("192.168.12.131", 7005));
	nodes.add(new HostAndPort("192.168.12.131", 7006));

	/** 创建JedisCluster集群对象 */
	JedisCluster jedisCluster = new JedisCluster(nodes);
	/** 设置数据 */
	jedisCluster.set("test", "jedisCluster");
	/** 获取数据 */
	System.out.println(jedisCluster.get("test"));
	/** 关闭JedisCluster */
	jedisCluster.close();
}