所谓困难、麻烦,都是定义在自己不会的基础上。哈,在前面对Redis还不是很熟的情况下,硬是搭建了个集群来尝尝鲜。哎,也正是因为此文Redis集群的出现,让我彻底蒙圈。什么单例啊、主从啊、哨兵啊、集群这些概念直接让我蒙逼。于是乎,只能一个个去探索咯。呼,深吸一口气!首先我们从单例说起吧:下载安装Redis,菜鸟教程 新手最佳选择,下载完成并启动:
单例并没什么好说的,其实就是建立个服务端提供给客户端进行使用,仅此而已。但它存在一个很大的弊端,突然宕机了怎么办?于是乎,为了解决Redis突然宕机的困扰,也为了保证数据的不丢失,所以引入了主从,即:一台主机搭配一台从机或多台从机。主机进行读写,从机只读,没有写的权限。说的直白些,其实就是为了预防Redis宕机,给主库做数据备份,它最大特点就是数据同步,即主机一旦写入数据,每台从机存储的数据都与主机保持同步和完整。
*将下载的Redis文件,拷贝三份。为主从模式的搭建做准备:
分别打开文件6071、6072、6073的配置文件进行配置,主节点(端口任意)配置内容如下:
# 端口
port 6071
# 数据库数
databases 16
# 日志
#logfile D:/Redis/Slave/6071/Logs.txt
# 日志类型
#loglevel verbose
# 支持持久化
appendonly yes
# slave连接master密码(主从切换:密码验证,必配)
masterauth 123@456
# 密码
requirepass 123@456
# 允许远程
protected-mode no
Linux配置文件大致一样,没太大区别:只不过是文件路径、目录格式不一样罢了。
# 端口
port 6380
# 运行后台运行
daemonize yes
# 支持持久化
appendonly yes
# 启动服务配置文件
pidfile /var/run/redis/redis-slave-server.pid
# 日志类型
loglevel verbose
# 日志位置
logfile /var/log/redis/redis-slave-server.log
# redis目录
dir /var/lib/redis
# 配置密码
requirepass 123@456
#主从切换时的密码验证
masterauth 123@456
# 运行远程
protected-mode no
每个从节点的配置内容均相同,唯一的区别就是:在主节点的配置内容的基础上,再增加一行代码:slaveof 192.168.157.1 6072,代表的意思是:从节点服务的主节点IP地址+端口。这里作一个简单说明,另一个从节点配置内容也完全一样,只需更换第一行启动端口为不同端口即可,其余内容不变。Linux配置也一样,同样只需增加一行代码:slaveof 192.168.157.1 6072即可。
# 端口
port 6073
# 数据库数
databases 16
# 日志
#logfile D:/Redis/Slave/6073/Logs.txt
# 日志类型
#loglevel verbose
# 支持持久化
appendonly yes
# 配置从节点主节点
slaveof 192.168.157.1 6071
# slave连接master密码
masterauth 123@456
# 密码
requirepass 123@456
# 允许远程
protected-mode no
配置完成后,进入到每个配置文件的目录,编写一个脚本.bat文件来进行启动。这里注意,是每一个配置文件所在的目录都要编写,因为每个服务都要启动,才有所谓的主从。脚本内容如下:
# 启动Redis服务
redis-server redis.windows.conf
Linux启动就更简单了,直接使用如下命令启动对应得配置文件就好了:
# 启动每个配置文件所对应的Redis服务
redis-server /etc/redis/redis_slave.conf
启动效果:
验证主从,首先进入Redis安装目录,通过客户端命令进行访问:
# 连接服务
redis-cli -h 192.168.157.1 -p 6071
# 验证密码
auth 123@456
同理,访问从节点端口,可以看到:从节点没有写的权限,却可以读取到和主节点同步的数据。
# 连接服务
redis-cli -h 192.168.157.1 -p 6072
# 验证密码
auth 123@456
有了主从以后,虽然保证了数据的同步和可用。但当Master节点宕机后,从节点它不具有写的权限啊。这样的话,除了做一个数据备份,好像对Redis的可用性并不是很强。所以引入了我们的Redis哨兵,Sentinel就是哨兵的意思。哨兵的作用呢,就是监控Master主节点的运行状况。一旦主节点宕机,Redis的Sentinel哨兵就会进行投票选举,从已经宕机了的Master节点的从节点中,推选出一个新的Master节点,从而避免了Master宕机,就导致从节点因为不具有写的权限,而无法提供服务的缺陷。从而,把这种哨兵模式,称为:Redis的高可用模式。同理,将Redis文件拷贝三份,在每一个目录下新建一个文本文件sentinel.conf,只不过这一次的不同是,我们启动的是Sentinel配置文件sentinel.conf,而不再是redis.windows.conf。同理,每一个sentinel.conf配置内容都一样,因为监控的是同一个Master节点,只不过是启动的端口不同。当然也可以把Sentinel部署在不同的机器,不过前提是必须在同一个局域网内(亲测)。因为Sentinel之间的通信是通过内网交互,而不是外网。
Sentinel.conf配置内容:这里一定要注意的是,三个目录下的配置文件内容都相同,但启动的端口一定要更换,如6071:prot 26071,6072:26072,一次类推。除非你是在同一个局域网内的三台机器相同的端口,方可。
#当前Sentinel服务运行的端口
port 26071
#Sentinel去监视一个名为master-6071的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6071,
#而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor master-6071 192.168.157.1 6071 2
# 验证主机密码
sentinel auth-pass master-6071 123@456
# 允许远程
protected-mode no
每个目录下编写一个脚本文件Sentinel.bat用于启动Sentinel.conf,脚本内容如下:
# 启动Sentinel
redis-server sentinel.conf --sentinel
启动后每个Sentinel:
停掉6071这个服务,即宕机的情景。此时我们会发现,主从自动进行了切换,即Master挂掉后,当Sentinel监控到主节点6071宕机后,在Master的Slave推选了出了新的Master,仍旧可以为Redis提供正常的服务。通过这种选举机制,大大提高了Redis使用效率,故称为:高可用。即不会因为当前Master的宕机,而导致整个服务无法继续 进行,而是通过新的Master来继续提供服务,直到每个节点都宕机以后,整个服务才会停止。
这里一定要注意啊,在mster宕机后,主从切换是需要时间的,大概要等待30秒左右吧。记得一开始我就没等待,导致我认为我的Sentinel是没有搭建成功的。若等待超过了这30或超过这个时间段Sentinel还没反应,那就得重新检查你的配置文件了。下面来看下正确的场景:
纵使有了Redis哨兵Senteinel的高可用,可是它仍存在着缺陷啊。当用户量过大、或是并发数过多,所有的服务器压力Master都得自己扛下来,除非宕机通过Sentinel哨兵机制扔给下一台服务器去扛。但它始终只有一台进行工作,所以为了解决这样的困境,就引入了Redis集群,以负载均衡的方式,来分担服务器压力。把一台服务器要扛得压力,通过负载均衡给集群中的每一台Matser机器。Redis集群与哨兵机制的区别在于,Redis集群的从节点不提供任何服务,仅作主节点Master的数据备份,但它是负载均衡,多个Master进行负载均衡。而哨兵是可以进行主从切换的,但它从头到尾都是一台服务器在扛。集群的详细搭建,请参照我的上一篇博文搭建Redis集群,配置文件如下:
# 支持持久化
appendonly yes
# 端口
port 6379
# 日志
logfile C:/Files/Redis/Cluster/Logs/Log.txt
# 日志类型
loglevel verbose
# 配置密码
requirepass 123@456
# 从服务器只读选项,默认是yes,只读模式
# slave-read-only no
# 允许创建集群
cluster-enabled yes
# 节点配置文件
cluster-config-file nodes.conf
# 连接超时时间
cluster-node-timeout 15000
# 允许远程
protected-mode no
Linux配置文件:有个小细节,先创建集群后再配置密码,这样就会避免NO AUTH…的错误提示了,即没有进行密码验证授权。
# 端口
port 6379
# 运行后台运行
daemonize yes
# 支持持久化
appendonly yes
# 启动服务配置文件
pidfile /var/run/redis/redis-server.pid
# 日志类型
loglevel verbose
# 日志位置
logfile /var/log/redis/redis-server.log
# redis目录
dir /var/lib/redis
# 配置密码
requirepass 123@456
# 从服务器只读选项,默认是yes,只读模式
slave-read-only yes
# 运行远程
protected-mode no
# 开启集群
cluster-enabled yes
总结:
主从:数据同步、作备份。保证数据的可用性!
哨兵:保障Redis服务的高可用,不至于Master挂点后,就无法再继续提供服务。主从自动切换,直到最后一个节点宕机方止!
集群:负载均衡,缓解服务器的压力。详细参见我的另一篇博文Redis集群重新学习再详解说明