Windows下安装Redis
单机模式
下载地址:https://github.com/MicrosoftArchive/redis/releases
1、下载后解压,在文件根目录下创建两个文件夹dbcache、logs
2、修改配置文件redis.windows.conf
(1)配置redis地址:
bind 127.0.0.1
(2)配置redis端口(默认6379):
port 6379
(3)配置redis密码(默认为空):
requirepass 123456
(4)配置redis是否为后台运行(NOT SUPPORTED ON WINDOWS):
daemonize no
(5)设置进程保存路径(NOT SUPPORTED ON WINDOWS):
/var/run/redis_6379.pid
(6)支持数据库个数:
databases 16
(7)设置数据文件保存目录:
dir ./dbcache
(8)设置日志文件保存:
logfile "./logs/logfile.log"
3、启动redis服务,双击redis-server.exe 或 cmd到redis安装目录执行命令(需要指定配置文件):
redis-server redis.windows.conf
4、将redis注册为系统服务,设置redis开机自启
打开命令行,进入redis目录,执行以下命令,然后查看“服务”(services.msc)。另外,配置一下环境变量,将redis路径添加到path中。这里就是用了redis.windows-service.conf作为配置文件, --loglevel notice是设置log记录的,基本是notice
redis-server.exe --service-install redis.windows-service.conf --loglevel notice
5、连接redis客户端,执行以下命令行:
redis-cli -h 127.0.0.1 -p 6379
如果设置密码,则需要输入密码(auth "你的密码")验证:
auth "123456"
进行简单redis操作测试:
此外redis有提供客户端可视化工具:
- Another Redis Desktop Manager(本人用过) https://github.com/qishibo/AnotherRedisDesktopManager/
- Redis Insight (Web版) https://redis.com/redis-enterprise/redis-insight/
6、redis常用的服务命令如下:
(1)安装服务
redis-server --service-install
(2)卸载服务
redis-server --service-uninstall
(3)启动服务
redis-server --service-start
(4)停止服务
redis-server --service-stop
(5)其他命令
redis-server --service-name YourServiceName #设置服务的名字
redis-server --port YourPortNumber #设置服务的端口号
第一条命令为:以redis.windows-servie.conf作为配置文件,名字为 redisTest, 端口号为 6388 来安装一个Redis服务;
第二条命令为:(红色框内)是卸载名为 redisTest的服务。
哨兵模式
Redis的主从复制模式下, 一旦主节点由于故障不能提供服务, 需要人工将从节点晋升为主节点, 同时还要通知应用方更新主节点地址, 对于很多应用场景这种故障处理的方式是无法接受的。 Redis从2.8开始正式提供了Redis Sentinel(哨兵) 架构来解决这个问题。
Redis主从复制的缺点:没有办法对master进行动态选举,需要使用Sentinel机制完成动态选举。
哨兵模式介绍
Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态。
在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用(HA)。
哨兵进程的作用
- 监控(Monitoring):哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
- 提醒(Notification):当被监控的某个Redis节点出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作。
- 它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master;
- 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用现在的Master替换失效Master。
- Master和Slave服务器切换后,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置文件的内容都会发生相应的改变,即,Master主服务器的redis.conf配置文件中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。
哨兵进程的工作方式
(1)每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个 PING 命令。
(2)如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值,则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)。
(3)如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态。
(4)当有足够数量的 Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN), 则Master主服务器会被标记为客观下线(ODOWN)。
(5)在一般情况下, 每个Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送 INFO 命令。
(6)当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
(7)若没有足够数量的 Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状态就会被移除。若 Master主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主服务器的主观下线状态就会被移除。
安装和部署
redis-6379.conf
redis-6380.conf
redis-6381.conf
sentinel-26379.conf
sentinel-26380.conf
sentinel-26381.conf
部署主从节点
(1)启动主节点
redis-6379.conf主要修改参数:
port 6379
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
启动:
./redis-server redis-6379.conf
确认是否启动成功:
./redis-cli -h 127.0.0.1 -p 6379 ping
PONG
(2)启动从节点
从节点1 redis-6380.conf 主要修改参数:
port 6380
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
slaveof 127.0.0.1 6379
从节点2 redis-6381.conf 主要修改参数:
port 6381
daemonize yes
logfile "6381.log"
dbfilename "dump-6381.rdb"
slaveof 127.0.0.1 6379
启动:
./redis-server redis-6380.conf
./redis-server redis-6381.conf
确认主从关系
./redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master ##当前节点角色
connected_slaves:2 ##从节点连接个数
slave0:ip=127.0.0.1,port=6380,state=online,offset=392,lag=1 ##从节点连接信息
slave1:ip=127.0.0.1,port=6381,state=online,offset=392,lag=2 ##从节点连接信息
master_replid:6bc06103642acba6430e01ec78ef18ada4736649
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:392
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:392
此时的拓扑为:
部署Sentinel节点
3个Sentinel节点的部署方法是完全一致的(端口不同)。
主要修改参数 修改端口 ,修改主节点连接信息,其他使用默认就行了:
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
这一行代表sentinel监控的master的名字叫做mymaster,地址为127.0.0.1:6379,行尾最后的一个2代表什么意思呢?我们知道,网络是不可靠的,有时候一个sentinel会因为网络堵塞而误以为一个master redis已经死掉了,当sentinel集群式,解决这个问题的方法就变得很简单,只需要多个sentinel互相沟通来确认某个master是否真的死了,这个2代表,当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。(sentinel集群中各个sentinel也有互相通信,通过gossip协议)。
Sentinel节点的默认端口是26379。
启动方式:
./redis-sentinel sentinel-26379.conf
或
redis-server sentinel-26379.conf --sentinel
Sentinel节点本质上是一个特殊的Redis节点, 所以也可以通过info命令 来查询它的相关信息 。
redis-cli -h 127.0.0.1 -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=1
其他两个配置是一样的。
宕机测试
现在在master节点上执行如下操作,演示通过redis sentinel 进行故障转移和新master的选出
./redis-cli shutdown
执行完上述操作后,三个哨兵打印的日志如下:
14549:X 24 Jul 15:44:44.568 # +vote-for-leader e31085285266ff86372eeeb4970c9a8de0471025 1
14549:X 24 Jul 15:44:44.604 # +sdown master mymaster 127.0.0.1 6379
14549:X 24 Jul 15:44:44.604 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
14549:X 24 Jul 15:44:44.604 # Next failover delay: I will not start a failover before Wed Jul 24 15:50:45 2019
14549:X 24 Jul 15:44:45.093 # +config-update-from sentinel e31085285266ff86372eeeb4970c9a8de0471025 127.0.0.1 26381 @ mymaster 127.0.0.1 6379
14549:X 24 Jul 15:44:45.093 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6381
14549:X 24 Jul 15:44:45.093 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
14549:X 24 Jul 15:44:45.093 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
14549:X 24 Jul 15:45:15.127 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
意思就是选择6381为新的master。
Sentinel配置说明
# Example sentinel.conf
# 哨兵sentinel实例运行的端口 默认26379
port 26379
# 哨兵sentinel的工作目录
dir /tmp
# 哨兵sentinel监控的redis主节点的 ip port
# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 配置多少个sentinel哨兵统一认为master主节点失联 那么这时客观上认为主节点失联了
# sentinel monitor
sentinel monitor mymaster 127.0.0.1 6379 2
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds
sentinel down-after-milliseconds mymaster 30000
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout
sentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
一个是事件的类型,
一个是事件的描述。
如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
#通知脚本
# sentinel notification-script
sentinel notification-script mymaster /var/redis/notify.sh
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
#
# 目前总是“failover”,
# 是“leader”或者“observer”中的一个。
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
集群模式
Redis集群解决了什么问题
Redis使用集群方案是为了解决因单个节点数据量大、写入量大而产生的性能瓶颈 (主从架构也是单节点写入,但是所有节点都是存储了全量的数据)的问题。
集群是如何进行工作的
Redis采用哈希槽来处理数据与节点之间的映射关系,一个集群共有16384 个哈希槽,每个key通过 CRC16算法计算出一个16bit的值,再对16384取模,得到对应的哈希槽,集群通过维护哈希槽与节点的关系来得到key的映射关系。集群节点之间互相通信,把当前节点的哈希槽分配信息互相传递。
客户端在连接到节点时,会获取到哈希槽与节点的映射关系,并缓存到本地。如果节点哈希槽与节点的映射关系改变,那么当客户端使用key计算后访问节点时,如果节点不存在该哈希槽,则会将最新的哈希槽映射关系返回给客户端,客户端更新本地缓存,并根据最新的映射关系再次访问对应的节点操作。
Redis集群安装
在Windows系统下搭建Redis集群需要4个组件:
- Redis
- Ruby语言运行环境
- Redis的Ruby驱动redis-xxxx.gem
- 创建Redis集群的工具redis-trib.rb
安装Redis,并运行3个实例(Redis集群需要至少3个以上节点,低于3个无法创建)。
使用redis-trib.rb工具来创建Redis集群,由于该文件是用ruby语言写的,所以需要安装Ruby开发环境,以及驱动redis-xxxx.gem。
下载并安装Redis
Redis提供msi和zip格式的下载文件,这里下载zip格式 3.0.504版本。
将下载到的Redis-x64-3.0.504.zip解压即可,为了方便使用,建议放在盘符根目录下,并修改目录名为Redis,如:C:\Redis 或者D:\Redis。
通过配置文件来启动3个不同的Redis实例,由于Redis默认端口为6379,所以这里使用了6380、6381、6382来运行3个Redis实例。
注意:为了避免不必要的错误,配置文件尽量保存为utf8格式,并且不要包含注释
配置文件中以下两种保存日志的方式(保存在文件中、保存到System Log中)请根据需求选择其中一种即可:
loglevel notice #日志的记录级别,notice是适合生产环境的
logfile "D:/Redis/Logs/redis6380_log.txt" #指定log的保持路径,默认是创建在Redis安装目录下,如果有子目录需要手动创建,如此处的Logs目录
syslog-enabled yes #是否使用系统日志
syslog-ident redis6380 #在系统日志的标识名
这里使用了保存在文件中的方式,所以先在redis目录D:/Redis下新建L.ogs文件夹。
redis.6380.conf 内容如下:
port 6380
loglevel notice
logfile "D:/Redis/Logs/redis6380_log.txt"
appendonly yes
appendfilename "appendonly.6380.aof"
cluster-enabled yes
cluster-config-file nodes.6380.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
redis.6381.conf 内容如下:
port 6381
loglevel notice
logfile "D:/Redis/Logs/redis6381_log.txt"
appendonly yes
appendfilename "appendonly.6381.aof"
cluster-enabled yes
cluster-config-file nodes.6381.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
redis.6382.conf 内容如下:
port 6382
loglevel notice
logfile "D:/Redis/Logs/redis6382_log.txt"
appendonly yes
appendfilename "appendonly.6382.aof"
cluster-enabled yes
cluster-config-file nodes.6382.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
配置内容的解释如下:
#端口号
port 6380
#日志的记录级别,notice是适合生产环境的
loglevel notice
#指定log的保持路径,默认是创建在Redis安装目录下,如果有子目录需要手动创建,如此处的Logs目录
logfile "Logs/redis6380_log.txt"
#是否使用系统日志
syslog-enabled yes
#在系统日志的标识名
syslog-ident redis6380
#数据的保存为aof格式
appendonly yes
#数据保存文件
appendfilename "appendonly.6380.aof"
#是否开启集群
cluster-enabled yes
#记录集群信息,不用手动维护,Redis Cluster 会自动维护
cluster-config-file nodes.6380.conf
集群节点连接超时时间,如果集群规模小,都在同一个网络环境下,可以配置的短些,更快的做故障转移。
cluster-node-timeout 15000
#设置为0,如果master slave都挂掉, slave跟master失联又超过这个数值*timeout的数值,
#就不会发起选举了。如果设置为0,就是永远都会尝试发起选举,尝试从slave变为mater
cluster-slave-validity-factor 10
#只有当旧主服务器仍有至少给定数量的其他工作副本时,副本才会迁移到孤立主服务器。这个数字就是“移民壁垒”。
#迁移屏障为1意味着只有当主副本至少有一个其他工作副本时,副本才会迁移,以此类推。它通常反映集群中每个主节点所需的副本数量。
#默认值为1(副本仅在其主副本至少保留一个副本时迁移)。要禁用迁移,只需将其设置为一个非常大的值。
#可以设置值0,但该值仅用于调试和生产中的危险。
cluster-migration-barrier 1
#设置为no,默认为yes,故障发现到自动完成转移期间整个集群是不可用状态,
#对于大多数业务无法容忍这种情况,因此要设置为no,当主节点故障时只影 响它负责槽的相关命令执行,不会影响其他主节点的可用性。
#只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no
cluster-require-full-coverage yes
将上述配置文件保存到redis目录下,并使用这些配置文件安装3个redis服务,命令如下:
注意:redis.6380.conf等配置文件最好使用完整路径,避免重启Redis集群出现问题
D:/Redis/redis-server.exe --service-install D:/Redis/redis.6380.conf --service-name redis6380
D:/Redis/redis-server.exe --service-install D:/Redis/redis.6381.conf --service-name redis6381
D:/Redis/redis-server.exe --service-install D:/Redis/redis.6382.conf --service-name redis6382
启动这3个服务,命令如下:
D:/Redis/redis-server.exe --service-start --service-name redis6380
D:/Redis/redis-server.exe --service-start --service-name redis6381
D:/Redis/redis-server.exe --service-start --service-name redis6382
下载并安装ruby
1、下载Ruby
地址:https://rubyinstaller.org/downloads/archives/
下载后,双击安装即可,同样,为了操作方便,也是建议安装在盘符根目录下,如: D:\ruby22-x64 ,安装时这里选中后两个选项,意思是将ruby添加到系统的环境变量中,在cmd命令中能直接使用ruby的命令。
2、下载Redis驱动
下载ruby环境下Redis的驱动,考虑到兼容性,这里下载的是3.2.2版本。
https://rubygems.org/gems/redis/versions/3.2.2
注意:下载在页面右下角相关连接一项中
安装该驱动,命令如下:
gem install --local path_to_gem/filename.gem
3、下载redis-trib.rb
下载Redis官方提供的创建Redis集群的ruby脚本文件redis-trib.rb,路径如下:
https://raw.githubusercontent.com/MSOpenTech/redis/3.0/src/redis-trib.rb
打开该链接如果没有下载,而是打开一个页面,那么将该页面保存为redis-trib.rb
建议保存到redis的目录下。
注意:因为redis-trib.rb是ruby代码,必须用ruby来打开,若redis-trib.rb无法识别,需要手动选择该文件的打开方式:
选择ruby为的打开方式后,redis-trib.rb的logo都会发生改变,如下图:
创建Redis集群
cmd下切换到Redis目录,使用redis-trib.rb来创建Redis集群:
redis-trib.rb create --replicas 0 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382
执行结果:
当出现提示时,需要手动输入yes,输入后,当出现以下内容,说明已经创建了Redis集群:
检验是否真的创建成功,输入以下命令:
redis-trib.rb check 127.0.0.1:6380
出现以下信息,说明创建的Redis集群是没问题的:
使用Redis客户端Redis-cli.exe来查看数据记录数,以及集群相关信息:
D:/Redis/redis-cli.exe -c -p 6380
-c 表示 cluster
-p 表示 port 端口号
输入dbsize查询 记录总数
dbsize
或者一次输入完整命令:
D:/Redis/redis-cli.exe -c -p 6380 dbsize
结果如下:
输入cluster info可以从客户端的查看集群的信息:
cluster info
结果如下:
如果搭建redis集群出现如下的问题:
解决方案:
- 删除每个节点对应的nodes-xxx.conf配置文件
- 删除每个节点下的aof、rdb文件
- 关掉redis集群各个实例的进程,重新启动
Redis的服务命令
假设在Redis的安装目录下,有一个redis.windows-service.conf文件,即默认的配置文件。
如果需要修改端口号,或者设置密码就需要修改其中的内容:
默认端口号是6379,你可以随意修改
port 6379
默认是没有设置密码,如果需要则修改requirepass, 将前面的#去掉,将foobared改成你的密码
# requirepass foobared
Redis官网提供两种安装方式:msi文件格式 和 zip包文件,其中msi格式的redis安装后,即自动添加到系统的服务列表中,而zip包的redis则需要手动安装服务
特别注意:
使用默认的配置文件安装Redis服务时,必须在Redis的安装目录下新建一个Log目录,否则会报错,因为在redis.windows-service.conf中设置了日志的保存目录为安装目录下的Log,当然这个可以修改。
Redis常用的服务命令如下:
(1)安装服务
--service-install
完整的例子:
redis-server.exe --service-install redis.windows-service.conf --loglevel notice
这里就是用了redis.windows-service.conf作为配置文件, --loglevel notice是设置log记录的,基本是notice。
(2)卸载服务
--service-uninstall
完整的例子
redis-server --service-uninstall
(3)启动服务
--service-start
(4)停止服务
--service-stop
(5)其他命令
--service-name YourServiceName #设置服务的名字
--port YourPortNumber #设置服务的端口号
使用如下,通过cmd切换到Redis的安装目录,然后输入命令即可,如:
第一条命令为:以redis.windows-servie.conf作为配置文件,名字为 redisTest, 端口号为 6388 来安装一个Redis服务;
第二条命令为:(红色框内)是卸载名为 redisTest的服务
吃水不忘挖井人:
|