- Redis一主两从三哨兵
- 搭建Redis主从模式
- 下载
- 配置
- 启动
- 查看
- 读写测试
- 测试
- 配置redis哨兵模式
- 创建配置文件
Redis一主两从三哨兵
搭建Redis主从模式
下载
下载完成后按照端口命名,规划一主两从
将下载的压缩包加压后目录为:
配置
现在修改每个节点下的redis.windows.conf
文件
- 修改每个节点的端口号分别为6379、6380、6381。若部署再不同机器上可以不修改默认使用6379端口号
- 修改日志输出文件位置
loglevel 为日志级别默认值为verbose,取值可选为:
- debug:会打印出很多信息,适用于开发和测试阶段
- verbose(冗长的):包含很多不太有用的信息,但比debug要清晰一些
- notice:适用于生产模式
- warning : 警告信息
logfile为日志文件存放的位置,我们提前创建好日志存放的路径文件夹,文件不需要创建,日志会输出到此目录下的文件
- 设置redis主库密码
- 设置redis链接密码
requirepass和masterauth两个值所有配置文件都写填写,各个节点密码建议一致,不然后期主从切换的时候会有从节点链接不上
- 设置从节点slaveof
6380节点:
6381节点:
- 修改bind为0.0.0.0
启动
在每个节点目录下执行此命令启动redis
redis-server.exe redis.windows.conf
此时会在日志文件夹下生成日志文件
至此三个节点启动成功!
查看
在主节点依次上执行如下命令:
redis-cli.exe -p 6379
auth 123456
info Replication
可以看到如下信息:
role:master 节点权限为主节点,连接 两台从库 分别为6380和6381
在从节点上再次执行以上命令:
role:slave 表示为从库
读写测试
默认slave服务器只读,这个可以进行设置,按照业务需要,默认是只读。
主库写入一个key:
从6380读取
从6381读取
可以看到在master服务器进行设置,slave服务器就可以直接get了
主从增量原理: Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令
。
主从复制策略: 主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
注意: 如果多个Slave断线了,需重启时,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。
测试
关闭一台从服务6380
此时主服务输出日志表示从服务挂机
在主节点再次执行 info Replication
此时显示从服务链接数量为一台
重启关掉的6380节点
此时从库恢复连接后先进行一次全量同步(只有第一次会进行全量同步)
此时主节点显示刚才挂机的从节点已经回复上线
把master节点挂掉:
此时两个的role还是slave,并没有变成master,这时我们再启动6381服务器
由于主从模式下,master服务挂掉之后,redis写能力就会丢失,这是无法接受的,故而需要重新选举主服务器,于是有了哨兵模式。
配置redis哨兵模式
创建配置文件
在三台节点的安装目录下创建sentinel.conf文件
配置文件官方完整配置如下:
# Example sentinel.conf
# port <sentinel-port>
# The port that this sentinel instance will run on
# sentinel实例运行的端口
port 26381
# sentinel announce-ip <ip>
# sentinel announce-port <port>
#
# The above two configuration directives are useful in environments where,
# because of NAT, Sentinel is reachable from outside via a non-local address.
#
# When announce-ip is provided, the Sentinel will claim the specified IP address
# in HELLO messages used to gossip its presence, instead of auto-detecting the
# local address as it usually does.
#
# Similarly when announce-port is provided and is valid and non-zero, Sentinel
# will announce the specified TCP port.
#
# The two options don't need to be used together, if only announce-ip is
# provided, the Sentinel will announce the specified IP and the server port
# as specified by the "port" option. If only announce-port is provided, the
# Sentinel will announce the auto-detected local IP and the specified port.
#
# Example:
#
# sentinel announce-ip 1.2.3.4
# dir <working-directory>
# Every long running process should have a well-defined working directory.
# For Redis Sentinel to chdir to /tmp at startup is the simplest thing
# for the process to don't interferer with administrative tasks such as
# unmounting filesystems.
dir /tmp
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name : master Redis Server名称
# ip : master Redis Server的IP地址
# redis-port : master Redis Server的端口号
# quorum : 主实例判断为失效至少需要 quorum 个 Sentinel 进程的同意,只要同意 Sentinel 的数量不达标,自动failover就不会执行
#
# Tells Sentinel to monitor this master, and to consider it in O_DOWN
# (Objectively Down) state only if at least <quorum> sentinels agree.
#
# Note that whatever is the ODOWN quorum, a Sentinel will require to
# be elected by the majority of the known Sentinels in order to
# start a failover, so no failover can be performed in minority.
#
# Slaves are auto-discovered, so you don't need to specify slaves in
# any way. Sentinel itself will rewrite this configuration file adding
# the slaves using additional configuration options.
# Also note that the configuration file is rewritten when a
# slave is promoted to master.
#
# Note: master name should not include special characters or spaces.
# The valid charset is A-z 0-9 and the three characters ".-_".
#
sentinel monitor mymaster 127.0.0.1 6381 2
# sentinel auth-pass <master-name> <password>
#
# Set the password to use to authenticate with the master and slaves.
# Useful if there is a password set in the Redis instances to monitor.
#
# Note that the master password is also used for slaves, so it is not
# possible to set a different password in masters and slaves instances
# if you want to be able to monitor these instances with Sentinel.
#
# However you can have Redis instances without the authentication enabled
# mixed with Redis instances requiring the authentication (as long as the
# password set is the same for all the instances requiring the password) as
# the AUTH command will have no effect in Redis instances with authentication
# switched off.
#
# Example:
#
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# sentinel down-after-milliseconds <master-name> <milliseconds>
#
# Number of milliseconds the master (or any attached slave or sentinel) should
# be unreachable (as in, not acceptable reply to PING, continuously, for the
# specified period) in order to consider it in S_DOWN state (Subjectively
# Down).
# 选项指定了 Sentinel 认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误, 那么 Sentinel 将这个实例标记为主观下线(subjectively down,简称 SDOWN )
#
# Default is 30 seconds.
sentinel down-after-milliseconds mymaster 5000
# sentinel parallel-syncs <master-name> <numslaves>
#
# How many slaves we can reconfigure to point to the new slave simultaneously
# during the failover. Use a low number if you use the slaves to serve query
# to avoid that all the slaves will be unreachable at about the same
# time while performing the synchronization with the master.
# 选项指定了在执行故障转移时, 最多可以有多少个从Redis实例在同步新的主实例, 在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长。
sentinel parallel-syncs mymaster 1
# sentinel failover-timeout <master-name> <milliseconds>
#
# Specifies the failover timeout in milliseconds. It is used in many ways:
#
# - The time needed to re-start a failover after a previous failover was
# already tried against the same master by a given Sentinel, is two
# times the failover timeout.
#
# - The time needed for a slave replicating to a wrong master according
# to a Sentinel current configuration, to be forced to replicate
# with the right master, is exactly the failover timeout (counting since
# the moment a Sentinel detected the misconfiguration).
#
# - The time needed to cancel a failover that is already in progress but
# did not produced any configuration change (SLAVEOF NO ONE yet not
# acknowledged by the promoted slave).
#
# - The maximum time a failover in progress waits for all the slaves to be
# reconfigured as slaves of the new master. However even after this time
# the slaves will be reconfigured by the Sentinels anyway, but not with
# the exact parallel-syncs progression as specified.
# 如果在该时间(ms)内未能完成failover操作,则认为该failover失败
#
# Default is 3 minutes.
sentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
#
# sentinel notification-script and sentinel reconfig-script are used in order
# to configure scripts that are called to notify the system administrator
# or to reconfigure clients after a failover. The scripts are executed
# with the following rules for error handling:
#
# If script exits with "1" the execution is retried later (up to a maximum
# number of times currently set to 10).
#
# If script exits with "2" (or an higher value) the script execution is
# not retried.
#
# If script terminates because it receives a signal the behavior is the same
# as exit code 1.
#
# A script has a maximum running time of 60 seconds. After this limit is
# reached the script is terminated with a SIGKILL and the execution retried.
# NOTIFICATION SCRIPT
#
# sentinel notification-script <master-name> <script-path>
#
# Call the specified notification script for any sentinel event that is
# generated in the WARNING level (for instance -sdown, -odown, and so forth).
# This script should notify the system administrator via email, SMS, or any
# other messaging system, that there is something wrong with the monitored
# Redis systems.
#
# The script is called with just two arguments: the first is the event type
# and the second the event description.
#
# The script must exist and be executable in order for sentinel to start if
# this option is provided.
# 指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,但是很常用。
#
# Example:
#
# sentinel notification-script mymaster /var/redis/notify.sh
# CLIENTS RECONFIGURATION SCRIPT
#
# sentinel client-reconfig-script <master-name> <script-path>
#
# When the master changed because of a failover a script can be called in
# order to perform application-specific tasks to notify the clients that the
# configuration has changed and the master is at a different address.
#
# The following arguments are passed to the script:
#
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
#
# <state> is currently always "failover"
# <role> is either "leader" or "observer"
#
# The arguments from-ip, from-port, to-ip, to-port are used to communicate
# the old address of the master and the new address of the elected slave
# (now a master).
#
# This script should be resistant to multiple invocations.
#
# Example:
#
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
主要配置:
- 修改三个文件的端口号分别为26379、26380、26381
- 指定临时工作目录
- 配置监听的主节点地址
- 前面为监听的主节点redis的ip+端口号 后面的1表示,只要有一台哨兵服务判定主节点宕机那就执行主从切换操作,
如果三台哨兵服务只剩一台还在正常工作其余两台都挂机的情况下这时候无法进行主从切换,因为如果要进行主从切换的条件有两个,第一是得到半数以上的选票,第二是达到上面配置中配置的权重系数的值
也就是说三台机器的话最少要得到2张选票才能竞选为leader来执行主从库的切换,只剩一台哨兵的话没办法得到两张选票。所以说在做规划的时候一般都是最少选用三台哨兵服务 - 配置连接密码
- 配置日志文件输出地址
- 三个哨兵节点除了端口号配置不同外其余配置均一致
sentinel.conf 里面的内容全部都要顶格写且不可以出现空行,不然启动会报参数错误
- 启动哨兵服务(在三个目录下分别执行以下命令)
redis-server.exe sentinel.conf --sentinel
每次都窗口启动太麻烦了,我们先把这几个redis和哨兵都配成我们win的服务,这样每次启动比较方便
将Redis以及哨兵添加到系统服务中:
主:
redis-server --service-install redis.windows.conf --loglevel notice --service-name redis6379
从:
redis-server --service-install redis.windows.conf --loglevel notice --service-name redis6380
redis-server --service-install redis.windows.conf --loglevel notice --service-name redis6381
哨兵服务:分别进入到三个目录中,以管理员执行以下命令:
redis-server --service-install sentinel.conf --sentinel --loglevel notice --service-name Redissentinel26379
redis-server --service-install sentinel.conf --sentinel --loglevel notice --service-name Redissentinel26380
redis-server --service-install sentinel.conf --sentinel --loglevel notice --service-name Redissentinel26381
执行完成后查看下本地服务
这样服务就注册好了,现在就可以把服务启动起来了,若要查看日志可以在配置的日志文件路径上指定的文件查看即可。
我们测试发现在挂掉主节点的时候会在重新选举出一个新的主节点,当挂掉的主节点再次启动的时候会变成一个从节点继续工作
注意: 当只有一个从节点的时候挂载主节点会导致哨兵服务挂载,并且节点恢复不会自动恢复哨兵服务,需要手动重启哨兵