在昨天跟今天,我完成了黑马课程的redis单点登录和使用linux配置一主二从的简单哨兵模式,搭建简单的集群模式,接下来我将依次讲述其中的过程,简略讲解第一项,也就是黑马课程的使用redis完成短信登录
1.黑马点评系统使用redis完成短信登录(由于难以再次完成所以截图来自黑马课程)
1.1首先,为什么使用redis来实现登录呢?
在使用redis之前,我们是基于session的以下两种方法来获取验证码信息的
setAttribute(String name, Object value)
:将一个属性设置到 Session 中,属性由一个名称和一个对应的值组成。getAttribute(String name)
:通过属性名获取在 Session 中存储的属性值。
其中会触发session共享问题,指的是多台tomcat并不共享session存储空间,当请求切换到不同tomcat服务时会导致数据局丢失
通常的解决方法:数据拷贝,但是缺点有两个:第一:但是多台tomcat互相拷贝数据,浪费内存空间,第二:数据拷贝需要时间,如果在拷贝的时候访问,依然会出现数据丢失
为什么使用reids:
1.数据共享:每一台tomcat都能访问到redis,所以不会出现数据丢失的问题
2.内存存储:redis的读写速度是微秒级的,非常快
3.key.value结构:与session一致
1.2如何实现呢?
首先这是基于session的流程
其中,session不用考虑取的问题,因为创建session的时候会自动形成sessionid写到用户浏览器的cookie里,以后的每次请求都会带着cookieid这样就自然找到session了redis没有,那么redis该怎么解决呢?
这时redis就要自己手动设置key值了,然后value是一个hash结构的数据,为了解决key值的重复性,我们使用token随机值当key值,之前的session是使用id来获取用户的,但是taoken没有id,tomcat不会自动帮我们写到浏览器上面,所以我们要手动把token返回到客户端
第二步改为:
具体代码:
2.简单模拟实现redis哨兵模式和集群模式以及遇到的bug
2.1实现哨兵模式
预备工作:
2.1.1.打开哨兵配置文件
protected-mode no
port 26379#端口
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 1 #设置主人端口,1代表至少需要一个线程同意
sentinel down-after-milliseconds mymaster 30000
acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no
2.1.2.将哨兵配置文件拷贝到自己的配置文件里
第一步:先创建主从环境
关键命令:SLAVEOF
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:2302f528cea94f8a6bee823f30b24a92f81e55bd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
先查看自己进程的信息
复制自己的redis配置文件,创建3个不同的配置文件,用其启动redis
默认情况下,三台都是主机
6381的信息
我们一般只配置丛机就好了
2.1.3配置丛机语句
SLAVEOF 主机名
真实的主从配置应该在配置文件中配置,这样的话是永久的,我们这里使用的是命令,是暂时的
在配置文件的这里更改
细节:
主机可以设置值,丛机不能写,只能读
第二步:修改哨兵配置,主要是修改sentinel monitor选项,1代表要进行切换,至少需要1个哨兵同意
[root@localhost bin]# redis-sentinel kconfig/sentinel-26379.conf
*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***
Reading the configuration file, at line 6
>>> 'logfile "".'
Unbalanced quotes in configuration line
出现错误
这个错误可能是由于配置文件中引号的不平衡引起的。检查一下引号是否正确闭合,特别是在 'logfile' 和 "" 之间的引号
*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***
Reading the configuration file, at line 6
>>> 'logfile "".'
Unbalanced quotes in configuration line
[root@localhost bin]# vim kconfig/sentinel-26379.conf
[root@localhost bin]# redis-sentinel kconfig/sentinel-26379.conf
*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***
Reading the configuration file, at line 7
>>> 'dir /redis-7.0.15/data'
No such file or directory
[root@localhost bin]# vim kconfig/sentinel-26379.conf
[root@localhost bin]# redis-sentinel kconfig/sentinel-26379.conf
*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***
Reading the configuration file, at line 7
>>> 'dir opt/ /redis-7.0.15/data'
wrong number of arguments
成功
这时候给主机赋一个值然后关机
[root@localhost ~]# redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> redis-server
Could not connect to Redis at 127.0.0.1:6379: Connection refused
关掉重新连,报错了
使用[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf这种方式重连上了
16526:X 26 Jan 2024 19:30:39.358 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16526:X 26 Jan 2024 19:30:39.358 # Redis version=7.0.15, bits=64, commit=00000000, modified=0, pid=16526, just started
16526:X 26 Jan 2024 19:30:39.358 # Configuration loaded
16526:X 26 Jan 2024 19:30:39.359 * Increased maximum number of open files to 10032 (it was originally set to 1024).
16526:X 26 Jan 2024 19:30:39.359 * monotonic clock: POSIX clock_gettime
16526:X 26 Jan 2024 19:30:39.359 # Warning: Could not create server TCP listening socket *:26379: bind: Address already in use
16526:X 26 Jan 2024 19:30:39.359 # Failed listening on port 26379 (TCP), aborting.
刚才没有设置好主从机,现在设置好了,也能在sentinel上看到了
这时在6379设置一个值然后关掉6379端口
20134:X 26 Jan 2024 22:29:36.913 # -failover-abort-no-good-slave master mymaster 127.0.0.1 6379
20134:X 26 Jan 2024 22:29:36.985 # Next failover delay: I will not start a failover before Fri Jan 26 22:35:37 2024
报错了,显示Redis 当前处于一个故障转移的等待状态,因为没有可用的从节点来接管主节点。
可是不是有两个从节点吗,为什么不能专移到从节点呢
我猜测可能的原因是从节点设置了密码
于是我把两个从节点都以命令取消了密码
CONFIG SET requirepass ""
成功了
这时端口6381成为了主人
主机这时回来,也只能当丛机
2.2搭建集群
第一步:先创建六个线程的配置文件
主要是改变以下的配置,可以用:g/^#/d命令消除注释行,也可以使用vim命令/搜索
配置完,给他们全部启动
这时进程显示就带集群标记了
执行此次结果,出现这个反映
这个反映表示
Redis 集群正在执行哈希槽分配,并显示了每个主节点控制的哈希槽范围。此外,它还显示了将要添加的副本节点和它们所对应的主节点。副本节点用于提供冗余和高可用性。
接下来的句子 "Trying to optimize slaves allocation for anti-affinity" 意味着集群正在尝试对副本节点进行优化,以使它们与主节点尽可能分布在不同的主机上,以提高容错能力。
最后一行显示了一个提示,询问你是否接受上述配置。如果你确认配置正确且满意,输入 "yes" 来接受配置并继续创建集群。
简而言之,上述输出是关于 Redis 集群节点和槽分配的详细信息,并在最后确认你是否接受这些配置。
又输出了这些
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.40.128:8001)
M: 0b4615a3a5f9db6b4b93365e43735bb5a9773ac9 192.168.40.128:8001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 173bd898325bad2127f44b75e1d9ead1e171eb06 192.168.40.128:8004
slots: (0 slots) slave
replicates d746ed3b5ebdd774ffe9e50797c605c913edbc86
S: 0d5e06d960396e904b9e7d700632414b4b7d501d 192.168.40.128:8005
slots: (0 slots) slave
replicates 0b4615a3a5f9db6b4b93365e43735bb5a9773ac9
S: d4861a1ac0ef84c9d2f9881a5425f931582edf3d 192.168.40.128:8006
slots: (0 slots) slave
replicates 060d7ebfac9d800e46db0ace6690320b1f00577c
M: d746ed3b5ebdd774ffe9e50797c605c913edbc86 192.168.40.128:8003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 060d7ebfac9d800e46db0ace6690320b1f00577c 192.168.40.128:8002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
在上述输出中,首先更新了节点配置,并为每个节点分配了不同的配置纪元(config epoch)。然后,发送了 CLUSTER MEET 消息以加入集群,并等待集群加入完成。
接下来进行集群检查,使用的节点是 192.168.40.128:8001。输出列出了每个节点的信息,包括节点的角色(主节点或从节点)、节点的地址和端口、节点控制的哈希槽范围,以及副本节点的信息。
最后进行了一些检查,包括检查是否存在未分配的哈希槽和检查哈希槽的覆盖情况。输出显示所有 16384 个哈希槽都得到了覆盖,符合预期。
redis-cli -c -h 192.168.40.128 -p 8001
使用这条命令连接集群
再使用cluster info查看信息,让我们试试
再使用cluster nodes查看每个结点的信息
搭建完成
借鉴资料:
轻松搭建redis缓存高可用集群_哔哩哔哩_bilibili