快速了解Redis、Cachecloud集群的搭建及管理(敲详细!照着敲都能行!良心博客o(╥﹏╥)o)
Redis集群的搭建及管理
目录
5.1、基本介绍 https://github.com/sohutv/cachecloud.. 52
一、概述
本次通过搭建适用于机房的Redis集群作为对企业需要的Redis服务管理集群,这里针对于Redis的性能与存储方式作为介绍,以Cachecloud作为集群管理介绍,讲述了Redis集群的搭建、管理及使用。其中,Redis服务安装及测试与Redis集群安装及测试针对于Redis 5版本及以上,Cachecloud管理集群针对与Redis 3以上、Redis 5以下。本次对Cachecloud的集群只做最基础的安装及使用讲解及不进行任何后续优化,只使用源码包。PS:要不是公司内部要我培训Redis,我才不是闲的没事来整理这个!o(╥﹏╥)o
二、Redis介绍
具体看官网,讲得再多不离其中其宗。简单一点,为什么要使用缓存数据库,假如系统有千万级别的数据,数据信息基本不变,但每次加载所有数据时都要请求数据库,重复的查询操作严重降低了服务器性能。针对这种数据,把它们加入缓存数据库中,每次取数判断缓存数据库中是否为空,如果为空,再去请求数据库并将数据加入缓存。如下:
2.1、Redis与Memcache的对比
2.1.1、区别(单服务)
1)存储方式:Memecache把数据全部存在内存里,断电后会挂掉,数据不能超过内存大小。Redis部份存在硬盘上,保证数据的持久性。
2)数据支持:Memcache对数据类型支持相对简单。Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储,相对复杂。
3)底层模型:新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4)value大小:redis最大可以达到512MB,而memcache最大仅有1MB。
5)运行环境:redis目前官方只支持LINUX 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁,但是没有放到主干上。
2.1.2、优劣
应该说Memcached和Redis都能很好的满足解决我们的问题,它们性能都很高,总的来说,可以把Redis理解为是对Memcached的拓展,是更加重量级的实现,提供了更多更强大的功能。具体来说:
1)性能:性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。
2)内存空间和数据量大小:MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。
3)操作性:MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。
4)可靠性:MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。
2.1.3、适用
Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。
Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
2.2、Redis与Kafka的对比
redis是内存数据库,只是它的list数据类型刚好可以用作消息队列而已。
kafka是消息队列,消息的存储模型只是其中的一个环节,还提供了消息ACK和队列容量、消费速率等消息相关的功能,更加完善。
2.3、Redis适用场景
不需要实时更新但是又极其消耗数据库的数据。
需要实时更新,但是更新频率不高的数据。
在某个时刻访问量极大而且更新也很频繁的数据。
注:大部分数据其实都可以放在缓存数据库中,但涉及到钱、**、业务关键性核心数据等私密性数据等,是不能放在缓存数据库中的。
三、Redis服务安装及测试
这里只说编译安装了,详情请看:
https://blog.csdn.net/qq_37960324/article/details/104476378
这个主要针对于无网环境,更具有建设性(这个挺重要的!)
3.1、获取安装包
http://download.redis.io/releases/
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
3.2、安装依赖
安装的编译工具:make、gcc
3.3、解压编译
解压至当前目录
tar xf redis-5.0.7.tar.gz
编译
make
make PREFIX=/usr/local/redis install
3.4、配置
拷贝主配置文件
cp redis.conf /usr/local/redis/
编辑配置文件
daemonize yes:支持后台进程
sed -i -e "s/bind 127.0.0.1/#bind 127.0.0.1/g" /usr/local/redis/redis.conf
sed -i -e "s/# requirepass foobared/requirepass 123456/g" /usr/local/redis/redis.conf
sed -i -e "s/daemonize no/daemonize yes/g" /usr/local/redis/redis.conf
3.5、启动并检查
cd /usr/local/redis/bin/
./redis-server ../redis.conf
检查
四、Redis集群安装及测试
参考官网中文版:http://redisdoc.com/topic/cluster-spec.html
参考:http://redisdoc.com/topic/cluster-tutorial.html
一、集群简介
1、什么是redis集群?
redis集群是一个可以在多个redis节点之间进行数据共享的设施(installation)
图片来源:https://www.cnblogs.com/bcde/p/11163362.html
2、redis集群特性
不支持需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的行为。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
3、redis集群优点
将数据自动切分(split)到多个节点的能力。
当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。
4、连接
与任意实例连接,即可获得整个集群的数据!通过这个,得做一下读写分离了。
二、集群数据共享
参考:https://www.cnblogs.com/bcde/p/11163362.html
参考:https://www.cnblogs.com/wangfajun/p/12198149.html
Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
这个得在之后的集群操作中熟悉。
三、集群主从复制
为了使得集群在一部分节点下线或者无法与集群的大多数(majority)节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。
只要一个槽点存活一个节点服务器,那么集群就不会蹦!
四、Redis 集群的一致性保证(guarantee)风险项,需要考虑解决办法
Redis 集群不保证数据的强一致性(strong consistency): 在特定条件下, Redis 集群可能会丢失已经被执行过的写命令。
1、使用异步复制(asynchronous replication)是 Redis 集群可能会丢失写命令的其中一个原因。 考虑以下这个写命令的例子:
客户端向主节点 B 发送一条写命令。
主节点 B 执行写命令,并向客户端返回命令回复。
主节点 B 将刚刚执行的写命令复制给它的从节点 B1 、 B2 和 B3 。
如你所见, 主节点对命令的复制工作发生在返回命令回复之后, 因为如果每次处理命令请求都需要等待复制操作完成的话, 那么主节点处理命令请求的速度将极大地降低 —— 我们必须在性能和一致性之间做出权衡。
2、Redis 集群另外一种可能会丢失命令的情况是, 集群出现网络分裂(network partition), 并且一个客户端与至少包括一个主节点在内的少数(minority)实例被孤立。
举个例子, 假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点, 其中 A 、B 、C 为主节点, 而 A1 、B1 、C1 分别为三个主节点的从节点, 另外还有一个客户端 Z1 。
假设集群中发生网络分裂, 那么集群可能会分裂为两方, 大多数(majority)的一方包含节点 A 、C 、A1 、B1 和 C1 , 而少数(minority)的一方则包含节点 B 和客户端 Z1 。
在网络分裂期间, 主节点 B 仍然会接受 Z1 发送的写命令:
如果网络分裂出现的时间很短, 那么集群会继续正常运行;
但是, 如果网络分裂出现的时间足够长, 使得大多数一方将从节点 B1 设置为新的主节点, 并使用 B1 来代替原来的主节点 B , 那么 Z1 发送给主节点 B 的写命令将丢失。
注意,在网络分裂出现期间, 客户端 Z1 可以向主节点 B 发送写命令的最大时间是有限制的, 这一时间限制称为节点超时时间(node timeout), 是 Redis 集群的一个重要的配置选项:
对于大多数一方来说, 如果一个主节点未能在节点超时时间所设定的时限内重新联系上集群, 那么集群会将这个主节点视为下线, 并使用从节点来代替这个主节点继续工作。
对于少数一方, 如果一个主节点未能在节点超时时间所设定的时限内重新联系上集群, 那么它将停止处理写命令, 并向客户端报告错误。
4.1、环境配置
redis-2:10.0.0.12、CentOS 7.6
redis-3:10.0.0.13、CentOS 7.6
由于设备问题,现在还未在服务器上使用,就在本机建了两台虚拟机作为测试
4.2、集群预设
Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。
Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。Redis 集群不像单机 Redis 那样支持多数据库功能, 集群只使用默认的 0 号数据库, 并且不能使用 SELECT index 命令。
本次采用redis官方的redis-cluster集群建设。工具官网推荐,至少有三个主节点,按照标准,再来三个从节点,那就是需要六台主机。这里作为先步测试,就不做六台虚拟机了,反正不跑数据,两台够了。为了适应多种情况,就完全把它们当做不同服务器得了。本次对应的端口号20001的“2”表示服务器在12上,“0001”表示第一台服务器,在多台服务器环境里,端口号应为一致,统一采用从40001开始的端口号表示实例。
主机1:主节点1:redis-01:10.0.0.12:20001
主机2:主节点2:redis-02:10.0.0.13:30002
主机3:主节点3:redis-03:10.0.0.12:20003
主机4:从节点1:redis-04:10.0.0.13:30004
主机5:从节点2:redis-05:10.0.0.12:20005
主机6:从节点3:redis-06:10.0.0.13:30006
拓扑图大概是这样:
4.3、集群搭建
redis-2 配置
主机1:主节点1:redis-01:10.0.0.12:20001
主机3:主节点3:redis-03:10.0.0.12:20003
主机5:从节点2:redis-05:10.0.0.12:20005
1、创建节点集群目录
mkdir /usr/local/redis-cluster –p
2、创建主节点1:redis-01实例
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-01
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-01/redis.conf
3、更改主节点1:redis-01实例配置
删除原来的“dump.rdb”快照文件
端口号改为对应的20001端口:port 20001
打开后台模式(上一篇已做):daemonize yes
注释仅本机连接(上一篇已做):# bind 127.0.0.1
注释密码(上一篇已做,还原它):# requirepass
打开集群创建模式: cluster-enabled yes
指定日志文件:logfile ""
cd /usr/local/redis-cluster/redis-01/
rm -f dump.rdb
sed -i -e "s\port 6379\port 20001\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-01.log"\g' redis.conf
4、重复“2”“3”操作,设置主节点3、从节点2
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-03
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-03/redis.conf
cd /usr/local/redis-cluster/redis-03/
rm -f dump.rdb
sed -i -e "s\port 6379\port 20003\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-03.log"\g' redis.conf
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-05
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-05/redis.conf
cd /usr/local/redis-cluster/redis-05/
rm -f dump.rdb
sed -i -e "s\port 6379\port 20005\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-05.log"\g' redis.conf
5、创建启动脚本
cd /usr/local/redis-cluster
echo '#!/bin/bash' > all-start.sh
echo ' ' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-01/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-03/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-05/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
chmod +x all-start.sh
6、启动
./all-start.sh
先不管后面出现的port+10000的端口了
这是正常的
redis-3 配置
主机2:主节点2:redis-02:10.0.0.13:30002
主机4:从节点1:redis-04:10.0.0.13:30004
主机6:从节点3:redis-06:10.0.0.13:30006
mkdir /usr/local/redis-cluster -p
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-02
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-04
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-06
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-02/redis.conf
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-04/redis.conf
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-06/redis.conf
rm -f /usr/local/redis-cluster/redis-02/dump.rdb
rm -f /usr/local/redis-cluster/redis-04/dump.rdb
rm -f /usr/local/redis-cluster/redis-06/dump.rdb
cd /usr/local/redis-cluster/redis-02
sed -i -e "s\port 6379\port 30002\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-02.log"\g' redis.conf
cd /usr/local/redis-cluster/redis-04
sed -i -e "s\port 6379\port 30004\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-04.log"\g' redis.conf
cd /usr/local/redis-cluster/redis-06
sed -i -e "s\port 6379\port 30006\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-06.log"\g' redis.conf
cd /usr/local/redis-cluster
echo '#!/bin/bash' > all-start.sh
echo ' ' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-02/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-04/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-06/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
chmod +x all-start.sh
启动
4.4、创建集群
添加集群创建工具:redis-trib
通过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作。但是!
redis版本在5之前的集群需要安装ruby环境(这很耗时间,且有各种问题需要解决),redis5.0.0之后已经将redis-trib.rb 脚本的功能全部集成到redis-cli之中了。本文基于redis-cli的-cluster来搭建集群。所以,只要有redis-cli命令即可
cd /usr/local/redis-cluster
cp /opt/redis-5.0.7/src/redis-cli .
创建集群:前三个一定是主节点
./redis-cli --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1
出现的这个问题值得记录一下,以后有得用
[ERR] Node 10.0.0.12:20001 DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
参考:https://blog.csdn.net/michaelehome/article/details/79513002
参考:https://blog.csdn.net/zenmin2015/article/details/78020609
参考:https://www.cnblogs.com/codingmode/p/11133522.html
参考:https://blog.csdn.net/u014756827/article/details/52061987
要将bind开放出来,再清除rdb持久化文件和nodes.conf文件,生成集群配置文件
redis-02:
# 杀死redis-server服务
pkill redis-server
# 将#bind 127.0.0.1 开放到 bind 10.0.0.12 10.0.0.13
# 注:这里的操作导致了之后创建时一直卡在“Waiting for the cluster to join”
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-01/redis.conf
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-03/redis.conf
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-05/redis.conf
# 清除原来配置生成的服务器文件 .rdb nodes.conf
rm -f /usr/local/redis-cluster/redis-01/dump.rdb
rm -f /usr/local/redis-cluster/redis-01/nodes.conf
rm -f /usr/local/redis-cluster/redis-03/dump.rdb
rm -f /usr/local/redis-cluster/redis-03/nodes.conf
rm -f /usr/local/redis-cluster/redis-05/dump.rdb
rm -f /usr/local/redis-cluster/redis-05/nodes.conf
# 开放集群节点配置文件路径
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-01.conf\g" /usr/local/redis-cluster/redis-01/redis.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-03.conf\g" /usr/local/redis-cluster/redis-03/redis.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-05.conf\g" /usr/local/redis-cluster/redis-05/redis.conf
# 这里是“Waiting for the cluster to join”出错后换的,要将原来生成的服务器文件删掉 这里不重复记录了
# pkill redis-server
# bind 只绑定本机ip
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.12\g" /usr/local/redis-cluster/redis-01/redis.conf
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.12\g" /usr/local/redis-cluster/redis-03/redis.conf
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.12\g" /usr/local/redis-cluster/redis-05/redis.conf
# 清除原来集群生成的配置文件
rm -fr /usr/local/redis-cluster/redis-01/nodes-01.conf
rm -fr /usr/local/redis-cluster/redis-03/nodes-03.conf
rm -fr /usr/local/redis-cluster/redis-05/nodes-05.conf
redis-03:
pkill redis-server
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-02/redis.conf
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-04/redis.conf
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-06/redis.conf
rm -f /usr/local/redis-cluster/redis-02/dump.rdb
rm -f /usr/local/redis-cluster/redis-02/nodes.conf
rm -f /usr/local/redis-cluster/redis-04/dump.rdb
rm -f /usr/local/redis-cluster/redis-04/nodes.conf
rm -f /usr/local/redis-cluster/redis-06/dump.rdb
rm -f /usr/local/redis-cluster/redis-06/nodes.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-02.conf\g" /usr/local/redis-cluster/redis-02/redis.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-04.conf\g" /usr/local/redis-cluster/redis-04/redis.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-06.conf\g" /usr/local/redis-cluster/redis-06/redis.conf
pkill redis-server
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.13\g" /usr/local/redis-cluster/redis-02/redis.conf
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.13\g" /usr/local/redis-cluster/redis-04/redis.conf
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.13\g" /usr/local/redis-cluster/redis-06/redis.conf
rm -fr /usr/local/redis-cluster/redis-02/nodes-02.conf
rm -fr /usr/local/redis-cluster/redis-04/nodes-04.conf
rm -fr /usr/local/redis-cluster/redis-06/nodes-06.conf
重启集群
pkill redis-server
/usr/local/redis-cluster/all-start.sh
重新创建
./redis-cli --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1
等三秒创建成功
4.5、检查
连接一个节点
./redis-cli -h 10.0.0.12 -p 20001 -c
存活性:ping
集群状态:cluster info
4.6、使用
4.6.1、启动集群
命令:
cd /usr/local/redis-cluster/
./redis-cli --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1
create,表示创建一个新的集群。选项 --replicas 1 表示为集群中的每个主节点创建一个从节点。之后跟着的其他参数则是实例的地址列表, 指定使用这些地址所指示的实例来创建新集群。
“All 16384 slots covered.”表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。从打印出来的信息也可以看出10.0.0.12:20001、10.0.0.12:20003、10.0.0.13:30002是主节点,其它三个是从节点。
4.6.2、客户端连接集群
命令:
./redis-cli -c -h 10.0.0.12 -p 20001
任意一个客户端都可以连接集群。即可使用整个集群信息。故而一个集群只能为一个项目提供缓存数据库。
4.6.3、关闭集群
命令:
pkill redis-server
或逐个关闭
./redis-cli -c -h 10.0.0.12 -p 20001 shutdown
检查:./redis-cli --cluster check 10.0.0.12:20003
从节点自动升级为主节点
4.6.4、重启集群
重启:
(保留原有集群的)重启:
不需要再执行(形如下这样的)集群生成指令
/redis-cli -a <password> --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1
集群生成指令。
第一步:先关闭各个Redis节点。
第二步:再启动各个Redis节点即可。
(删除原有集群的)重启:
需要执行(形如下这样的)集群生成指令。
/redis-cli -a <password> --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1
第一步:先关闭各个Redis节点。
第二步:删除各个Redis安装目录下的节点配置文件nodes.conf、数据文件dump.rdb。
详细见:https://blog.csdn.net/justry_deng/article/details/89205155
4.6.5、集群使用测试
简单测试:set、get
如果不使用集群连接“-c”,则会MOVED错误
get取值
可以看到,客户端连接加-c选项的时候,存储和提取key的时候不断在各节点之间跳转,这个称为客户端重定向。之所以发生客户端重定向,是因为Redis Cluster中的每个Master节点都会负责一部分的槽(slot),存取的时候都会进行键值空间计算定位key映射在哪个槽(slot)上,如果映射的槽(slot)正好是当前Master节点负责则直接存取,否则就跳转到其他Master节点负的槽(slot)中存取,这个过程对客户端是透明的。继续看下文的集群分区原理。
4.6.6、集群分区原理
参考:https://www.cnblogs.com/rjzheng/p/11430592.html
参考:https://www.cnblogs.com/bcde/p/11163362.html
槽(slot)的基本概念
从上面集群的简单操作中,我们已经知道redis存取key的时候,都要定位相应的槽(slot)。
Redis 集群键分布算法使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 它们的编号为0、1、2、3……16382、16383,这个槽是一个逻辑意义上的槽,实际上并不存在。redis中的每个key都属于这 16384 个哈希槽的其中一个,存取key时都要进行key->slot的映射计算。
下面我们来看看启动集群时候打印的信息:
从上面信息可以看出,创建集群的时候,哈希槽被分配到了三个主节点上,从节点是没有哈希槽的。10.0.0.12:20001负责编号为0-5460 共5461个 slots,10.0.0.12:20003负责编号为 5461-10922共5462 个 slots,10.0.0.13:30002负责编号为10923-16383 共5461个 slots。
键-槽映射算法
和memcached一样,redis也采用一定的算法进行键-槽(key->slot)之间的映射。memcached采用一致性哈希(consistency hashing)算法进行键-节点(key-node)之间的映射,而redis集群使用集群公式来计算键 key 属于哪个槽:
HASH_SLOT(key)= CRC16(key) % 16384
其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。key经过公式计算后得到所对应的哈希槽,而哈希槽被某个主节点管理,从而确定key在哪个主节点上存取,这也是redis将数据均匀分布到各个节点上的基础。
4.6.7、集群分区好处
无论是memcached的一致性哈希算法,还是redis的集群分区,最主要的目的都是在移除、添加一个节点时对已经存在的缓存数据的定位影响尽可能的降到最小。redis将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点
比如说:
如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。
因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线,从而保证集群的可用性。下面我们就来学习下集群中节点的增加和删除。
4.6.8、查看集群信息
cluster info 查看集群状态,槽分配,集群大小等
cluster nodes 也可查看主从节点。
./redis-cli --cluster check 10.0.0.12:20003 检查
4.6.9、新增节点
1、新增主节点
创建新实例
cd /usr/local/redis-cluster
cp -r redis-02 reids-08
sed -i -e "s\pidfile /var/run/redis_6379.pid/pidfile /var/run/redis_30008.pid\g" /usr/local/redis-cluster/redis-08/redis.conf
sed -i -e "s\redis-02.log\redis-08.log\g" /usr/local/redis-cluster/redis-08/redis.conf
sed -i -e "s\30002\30008\g" /usr/local/redis-cluster/redis-08/redis.conf
sed -i -e "s\nodes-02.conf\nodes-08.conf\g" /usr/local/redis-cluster/redis-08/redis.conf
将实例加入集群
参考:https://www.cnblogs.com/shiguotao-com/p/10078379.html
./redis-cli --cluster add-node 10.0.0.13:30008 10.0.0.13:30006
分配hash槽
参考:https://www.cnblogs.com/shiguotao-com/p/10078517.html
参考:https://www.cnblogs.com/yanwei-wang/p/5527453.html
随便连接到集群
./redis-cli --cluster reshard 10.0.0.13:30008
检查 可发现平均分配共300槽点给了10.0.0.13:30008
2、添加从节点
创建实例redis-10
cd /usr/local/redis-cluster
cp -r redis-08 reids-10
cd reids-10/
rm -f dump.rdb
rm -f nodes-08.conf
sed -i -e "s\pidfile /var/run/redis_30008.pid\pidfile /var/run/redis_30010.pid\g" /usr/local/redis-cluster/redis-10/redis.conf
sed -i -e "s\redis-08.log\redis-10.log\g" /usr/local/redis-cluster/redis-10/redis.conf
sed -i -e "s\30008\30010\g" /usr/local/redis-cluster/redis-10/redis.conf
sed -i -e "s\nodes-08.conf\nodes-10.conf\g" /usr/local/redis-cluster/redis-10/redis.conf
启动
添加进集群步骤与主节点一样
./redis-cli --cluster add-node 10.0.0.13:30010 10.0.0.13:30006
查看集群信息
将其变为从节点,就给之前的30008吧
参考:https://www.cnblogs.com/hopeofthevillage/p/11535683.html
CLUSTER REPLICATE <30008即指定主节点的ID>
CLUSTER REPLICATE 5499e3ecdbe3eb14dcba76682f334c9cb117d038
4.6.10、删除节点
参考:https://www.cnblogs.com/yanwei-wang/p/5527453.html
参考:https://blog.csdn.net/hw120219/article/details/97006366
1、删除从节点
redis-cli --cluster del-node <集群中随便一个节点> <目标从节点ID>
删除10.0.0.13:30010
查看节点ID: ./redis-cli --cluster check 10.0.0.13:30008
删除节点
redis-cli --cluster del-node 10.0.0.13:30008 d813052b44a9315c4a57f038ac1b189903f24281
再查看已经没有了
2、删除主节点
如果主节点有从节点,将从节点转移到其他主节点
如果主节点有slot,去掉分配的slot,然后在删除主节点
从节点转移:(将30010再次添加至30008。需要将30010在集群中的配置清除)
转移从节点30010
去掉slot
./redis-cli --cluster reshard <要去掉slot的节点>。。。。其实更分配时一样,只不过在分配时指定的是自己罢了
./redis-cli --cluster reshard 10.0.0.13:30008
确认后填入yes
检查,已将槽点清空
再删除即可
./redis-cli --cluster del-node 10.0.0.12:20001 5499e3ecdbe3eb14dcba76682f334c9cb117d038
4.6.11、总结
从上面过程可以看出,添加节点、分配槽、删除节点的过程,不用停止集群,不阻塞集群的其他操作。命令小结
查看节点
> cluster info 查看集群状态,槽分配,集群大小等
cluster info
> cluster nodes 也可查看主从节点。
cluster nodes
./redis-cli --cluster check 10.0.0.12:20003 检查
./redis-cli --cluster check 10.0.0.12:20003
#向集群中添加节点,10.0.0.13:30008是新增节点,10.0.0.12:20001是集群中已有的节点
./redis-cli --cluster add-node 10.0.0.13:30008 10.0.0.12:20001
#重新分配槽
./redis-cli --cluster reshard 10.0.0.13:30008
#指定当前节点的主节点(主节点ID)
> cluster replicate cf48228259def4e51e7e74448e05b7a6c8f5713f
#删除节点(节点ID)
./redis-cli --cluster del-node 10.0.0.12:20001 5499e3ecdbe3eb14dcba76682f334c9cb117d038
五、Cachecloud集群安装及测试
5.1、基本介绍
https://github.com/sohutv/cachecloud
5.2、安装环境
本次使用虚拟机,IP(10.0.0.50)、内存(1G)、CPU(1C)
JDK 7+(本次使用:java-1.7.0-openjdk)
Maven 3+(本次使用:Apache Maven-3.5.2)
MySQL 5+(本次使用:MariaDB-10.3.21)
Redis 3+(暂无)
5.3、搭建Cachecloud
5.3.1、下载CacheCloud
官网https://github.com/sohutv/cachecloud
进入到/usr/local目录
cd /usr/local
git clone https://github.com/sohutv/cachecloud.git
cd cachecloud
更改配置
vim pom.xml
vim /usr/local/cachecloud/cachecloud-open-web/src/main/swap/online.properties
vim /usr/local/cachecloud/cachecloud-open-web/src/main/swap/local.properties
5.3.2、初始化数据库
mysql
在其下创建cachecloud库并授权
create database cachecloud;
grant all on cachecloud.* to 'admin'@'localhost' identified by 'admin';
flush privileges;
导入数据
use cachecloud;
source /usr/local/cachecloud/script/cachecloud.sql;
exit
退出数据库
5.3.3、构建cachecloud
在cachecloud根目录下执行(大概#分钟)
cd /usr/local/cachecloud/
mvn clean compile install -Plocal
5.3.4、启动cachecloud
sh script/deploy.sh /usr/local
cd /opt/cachecloud-web
或者:
vim script/deploy.sh
sh script/deploy.sh
cd /opt/cachecloud-web
####
vim start.sh
chmod +x start.sh
chmod +x stop.sh
vim cachecloud-open-web-1.0-SNAPSHOT.conf
touch logs/cachecloud-web.log
./start.sh
vim start.sh
./start.sh
启动成功
5.4、访问网站
http://10.0.0.50:9999
账户密码是在数据库设置的admin/admin
5.6、使用
--机器加入
对于Cachecloud的使用,无非于
怎么加入机器
怎么将机器里的redis服务监控上(已识别机器/未识别机器)
监控上的机器能够进行怎么样的操作
至于原因,在此作个预想。就使用其他监控软件时,都是先要将机器加入监控软件中,如zabbix-agent,所以,要想在平台上监控redis服务,那么就必须将redis服务所在的主机加入cachecloud平台里,所以,第一步当然是加入机器。加入机器后,就该想怎么将redis服务或redis集群监控上,而redis服务的状态有两种,一种是已经识别机器上的redis服务,另一种是未识别机器的redis服务。当然,存活性也分两种,这里先测试未识别机器redis服务(未启动),再测试未识别机器redis服务(已启动)。前者是为了测试cachecloud平台是否具备自动创建redis服务所设计的,后者则是为了测试机器识别对服务监控是否有影响以验证第一步的猜想。当加入redis服务后,能够进行怎样的操作,就成了cachecloud工具的功能展示环节,看看它能够做什么,对使用者有什么帮助。
工具界面:
5.6.1、Cachecloud加入机器
可见,在机器管理中,并没有识别出本机,所以说明cachecloud并没有在本机进行监控。下面开始将本机加入监控里。
1、修改初始化脚本文件
vim /usr/local/cachecloud/script/cachecloud-init.sh
修改为将要的版本文件即可,当然,看它脚本的配置,其实这个服务未必能生成成功,在后续会更新脚本,争取完善这些bug。。。毕竟人家官网都停更了,咱也不强求。
2、初始化
cd /usr/local/cachecloud/script/
sh cachecloud-init.sh cachecloud
得到初始化成功并安装上redis服务的命令。。。这里想到,如果已经安装redis服务,那么之后安装的过程完全可以注释掉,只保留前面的初始化命令即可。为此,我先打算不启动redis服务,看看能否在线上添加。
3、加入新机器
等待大概一分钟后,便能看到新机器的加入。。。当然这是我想的,但事实并非如此,等了五分钟还是这样。到这里我就不禁想,是不是非要启动redis服务,它才能够识别?
4、开启redis服务
vim /opt/cachecloud/redis/redis.conf
cd /opt/cachecloud/redis/
按之前讲的
bind 10.0.0.50
requirepass 123456
daemonize yes
启动
redis-server ./redis.conf
启动成功,再去看看监控平台。。。还是老样子。后来突然发现,在日志中都有一个报错:
说明这个用户登录不上,测试一下,果然,用户都没了。这说明什么?说明这个脚本有一定bug,看起来像是创建了cachecloud用户,实则并没有。在机器上加入用户
useradd cachecloud
passwd #输入两次cachecloud即可
再刷新页面
10.0.0.50就监控上了。。。之后删除机器,再停用redis服务,再加入机器,也是正常的。说明并不需要redis服务也可以启动。这里就可以考虑将初始化脚本中redis服务创建的那条策略给删了。
5.6.2、加入redis服务监控
上述是加入了机器,使机器能够被cachecloud平台识别。再来看redis服务,这里将两个redis服务(一个是在10.0.0.50上,一个是在10.0.0.100上,其中,10.0.0.100未被平台识别)加入平台监控,看能否正常使用。
1、10.0.0.50:6379(以识别)redis服务加入监控
在admin --> 导入应用
填写配置
检查完格式就可以开始导入了
导入成功
首页上就会显示创建的应用
2、10.0.0.100:6379(未识别但已经做了初始化,仅未加入平台)redis服务加入监控
上面是已经开启的redis服务,现在10.0.0.100可没有开启服务,看看能否加入。
。。。失败了。
再将10.0.0.100服务器上的redis启动,和10.0.0.50一样的配置。
还是一样,说明cachecloud并不能识别不加入平台监控的机器。
3、关闭10.0.0.100上的redis服务,将机器加入监控。
也说明了并不需要启动redis服务,只要做了cachecloud平台的初始化,便可被平台识别。
初始化:
在10.0.0.100上执行10.0.0.50上的:/usr/local/cachecloud/script/cachecloud-init.sh
sh cachecloud-init.sh cachecloud
执行完后。添加新机器即可。
5.6.3、用户生成
一、用户注册
“用户管理”已将申请的用户加进来
“审批流程”可见
“通过”-->用户类型更改为:普通用户
“驳回”-->用户从用户管理踢除
5.6.4、用户申请
上述生成了yh-01的普通用户
在首页登录中:账户/密码==>yh-01/123456 (这个随便设,设了就是密码)
再到admin后台管理,见“流程审批”
点“审批处理”
“格式检查”后“开始部署”
如果出现状态依然未变成“通过”,则是生成的配置文件没有传到指定目录下
当前目录没有权限
chmod 777 /tmp/cachecloud
chmod 777 /opt/cachecloud/conf
之后又有一个错误
chmod 777 /opt/cachecloud/logs
cp /usr/local/bin/redis-server /bin/
文件数不够
echo 'cachecloud soft nofile 10240' >> /etc/security/limits.conf
echo 'cachecloud hard nofile 10240' >> /etc/security/limits.conf
5.6.4、用户申请
普通用户(yh-01)下
1、填写应用申请
2、提交申请
管理员(admin)下
1、进入管理后台的流程审批
2、审批处理
注:可选节点ip必须全部init初始化加入集群里。
本次实例生成格式:
standalone格式:
10.0.0.50:512
sentinel格式:
10.0.0.50:512:10.0.0.50
10.0.0.50
10.0.0.50
10.0.0.50
cluster格式:
10.0.0.50:512:10.0.0.50
10.0.0.50:512:10.0.0.50
10.0.0.50:512:10.0.0.50
通过后即可对其管理操作
3、集群生成及测试
按照以上流程生成cluster集群服务
通过后测试集群可用性。
普通用户下查看
进入集群测试
取值测试
取值正常。
故,集群可用。
5.6.5、集群管理
生成服务集群的管理
在“全局统计”中找到对应集群的应用运维
对其可以动态管理
六、总结
通过cachecloud工具的使用,得出以下结论。
首先,cachecloud是针对于服务器对redis服务的管理工具,通过分配服务器内存资源实现redis服务的生成及管理。之前的redis-cluster集群则可用通过cachecloud工具自动生成,而无需手动一台台的搭建。对于cachecloud的功能以及中文乱码的问题,应该后续跟进,其原因大有可能是cachecloud在2017年停止更新导致的版本问题。而在集群部署时,应该将cachecloud搭建至服务器,再将多台服务器添加至cachecloud即可。以cacahecloud作为跳板,将所有机器进行redis服务的划分。
所以,在机房搭建项目下,应该搭建的是cachecloud集群而非redis-cluster集群。
其架构如下:
虽然比较繁琐,但详细一点总是好的,毕竟坑比较多,还有键入的时候一定得小心了。