Redis集群
步骤
1、集群搭建需要的环境,设置集群配置文件
2.1 Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
.
2.2 要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。
.
个人练习没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(6379-6381 6389-6391),当然实际生产环境的Redis集群搭建和这里是一样的。
创建6个redis实例:
分别为 (放在 /myRedis 目录下 需要自己创建)
redis6379.conf . redis6389.conf . redis6380.conf . redis6390.conf . redis6381.conf . redis6391.conf
配置文件代码(直接复制即可):
例 redis6379.conf :
include /myRedis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379 //每个实例的端口号不一样
dbfilename dump6379.rdb
cluster-enabled yes //打开集群模式
cluster-config-file nodes-6379.conf //设置节点配置文件名称
cluster-node-timeout 15000 //
2、Redis集群的管理工具使用的是ruby脚本语言,安装 ruby 环境
安装:
yum remove ruby //卸载默认的低版本 ruby
yum install ruby //安装新的ruby
yum install rubygems
注意:
- centos7默认的ruby版本太低(2.0),要卸载重装
- Redis需要Ruby版本不能小于2.3版本
- 可以使用 命令 " ruby -v " 查看系统默认当前 ruby 版本
- redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群;
- RubyGems 是 Ruby 的一个包管理器,它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具。
3、执行命令 : gem install redis
安装的时候报错:
[root@arslinux-01 ~]# gem install redis
Fetching: redis-4.1.2.gem (100%)
ERROR: Error installing redis:
redis requires Ruby version >= 2.3.0.
解决办法:
4、修改redis配置文件
- 打开redis配置文件 命令 : vim redis.conf
- 直接把 bind 注释
- 再把 protected-mode yes 改为 no
注意:
不改的话后面有可能报错 [ERR] Sorry, can‘t connect to node 192.168.10.3:6379
[ERR] Sorry, can‘t connect to node 192.168.10.3:6379 解决办法
5、启动redis实例
[root@localhost myRedis]# redis-server redis6379.conf
[root@localhost myRedis]# redis-server redis6380.conf
[root@localhost myRedis]# redis-server redis6381.conf
[root@localhost myRedis]# redis-server redis6390.conf
[root@localhost myRedis]# redis-server redis6389.conf
[root@localhost myRedis]# redis-server redis6391.conf
6、合并6个节点(6个redis实例)
注意:
合并6个节点之前,要确保redis实例启动后,nodes-xxxx.conf文件正常生成
执行命令:
./redis-trib.rb create --replicas 1 192.168.10.3:6379 192.168.10.3:6380 192.168.10.3:6381 192.168.10.3:6389 192.168.10.3:6390 192.168.10.3:6391
注意:
此处不要用 127.0.0.1 ,使用真实的 ip 地址
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.10.3:6379 192.168.10.3:6380 192.168.10.3:6381 192.168.10.3:6389 192.168.10.3:6390 192.168.10.3:6391
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.10.3:6379
192.168.10.3:6380
192.168.10.3:6381
Adding replica 192.168.10.3:6389 to 192.168.10.3:6379
Adding replica 192.168.10.3:6390 to 192.168.10.3:6380
Adding replica 192.168.10.3:6391 to 192.168.10.3:6381
M: f7fe7b654d3164a37aef01c67ad0ef9851bccbe2 192.168.10.3:6379
slots:0-5460 (5461 slots) master
M: 28fb88f6c55aa4468671d1144e70a8506e73ac02 192.168.10.3:6380
slots:5461-10922 (5462 slots) master
M: 0d9f5a5f77b2acfa3e97dc84d23d8923898f66c6 192.168.10.3:6381
slots:10923-16383 (5461 slots) master
S: 3eb715da3de214e99de389ab0471e1a174bd765c 192.168.10.3:6389
replicates f7fe7b654d3164a37aef01c67ad0ef9851bccbe2
S: d1a96f0524827152a5f3bf5436666da0cbefed87 192.168.10.3:6390
replicates 28fb88f6c55aa4468671d1144e70a8506e73ac02
S: 4083d04d2a7ace16c6638659799fc8702c0770a7 192.168.10.3:6391
replicates 0d9f5a5f77b2acfa3e97dc84d23d8923898f66c6
Can I set the above configuration? (type 'yes' to accept): yes
7、以集群的方式进入客户端
[root@localhost myRedis]# redis-cli -c -p 6379
127.0.0.1:6379> set a 100
-> Redirected to slot [15495] located
at 192.168.10.3:6381
OK
192.168.10.3:6381> set c 200
-> Redirected to slot [7365] located at 192.168.10.3:6380
OK
192.168.10.3:6380> get a
-> Redirected to slot [15495] located at 192.168.10.3:6381
"100"
192.168.10.3:6381>
使用命令cluster nodes 查看集群信息
192.168.10.3:6381> cluster nodes
d1a96f0524827152a5f3bf5436666da0cbefed87 192.168.10.3:6390 slave 28fb88f6c55aa4468671d1144e70a8506e73ac02 0 1614755297002 2 connected
f7fe7b654d3164a37aef01c67ad0ef9851bccbe2 192.168.10.3:6379 master - 0 1614755294984 1 connected 0-5460
0d9f5a5f77b2acfa3e97dc84d23d8923898f66c6 192.168.10.3:6381 myself,master - 0 0 3 connected 10923-16383
3eb715da3de214e99de389ab0471e1a174bd765c 192.168.10.3:6389 slave f7fe7b654d3164a37aef01c67ad0ef9851bccbe2 0 1614755300029 4 connected
28fb88f6c55aa4468671d1144e70a8506e73ac02 192.168.10.3:6380 master - 0 1614755298013 2 connected 5461-10922
4083d04d2a7ace16c6638659799fc8702c0770a7 192.168.10.3:6391 slave 0d9f5a5f77b2acfa3e97dc84d23d8923898f66c6 0 1614755299019 6 connected
8、redis cluster 如何分配这六个节点?
- 一个集群至少要有3个主节点
- 选项 --replicas 1 表示我们希望为集群的每个主节点创建一个从节点
- 分配原则尽量保证每个主数据库运行在不同的ip地址,每个从库和主库不在一个 ip地址上
9、集群的工作方式
在 Redis
的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是cluster,可以理解为是一个集群管理的插件。当我们的存取的 Key到达的时候,Redis 会根据 crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
.为了保证高可用,redis-cluster集群引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。如果主节点A和它的从节点A1都宕机了,那么该集群就无法再提供服务了。
10、在集群中录入值
- 在redis-cli 每次 录入、查询键值,redis都会计算出该key 应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。
- 不在一个slot下的键值 -c 参数实现自动重定向。
- 可以通过{} 来定义组的概念,从而使key中{} 相同内容的键值对放在一个slot中去。
192.168.10.3:6381> set a{user} a
-> Redirected to slot [5474] located at 192.168.10.3:6380 //5474是在192.168.10.3:6380 服务器下,所以会自动重定向该服务器下
OK
192.168.10.3:6380> set c{user} 100 //可以通过{}来描述这些键是在同一个组下面的 , 在同一个组下面的必定是在同一个服务器下面的
OK
192.168.10.3:6380> set jj{user} 300
命令:
- CLUSTER KEYSLOT < key > 计算键 key 应该被放置在哪个槽上。
- CLUSTER COUNTKEYSINSLOT < slot > 返回槽 slot 目前包含的键值对数量。
- CLUSTER GETKEYSINSLOT < slot > < count > 返回count 个 slot 槽中的值
11、集群小知识:
- 如果主节点下线,从节点自动升为主节点
- 主节点恢复后,降为从节点
- 如果某一段插槽中的主从节点都宕掉,redis是否还能继续 ? 否
- redis.conf 中的参数 cluter-require-full-coverage
- 16384个slot都正常的时候才能对外提供服务
12、Redis 集群的优点
(1)实现扩容
(2)分摊压力 (既能分摊读写压力,又能分摊内存压力)
(3)无中心配置相对简单
Redis 集群的不足
(1)多键操作是不被支持的
(2)多键的Redis事务是不被支持的,lua脚本不被支持。
(3)由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。