redis-5.0.4集群部署

redis-5.0.4 集群搭建

redis-cluster介绍

​ 1:redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。
​ 2:redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
​ 3:redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
​ 4:为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;
那么如何判断集群是否挂了呢? -> 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;
​ 5:那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
​ 综上所述,每个Redis集群理论上最多可以有16384个节点。

redis-cluster的现状

  目前redis支持的cluster特性:

  1):节点自动发现

  2):slave->master 选举,集群容错

  3):Hot resharding:在线分片

  4):进群管理:cluster xxx

  5):基于配置(nodes-port.conf)的集群管理

  6):ASK 转向/MOVED 转向机制。

redis-cluster 架构

  1)redis-cluster架构图
redis-5.0.4集群部署

架构细节:

  (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

  (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

  (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

  (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

2) redis-cluster选举:容错

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

(2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

​  如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态。

​ 那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。

综上所述,每个Redis集群理论上最多可以有16384个节点。

​  如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

(3) Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。

要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7000-7005),当然实际生产环境的Redis集群搭建和这里是一样的。

redis集群环境描述:redis集群至少需要三个主节点才能构成集群,因为这是redis集群的投票机制决定的。正常情况下每个主节点都应该至少有一个从节点 所以Redis集群至少需要6台服务器。所以这里使用的是伪集群的构建方式,但是最新的版本的redis支持docker容器集群部署(可以尝试)

准备工作
用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master、3 salve 环境。

redis 采用 redis-5.0.4 版本。

两台虚拟机都是 CentOS ,一台 CentOS7(IP:192.168.11.12),一台 CentOS7(IP:192.168.11.13) 。

环境描述
操作系统 :centos7
gcc版本 :gcc-c++
redis版本 :redis-5.0.4

官网文档参考:https://redis.io/topics/cluster-tutorial

安装过程

1、安装支持的库文件:(注:可以只安装 gcc-c++)

 yum -y install gcc automake autoconf libtool make

2、下载redis安装包 :wget http://download.redis.io/releases/redis-5.0.4.tar.gz

3、解压文件:

cd /usr/local/
tar xvzf redis-5.0.4.tar.gz

3、编译与安装

cd /usr/local/redis-5.0.4
make
make install PREFIX=/usr/local/redis 

4、将 redis-trib.rb 复制到 /usr/local/bin 目录下

cd src 
cp redis-trib.rb /usr/local/bin/ 

5、 创建 Redis 节点,

首先在 192.168.11.12 机器上 创建 redis_cluster 目录;

mkdir redis_cluster 

在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中

mkdir 7000 7001 7002

cp redis.conf redis-cluster/7000 
cp redis.conf redis-cluster/7001 
cp redis.conf redis-cluster/7002 

分别修改这三个配置文件,修改如下内容

port 7000 //端口7000,7002,7003 
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群 
daemonize yes //redis后台运行 
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002 
cluster-enabled yes //开启集群 把注释#去掉 
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002 把注释#去掉 
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置  把注释#去掉 
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志 

接着在另外一台机器上(192.168.11.13),的操作重复以上三步,只是把目录改为7003、7004、7005,对应的配置文件也按照这个规则修改即可

6、启动redis各个节点

第一台12机器上执行

cd /usr/local/redis-5.0.4/src
./redis-server /usr/local/redis-cluster/7000/redis.conf 
./redis-server /usr/local/redis-cluster/7001/redis.conf 
./redis-server /usr/local/redis-cluster/7002/redis.conf

redis-5.0.4集群部署

13机器上执行

cd /usr/local/redis-5.0.4/src
./redis-server /usr/local/redis-cluster/7003/redis.conf 
./redis-server /usr/local/redis-cluster/7004/redis.conf 
./redis-server /usr/local/redis-cluster/7005/redis.conf

redis-5.0.4集群部署
相关命令

启动 redis 命令

./redis-server redis.conf

查看redis是否启动

ps aux|grep redis

连接redis 命令为:

./redis-cli -h host -p port host为服务器host port 为redis.conf中的port

退出redis 命令:exit

关闭redis

./redis-cli -h 192.168.11.12 -p 7000 shutdown

7、检查 redis 启动情况

ps -ef | grep redis //查看redis启动情况
netstat -tnlp | grep redis//查看redis端口开启情况

redis-5.0.4集群部署
redis-5.0.4集群部署

8、开启两台机器的防火墙(选做)

firewall-cmd --zone=public --add-port=7000-7002/tcp --permanent
firewall-cmd --zone=public --add-port=17000-17002/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

9、创建集群

原命令 redis-trib.rb 这个工具目前已经废弃,使用redis-cli

./redis-cli --cluster create --cluster-replicas 1 192.168.11.12:7000 192.168.11.12:7001 192.168.11.12:7002 192.168.11.13:7003 192.168.11.13:7004 192.168.11.13:7005

redis-5.0.4集群部署
其中,前三个 ip:port 为第一台机器的节点,剩下三个为第二台机器

输入 yes 即可,然后出现如下内容,说明安装成功

redis-5.0.4集群部署
10、集群验证

在第一台机器上连接集群的7000端口的节点,在另外一台连接7003节点,连接方式为

./redis-cli -h 192.168.11.13 -c -p 7000

在7000节点执行命令 set hello world ,执行结果如下:

redis-5.0.4集群部署
然后在另外一台7003端口,查看 key 为 hello 的内容, get hello ,执行结果如下:

redis-5.0.4集群部署
说明集群运作正常。

简单说一下原理

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。

Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。

需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

安装过程中的问题点汇总

1.关于启动集群时候出现一直等待 Waiting for the cluster to join 很久都没有反应的问题

Redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口 + 10000,如redis端口为7000,则集群总线端口为17000,因此所有服务器的点需要开通redis的客户端连接端口和集群总线端口

2.关于集群连接验证时候连接失败,可以先关闭redis ./redis-cli -h 192.168.11.12 -p 7000 shutdown 再开启 ./redis-server redis.conf

Redis 集群模式下连接需要已-h ip地址方式连接,命令应为./redis-cli -h 192.168.11.12 -c -p 7000

猜你喜欢

转载自blog.51cto.com/14237756/2395280
今日推荐