创建redis集群

为什么要使用redis集群
单机redis为了提高网站响应速度,总是把热点数据保存在缓存中而不是直接从后端数
据库中读取。一般大型网站缓存有28定律 80%访问量集中在20%的业务上
1,单机redis故障时,redis就不能使用
2,大型网站应用,热点数据量往往巨大,使用一台 Redis 实例无满足需求,这时就需
要使用 多台 Redis (集群)作为缓存数据库。才能在用户请求时快速的进行响应。
redis集群设计架构
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和
带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集
群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<-
>slot<->value
通俗的说,redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是
说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集
群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只
需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
redis集群实现
集群规划
两台redis服务器 每一台服务器上放置3个节点,一共6个节点(3master3slave  即三主三从)
192.168.182.20 : (7001 7002 7003) 192.168.182.21: (7004 7005 7006)
1,创建单机redis(参考上节课)
克隆redis1为redis2(启动使用root登录)
1)修改ip地址(只需要改IP,因为本身克隆机)
vim /etc/sysconfig/network­scripts/ifcfg­eth0
2)删除网卡和mac地址的对应文件
rm ­rf /etc/udev/rules.d/70­persistent­net.rules
3) 修改主机名称
vim /etc/sysconfig/network
HOSTNAME=redis2
4) 修改hosts
vim /etc/hosts
192.168.182.21 redis2
5) 重启
reboot
2,单机创建节点
1)在单机 /usr/redis目录下创建 cluster 目录;
mkdir cluster
2)在 cluster 下创建节点目录(为了方便创建和端口号一样的目录)
mkdir cluster/7001
mkdir cluster/7002
mkdir cluster/7003
3)复制redis.conf配置到节点目录下
cp bin/redis.conf cluster/7001/
4)修改配置redis.conf:
vim cluster/7001/redis.conf
/关键字 //例如 /port 在文件中查找port
port 7001 //端口7001,7002,7003 92行
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群 69行
daemonize yes //redis后台运行 136行
pidfile /var/run/redis_7001.pid //pidfile文件对应7001,7002,7003 158行
cluster-enabled yes //开启集群 把注释#去掉 814行
cluster-config-file nodes_7001.conf //集群的配置 配置文件首次启动自动生成 7001,7002,7003 822行
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置828行
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志 672行
5)复制7001下redis.conf 到7002和7003
cp cluster/7001/redis.conf cluster/7002
cp cluster/7001/redis.conf cluster/7003
6) 修改7002和7003下的配置文件
vim cluster/7002/redis.conf
使用全局替换,把7001替换为7002
底行模式下 :%s/7001/7002/g
vim cluster/7003/redis.conf
底行模式下 :%s/7001/7003/g
3,如果多台主机都分别执行第2步操作
登录redis2上
进入redis目录
cd /usr/redis
执行远程cp命令
scp -r 192.168.182.20:/usr/redis/cluster .
把 192.168.182.20上的cluster目录拷贝到,当前目录下
输入yes 等待输入密码:tiger
修改目录名称:
mv cluster/7001 cluster/7004
mv cluster/7002 cluster/7005
mv cluster/7003 cluster/7006
修改配置:
vim cluster/7004/redis.conf底行模式下 :%s/7001/7004/g
69行,修改IP
vim cluster/7005/redis.conf
底行模式下 :%s/7002/7005/g
69行,修改IP
vim cluster/7006/redis.conf
底行模式下 :%s/7003/7006/g
69行,修改IP
4,启动及检查
启动:
redis1:
./bin/redis-server cluster/7001/redis.conf
./bin/redis-server cluster/7002/redis.conf
./bin/redis-server cluster/7003/redis.conf
redis2:
./bin/redis-server cluster/7004/redis.conf
./bin/redis-server cluster/7005/redis.conf
./bin/redis-server cluster/7006/redis.conf
检查:
ps -ef | grep redis
netstat -tnlp | grep redis
5,使用官方提供工具创建集群(只需要启动机器上安装)
( 使用命令前需要安装 ruby )
redis-trib.rb 该命令是ruby程序写的,所以要下载安装ruby
yum -y install ruby ruby-devel rubygems rpm-build
//下面注释掉的废弃,不可用
/* ruby官网下载 https://www.ruby-lang.org/en/news/2018/03/28/ruby-2-
3-7-released/
tar -xzvf ruby-2.3.7.tar.gz
进入 ruby-2.3.7目录
mkdir /usr/local/ruby-2.3.7
./configure --prefix=/usr/local/ruby-2.3.7
make && make install(编译安装时间较长)
*/yum install -y centos-release-scl-rh (SCL:Software Collections SCL 的设
计初衷就是在不影响原有配置的前提下,让新旧软件能一起运行。 用户提供一种
以方便、安全地安装和使用应用程序和运行时环境的多个(而且可能是更新的)版
本的方式,同时避免把系统搞乱。)
yum install rh-ruby23 -y
scl enable rh-ruby23 bash
ruby -v
gem install redis ././gem Gem是一个管理Ruby库和程序的标准包,它通过
Ruby Gem 源来查找、安装、升级和卸载软件包,非常的便捷。
使用redis提供命令创建集群
在解压目录的redis-4.0.1/src下执行:redis-trib.rb
./redis-trib.rb create --replicas 1 ip1:7000 ip1:7001 ip1:7002 ip2:7003
ip2:7004 ip2:7005
中间确认:Can I set the above configuration? (type 'yes' to accept): yes
[OK] All 16384 slots covered // 成功!!
链接测试
./redis-cli -h ip1 -c -p 7001 设置值,在任意其他节点取值,可以成功,
说明集群成功
-c解释:连接集群结点时使用,此选项可防止moved和ask异常。
 
每次set get都跳第一个原因:
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种
叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384
个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将
这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所
以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。
 
  如果集群重新配置,需要删除各个单机上redis根目录下.aof .rdb .conf文
件,然后重启各个节点
集群的使用:
1, cluster info 显示集群信息
cluster_state: ok状态表示集群可以正常接受查询请求。fail 状态表示,至少有一个哈希槽没有被绑定(说明有哈希槽没有被绑定到任意一个节点) 。.
cluster_slots_assigned: 已分配到集群节点的哈希槽数量(不是没有被绑定的数量)。
cluster_slots_ok: 哈希槽状态不是FAIL 和 PFAIL 的数量.
cluster_slots_pfail: 哈希槽状态是 PFAIL的数量。只要哈希槽状态没有被升级到FAIL状态,这些哈希槽仍然可以被正常处理。PFAIL状态表示我们当前不能和节点进行交互,但这种状态只是临时的错误状态。
cluster_slots_fail: 哈希槽状态是FAIL的数量。如果值不是0,那么集群节点将无法提供查询服务,除非cluster-require-full-coverage被设置为no .
cluster_known_nodes: 集群中节点数量,包括处于握手状态还没有成为集群正式成员的节点.
cluster_size: 至少包含一个哈希槽且能够提供服务的master节点数量.
cluster_current_epoch: 集群本地Current Epoch变量的值。这个值在节点故障转移过程时有用,它总是递增和唯一的。
cluster_my_epoch: 当前正在使用的节点的Config Epoch值. 这个是关联在本节点的版本值.
cluster_stats_messages_sent: 通过node-to-node二进制总线发送的消息数量.
cluster_stats_messages_received: 通过node-to-node二进制总线接收的消息数量.
2,主节点异常,从节点自动顶替主节点
cluster nodes 节点信息的使用
ps -ef|grep redis
kill -9 主节点进程ID
再次查看
cluster nodes
 
参考帖子:
http://www.redis.net.cn/
 
原文地址:https://www.cnblogs.com/duguangming/p/11140686.html