Liunx搭建Redis集群

Posted zhuoweihuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Liunx搭建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 会根据节点数量大致均等的将哈希槽映射到不同的节点。
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

如果有安装过,那么先停止集群版redis;使用命令找出当前的所有redis进程,然后kill

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

cd /usr/local/redis/bin

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

把bin复制6份

cd ..

删除原有的redis-cluster

rm –rf redis-cluster

创建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

  1. 修改端口号
    依次修改端口号为7001~7006

cd redis1

vi redis.conf

修改第84行,端口6379为7001

port 6379 修改为 port 7001

其它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

停止6个redis

ps -ef | grep redis

kill 进程号 进程号 ...

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

安装ruby环境

yum install ruby

安装Ruby的打包系统

yum install rubygems

安装redis的ruby接口库

cd /root/software

上传“redis-3.2.1.gem”到“/root/software”

安装

gem install redis-3.2.1.gem

2.3.安装redis集群
2.3.1.配置集群节点

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

cd /usr/local/redis/redis-cluster/

vi redis1/redis.conf

反注释第721行; cluster-enabled yes

需要修改6个节点;同样修改

重启redis实例

./start-all.sh

2.3.2.集群启动
集群管理工具在redis解压文件夹的src的文件夹中;使用redis-cluster的集群管理工具启动集群。

先进入集群管理工具所在的路径

cd /root/software/redis-3.2.4/src/

再启动命令(注意如下连接中的ip最好不用127.0.0.1和默认端口)

./redis-trib.rb create --replicas 1 192.168.12.168:7001 192.168.12.111:7002 192.168.12.168:7003 192.168.12.168:7004 192.168.12.111:7005 192.168.12.168:7006

启动信息(中间需要输入yes)

3.Redis集群连接
3.1.工具连接
redis的单机版,默认是16个数据库,但是redis-Cluster集群版,有n个数据库(多个主数据库则多少个,整个集群算是一个数据库)。

使用redis命令行客户端连接

cd /usr/local/redis/bin
./redis-cli -h 192.168.12.168 -p 7006 -c

【注意】一定要加-c参数,节点之间则可以互相跳转

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

3.2.代码连接

public class JedisClusterTest {

@Test
public void test() throws IOException {
	// 设置集群节点
	Set<HostAndPort> nodes = new HashSet<>();
	nodes.add(new HostAndPort("192.168.12.168", 7001));
	nodes.add(new HostAndPort("192.168.12.168", 7002));
	nodes.add(new HostAndPort("192.168.12.168", 7003));
	nodes.add(new HostAndPort("192.168.12.168", 7004));
	nodes.add(new HostAndPort("192.168.12.168", 7005));
	nodes.add(new HostAndPort("192.168.12.168", 7006));

	// 创建jedis集群对象
	JedisCluster jedisCluster = new JedisCluster(nodes);

	// 设置值
	jedisCluster.set("jedisCluster_msg", "redis-集群");

	// 获取键值
	String msg = jedisCluster.get("jedisCluster_msg");
	System.out.println(msg);

	// 关闭jedisCluster连接(在程序执行完之后,才能关闭,他的内部已经封装了连接池)
	jedisCluster.close();
}

}

以上是关于Liunx搭建Redis集群的主要内容,如果未能解决你的问题,请参考以下文章

liunx redis集群添加密码

MySql集群讲解Mysql Liunx环境下搭建

redis集群搭建

windows版redis集群搭建

基于docker环境搭建redis-cluster集群(多台机器)

如何利用redis来进行分布式集群系统的限流设计