【Redis学习之九】Redis集群:Twemproxy和HA

 环境

  虚拟机:VMware 10
  Linux版本:CentOS-6.5-x86_64
  客户端:Xshell4
  FTP:Xftp4
  jdk8
  redis-3.0.4

主从模式对写压力没有分担,解决思路就是,使用多个节点分担,将写请求分散到不同节点处理
一、Twemproxy
Twitter开发的代理服务器,兼容Redis和Memcached;
允许用户将多个redis服务器添加到一个服务器池(pool)里面,并通过用户选择的散列函数和分布函数,将来自客户端的命令请求分发给服务器池中的各个服务器;
对key取hash值,然后对服务器总数取模,对一个包含N台redis服务器的池来说,池中每台平分1/N的客户端命令请求;
向池里添加更多服务器可以线性的扩展系统处理命令请求的能力,以及系统能够保存的数据量;

问题:
(1)代理是单点的,存在单点故障风险;
(2)业务增长,节点增加,原有数据全量再次分发,稳定算法有问题
(3)key特殊会造成数据倾斜,redis不支持跨节点汇集数据,因此这种模式不支持交、并、差集操作

由于存在以上问题,Twemproxy并没有流行起来。

二、HA集群
(1)3.0支持;
(2)由多个Redis服务器组成的分布式网络服务集群;
(3)每一个Redis服务器称为节点Node,节点之间会互相通信 两两相连;
(4)Redis集群无中心节点;

1、Redis集群节点复制
(1)Redis集群的每个节点都有两种角色可选:主节点master node、从节点slave node。其中主节点用于存储数据,而从节点则是某个主节点的复制品
(2)当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能,因为Redis集群重用了单机Redis复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为是完全一样的


2、Redis集群故障转移
(1)Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移
(2)集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel

3、Redis集群分片
(1)集群将整个数据库分为16384个槽位slot,所有key的数据对应这些slot中的一个,key的槽位计算公式为slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数
(2)集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求


4、Redis集群Redirect转向
(1)由于Redis集群无中心节点,请求会发给任意主节点
(2)主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误
(3)客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求


5、Redis集群搭建
集群方案:
3主:192.168.1.201、192.168.1.202、192.168.1.203
3从:192.168.1.204、192.168.1.205、192.168.1.206


(1)redis3.0版本依赖ruby,所有节点需要安装ruby和gem模块

[cluster@node1 ~]$ yum -y install ruby rubygems
[cluster@node1 ~]$ gem install --local redis-3.3.0.gem

或者源码安装参考:
ruby :http://www.cnblogs.com/xuliangxing/p/7132656.html?utm_source=itdadao&utm_medium=referral
rubygems :https://www.cnblogs.com/xuliangxing/p/7133544.html
redis.gem:https://www.cnblogs.com/hello-daocaoren/p/8431902.html

(2)所有节点安装redis-3.0.4.tar.gz

(3)所有节点修改配置redis.conf

#设置后台启动
daemonize yes
#监听端口 
port=6379
#绑定当前机器IP
bind 192.168.1.201
#数据文件存放目录
dir /usr/local/redis/
#启动集群模式 
cluster-enabled yes
#集群配置文件 201-206配置nodes-201.conf-nodes-206.conf 
cluster-config-file nodes-201.conf
#集群节点超时时间配置
cluster-node-timeout 5000
#appendonly
appendonly yes


(4)所有节点启动redis

[cluster@node1 ~]$ /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

(5)创建集群,槽位认领
在任意一台机器上 使用redis-trib.rb replicas后面第一个参数1,表示主备比例为1 自动将后面ip清单分成一半主一半备

[cluster@node1 ~]$ /usr/local/redis-3.0.4/src/redis-trib.rb create --replicas 1 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.204:6379 192.168.1.205:6379 192.168.1.206:6379 

自动分配了主从,自动分配了slots,所有槽都有节点处理,集群上线

(6)客户端连接:连接任意1台机器客户端 -c 集群 -h 主机 -p端口

[cluster@node1 ~]$ /usr/local/redis/bin/redis-cli -c -h 192.168.1.201 -p 6379

(7)客户端查看集群信息:

[cluster@node1 ~]$ cluster info 

(8)客户端查看节点列表:

[cluster@node1 ~]$ cluster nodes

(9)客户端关闭节点:(集群关闭方式:逐台关闭 没有直接关闭集群的方式)

[cluster@node1 ~]$ shutdown

参考:

https://blog.csdn.net/c295477887/article/details/52487621

原文地址:https://www.cnblogs.com/cac2020/p/9529900.html