目录
1、搭建 2、故障恢复 3、jredis开发
ak须知点:
添加操作集群,查询(对应插槽机),查看节点(cluseer nodes)必须在主机上操作。
一、搭建
解决两个问题
(1)容量不够,redis如何扩容? (2)并发写操作, redis如何分摊?
此外,主从模式、薪火相传模式、主机停机ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。
以前是代理主机解决的,但是redis3.0中提供了解决方案。无中心集群配置
什么是集群?
(1)Redis 集群是对的Redis水平扩容,即启动Nredis将整个数据库分布存储在N个节点中,每个节点存储总数据的1/N。 (2)Redis 集群通过分区(partition)提供一定程度的可用性(availability): 即使集群中的一些节点失效或无法通信, 集群还可以继续处理命令请求。
3、开卷(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
,以此类推
(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
redis6.2.以上是包装环境,以下版本需要自己安装
(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 集群配置最简单,一台主机,一台从机,正好是三组。
(10)登录:此时不能以普通方式登录,插入等操作会出现重定向问题 -c 通过集群策略连接,设置数据将自动切换到相应的写作主机 redis-cli -c -p 6379
这里需要注意的是,确保6个端口开放,否则运行后会加班.在此,我推荐一个架构学习交流圈。交流学习指导伪欣:1253431195(有大量的面试问题和答案)将分享一些资深架构师录制的视频:Spring,MyBatis,Netty高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等已成为架构师必备的知识体系。还可以获得免费的学习资源,目前受益匪浅
(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.013: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 号插槽。
(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 返回 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 ,那么 ,整个集群都挂掉.在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
如果某一段插槽的主从都挂掉,而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端口使用情况·