Redis 集群★★★

Redis6总纲

//www.greatytc.com/p/901dc5a0c683

目录

1、搭建
2、故障恢复
3、jredis开发

阿K须知点:

操作集群的添加,查询(对应的插槽机),查看节点(cluseer nodes)都必须在主机上面操作。

一、搭建

1、解决两个问题

(1)容量不够,redis如何进行扩容?
(2)并发写操作, redis如何分摊?

另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。

之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置

2、什么是集群

(1)Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
(2)Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

3、开撸(制作6个实例,6379,6380,6381,6389,6390,6391)

(1)删除持久化数据:将rdb,aof文件都删除掉。
rm -rf dump63*.rdb

[root@VM-0-13-centos ~]# cd /myredis
[root@VM-0-13-centos myredis]# ls
dump6379.rdb  dump6381.rdb    redis6380.conf  redis.conf
dump6380.rdb  redis6379.conf  redis6381.conf  sentinel.conf
[root@VM-0-13-centos myredis]# rm -rf dump63*.rdb
[root@VM-0-13-centos myredis]# ls
redis6379.conf  redis6380.conf  redis6381.conf  redis.conf  sentinel.conf

(2)配置基本信息

[root@VM-0-13-centos myredis]# cat redis6379.conf
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"

(3)添加配置信息
cluster-enabled yes 打开集群模式

cluster-config-file nodes-6379.conf 设定节点配置文件名

cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。

[root@VM-0-13-centos myredis]# cat 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

(4)复制出其他五个节点的配置文件

cp redis6379.conf redis6380.conf
......
cp redis6379.conf redis6391.conf

(5)全局替换配置的端口号
vi 下运行 %s/6379/6380,其他几个以此类推

image.png

(6)启动6个节点服务

[root@VM-0-13-centos myredis]# redis-server redis6379.conf
[root@VM-0-13-centos myredis]# redis-server redis6380.conf
[root@VM-0-13-centos myredis]# redis-server redis6381.conf
[root@VM-0-13-centos myredis]# redis-server redis6389.conf
[root@VM-0-13-centos myredis]# redis-server redis6390.conf
[root@VM-0-13-centos myredis]# redis-server redis6391.conf

(7)组合之前先确定6个节点实例启动成功,nodes-xxxx.conf文件都生成正常(合体前的检查)

[root@VM-0-13-centos myredis]# ll
total 144
-rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6379.conf
-rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6380.conf
-rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6381.conf
-rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6389.conf
-rw-r--r-- 1 root root   114 Dec  1 23:14 nodes-6390.conf
-rw-r--r-- 1 root root   114 Dec  1 23:14 nodes-6391.conf
-rw-r--r-- 1 root root   181 Dec  1 22:55 redis6379.conf
-rw-r--r-- 1 root root   181 Dec  1 23:01 redis6380.conf
-rw-r--r-- 1 root root   181 Dec  1 23:01 redis6381.conf
-rw-r--r-- 1 root root   181 Dec  1 23:02 redis6389.conf
-rw-r--r-- 1 root root   181 Dec  1 23:02 redis6390.conf
-rw-r--r-- 1 root root   181 Dec  1 23:03 redis6391.conf
-rw-r--r-- 1 root root 92223 Nov 30 21:50 redis.conf
-rw-r--r-- 1 root root   392 Dec  1 20:27 sentinel.conf

(8)查看是否有 rb环境(合体前的检查)
切换到 cd /opt/redis-6.2.1/src

image.png

redis6.2.1及其以上是有封装这个环境,以下的版本需要自己装

(9)将6个节点合成一个集群(合体!)
以下命令要在cd /opt/redis-6.2.1/src目录下才能执行

redis-cli --cluster create --cluster-replicas 1 172.16.0.13:6379 172.16.0.13:6380 172.16.0.13:6381 172.16.0.13:6389 172.16.0.13:6390 172.16.0.13:6391

此处不要用127.0.0.1, 请用真实IP地址
--replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组。


image.png

(10)登录:此时不能已普通方式登录,插入等操作会出重定向的问题
-c 采用集群策略连接,设置数据会自动切换到相应的写主机
redis-cli -c -p 6379

image.png

这里需要注意,保证6个端口都是开放的,否则运行后会超时

(11)通过 cluster nodes 命令查看集群信息

127.0.0.1:6380> CLUSTER NODES
e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638458289000 1 connected
ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638458289779 1 connected 0-5460
a907d625a8b92a9ba429722cca79c94ad344ad88 172.16.0.13:6380@16380 myself,master - 0 1638458288000 2 connected 5461-10922
4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 master - 0 1638458290000 3 connected 10923-16383
bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 slave a907d625a8b92a9ba429722cca79c94ad344ad88 0 1638458291806 2 connected
f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638458290781 3 connected

二、集群原理

(1)redis cluster 如何分配这六个节点?

一个集群至少要有三个主节点。

选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。(一对一)

分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

(2)什么是slots
一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽。
节点 B 负责处理 5461 号至 10922 号插槽。
节点 C 负责处理 10923 号至 16383 号插槽。

image.png

(3)在集群中录入值

在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。

redis-cli客户端提供了 –c 参数实现自动重定向。

如 redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向。

不在一个slot下的键值,是不能使用mget,mset等多键操作。

127.0.0.1:6380> mset k1 v1 k2 v2 ke v3
(error) CROSSSLOT Keys in request don't hash to the same slot

可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。

127.0.0.1:6380> mset name{user} jack age{user} 20
OK

(4)查询集群中的值
CLUSTER GETKEYSINSLOT <slot><count> 返回 count 个 slot 槽中的键。

127.0.0.1:6380> CLUSTER KEYSLOT user
(integer) 5474
127.0.0.1:6380> CLUSTER COUNTKEYSINSLOT 5474
(integer) 2
127.0.0.1:6380> CLUSTER GETKEYSINSLOT 5474 2
1) "age{user}"
2) "name{user}"

三、故障恢复

1、如果主节点下线?

从节点能否自动升为主节点?注意:15秒超时
原本是 6380主机的 从机 6389上位了

[root@VM-0-13-centos ~]# redis-cli -c -p  6380
127.0.0.1:6380> shutdown
not connected> exit
[root@VM-0-13-centos ~]# ps -ef|grep redis
root     19658     1  0 14:40 ?        00:00:50 redis-server *:6381 [cluster]
root     19664     1  0 14:40 ?        00:00:49 redis-server *:6389 [cluster]
root     19670     1  0 14:41 ?        00:00:49 redis-server *:6390 [cluster]
root     19676     1  0 14:41 ?        00:00:49 redis-server *:6391 [cluster]
root     19686     1  0 14:42 ?        00:00:50 redis-server *:6379 [cluster]
root     19739 19610  0 14:57 pts/1    00:00:00 redis-cli -c -p 6379
root     24776 24515  0 23:34 pts/0    00:00:00 grep --color=auto redis
[root@VM-0-13-centos ~]# redis-cli -c -p  6381
127.0.0.1:6381> cluster nodes
ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638459347964 1 connected 0-5460
4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 myself,master - 0 1638459348000 3 connected 10923-16383
f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638459348000 3 connected
bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 master - 0 1638459348989 7 connected 5461-10922
e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638459347000 1 connected
a907d625a8b92a9ba429722cca79c94ad344ad88 172.16.0.13:6380@16380 master,fail - 1638459257471 1638459254000 2 disconnected

2、主节点恢复后,主从关系会如何?

主节点回来变成从机。

[root@VM-0-13-centos ~]# redis-server /myredis/redis6380.conf
[root@VM-0-13-centos ~]# redis-cli -c -p 6389
127.0.0.1:6389> cluster nodes
a907d625a8b92a9ba429722cca79c94ad344ad88 :0@0 master,fail,noaddr - 1638459258445 1638459254000 2 disconnected
e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638459799000 1 connected
ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638459798000 1 connected 0-5460
4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 master - 0 1638459800592 3 connected 10923-16383
f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638459799578 3 connected
bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 myself,master - 0 1638459799000 7 connected 5461-10922

3、如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为yes ,那么 ,整个集群都挂掉

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为no ,那么,该插槽数据全都不能使用,也无法存储,但是整个集群还可以用。

redis.conf中的参数 cluster-require-full-coverage

查看 参数情况:config get cluster-require-full-coverage

127.0.0.1:6389> config get cluster-require-full-coverage
1) "cluster-require-full-coverage"
2) "yes"

四、jredis开发

1、说明

即使连接的不是主机,集群会自动切换主机存储。主机写,从机读。
无中心化主从集群。无论从哪台主机写的数据,其他主机上都能读到数据。

2、代码

    public static void main(String[] args) {
        // 创建对象
        HostAndPort hostAndPort = new HostAndPort ("172.16.0.13",6390);
        JedisCluster jedisCluster = new JedisCluster (hostAndPort);

        // 操作
        jedisCluster.set ("bb1","vv1");
        String value = jedisCluster.get ("bb1");
        System.out.println (value );

        jedisCluster.close ();
    }

3、Redis 集群提供了以下好处

(1)实现扩容
(2)分摊压力
(3)无中心配置相对简单

4、缺点

(1)多键操作是不被支持的
(2)多键的Redis事务是不被支持的。lua脚本不被支持
(3)由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。

端口开放

1、开启防火墙 
    systemctl start firewalld

2、开放指定端口
      firewall-cmd --zone=public --add-port=1935/tcp --permanent
 命令含义:
--zone #作用域
--add-port=1935/tcp  #添加端口,格式为:端口/通讯协议
--permanent  #永久生效,没有此参数重启后失效

3、重启防火墙
      firewall-cmd --reload

4、查看端口号
netstat -ntlp   //查看当前所有tcp端口·

netstat -ntulp |grep 1935   //查看所有1935端口使用情况·

搭建遇到的问题参考的博客

使用rb合体:https://blog.csdn.net/weixin_42350858/article/details/108229438

发现rb运行不了:https://blog.csdn.net/fly910905/article/details/85274463

开放端口:https://www.cnblogs.com/sxmny/p/11224842.html

cluster-require-full-coverage 参数:https://blog.51cto.com/liuzhanbin/1871514

节点重新加入集群:https://blog.csdn.net/qq_35613498/article/details/105523536

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容