redis6.0集群初步学习

redis集群有 主从、哨兵sentinel、集群cluster三种模式

1、主从:主挂了就无法写入了。读写分离,从只读
2、哨兵:主从基础上,增加了主挂了可以从备中选一个主,需要多哨兵,但是垂直或者水平扩容都困难。从只备份不提供服务
3、cluster: 去中心化、热扩容,需要至少3个实例6台服务器,投票机制,奇数master不少于3个,哈希槽分片方式储存。主挂了备顶上,直到一个实例的主从都挂了,集群故障。从只备份

cluster缺点:

1、客户端实现复杂,驱动要求实现Smart Client,缓存slot mapping信息并及时更新,提高了开发难度,目前仅JedisCluster相对成熟,异常处理还不完善,比如常见的“max redirect exception”。
2、节点会因为某些原因发生阻塞(阻塞时间大于cluster-node-timeout)被判断下线,这种failover是没有必要的。
3、数据通过异步复制,不保证数据的强一致性。
4、slave充当“冷备”,不能缓解读压力。
5、批量操作限制,目前只支持具有相同slot值的key执行批量操作,对mset、mget、sunion等操作支持不友好。
6、key事务操作支持有线,只支持多key在同一节点的事务操作,多key分布不同节点时无法使用事务功能。
7、不支持多数据库空间,单机redis可以支持16个db,集群模式下只能使用一个,即db 0。
redis Cluster模式不建议使用pipeline和multi-keys操作,减少max redirect产生的场景。

注意:redis集群是异步复制,不能保证数据强一致性,有丢失数据的可能!!!
redis6.0以上需要gcc5.3以上
redis5.0.5以上不需要ruby环境,创建集群已经不用redis-trib.rb这个脚本,而是使用自带的redis-cli创建

redis的cluster集群监控方案:

1、开源的RedisClusterManager

2、自己写脚本监控,通过cluster自带的nodes、info和日志分析

详细单机版、集群、增删节点

gcc9安装步骤
yum -y install centos-release-scl scl-utils-build
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
echo “source /opt/rh/devtoolset-9/enable” >>/etc/profile  --使永久生效


单机版redis
gcc -v
yum install gcc-c++

tar zxf redis-3.0.0.tar.gz
cd
make

make install PREFIX=/usr/local/redis
cd redis bin
./redis-server

cp ~/redis-3.0.0/redis.conf .
修改redis.conf文件,将daemonize no -> daemonize yes,这样便将启动方式修改为后台启动了
./redis-server redis.conf
./redis-cli -h 192.168.25.153 -p 6379


集群开始搭建

一台服务器的6个端口模拟6个服务 伪集群
在usr/local目录下新建redis-cluster目录,用于存放集群节点
把redis目录下的bin目录下的所有文件复制到/usr/local/redis-cluster/redis01目录下,不用担心这里没有redis01目录,会自动创建的。操作命令如下(注意当前所在路径):
cp -r redis/bin/ redis-cluster/redis01

删除redis01目录下的快照文件dump.rdb,并且修改该目录下的redis.cnf文件,具体修改两处地方:一是端口号修改为7001,二是开启集群创建模式,打开注释即可

将redis-cluster/redis01文件复制5份到redis-cluster目录下(redis02-redis06),创建6个redis实例,模拟Redis集群的6个节点。然后将其余5个文件下的redis.conf里面的端口号分别修改为7002-7006

接着启动所有redis节点,由于一个一个启动太麻烦了,所以在这里创建一个批量启动redis节点的脚本文件,命令为start-all.sh,文件内容如下
cd redis01
./redis-server redis.conf
cd …
cd redis02
./redis-server redis.conf
cd …
cd redis03
./redis-server redis.conf
cd …
cd redis04
./redis-server redis.conf
cd …
cd redis05
./redis-server redis.conf
cd …
cd redis06
./redis-server redis.conf
cd …

chmod +x start-all.sh

执行start-all.sh脚本,启动6个redis节点


集群开始创建::::
/root/redis-6.0.5/src/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

/root/redis-6.0.5/src/redis-cli -c -h 127.0.0.1 -p 5001
set number 1000

cluster nodes


主节点新增:
/root/redis-6.0.5/src/redis-cli --cluster add-node 127.0.0.1:5007 127.0.0.1:5001
add-node 参数后跟 新节点 IP + 端口,已知集群中某一节点的 IP + 端口。
/root/redis-6.0.5/src/redis-cli --cluster reshard 127.0.0.1:5007
reshard 参数表示为某一结点重新分片,后跟 节点 IP + 端口,这里我们为 5007 节点重新分片
这里我们打算用四个主节点,则平均每个节点分配 4096 个数据槽。所以,这里我们输入 4096

接收节点 ID 是多少? 这里我们输入 5007 节点的 ID
将集群中所有现有数据槽的节点作为数据槽分配的源节点,则输入 all 即可
Type ‘all’ to use all the nodes as source nodes for the hash slots.
仅从部分源节点分配数据槽,则只需输入分配的源节点 ID ,输入完后,回车输入 done 即可
Type ‘done’ once you entered all the source nodes IDs.
源节点
Source node #1:
是否执行建议的分片计划
Do you want to proceed with the proposed reshard plan (yes/no)?
我们输入 yes.
片刻之后,看到如下内容,则表示重新分片成功: