From 6f4223ab0a93c7306d37c7ef8bd7d2c2abda7c34 Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Fri, 22 Jun 2018 14:13:34 +0800 Subject: [PATCH] =?UTF-8?q?:bookmark:=20Redis=20=E5=93=A8=E5=85=B5?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E9=83=A8=E7=BD=B2=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codes/redis/redis-config/sentinel3/README.md | 12 + .../sentinel3/instant-sentinel-setup.png | Bin 0 -> 44274 bytes .../redis-config/sentinel3/linux/redis.conf | 938 +++++++++++++++++ .../sentinel3/linux/sentinel.conf | 181 ++++ .../sentinel3/linux/server-6380/redis.conf | 5 + .../sentinel3/linux/server-6380/sentinel.conf | 5 + .../sentinel3/linux/server-6380/start.sh | 7 + .../linux/server-6380/state/dump.rdb | 1 + .../sentinel3/linux/server-6380/stop.sh | 6 + .../sentinel3/linux/server-6381/redis.conf | 6 + .../sentinel3/linux/server-6381/sentinel.conf | 6 + .../sentinel3/linux/server-6381/start.sh | 7 + .../linux/server-6381/state/dump.rdb | 1 + .../sentinel3/linux/server-6381/stop.sh | 6 + .../sentinel3/linux/server-6382/redis.conf | 6 + .../sentinel3/linux/server-6382/sentinel.conf | 6 + .../sentinel3/linux/server-6382/start.sh | 7 + .../linux/server-6382/state/dump.rdb | 1 + .../sentinel3/linux/server-6382/stop.sh | 6 + .../redis-config/sentinel3/linux/start-all.sh | 17 + .../redis-config/sentinel3/linux/stop-all.sh | 9 + .../redis-config/sentinel3/osx/redis.conf | 938 +++++++++++++++++ .../redis-config/sentinel3/osx/sentinel.conf | 181 ++++ .../sentinel3/osx/server-6380/redis.conf | 5 + .../sentinel3/osx/server-6380/sentinel.conf | 5 + .../sentinel3/osx/server-6380/start.sh | 7 + .../sentinel3/osx/server-6380/state/dump.rdb | 1 + .../sentinel3/osx/server-6380/stop.sh | 6 + .../sentinel3/osx/server-6381/redis.conf | 6 + .../sentinel3/osx/server-6381/sentinel.conf | 5 + .../sentinel3/osx/server-6381/start.sh | 7 + .../sentinel3/osx/server-6381/state/dump.rdb | 1 + .../sentinel3/osx/server-6381/stop.sh | 6 + .../sentinel3/osx/server-6382/redis.conf | 6 + .../sentinel3/osx/server-6382/sentinel.conf | 5 + .../sentinel3/osx/server-6382/start.sh | 7 + .../sentinel3/osx/server-6382/state/dump.rdb | 1 + .../sentinel3/osx/server-6382/stop.sh | 6 + .../redis-config/sentinel3/osx/start-all.sh | 17 + .../redis-config/sentinel3/osx/stop-all.sh | 9 + .../windows-password/redis.windows.conf | 967 ++++++++++++++++++ .../windows-password/server-6380/redis.conf | 5 + .../server-6380/sentinel.conf | 6 + .../windows-password/server-6380/start.cmd | 8 + .../server-6380/state/dump.rdb | Bin 0 -> 438 bytes .../windows-password/server-6380/stop.cmd | 7 + .../windows-password/server-6381/redis.conf | 6 + .../server-6381/sentinel.conf | 6 + .../windows-password/server-6381/start.cmd | 8 + .../server-6381/state/dump.rdb | Bin 0 -> 438 bytes .../windows-password/server-6381/stop.cmd | 7 + .../windows-password/server-6382/redis.conf | 6 + .../server-6382/sentinel.conf | 6 + .../windows-password/server-6382/start.cmd | 8 + .../server-6382/state/dump.rdb | Bin 0 -> 438 bytes .../windows-password/server-6382/stop.cmd | 7 + .../sentinel3/windows-password/start-all.cmd | 22 + .../sentinel3/windows-password/stop-all.cmd | 10 + .../sentinel3/windows/redis.windows.conf | 963 +++++++++++++++++ .../sentinel3/windows/server-6380/redis.conf | 5 + .../windows/server-6380/sentinel.conf | 13 + .../sentinel3/windows/server-6380/start.cmd | 8 + .../windows/server-6380/state/dump.rdb | Bin 0 -> 438 bytes .../sentinel3/windows/server-6380/stop.cmd | 7 + .../sentinel3/windows/server-6381/redis.conf | 6 + .../windows/server-6381/sentinel.conf | 13 + .../sentinel3/windows/server-6381/start.cmd | 8 + .../windows/server-6381/state/dump.rdb | Bin 0 -> 438 bytes .../sentinel3/windows/server-6381/stop.cmd | 7 + .../sentinel3/windows/server-6382/redis.conf | 6 + .../windows/server-6382/sentinel.conf | 13 + .../sentinel3/windows/server-6382/start.cmd | 8 + .../windows/server-6382/state/dump.rdb | Bin 0 -> 438 bytes .../sentinel3/windows/server-6382/stop.cmd | 7 + .../sentinel3/windows/start-all.cmd | 22 + .../sentinel3/windows/stop-all.cmd | 10 + 76 files changed, 4627 insertions(+) create mode 100644 codes/redis/redis-config/sentinel3/README.md create mode 100644 codes/redis/redis-config/sentinel3/instant-sentinel-setup.png create mode 100644 codes/redis/redis-config/sentinel3/linux/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/linux/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6380/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6380/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6380/start.sh create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6380/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6380/stop.sh create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6381/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6381/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6381/start.sh create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6381/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6381/stop.sh create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6382/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6382/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6382/start.sh create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6382/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/linux/server-6382/stop.sh create mode 100644 codes/redis/redis-config/sentinel3/linux/start-all.sh create mode 100644 codes/redis/redis-config/sentinel3/linux/stop-all.sh create mode 100644 codes/redis/redis-config/sentinel3/osx/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/osx/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6380/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6380/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6380/start.sh create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6380/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6380/stop.sh create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6381/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6381/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6381/start.sh create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6381/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6381/stop.sh create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6382/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6382/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6382/start.sh create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6382/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/osx/server-6382/stop.sh create mode 100644 codes/redis/redis-config/sentinel3/osx/start-all.sh create mode 100644 codes/redis/redis-config/sentinel3/osx/stop-all.sh create mode 100644 codes/redis/redis-config/sentinel3/windows-password/redis.windows.conf create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6380/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6380/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6380/start.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6380/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6380/stop.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6381/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6381/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6381/start.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6381/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6381/stop.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6382/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6382/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6382/start.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6382/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/windows-password/server-6382/stop.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows-password/start-all.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows-password/stop-all.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows/redis.windows.conf create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6380/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6380/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6380/start.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6380/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6380/stop.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6381/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6381/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6381/start.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6381/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6381/stop.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6382/redis.conf create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6382/sentinel.conf create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6382/start.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6382/state/dump.rdb create mode 100644 codes/redis/redis-config/sentinel3/windows/server-6382/stop.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows/start-all.cmd create mode 100644 codes/redis/redis-config/sentinel3/windows/stop-all.cmd diff --git a/codes/redis/redis-config/sentinel3/README.md b/codes/redis/redis-config/sentinel3/README.md new file mode 100644 index 0000000..f574a30 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/README.md @@ -0,0 +1,12 @@ +# Redis 部署哨兵模式 + +本目录下的配置来源于:https://github.com/ServiceStack/redis-config + +本目录下的配置实现了 [**基本的哨兵模式部署配置**](http://redis.io/topics/sentinel#example-2-basic-setup-with-three-boxes)。 + +拓扑图如下: + +
+ +

图:一主两从三哨兵

+
\ No newline at end of file diff --git a/codes/redis/redis-config/sentinel3/instant-sentinel-setup.png b/codes/redis/redis-config/sentinel3/instant-sentinel-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..3de4f7ceccd1e83868fb518b54ef1bfacf9a653c GIT binary patch literal 44274 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 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis servers but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# from admin or Redis Sentinel. Since Redis always uses the last processed +# line as value of a configuration directive, you'd better put includes +# at the beginning of this file to avoid overwriting config change at runtime. +# +# If instead you are interested in using includes to override configuration +# options, it is better to use include as the last line. +# +# include /path/to/local.conf +# include /path/to/other.conf + +################################ GENERAL ##################################### + +# By default Redis does not run as a daemon. Use 'yes' if you need it. +# Note that Redis will write a pid file in /var/run/redis.pid when daemonized. +daemonize no + +# When running daemonized, Redis writes a pid file in /var/run/redis.pid by +# default. You can specify a custom pid file location here. +pidfile /var/run/redis.pid + +# Accept connections on the specified port, default is 6379. +# If port 0 is specified Redis will not listen on a TCP socket. +port 6379 + +# TCP listen() backlog. +# +# In high requests-per-second environments you need an high backlog in order +# to avoid slow clients connections issues. Note that the Linux kernel +# will silently truncate it to the value of /proc/sys/net/core/somaxconn so +# make sure to raise both the value of somaxconn and tcp_max_syn_backlog +# in order to get the desired effect. +tcp-backlog 511 + +# By default Redis listens for connections from all the network interfaces +# available on the server. It is possible to listen to just one or multiple +# interfaces using the "bind" configuration directive, followed by one or +# more IP addresses. +# +# Examples: +# +# bind 192.168.1.100 10.0.0.1 +# bind 127.0.0.1 + +# Specify the path for the Unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /tmp/redis.sock +# unixsocketperm 700 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 0 + +# TCP keepalive. +# +# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence +# of communication. This is useful for two reasons: +# +# 1) Detect dead peers. +# 2) Take the connection alive from the point of view of network +# equipment in the middle. +# +# On Linux, the specified value (in seconds) is the period used to send ACKs. +# Note that to close the connection the double of the time is needed. +# On other kernels the period depends on the kernel configuration. +# +# A reasonable value for this option is 60 seconds. +tcp-keepalive 0 + +# Specify the server verbosity level. +# This can be one of: +# debug (a lot of information, useful for development/testing) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +loglevel notice + +# Specify the log file name. Also the empty string can be used to force +# Redis to log on the standard output. Note that if you use standard +# output for logging but daemonize, logs will be sent to /dev/null +logfile "" + +# To enable logging to the system logger, just set 'syslog-enabled' to yes, +# and optionally update the other syslog parameters to suit your needs. +# syslog-enabled no + +# Specify the syslog identity. +# syslog-ident redis + +# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. +# syslog-facility local0 + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################ SNAPSHOTTING ################################ +# +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +# +# Note: you can disable saving completely by commenting out all "save" lines. +# +# It is also possible to remove all the previously configured save +# points by adding a save directive with a single empty string argument +# like in the following example: +# +# save "" + +save 900 1 +save 300 10 +save 60 10000 + +# By default Redis will stop accepting writes if RDB snapshots are enabled +# (at least one save point) and the latest background save failed. +# This will make the user aware (in a hard way) that data is not persisting +# on disk properly, otherwise chances are that no one will notice and some +# disaster will happen. +# +# If the background saving process will start working again Redis will +# automatically allow writes again. +# +# However if you have setup your proper monitoring of the Redis server +# and persistence, you may want to disable this feature so that Redis will +# continue to work as usual even if there are problems with disk, +# permissions, and so forth. +stop-writes-on-bgsave-error yes + +# Compress string objects using LZF when dump .rdb databases? +# For default that's set to 'yes' as it's almost always a win. +# If you want to save some CPU in the saving child set it to 'no' but +# the dataset will likely be bigger if you have compressible values or keys. +rdbcompression yes + +# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. +# This makes the format more resistant to corruption but there is a performance +# hit to pay (around 10%) when saving and loading RDB files, so you can disable it +# for maximum performances. +# +# RDB files created with checksum disabled have a checksum of zero that will +# tell the loading code to skip the check. +rdbchecksum yes + +# The filename where to dump the DB +dbfilename dump.rdb + +# The working directory. +# +# The DB will be written inside this directory, with the filename specified +# above using the 'dbfilename' configuration directive. +# +# The Append Only File will also be created inside this directory. +# +# Note that you must specify a directory here, not a file name. +dir ./ + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. A few things to understand ASAP about Redis replication. +# +# 1) Redis replication is asynchronous, but you can configure a master to +# stop accepting writes if it appears to be not connected with at least +# a given number of slaves. +# 2) Redis slaves are able to perform a partial resynchronization with the +# master if the replication link is lost for a relatively small amount of +# time. You may want to configure the replication backlog size (see the next +# sections of this file) with a sensible value depending on your needs. +# 3) Replication is automatic and does not need user intervention. After a +# network partition slaves automatically try to reconnect to masters +# and resynchronize with them. +# +# slaveof + +# If the master is password protected (using the "requirepass" configuration +# directive below) it is possible to tell the slave to authenticate before +# starting the replication synchronization process, otherwise the master will +# refuse the slave request. +# +# masterauth + +# When a slave loses its connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of date data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale-data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# You can configure a slave instance to accept writes or not. Writing against +# a slave instance may be useful to store some ephemeral data (because data +# written on a slave will be easily deleted after resync with the master) but +# may also cause problems if clients are writing to it because of a +# misconfiguration. +# +# Since Redis 2.6 by default slaves are read-only. +# +# Note: read only slaves are not designed to be exposed to untrusted clients +# on the internet. It's just a protection layer against misuse of the instance. +# Still a read only slave exports by default all the administrative commands +# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve +# security of read only slaves using 'rename-command' to shadow all the +# administrative / dangerous commands. +slave-read-only yes + +# Replication SYNC strategy: disk or socket. +# +# ------------------------------------------------------- +# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY +# ------------------------------------------------------- +# +# New slaves and reconnecting slaves that are not able to continue the replication +# process just receiving differences, need to do what is called a "full +# synchronization". An RDB file is transmitted from the master to the slaves. +# The transmission can happen in two different ways: +# +# 1) Disk-backed: The Redis master creates a new process that writes the RDB +# file on disk. Later the file is transferred by the parent +# process to the slaves incrementally. +# 2) Diskless: The Redis master creates a new process that directly writes the +# RDB file to slave sockets, without touching the disk at all. +# +# With disk-backed replication, while the RDB file is generated, more slaves +# can be queued and served with the RDB file as soon as the current child producing +# the RDB file finishes its work. With diskless replication instead once +# the transfer starts, new slaves arriving will be queued and a new transfer +# will start when the current one terminates. +# +# When diskless replication is used, the master waits a configurable amount of +# time (in seconds) before starting the transfer in the hope that multiple slaves +# will arrive and the transfer can be parallelized. +# +# With slow disks and fast (large bandwidth) networks, diskless replication +# works better. +repl-diskless-sync no + +# When diskless replication is enabled, it is possible to configure the delay +# the server waits in order to spawn the child that transfers the RDB via socket +# to the slaves. +# +# This is important since once the transfer starts, it is not possible to serve +# new slaves arriving, that will be queued for the next RDB transfer, so the server +# waits a delay in order to let more slaves arrive. +# +# The delay is specified in seconds, and by default is 5 seconds. To disable +# it entirely just set it to 0 seconds and the transfer will start ASAP. +repl-diskless-sync-delay 5 + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets the replication timeout for: +# +# 1) Bulk transfer I/O during SYNC, from the point of view of slave. +# 2) Master timeout from the point of view of slaves (data, pings). +# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +# Disable TCP_NODELAY on the slave socket after SYNC? +# +# If you select "yes" Redis will use a smaller number of TCP packets and +# less bandwidth to send data to slaves. But this can add a delay for +# the data to appear on the slave side, up to 40 milliseconds with +# Linux kernels using a default configuration. +# +# If you select "no" the delay for data to appear on the slave side will +# be reduced but more bandwidth will be used for replication. +# +# By default we optimize for low latency, but in very high traffic conditions +# or when the master and slaves are many hops away, turning this to "yes" may +# be a good idea. +repl-disable-tcp-nodelay no + +# Set the replication backlog size. The backlog is a buffer that accumulates +# slave data when slaves are disconnected for some time, so that when a slave +# wants to reconnect again, often a full resync is not needed, but a partial +# resync is enough, just passing the portion of data the slave missed while +# disconnected. +# +# The bigger the replication backlog, the longer the time the slave can be +# disconnected and later be able to perform a partial resynchronization. +# +# The backlog is only allocated once there is at least a slave connected. +# +# repl-backlog-size 1mb + +# After a master has no longer connected slaves for some time, the backlog +# will be freed. The following option configures the amount of seconds that +# need to elapse, starting from the time the last slave disconnected, for +# the backlog buffer to be freed. +# +# A value of 0 means to never release the backlog. +# +# repl-backlog-ttl 3600 + +# The slave priority is an integer number published by Redis in the INFO output. +# It is used by Redis Sentinel in order to select a slave to promote into a +# master if the master is no longer working correctly. +# +# A slave with a low priority number is considered better for promotion, so +# for instance if there are three slaves with priority 10, 100, 25 Sentinel will +# pick the one with priority 10, that is the lowest. +# +# However a special priority of 0 marks the slave as not able to perform the +# role of master, so a slave with priority of 0 will never be selected by +# Redis Sentinel for promotion. +# +# By default the priority is 100. +slave-priority 100 + +# It is possible for a master to stop accepting writes if there are less than +# N slaves connected, having a lag less or equal than M seconds. +# +# The N slaves need to be in "online" state. +# +# The lag in seconds, that must be <= the specified value, is calculated from +# the last ping received from the slave, that is usually sent every second. +# +# This option does not GUARANTEE that N replicas will accept the write, but +# will limit the window of exposure for lost writes in case not enough slaves +# are available, to the specified number of seconds. +# +# For example to require at least 3 slaves with a lag <= 10 seconds use: +# +# min-slaves-to-write 3 +# min-slaves-max-lag 10 +# +# Setting one or the other to 0 disables the feature. +# +# By default min-slaves-to-write is set to 0 (feature disabled) and +# min-slaves-max-lag is set to 10. + +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +# Command renaming. +# +# It is possible to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# hard to guess so that it will still be available for internal-use tools +# but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possible to completely kill a command by renaming it into +# an empty string: +# +# rename-command CONFIG "" +# +# Please note that changing the name of commands that are logged into the +# AOF file or transmitted to slaves may cause problems. + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default +# this limit is set to 10000 clients, however if the Redis server is not +# able to configure the process file limit to allow for the specified limit +# the max number of allowed clients is set to the current file limit +# minus 32 (as Redis reserves a few file descriptors for internal uses). +# +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. +# +# maxclients 10000 + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys +# according to the eviction policy selected (see maxmemory-policy). +# +# If Redis can't remove keys according to the policy, or if the policy is +# set to 'noeviction', Redis will start to reply with errors to commands +# that would use more memory, like SET, LPUSH, and so on, and will continue +# to reply to read-only commands like GET. +# +# This option is usually useful when using Redis as an LRU cache, or to set +# a hard memory limit for an instance (using the 'noeviction' policy). +# +# WARNING: If you have slaves attached to an instance with maxmemory on, +# the size of the output buffers needed to feed the slaves are subtracted +# from the used memory count, so that network problems / resyncs will +# not trigger a loop where keys are evicted, and in turn the output +# buffer of slaves is full with DELs of keys evicted triggering the deletion +# of more keys, and so forth until the database is completely emptied. +# +# In short... if you have slaves attached it is suggested that you set a lower +# limit for maxmemory so that there is some free RAM on the system for slave +# output buffers (but this is not needed if the policy is 'noeviction'). +# +# maxmemory + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached. You can select among five behaviors: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key according to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys-random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with any of the above policies, Redis will return an error on write +# operations, when there are no suitable keys for eviction. +# +# At the date of writing these commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy noeviction + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can tune it for speed or +# accuracy. For default Redis will check five keys and pick the one that was +# used less recently, you can change the sample size using the following +# configuration directive. +# +# The default of 5 produces good enough results. 10 Approximates very closely +# true LRU but costs a bit more CPU. 3 is very fast but not very accurate. +# +# maxmemory-samples 5 + +############################## APPEND ONLY MODE ############################### + +# By default Redis asynchronously dumps the dataset on disk. This mode is +# good enough in many applications, but an issue with the Redis process or +# a power outage may result into a few minutes of writes lost (depending on +# the configured save points). +# +# The Append Only File is an alternative persistence mode that provides +# much better durability. For instance using the default data fsync policy +# (see later in the config file) Redis can lose just one second of writes in a +# dramatic event like a server power outage, or a single write if something +# wrong with the Redis process itself happens, but the operating system is +# still running correctly. +# +# AOF and RDB persistence can be enabled at the same time without problems. +# If the AOF is enabled on startup Redis will load the AOF, that is the file +# with the better durability guarantees. +# +# Please check http://redis.io/topics/persistence for more information. + +appendonly no + +# The name of the append only file (default: "appendonly.aof") + +appendfilename "appendonly.aof" + +# The fsync() call tells the Operating System to actually write data on disk +# instead of waiting for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. +# +# Redis supports three different modes: +# +# no: don't fsync, just let the OS flush the data when it wants. Faster. +# always: fsync after every write to the append only log. Slow, Safest. +# everysec: fsync only one time every second. Compromise. +# +# The default is "everysec", as that's usually the right compromise between +# speed and data safety. It's up to you to understand if you can relax this to +# "no" that will let the operating system flush the output buffer when +# it wants, for better performances (but if you can live with the idea of +# some data loss consider the default persistence mode that's snapshotting), +# or on the contrary, use "always" that's very slow but a bit safer than +# everysec. +# +# More details please check the following article: +# http://antirez.com/post/redis-persistence-demystified.html +# +# If unsure, use "everysec". + +# appendfsync always +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving, the durability of Redis is +# the same as "appendfsync none". In practical terms, this means that it is +# possible to lose up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. + +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size grows by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (if no rewrite has happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a percentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +# An AOF file may be found to be truncated at the end during the Redis +# startup process, when the AOF data gets loaded back into memory. +# This may happen when the system where Redis is running +# crashes, especially when an ext4 filesystem is mounted without the +# data=ordered option (however this can't happen when Redis itself +# crashes or aborts but the operating system still works correctly). +# +# Redis can either exit with an error when this happens, or load as much +# data as possible (the default now) and start if the AOF file is found +# to be truncated at the end. The following option controls this behavior. +# +# If aof-load-truncated is set to yes, a truncated AOF file is loaded and +# the Redis server starts emitting a log to inform the user of the event. +# Otherwise if the option is set to no, the server aborts with an error +# and refuses to start. When the option is set to no, the user requires +# to fix the AOF file using the "redis-check-aof" utility before to restart +# the server. +# +# Note that if the AOF file will be found to be corrupted in the middle +# the server will still exit with an error. This option only applies when +# Redis will try to read more data from the AOF file but not enough bytes +# will be found. +aof-load-truncated yes + +################################ LUA SCRIPTING ############################### + +# Max execution time of a Lua script in milliseconds. +# +# If the maximum execution time is reached Redis will log that a script is +# still in execution after the maximum allowed time and will start to +# reply to queries with an error. +# +# When a long running script exceeds the maximum execution time only the +# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be +# used to stop a script that did not yet called write commands. The second +# is the only way to shut down the server in the case a write command was +# already issued by the script but the user doesn't want to wait for the natural +# termination of the script. +# +# Set it to 0 or a negative value for unlimited execution without warnings. +lua-time-limit 5000 + +################################ REDIS CLUSTER ############################### +# +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however +# in order to mark it as "mature" we need to wait for a non trivial percentage +# of users to deploy it in production. +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# +# Normal Redis instances can't be part of a Redis Cluster; only nodes that are +# started as cluster nodes can. In order to start a Redis instance as a +# cluster node enable the cluster support uncommenting the following: +# +# cluster-enabled yes + +# Every cluster node has a cluster configuration file. This file is not +# intended to be edited by hand. It is created and updated by Redis nodes. +# Every Redis Cluster node requires a different cluster configuration file. +# Make sure that instances running in the same system do not have +# overlapping cluster configuration file names. +# +# cluster-config-file nodes-6379.conf + +# Cluster node timeout is the amount of milliseconds a node must be unreachable +# for it to be considered in failure state. +# Most other internal time limits are multiple of the node timeout. +# +# cluster-node-timeout 15000 + +# A slave of a failing master will avoid to start a failover if its data +# looks too old. +# +# There is no simple way for a slave to actually have a exact measure of +# its "data age", so the following two checks are performed: +# +# 1) If there are multiple slaves able to failover, they exchange messages +# in order to try to give an advantage to the slave with the best +# replication offset (more data from the master processed). +# Slaves will try to get their rank by offset, and apply to the start +# of the failover a delay proportional to their rank. +# +# 2) Every single slave computes the time of the last interaction with +# its master. This can be the last ping or command received (if the master +# is still in the "connected" state), or the time that elapsed since the +# disconnection with the master (if the replication link is currently down). +# If the last interaction is too old, the slave will not try to failover +# at all. +# +# The point "2" can be tuned by user. Specifically a slave will not perform +# the failover if, since the last interaction with the master, the time +# elapsed is greater than: +# +# (node-timeout * slave-validity-factor) + repl-ping-slave-period +# +# So for example if node-timeout is 30 seconds, and the slave-validity-factor +# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the +# slave will not try to failover if it was not able to talk with the master +# for longer than 310 seconds. +# +# A large slave-validity-factor may allow slaves with too old data to failover +# a master, while a too small value may prevent the cluster from being able to +# elect a slave at all. +# +# For maximum availability, it is possible to set the slave-validity-factor +# to a value of 0, which means, that slaves will always try to failover the +# master regardless of the last time they interacted with the master. +# (However they'll always try to apply a delay proportional to their +# offset rank). +# +# Zero is the only value able to guarantee that when all the partitions heal +# the cluster will always be able to continue. +# +# cluster-slave-validity-factor 10 + +# Cluster slaves are able to migrate to orphaned masters, that are masters +# that are left without working slaves. This improves the cluster ability +# to resist to failures as otherwise an orphaned master can't be failed over +# in case of failure if it has no working slaves. +# +# Slaves migrate to orphaned masters only if there are still at least a +# given number of other working slaves for their old master. This number +# is the "migration barrier". A migration barrier of 1 means that a slave +# will migrate only if there is at least 1 other working slave for its master +# and so forth. It usually reflects the number of slaves you want for every +# master in your cluster. +# +# Default is 1 (slaves migrate only if their masters remain with at least +# one slave). To disable migration just set it to a very large value. +# A value of 0 can be set but is useful only for debugging and dangerous +# in production. +# +# cluster-migration-barrier 1 + +# By default Redis Cluster nodes stop accepting queries if they detect there +# is at least an hash slot uncovered (no available node is serving it). +# This way if the cluster is partially down (for example a range of hash slots +# are no longer covered) all the cluster becomes, eventually, unavailable. +# It automatically returns available as soon as all the slots are covered again. +# +# However sometimes you want the subset of the cluster which is working, +# to continue to accept queries for the part of the key space that is still +# covered. In order to do so, just set the cluster-require-full-coverage +# option to no. +# +# cluster-require-full-coverage yes + +# In order to setup your cluster make sure to read the documentation +# available at http://redis.io web site. + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 128 + +################################ LATENCY MONITOR ############################## + +# The Redis latency monitoring subsystem samples different operations +# at runtime in order to collect data related to possible sources of +# latency of a Redis instance. +# +# Via the LATENCY command this information is available to the user that can +# print graphs and obtain reports. +# +# The system only logs operations that were performed in a time equal or +# greater than the amount of milliseconds specified via the +# latency-monitor-threshold configuration directive. When its value is set +# to zero, the latency monitor is turned off. +# +# By default latency monitoring is disabled since it is mostly not needed +# if you don't have latency issues, and collecting data has a performance +# impact, that while very small, can be measured under big load. Latency +# monitoring can easily be enabled at runtime using the command +# "CONFIG SET latency-monitor-threshold " if needed. +latency-monitor-threshold 0 + +############################# EVENT NOTIFICATION ############################## + +# Redis can notify Pub/Sub clients about events happening in the key space. +# This feature is documented at http://redis.io/topics/notifications +# +# For instance if keyspace events notification is enabled, and a client +# performs a DEL operation on key "foo" stored in the Database 0, two +# messages will be published via Pub/Sub: +# +# PUBLISH __keyspace@0__:foo del +# PUBLISH __keyevent@0__:del foo +# +# It is possible to select the events that Redis will notify among a set +# of classes. Every class is identified by a single character: +# +# K Keyspace events, published with __keyspace@__ prefix. +# E Keyevent events, published with __keyevent@__ prefix. +# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... +# $ String commands +# l List commands +# s Set commands +# h Hash commands +# z Sorted set commands +# x Expired events (events generated every time a key expires) +# e Evicted events (events generated when a key is evicted for maxmemory) +# A Alias for g$lshzxe, so that the "AKE" string means all the events. +# +# The "notify-keyspace-events" takes as argument a string that is composed +# of zero or multiple characters. The empty string means that notifications +# are disabled. +# +# Example: to enable list and generic events, from the point of view of the +# event name, use: +# +# notify-keyspace-events Elg +# +# Example 2: to get the stream of the expired keys subscribing to channel +# name __keyevent@0__:expired use: +# +# notify-keyspace-events Ex +# +# By default all notifications are disabled because most users don't need +# this feature and the feature has some overhead. Note that if you don't +# specify at least one of K or E, no events will be delivered. +notify-keyspace-events "" + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded using a memory efficient data structure when they have a +# small number of entries, and the biggest entry does not exceed a given +# threshold. These thresholds can be configured using the following directives. +hash-max-ziplist-entries 512 +hash-max-ziplist-value 64 + +# Similarly to hashes, small lists are also encoded in a special way in order +# to save a lot of space. The special representation is only used when +# you are under the following limits: +list-max-ziplist-entries 512 +list-max-ziplist-value 64 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happen to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# HyperLogLog sparse representation bytes limit. The limit includes the +# 16 bytes header. When an HyperLogLog using the sparse representation crosses +# this limit, it is converted into the dense representation. +# +# A value greater than 16000 is totally useless, since at that point the +# dense representation is more memory efficient. +# +# The suggested value is ~ 3000 in order to have the benefits of +# the space efficient encoding without slowing down too much PFADD, +# which is O(N) with the sparse encoding. The value can be raised to +# ~ 10000 when CPU is not a concern, but space is, and the data set is +# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. +hll-sparse-max-bytes 3000 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation Redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into a hash table +# that is rehashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# actively rehash the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply from time to time +# to queries with 2 milliseconds delay. +# +# use "activerehashing yes" if you don't have such hard requirements but +# want to free memory asap when possible. +activerehashing yes + +# The client output buffer limits can be used to force disconnection of clients +# that are not reading data from the server fast enough for some reason (a +# common reason is that a Pub/Sub client can't consume messages as fast as the +# publisher can produce them). +# +# The limit can be set differently for the three different classes of clients: +# +# normal -> normal clients including MONITOR clients +# slave -> slave clients +# pubsub -> clients subscribed to at least one pubsub channel or pattern +# +# The syntax of every client-output-buffer-limit directive is the following: +# +# client-output-buffer-limit +# +# A client is immediately disconnected once the hard limit is reached, or if +# the soft limit is reached and remains reached for the specified number of +# seconds (continuously). +# So for instance if the hard limit is 32 megabytes and the soft limit is +# 16 megabytes / 10 seconds, the client will get disconnected immediately +# if the size of the output buffers reach 32 megabytes, but will also get +# disconnected if the client reaches 16 megabytes and continuously overcomes +# the limit for 10 seconds. +# +# By default normal clients are not limited because they don't receive data +# without asking (in a push way), but just after a request, so only +# asynchronous clients may create a scenario where data is requested faster +# than it can read. +# +# Instead there is a default limit for pubsub and slave clients, since +# subscribers and slaves receive data in a push fashion. +# +# Both the hard or the soft limit can be disabled by setting them to zero. +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 256mb 64mb 60 +client-output-buffer-limit pubsub 32mb 8mb 60 + +# Redis calls an internal function to perform many background tasks, like +# closing connections of clients in timeout, purging expired keys that are +# never requested, and so forth. +# +# Not all tasks are performed with the same frequency, but Redis checks for +# tasks to perform according to the specified "hz" value. +# +# By default "hz" is set to 10. Raising the value will use more CPU when +# Redis is idle, but at the same time will make Redis more responsive when +# there are many keys expiring at the same time, and timeouts may be +# handled with more precision. +# +# The range is between 1 and 500, however a value over 100 is usually not +# a good idea. Most users should use the default of 10 and raise this up to +# 100 only in environments where very low latency is required. +hz 10 + +# When a child rewrites the AOF file, if the following option is enabled +# the file will be fsync-ed every 32 MB of data generated. This is useful +# in order to commit the file to the disk more incrementally and avoid +# big latency spikes. +aof-rewrite-incremental-fsync yes diff --git a/codes/redis/redis-config/sentinel3/linux/sentinel.conf b/codes/redis/redis-config/sentinel3/linux/sentinel.conf new file mode 100644 index 0000000..39d1044 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/sentinel.conf @@ -0,0 +1,181 @@ +# Example sentinel.conf + +# port +# The port that this sentinel instance will run on +port 26379 + +# sentinel announce-ip +# sentinel announce-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 +# 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 interfere with administrative tasks such as +# unmounting filesystems. +dir /tmp + +# sentinel monitor +# +# Tells Sentinel to monitor this master, and to consider it in O_DOWN +# (Objectively Down) state only if at least 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 6379 2 + +# sentinel auth-pass +# +# 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 +# +# 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). +# +# Default is 30 seconds. +sentinel down-after-milliseconds mymaster 30000 + +# sentinel parallel-syncs +# +# 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. +sentinel parallel-syncs mymaster 1 + +# sentinel failover-timeout +# +# 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. +# +# 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 +# +# 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. +# +# Example: +# +# sentinel notification-script mymaster /var/redis/notify.sh + +# CLIENTS RECONFIGURATION SCRIPT +# +# sentinel client-reconfig-script +# +# 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: +# +# +# +# is currently always "failover" +# 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 + + diff --git a/codes/redis/redis-config/sentinel3/linux/server-6380/redis.conf b/codes/redis/redis-config/sentinel3/linux/server-6380/redis.conf new file mode 100644 index 0000000..358715a --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6380/redis.conf @@ -0,0 +1,5 @@ +# Relative to ./sentinel3/linux +include redis.conf + +port 6380 +dir ./server-6380/state diff --git a/codes/redis/redis-config/sentinel3/linux/server-6380/sentinel.conf b/codes/redis/redis-config/sentinel3/linux/server-6380/sentinel.conf new file mode 100644 index 0000000..c12c075 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6380/sentinel.conf @@ -0,0 +1,5 @@ +# Relative to ./sentinel3/linux + +port 26380 +dir ./server-6380/state +sentinel monitor mymaster 127.0.0.1 6380 2 diff --git a/codes/redis/redis-config/sentinel3/linux/server-6380/start.sh b/codes/redis/redis-config/sentinel3/linux/server-6380/start.sh new file mode 100644 index 0000000..bfa8135 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6380/start.sh @@ -0,0 +1,7 @@ +redis_server=redis-server +redis_sentinel=redis-sentinel + +pushd .. +$redis_server server-6380/redis.conf & +$redis_sentinel server-6380/sentinel.conf & +popd diff --git a/codes/redis/redis-config/sentinel3/linux/server-6380/state/dump.rdb b/codes/redis/redis-config/sentinel3/linux/server-6380/state/dump.rdb new file mode 100644 index 0000000..56af04e --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6380/state/dump.rdb @@ -0,0 +1 @@ +REDIS0006ܳCZV \ No newline at end of file diff --git a/codes/redis/redis-config/sentinel3/linux/server-6380/stop.sh b/codes/redis/redis-config/sentinel3/linux/server-6380/stop.sh new file mode 100644 index 0000000..b58719d --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6380/stop.sh @@ -0,0 +1,6 @@ +redis_cli=redis-cli + +pushd .. +$redis_cli -p 26380 SHUTDOWN NOSAVE +$redis_cli -p 6380 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/linux/server-6381/redis.conf b/codes/redis/redis-config/sentinel3/linux/server-6381/redis.conf new file mode 100644 index 0000000..6cf71f7 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6381/redis.conf @@ -0,0 +1,6 @@ +# Relative to ./sentinel3/linux +include redis.conf + +port 6381 +dir ./server-6381/state +slaveof 127.0.0.1 6380 diff --git a/codes/redis/redis-config/sentinel3/linux/server-6381/sentinel.conf b/codes/redis/redis-config/sentinel3/linux/server-6381/sentinel.conf new file mode 100644 index 0000000..abf33c0 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6381/sentinel.conf @@ -0,0 +1,6 @@ +# Relative to ./sentinel3/linux + +port 26381 +dir ./server-6381/state +sentinel monitor mymaster 127.0.0.1 6380 2 + diff --git a/codes/redis/redis-config/sentinel3/linux/server-6381/start.sh b/codes/redis/redis-config/sentinel3/linux/server-6381/start.sh new file mode 100644 index 0000000..43e96fd --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6381/start.sh @@ -0,0 +1,7 @@ +redis_server=redis-server +redis_sentinel=redis-sentinel + +pushd .. +$redis_server server-6381/redis.conf & +$redis_sentinel server-6381/sentinel.conf & +popd diff --git a/codes/redis/redis-config/sentinel3/linux/server-6381/state/dump.rdb b/codes/redis/redis-config/sentinel3/linux/server-6381/state/dump.rdb new file mode 100644 index 0000000..56af04e --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6381/state/dump.rdb @@ -0,0 +1 @@ +REDIS0006ܳCZV \ No newline at end of file diff --git a/codes/redis/redis-config/sentinel3/linux/server-6381/stop.sh b/codes/redis/redis-config/sentinel3/linux/server-6381/stop.sh new file mode 100644 index 0000000..737929b --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6381/stop.sh @@ -0,0 +1,6 @@ +redis_cli=redis-cli + +pushd .. +$redis_cli -p 26381 SHUTDOWN NOSAVE +$redis_cli -p 6381 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/linux/server-6382/redis.conf b/codes/redis/redis-config/sentinel3/linux/server-6382/redis.conf new file mode 100644 index 0000000..ed5eb1a --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6382/redis.conf @@ -0,0 +1,6 @@ +# Relative to ./sentinel3/linux +include redis.conf + +port 6382 +dir ./server-6382/state +slaveof 127.0.0.1 6380 diff --git a/codes/redis/redis-config/sentinel3/linux/server-6382/sentinel.conf b/codes/redis/redis-config/sentinel3/linux/server-6382/sentinel.conf new file mode 100644 index 0000000..fe3e965 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6382/sentinel.conf @@ -0,0 +1,6 @@ +# Relative to ./sentinel3/linux + +port 26382 +dir ./server-6382/state +sentinel monitor mymaster 127.0.0.1 6380 2 + diff --git a/codes/redis/redis-config/sentinel3/linux/server-6382/start.sh b/codes/redis/redis-config/sentinel3/linux/server-6382/start.sh new file mode 100644 index 0000000..a3ac64c --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6382/start.sh @@ -0,0 +1,7 @@ +redis_server=redis-server +redis_sentinel=redis-sentinel + +pushd .. +$redis_server server-6382/redis.conf & +$redis_sentinel server-6382/sentinel.conf & +popd diff --git a/codes/redis/redis-config/sentinel3/linux/server-6382/state/dump.rdb b/codes/redis/redis-config/sentinel3/linux/server-6382/state/dump.rdb new file mode 100644 index 0000000..56af04e --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6382/state/dump.rdb @@ -0,0 +1 @@ +REDIS0006ܳCZV \ No newline at end of file diff --git a/codes/redis/redis-config/sentinel3/linux/server-6382/stop.sh b/codes/redis/redis-config/sentinel3/linux/server-6382/stop.sh new file mode 100644 index 0000000..bc2e44a --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/server-6382/stop.sh @@ -0,0 +1,6 @@ +redis_cli=redis-cli + +pushd .. +$redis_cli -p 26382 SHUTDOWN NOSAVE +$redis_cli -p 6382 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/linux/start-all.sh b/codes/redis/redis-config/sentinel3/linux/start-all.sh new file mode 100644 index 0000000..de24243 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/start-all.sh @@ -0,0 +1,17 @@ +redis_server=redis-server +redis_sentinel=redis-sentinel +redis_cli=redis-cli + +$redis_server server-6380/redis.conf & +$redis_sentinel server-6380/sentinel.conf & + +$redis_server server-6381/redis.conf & +$redis_sentinel server-6381/sentinel.conf & + +$redis_server server-6382/redis.conf & +$redis_sentinel server-6382/sentinel.conf & + +read -n1 -r -p "Press any key to see sentinel info on masters and slaves..." + +$redis_cli -p 26380 sentinel master mymaster +$redis_cli -p 26381 sentinel slaves mymaster diff --git a/codes/redis/redis-config/sentinel3/linux/stop-all.sh b/codes/redis/redis-config/sentinel3/linux/stop-all.sh new file mode 100644 index 0000000..c6a712d --- /dev/null +++ b/codes/redis/redis-config/sentinel3/linux/stop-all.sh @@ -0,0 +1,9 @@ +redis_cli=redis-cli + +$redis_cli -p 26382 SHUTDOWN NOSAVE +$redis_cli -p 26381 SHUTDOWN NOSAVE +$redis_cli -p 26380 SHUTDOWN NOSAVE + +$redis_cli -p 6382 SHUTDOWN NOSAVE +$redis_cli -p 6381 SHUTDOWN NOSAVE +$redis_cli -p 6380 SHUTDOWN NOSAVE diff --git a/codes/redis/redis-config/sentinel3/osx/redis.conf b/codes/redis/redis-config/sentinel3/osx/redis.conf new file mode 100644 index 0000000..2206f2d --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/redis.conf @@ -0,0 +1,938 @@ +# Redis configuration file example + +# Note on units: when memory size is needed, it is possible to specify +# it in the usual form of 1k 5GB 4M and so forth: +# +# 1k => 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis servers but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# from admin or Redis Sentinel. Since Redis always uses the last processed +# line as value of a configuration directive, you'd better put includes +# at the beginning of this file to avoid overwriting config change at runtime. +# +# If instead you are interested in using includes to override configuration +# options, it is better to use include as the last line. +# +# include /path/to/local.conf +# include /path/to/other.conf + +################################ GENERAL ##################################### + +# By default Redis does not run as a daemon. Use 'yes' if you need it. +# Note that Redis will write a pid file in /var/run/redis.pid when daemonized. +daemonize no + +# When running daemonized, Redis writes a pid file in /var/run/redis.pid by +# default. You can specify a custom pid file location here. +pidfile /var/run/redis.pid + +# Accept connections on the specified port, default is 6379. +# If port 0 is specified Redis will not listen on a TCP socket. +port 6379 + +# TCP listen() backlog. +# +# In high requests-per-second environments you need an high backlog in order +# to avoid slow clients connections issues. Note that the Linux kernel +# will silently truncate it to the value of /proc/sys/net/core/somaxconn so +# make sure to raise both the value of somaxconn and tcp_max_syn_backlog +# in order to get the desired effect. +tcp-backlog 511 + +# By default Redis listens for connections from all the network interfaces +# available on the server. It is possible to listen to just one or multiple +# interfaces using the "bind" configuration directive, followed by one or +# more IP addresses. +# +# Examples: +# +# bind 192.168.1.100 10.0.0.1 +# bind 127.0.0.1 + +# Specify the path for the Unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /tmp/redis.sock +# unixsocketperm 700 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 0 + +# TCP keepalive. +# +# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence +# of communication. This is useful for two reasons: +# +# 1) Detect dead peers. +# 2) Take the connection alive from the point of view of network +# equipment in the middle. +# +# On Linux, the specified value (in seconds) is the period used to send ACKs. +# Note that to close the connection the double of the time is needed. +# On other kernels the period depends on the kernel configuration. +# +# A reasonable value for this option is 60 seconds. +tcp-keepalive 0 + +# Specify the server verbosity level. +# This can be one of: +# debug (a lot of information, useful for development/testing) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +loglevel notice + +# Specify the log file name. Also the empty string can be used to force +# Redis to log on the standard output. Note that if you use standard +# output for logging but daemonize, logs will be sent to /dev/null +logfile "" + +# To enable logging to the system logger, just set 'syslog-enabled' to yes, +# and optionally update the other syslog parameters to suit your needs. +# syslog-enabled no + +# Specify the syslog identity. +# syslog-ident redis + +# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. +# syslog-facility local0 + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################ SNAPSHOTTING ################################ +# +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +# +# Note: you can disable saving completely by commenting out all "save" lines. +# +# It is also possible to remove all the previously configured save +# points by adding a save directive with a single empty string argument +# like in the following example: +# +# save "" + +save 900 1 +save 300 10 +save 60 10000 + +# By default Redis will stop accepting writes if RDB snapshots are enabled +# (at least one save point) and the latest background save failed. +# This will make the user aware (in a hard way) that data is not persisting +# on disk properly, otherwise chances are that no one will notice and some +# disaster will happen. +# +# If the background saving process will start working again Redis will +# automatically allow writes again. +# +# However if you have setup your proper monitoring of the Redis server +# and persistence, you may want to disable this feature so that Redis will +# continue to work as usual even if there are problems with disk, +# permissions, and so forth. +stop-writes-on-bgsave-error yes + +# Compress string objects using LZF when dump .rdb databases? +# For default that's set to 'yes' as it's almost always a win. +# If you want to save some CPU in the saving child set it to 'no' but +# the dataset will likely be bigger if you have compressible values or keys. +rdbcompression yes + +# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. +# This makes the format more resistant to corruption but there is a performance +# hit to pay (around 10%) when saving and loading RDB files, so you can disable it +# for maximum performances. +# +# RDB files created with checksum disabled have a checksum of zero that will +# tell the loading code to skip the check. +rdbchecksum yes + +# The filename where to dump the DB +dbfilename dump.rdb + +# The working directory. +# +# The DB will be written inside this directory, with the filename specified +# above using the 'dbfilename' configuration directive. +# +# The Append Only File will also be created inside this directory. +# +# Note that you must specify a directory here, not a file name. +dir ./ + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. A few things to understand ASAP about Redis replication. +# +# 1) Redis replication is asynchronous, but you can configure a master to +# stop accepting writes if it appears to be not connected with at least +# a given number of slaves. +# 2) Redis slaves are able to perform a partial resynchronization with the +# master if the replication link is lost for a relatively small amount of +# time. You may want to configure the replication backlog size (see the next +# sections of this file) with a sensible value depending on your needs. +# 3) Replication is automatic and does not need user intervention. After a +# network partition slaves automatically try to reconnect to masters +# and resynchronize with them. +# +# slaveof + +# If the master is password protected (using the "requirepass" configuration +# directive below) it is possible to tell the slave to authenticate before +# starting the replication synchronization process, otherwise the master will +# refuse the slave request. +# +# masterauth + +# When a slave loses its connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of date data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale-data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# You can configure a slave instance to accept writes or not. Writing against +# a slave instance may be useful to store some ephemeral data (because data +# written on a slave will be easily deleted after resync with the master) but +# may also cause problems if clients are writing to it because of a +# misconfiguration. +# +# Since Redis 2.6 by default slaves are read-only. +# +# Note: read only slaves are not designed to be exposed to untrusted clients +# on the internet. It's just a protection layer against misuse of the instance. +# Still a read only slave exports by default all the administrative commands +# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve +# security of read only slaves using 'rename-command' to shadow all the +# administrative / dangerous commands. +slave-read-only yes + +# Replication SYNC strategy: disk or socket. +# +# ------------------------------------------------------- +# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY +# ------------------------------------------------------- +# +# New slaves and reconnecting slaves that are not able to continue the replication +# process just receiving differences, need to do what is called a "full +# synchronization". An RDB file is transmitted from the master to the slaves. +# The transmission can happen in two different ways: +# +# 1) Disk-backed: The Redis master creates a new process that writes the RDB +# file on disk. Later the file is transferred by the parent +# process to the slaves incrementally. +# 2) Diskless: The Redis master creates a new process that directly writes the +# RDB file to slave sockets, without touching the disk at all. +# +# With disk-backed replication, while the RDB file is generated, more slaves +# can be queued and served with the RDB file as soon as the current child producing +# the RDB file finishes its work. With diskless replication instead once +# the transfer starts, new slaves arriving will be queued and a new transfer +# will start when the current one terminates. +# +# When diskless replication is used, the master waits a configurable amount of +# time (in seconds) before starting the transfer in the hope that multiple slaves +# will arrive and the transfer can be parallelized. +# +# With slow disks and fast (large bandwidth) networks, diskless replication +# works better. +repl-diskless-sync no + +# When diskless replication is enabled, it is possible to configure the delay +# the server waits in order to spawn the child that transfers the RDB via socket +# to the slaves. +# +# This is important since once the transfer starts, it is not possible to serve +# new slaves arriving, that will be queued for the next RDB transfer, so the server +# waits a delay in order to let more slaves arrive. +# +# The delay is specified in seconds, and by default is 5 seconds. To disable +# it entirely just set it to 0 seconds and the transfer will start ASAP. +repl-diskless-sync-delay 5 + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets the replication timeout for: +# +# 1) Bulk transfer I/O during SYNC, from the point of view of slave. +# 2) Master timeout from the point of view of slaves (data, pings). +# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +# Disable TCP_NODELAY on the slave socket after SYNC? +# +# If you select "yes" Redis will use a smaller number of TCP packets and +# less bandwidth to send data to slaves. But this can add a delay for +# the data to appear on the slave side, up to 40 milliseconds with +# Linux kernels using a default configuration. +# +# If you select "no" the delay for data to appear on the slave side will +# be reduced but more bandwidth will be used for replication. +# +# By default we optimize for low latency, but in very high traffic conditions +# or when the master and slaves are many hops away, turning this to "yes" may +# be a good idea. +repl-disable-tcp-nodelay no + +# Set the replication backlog size. The backlog is a buffer that accumulates +# slave data when slaves are disconnected for some time, so that when a slave +# wants to reconnect again, often a full resync is not needed, but a partial +# resync is enough, just passing the portion of data the slave missed while +# disconnected. +# +# The bigger the replication backlog, the longer the time the slave can be +# disconnected and later be able to perform a partial resynchronization. +# +# The backlog is only allocated once there is at least a slave connected. +# +# repl-backlog-size 1mb + +# After a master has no longer connected slaves for some time, the backlog +# will be freed. The following option configures the amount of seconds that +# need to elapse, starting from the time the last slave disconnected, for +# the backlog buffer to be freed. +# +# A value of 0 means to never release the backlog. +# +# repl-backlog-ttl 3600 + +# The slave priority is an integer number published by Redis in the INFO output. +# It is used by Redis Sentinel in order to select a slave to promote into a +# master if the master is no longer working correctly. +# +# A slave with a low priority number is considered better for promotion, so +# for instance if there are three slaves with priority 10, 100, 25 Sentinel will +# pick the one with priority 10, that is the lowest. +# +# However a special priority of 0 marks the slave as not able to perform the +# role of master, so a slave with priority of 0 will never be selected by +# Redis Sentinel for promotion. +# +# By default the priority is 100. +slave-priority 100 + +# It is possible for a master to stop accepting writes if there are less than +# N slaves connected, having a lag less or equal than M seconds. +# +# The N slaves need to be in "online" state. +# +# The lag in seconds, that must be <= the specified value, is calculated from +# the last ping received from the slave, that is usually sent every second. +# +# This option does not GUARANTEE that N replicas will accept the write, but +# will limit the window of exposure for lost writes in case not enough slaves +# are available, to the specified number of seconds. +# +# For example to require at least 3 slaves with a lag <= 10 seconds use: +# +# min-slaves-to-write 3 +# min-slaves-max-lag 10 +# +# Setting one or the other to 0 disables the feature. +# +# By default min-slaves-to-write is set to 0 (feature disabled) and +# min-slaves-max-lag is set to 10. + +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +# Command renaming. +# +# It is possible to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# hard to guess so that it will still be available for internal-use tools +# but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possible to completely kill a command by renaming it into +# an empty string: +# +# rename-command CONFIG "" +# +# Please note that changing the name of commands that are logged into the +# AOF file or transmitted to slaves may cause problems. + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default +# this limit is set to 10000 clients, however if the Redis server is not +# able to configure the process file limit to allow for the specified limit +# the max number of allowed clients is set to the current file limit +# minus 32 (as Redis reserves a few file descriptors for internal uses). +# +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. +# +# maxclients 10000 + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys +# according to the eviction policy selected (see maxmemory-policy). +# +# If Redis can't remove keys according to the policy, or if the policy is +# set to 'noeviction', Redis will start to reply with errors to commands +# that would use more memory, like SET, LPUSH, and so on, and will continue +# to reply to read-only commands like GET. +# +# This option is usually useful when using Redis as an LRU cache, or to set +# a hard memory limit for an instance (using the 'noeviction' policy). +# +# WARNING: If you have slaves attached to an instance with maxmemory on, +# the size of the output buffers needed to feed the slaves are subtracted +# from the used memory count, so that network problems / resyncs will +# not trigger a loop where keys are evicted, and in turn the output +# buffer of slaves is full with DELs of keys evicted triggering the deletion +# of more keys, and so forth until the database is completely emptied. +# +# In short... if you have slaves attached it is suggested that you set a lower +# limit for maxmemory so that there is some free RAM on the system for slave +# output buffers (but this is not needed if the policy is 'noeviction'). +# +# maxmemory + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached. You can select among five behaviors: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key according to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys-random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with any of the above policies, Redis will return an error on write +# operations, when there are no suitable keys for eviction. +# +# At the date of writing these commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy noeviction + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can tune it for speed or +# accuracy. For default Redis will check five keys and pick the one that was +# used less recently, you can change the sample size using the following +# configuration directive. +# +# The default of 5 produces good enough results. 10 Approximates very closely +# true LRU but costs a bit more CPU. 3 is very fast but not very accurate. +# +# maxmemory-samples 5 + +############################## APPEND ONLY MODE ############################### + +# By default Redis asynchronously dumps the dataset on disk. This mode is +# good enough in many applications, but an issue with the Redis process or +# a power outage may result into a few minutes of writes lost (depending on +# the configured save points). +# +# The Append Only File is an alternative persistence mode that provides +# much better durability. For instance using the default data fsync policy +# (see later in the config file) Redis can lose just one second of writes in a +# dramatic event like a server power outage, or a single write if something +# wrong with the Redis process itself happens, but the operating system is +# still running correctly. +# +# AOF and RDB persistence can be enabled at the same time without problems. +# If the AOF is enabled on startup Redis will load the AOF, that is the file +# with the better durability guarantees. +# +# Please check http://redis.io/topics/persistence for more information. + +appendonly no + +# The name of the append only file (default: "appendonly.aof") + +appendfilename "appendonly.aof" + +# The fsync() call tells the Operating System to actually write data on disk +# instead of waiting for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. +# +# Redis supports three different modes: +# +# no: don't fsync, just let the OS flush the data when it wants. Faster. +# always: fsync after every write to the append only log. Slow, Safest. +# everysec: fsync only one time every second. Compromise. +# +# The default is "everysec", as that's usually the right compromise between +# speed and data safety. It's up to you to understand if you can relax this to +# "no" that will let the operating system flush the output buffer when +# it wants, for better performances (but if you can live with the idea of +# some data loss consider the default persistence mode that's snapshotting), +# or on the contrary, use "always" that's very slow but a bit safer than +# everysec. +# +# More details please check the following article: +# http://antirez.com/post/redis-persistence-demystified.html +# +# If unsure, use "everysec". + +# appendfsync always +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving, the durability of Redis is +# the same as "appendfsync none". In practical terms, this means that it is +# possible to lose up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. + +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size grows by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (if no rewrite has happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a percentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +# An AOF file may be found to be truncated at the end during the Redis +# startup process, when the AOF data gets loaded back into memory. +# This may happen when the system where Redis is running +# crashes, especially when an ext4 filesystem is mounted without the +# data=ordered option (however this can't happen when Redis itself +# crashes or aborts but the operating system still works correctly). +# +# Redis can either exit with an error when this happens, or load as much +# data as possible (the default now) and start if the AOF file is found +# to be truncated at the end. The following option controls this behavior. +# +# If aof-load-truncated is set to yes, a truncated AOF file is loaded and +# the Redis server starts emitting a log to inform the user of the event. +# Otherwise if the option is set to no, the server aborts with an error +# and refuses to start. When the option is set to no, the user requires +# to fix the AOF file using the "redis-check-aof" utility before to restart +# the server. +# +# Note that if the AOF file will be found to be corrupted in the middle +# the server will still exit with an error. This option only applies when +# Redis will try to read more data from the AOF file but not enough bytes +# will be found. +aof-load-truncated yes + +################################ LUA SCRIPTING ############################### + +# Max execution time of a Lua script in milliseconds. +# +# If the maximum execution time is reached Redis will log that a script is +# still in execution after the maximum allowed time and will start to +# reply to queries with an error. +# +# When a long running script exceeds the maximum execution time only the +# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be +# used to stop a script that did not yet called write commands. The second +# is the only way to shut down the server in the case a write command was +# already issued by the script but the user doesn't want to wait for the natural +# termination of the script. +# +# Set it to 0 or a negative value for unlimited execution without warnings. +lua-time-limit 5000 + +################################ REDIS CLUSTER ############################### +# +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however +# in order to mark it as "mature" we need to wait for a non trivial percentage +# of users to deploy it in production. +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# +# Normal Redis instances can't be part of a Redis Cluster; only nodes that are +# started as cluster nodes can. In order to start a Redis instance as a +# cluster node enable the cluster support uncommenting the following: +# +# cluster-enabled yes + +# Every cluster node has a cluster configuration file. This file is not +# intended to be edited by hand. It is created and updated by Redis nodes. +# Every Redis Cluster node requires a different cluster configuration file. +# Make sure that instances running in the same system do not have +# overlapping cluster configuration file names. +# +# cluster-config-file nodes-6379.conf + +# Cluster node timeout is the amount of milliseconds a node must be unreachable +# for it to be considered in failure state. +# Most other internal time limits are multiple of the node timeout. +# +# cluster-node-timeout 15000 + +# A slave of a failing master will avoid to start a failover if its data +# looks too old. +# +# There is no simple way for a slave to actually have a exact measure of +# its "data age", so the following two checks are performed: +# +# 1) If there are multiple slaves able to failover, they exchange messages +# in order to try to give an advantage to the slave with the best +# replication offset (more data from the master processed). +# Slaves will try to get their rank by offset, and apply to the start +# of the failover a delay proportional to their rank. +# +# 2) Every single slave computes the time of the last interaction with +# its master. This can be the last ping or command received (if the master +# is still in the "connected" state), or the time that elapsed since the +# disconnection with the master (if the replication link is currently down). +# If the last interaction is too old, the slave will not try to failover +# at all. +# +# The point "2" can be tuned by user. Specifically a slave will not perform +# the failover if, since the last interaction with the master, the time +# elapsed is greater than: +# +# (node-timeout * slave-validity-factor) + repl-ping-slave-period +# +# So for example if node-timeout is 30 seconds, and the slave-validity-factor +# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the +# slave will not try to failover if it was not able to talk with the master +# for longer than 310 seconds. +# +# A large slave-validity-factor may allow slaves with too old data to failover +# a master, while a too small value may prevent the cluster from being able to +# elect a slave at all. +# +# For maximum availability, it is possible to set the slave-validity-factor +# to a value of 0, which means, that slaves will always try to failover the +# master regardless of the last time they interacted with the master. +# (However they'll always try to apply a delay proportional to their +# offset rank). +# +# Zero is the only value able to guarantee that when all the partitions heal +# the cluster will always be able to continue. +# +# cluster-slave-validity-factor 10 + +# Cluster slaves are able to migrate to orphaned masters, that are masters +# that are left without working slaves. This improves the cluster ability +# to resist to failures as otherwise an orphaned master can't be failed over +# in case of failure if it has no working slaves. +# +# Slaves migrate to orphaned masters only if there are still at least a +# given number of other working slaves for their old master. This number +# is the "migration barrier". A migration barrier of 1 means that a slave +# will migrate only if there is at least 1 other working slave for its master +# and so forth. It usually reflects the number of slaves you want for every +# master in your cluster. +# +# Default is 1 (slaves migrate only if their masters remain with at least +# one slave). To disable migration just set it to a very large value. +# A value of 0 can be set but is useful only for debugging and dangerous +# in production. +# +# cluster-migration-barrier 1 + +# By default Redis Cluster nodes stop accepting queries if they detect there +# is at least an hash slot uncovered (no available node is serving it). +# This way if the cluster is partially down (for example a range of hash slots +# are no longer covered) all the cluster becomes, eventually, unavailable. +# It automatically returns available as soon as all the slots are covered again. +# +# However sometimes you want the subset of the cluster which is working, +# to continue to accept queries for the part of the key space that is still +# covered. In order to do so, just set the cluster-require-full-coverage +# option to no. +# +# cluster-require-full-coverage yes + +# In order to setup your cluster make sure to read the documentation +# available at http://redis.io web site. + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 128 + +################################ LATENCY MONITOR ############################## + +# The Redis latency monitoring subsystem samples different operations +# at runtime in order to collect data related to possible sources of +# latency of a Redis instance. +# +# Via the LATENCY command this information is available to the user that can +# print graphs and obtain reports. +# +# The system only logs operations that were performed in a time equal or +# greater than the amount of milliseconds specified via the +# latency-monitor-threshold configuration directive. When its value is set +# to zero, the latency monitor is turned off. +# +# By default latency monitoring is disabled since it is mostly not needed +# if you don't have latency issues, and collecting data has a performance +# impact, that while very small, can be measured under big load. Latency +# monitoring can easily be enabled at runtime using the command +# "CONFIG SET latency-monitor-threshold " if needed. +latency-monitor-threshold 0 + +############################# EVENT NOTIFICATION ############################## + +# Redis can notify Pub/Sub clients about events happening in the key space. +# This feature is documented at http://redis.io/topics/notifications +# +# For instance if keyspace events notification is enabled, and a client +# performs a DEL operation on key "foo" stored in the Database 0, two +# messages will be published via Pub/Sub: +# +# PUBLISH __keyspace@0__:foo del +# PUBLISH __keyevent@0__:del foo +# +# It is possible to select the events that Redis will notify among a set +# of classes. Every class is identified by a single character: +# +# K Keyspace events, published with __keyspace@__ prefix. +# E Keyevent events, published with __keyevent@__ prefix. +# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... +# $ String commands +# l List commands +# s Set commands +# h Hash commands +# z Sorted set commands +# x Expired events (events generated every time a key expires) +# e Evicted events (events generated when a key is evicted for maxmemory) +# A Alias for g$lshzxe, so that the "AKE" string means all the events. +# +# The "notify-keyspace-events" takes as argument a string that is composed +# of zero or multiple characters. The empty string means that notifications +# are disabled. +# +# Example: to enable list and generic events, from the point of view of the +# event name, use: +# +# notify-keyspace-events Elg +# +# Example 2: to get the stream of the expired keys subscribing to channel +# name __keyevent@0__:expired use: +# +# notify-keyspace-events Ex +# +# By default all notifications are disabled because most users don't need +# this feature and the feature has some overhead. Note that if you don't +# specify at least one of K or E, no events will be delivered. +notify-keyspace-events "" + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded using a memory efficient data structure when they have a +# small number of entries, and the biggest entry does not exceed a given +# threshold. These thresholds can be configured using the following directives. +hash-max-ziplist-entries 512 +hash-max-ziplist-value 64 + +# Similarly to hashes, small lists are also encoded in a special way in order +# to save a lot of space. The special representation is only used when +# you are under the following limits: +list-max-ziplist-entries 512 +list-max-ziplist-value 64 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happen to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# HyperLogLog sparse representation bytes limit. The limit includes the +# 16 bytes header. When an HyperLogLog using the sparse representation crosses +# this limit, it is converted into the dense representation. +# +# A value greater than 16000 is totally useless, since at that point the +# dense representation is more memory efficient. +# +# The suggested value is ~ 3000 in order to have the benefits of +# the space efficient encoding without slowing down too much PFADD, +# which is O(N) with the sparse encoding. The value can be raised to +# ~ 10000 when CPU is not a concern, but space is, and the data set is +# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. +hll-sparse-max-bytes 3000 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation Redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into a hash table +# that is rehashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# actively rehash the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply from time to time +# to queries with 2 milliseconds delay. +# +# use "activerehashing yes" if you don't have such hard requirements but +# want to free memory asap when possible. +activerehashing yes + +# The client output buffer limits can be used to force disconnection of clients +# that are not reading data from the server fast enough for some reason (a +# common reason is that a Pub/Sub client can't consume messages as fast as the +# publisher can produce them). +# +# The limit can be set differently for the three different classes of clients: +# +# normal -> normal clients including MONITOR clients +# slave -> slave clients +# pubsub -> clients subscribed to at least one pubsub channel or pattern +# +# The syntax of every client-output-buffer-limit directive is the following: +# +# client-output-buffer-limit +# +# A client is immediately disconnected once the hard limit is reached, or if +# the soft limit is reached and remains reached for the specified number of +# seconds (continuously). +# So for instance if the hard limit is 32 megabytes and the soft limit is +# 16 megabytes / 10 seconds, the client will get disconnected immediately +# if the size of the output buffers reach 32 megabytes, but will also get +# disconnected if the client reaches 16 megabytes and continuously overcomes +# the limit for 10 seconds. +# +# By default normal clients are not limited because they don't receive data +# without asking (in a push way), but just after a request, so only +# asynchronous clients may create a scenario where data is requested faster +# than it can read. +# +# Instead there is a default limit for pubsub and slave clients, since +# subscribers and slaves receive data in a push fashion. +# +# Both the hard or the soft limit can be disabled by setting them to zero. +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 256mb 64mb 60 +client-output-buffer-limit pubsub 32mb 8mb 60 + +# Redis calls an internal function to perform many background tasks, like +# closing connections of clients in timeout, purging expired keys that are +# never requested, and so forth. +# +# Not all tasks are performed with the same frequency, but Redis checks for +# tasks to perform according to the specified "hz" value. +# +# By default "hz" is set to 10. Raising the value will use more CPU when +# Redis is idle, but at the same time will make Redis more responsive when +# there are many keys expiring at the same time, and timeouts may be +# handled with more precision. +# +# The range is between 1 and 500, however a value over 100 is usually not +# a good idea. Most users should use the default of 10 and raise this up to +# 100 only in environments where very low latency is required. +hz 10 + +# When a child rewrites the AOF file, if the following option is enabled +# the file will be fsync-ed every 32 MB of data generated. This is useful +# in order to commit the file to the disk more incrementally and avoid +# big latency spikes. +aof-rewrite-incremental-fsync yes diff --git a/codes/redis/redis-config/sentinel3/osx/sentinel.conf b/codes/redis/redis-config/sentinel3/osx/sentinel.conf new file mode 100644 index 0000000..39d1044 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/sentinel.conf @@ -0,0 +1,181 @@ +# Example sentinel.conf + +# port +# The port that this sentinel instance will run on +port 26379 + +# sentinel announce-ip +# sentinel announce-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 +# 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 interfere with administrative tasks such as +# unmounting filesystems. +dir /tmp + +# sentinel monitor +# +# Tells Sentinel to monitor this master, and to consider it in O_DOWN +# (Objectively Down) state only if at least 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 6379 2 + +# sentinel auth-pass +# +# 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 +# +# 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). +# +# Default is 30 seconds. +sentinel down-after-milliseconds mymaster 30000 + +# sentinel parallel-syncs +# +# 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. +sentinel parallel-syncs mymaster 1 + +# sentinel failover-timeout +# +# 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. +# +# 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 +# +# 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. +# +# Example: +# +# sentinel notification-script mymaster /var/redis/notify.sh + +# CLIENTS RECONFIGURATION SCRIPT +# +# sentinel client-reconfig-script +# +# 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: +# +# +# +# is currently always "failover" +# 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 + + diff --git a/codes/redis/redis-config/sentinel3/osx/server-6380/redis.conf b/codes/redis/redis-config/sentinel3/osx/server-6380/redis.conf new file mode 100644 index 0000000..b729304 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6380/redis.conf @@ -0,0 +1,5 @@ +# Relative to ./sentinel3/osx +include redis.conf + +port 6380 +dir ./server-6380/state diff --git a/codes/redis/redis-config/sentinel3/osx/server-6380/sentinel.conf b/codes/redis/redis-config/sentinel3/osx/server-6380/sentinel.conf new file mode 100644 index 0000000..c874451 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6380/sentinel.conf @@ -0,0 +1,5 @@ +# Relative to ./sentinel3/osx + +port 26380 +dir ./server-6380/state +sentinel monitor mymaster 127.0.0.1 6380 2 diff --git a/codes/redis/redis-config/sentinel3/osx/server-6380/start.sh b/codes/redis/redis-config/sentinel3/osx/server-6380/start.sh new file mode 100644 index 0000000..28100df --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6380/start.sh @@ -0,0 +1,7 @@ +redis_server=../../bin/osx/redis-server +redis_sentinel=../../bin/osx/redis-sentinel + +pushd .. +$redis_server server-6380/redis.conf & +$redis_sentinel server-6380/sentinel.conf & +popd diff --git a/codes/redis/redis-config/sentinel3/osx/server-6380/state/dump.rdb b/codes/redis/redis-config/sentinel3/osx/server-6380/state/dump.rdb new file mode 100644 index 0000000..56af04e --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6380/state/dump.rdb @@ -0,0 +1 @@ +REDIS0006ܳCZV \ No newline at end of file diff --git a/codes/redis/redis-config/sentinel3/osx/server-6380/stop.sh b/codes/redis/redis-config/sentinel3/osx/server-6380/stop.sh new file mode 100644 index 0000000..4d931e9 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6380/stop.sh @@ -0,0 +1,6 @@ +redis_cli=../../bin/osx/redis-cli + +pushd .. +$redis_cli -p 26380 SHUTDOWN NOSAVE +$redis_cli -p 6380 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/osx/server-6381/redis.conf b/codes/redis/redis-config/sentinel3/osx/server-6381/redis.conf new file mode 100644 index 0000000..ffbf0c2 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6381/redis.conf @@ -0,0 +1,6 @@ +# Relative to ./sentinel3/osx +include redis.conf + +port 6381 +dir ./server-6381/state +slaveof 127.0.0.1 6380 diff --git a/codes/redis/redis-config/sentinel3/osx/server-6381/sentinel.conf b/codes/redis/redis-config/sentinel3/osx/server-6381/sentinel.conf new file mode 100644 index 0000000..38a5ba7 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6381/sentinel.conf @@ -0,0 +1,5 @@ +# Relative to ./sentinel3/osx + +port 26381 +dir ./server-6381/state +sentinel monitor mymaster 127.0.0.1 6380 2 diff --git a/codes/redis/redis-config/sentinel3/osx/server-6381/start.sh b/codes/redis/redis-config/sentinel3/osx/server-6381/start.sh new file mode 100644 index 0000000..6c83e6f --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6381/start.sh @@ -0,0 +1,7 @@ +redis_server=../../bin/osx/redis-server +redis_sentinel=../../bin/osx/redis-sentinel + +pushd .. +$redis_server server-6381/redis.conf & +$redis_sentinel server-6381/sentinel.conf & +popd diff --git a/codes/redis/redis-config/sentinel3/osx/server-6381/state/dump.rdb b/codes/redis/redis-config/sentinel3/osx/server-6381/state/dump.rdb new file mode 100644 index 0000000..56af04e --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6381/state/dump.rdb @@ -0,0 +1 @@ +REDIS0006ܳCZV \ No newline at end of file diff --git a/codes/redis/redis-config/sentinel3/osx/server-6381/stop.sh b/codes/redis/redis-config/sentinel3/osx/server-6381/stop.sh new file mode 100644 index 0000000..3d2a935 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6381/stop.sh @@ -0,0 +1,6 @@ +redis_cli=../../bin/osx/redis-cli + +pushd .. +$redis_cli -p 26381 SHUTDOWN NOSAVE +$redis_cli -p 6381 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/osx/server-6382/redis.conf b/codes/redis/redis-config/sentinel3/osx/server-6382/redis.conf new file mode 100644 index 0000000..49af883 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6382/redis.conf @@ -0,0 +1,6 @@ +# Relative to ./sentinel3/osx +include redis.conf + +port 6382 +dir ./server-6382/state +slaveof 127.0.0.1 6380 diff --git a/codes/redis/redis-config/sentinel3/osx/server-6382/sentinel.conf b/codes/redis/redis-config/sentinel3/osx/server-6382/sentinel.conf new file mode 100644 index 0000000..dd0e287 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6382/sentinel.conf @@ -0,0 +1,5 @@ +# Relative to ./sentinel3/osx + +port 26382 +dir ./server-6382/state +sentinel monitor mymaster 127.0.0.1 6380 2 diff --git a/codes/redis/redis-config/sentinel3/osx/server-6382/start.sh b/codes/redis/redis-config/sentinel3/osx/server-6382/start.sh new file mode 100644 index 0000000..9a38b7b --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6382/start.sh @@ -0,0 +1,7 @@ +redis_server=../../bin/osx/redis-server +redis_sentinel=../../bin/osx/redis-sentinel + +pushd .. +$redis_server server-6382/redis.conf & +$redis_sentinel server-6382/sentinel.conf & +popd diff --git a/codes/redis/redis-config/sentinel3/osx/server-6382/state/dump.rdb b/codes/redis/redis-config/sentinel3/osx/server-6382/state/dump.rdb new file mode 100644 index 0000000..56af04e --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6382/state/dump.rdb @@ -0,0 +1 @@ +REDIS0006ܳCZV \ No newline at end of file diff --git a/codes/redis/redis-config/sentinel3/osx/server-6382/stop.sh b/codes/redis/redis-config/sentinel3/osx/server-6382/stop.sh new file mode 100644 index 0000000..61c5594 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/server-6382/stop.sh @@ -0,0 +1,6 @@ +redis_cli=../../bin/osx/redis-cli + +pushd .. +$redis_cli -p 26382 SHUTDOWN NOSAVE +$redis_cli -p 6382 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/osx/start-all.sh b/codes/redis/redis-config/sentinel3/osx/start-all.sh new file mode 100644 index 0000000..f9be418 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/start-all.sh @@ -0,0 +1,17 @@ +redis_server=../../bin/osx/redis-server +redis_sentinel=../../bin/osx/redis-sentinel +redis_cli=../../bin/osx/redis-cli + +$redis_server server-6380/redis.conf & +$redis_sentinel server-6380/sentinel.conf & + +$redis_server server-6381/redis.conf & +$redis_sentinel server-6381/sentinel.conf & + +$redis_server server-6382/redis.conf & +$redis_sentinel server-6382/sentinel.conf & + +read -n1 -r -p "Press any key to see sentinel info on masters and slaves..." + +$redis_cli -p 26380 sentinel master mymaster +$redis_cli -p 26381 sentinel slaves mymaster diff --git a/codes/redis/redis-config/sentinel3/osx/stop-all.sh b/codes/redis/redis-config/sentinel3/osx/stop-all.sh new file mode 100644 index 0000000..5a9b476 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/osx/stop-all.sh @@ -0,0 +1,9 @@ +redis_cli=../../bin/osx/redis-cli + +$redis_cli -p 26382 SHUTDOWN NOSAVE +$redis_cli -p 26381 SHUTDOWN NOSAVE +$redis_cli -p 26380 SHUTDOWN NOSAVE + +$redis_cli -p 6382 SHUTDOWN NOSAVE +$redis_cli -p 6381 SHUTDOWN NOSAVE +$redis_cli -p 6380 SHUTDOWN NOSAVE diff --git a/codes/redis/redis-config/sentinel3/windows-password/redis.windows.conf b/codes/redis/redis-config/sentinel3/windows-password/redis.windows.conf new file mode 100644 index 0000000..d98fdf3 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/redis.windows.conf @@ -0,0 +1,967 @@ +# Redis configuration file example + +# Note on units: when memory size is needed, it is possible to specify +# it in the usual form of 1k 5GB 4M and so forth: +# +# 1k => 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis servers but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# from admin or Redis Sentinel. Since Redis always uses the last processed +# line as value of a configuration directive, you'd better put includes +# at the beginning of this file to avoid overwriting config change at runtime. +# +# If instead you are interested in using includes to override configuration +# options, it is better to use include as the last line. +# +# include .\path\to\local.conf +# include c:\path\to\other.conf + +################################ GENERAL ##################################### + +# On Windows, daemonize and pidfile are not supported. +# However, you can run redis as a Windows service, and specify a logfile. +# The logfile will contain the pid. + +# Accept connections on the specified port, default is 6379. +# If port 0 is specified Redis will not listen on a TCP socket. +port 6379 + +# TCP listen() backlog. +# +# In high requests-per-second environments you need an high backlog in order +# to avoid slow clients connections issues. Note that the Linux kernel +# will silently truncate it to the value of /proc/sys/net/core/somaxconn so +# make sure to raise both the value of somaxconn and tcp_max_syn_backlog +# in order to get the desired effect. +tcp-backlog 511 + +# By default Redis listens for connections from all the network interfaces +# available on the server. It is possible to listen to just one or multiple +# interfaces using the "bind" configuration directive, followed by one or +# more IP addresses. +# +# Examples: +# +# bind 192.168.1.100 10.0.0.1 +# bind 127.0.0.1 + + +# Specify the path for the Unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /tmp/redis.sock +# unixsocketperm 700 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 0 + +# TCP keepalive. +# +# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence +# of communication. This is useful for two reasons: +# +# 1) Detect dead peers. +# 2) Take the connection alive from the point of view of network +# equipment in the middle. +# +# On Linux, the specified value (in seconds) is the period used to send ACKs. +# Note that to close the connection the double of the time is needed. +# On other kernels the period depends on the kernel configuration. +# +# A reasonable value for this option is 60 seconds. +tcp-keepalive 0 + +# Specify the server verbosity level. +# This can be one of: +# debug (a lot of information, useful for development/testing) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +loglevel notice + +# Specify the log file name. Also 'stdout' can be used to force +# Redis to log on the standard output. +logfile "" + +# To enable logging to the Windows EventLog, just set 'syslog-enabled' to +# yes, and optionally update the other syslog parameters to suit your needs. +# If Redis is installed and launched as a Windows Service, this will +# automatically be enabled. +# syslog-enabled no + +# Specify the source name of the events in the Windows Application log. +# syslog-ident redis + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################ SNAPSHOTTING ################################ +# +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +# +# Note: you can disable saving completely by commenting out all "save" lines. +# +# It is also possible to remove all the previously configured save +# points by adding a save directive with a single empty string argument +# like in the following example: +# +# save "" + +save 900 1 +save 300 10 +save 60 10000 + +# By default Redis will stop accepting writes if RDB snapshots are enabled +# (at least one save point) and the latest background save failed. +# This will make the user aware (in a hard way) that data is not persisting +# on disk properly, otherwise chances are that no one will notice and some +# disaster will happen. +# +# If the background saving process will start working again Redis will +# automatically allow writes again. +# +# However if you have setup your proper monitoring of the Redis server +# and persistence, you may want to disable this feature so that Redis will +# continue to work as usual even if there are problems with disk, +# permissions, and so forth. +stop-writes-on-bgsave-error yes + +# Compress string objects using LZF when dump .rdb databases? +# For default that's set to 'yes' as it's almost always a win. +# If you want to save some CPU in the saving child set it to 'no' but +# the dataset will likely be bigger if you have compressible values or keys. +rdbcompression yes + +# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. +# This makes the format more resistant to corruption but there is a performance +# hit to pay (around 10%) when saving and loading RDB files, so you can disable it +# for maximum performances. +# +# RDB files created with checksum disabled have a checksum of zero that will +# tell the loading code to skip the check. +rdbchecksum yes + +# The filename where to dump the DB +dbfilename dump.rdb + +# The working directory. +# +# The DB will be written inside this directory, with the filename specified +# above using the 'dbfilename' configuration directive. +# +# The Append Only File will also be created inside this directory. +# +# Note that you must specify a directory here, not a file name. +dir ./ + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. A few things to understand ASAP about Redis replication. +# +# 1) Redis replication is asynchronous, but you can configure a master to +# stop accepting writes if it appears to be not connected with at least +# a given number of slaves. +# 2) Redis slaves are able to perform a partial resynchronization with the +# master if the replication link is lost for a relatively small amount of +# time. You may want to configure the replication backlog size (see the next +# sections of this file) with a sensible value depending on your needs. +# 3) Replication is automatic and does not need user intervention. After a +# network partition slaves automatically try to reconnect to masters +# and resynchronize with them. +# +# slaveof + +# If the master is password protected (using the "requirepass" configuration +# directive below) it is possible to tell the slave to authenticate before +# starting the replication synchronization process, otherwise the master will +# refuse the slave request. +# +# masterauth + +masterauth password + +# When a slave loses its connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of date data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale-data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# You can configure a slave instance to accept writes or not. Writing against +# a slave instance may be useful to store some ephemeral data (because data +# written on a slave will be easily deleted after resync with the master) but +# may also cause problems if clients are writing to it because of a +# misconfiguration. +# +# Since Redis 2.6 by default slaves are read-only. +# +# Note: read only slaves are not designed to be exposed to untrusted clients +# on the internet. It's just a protection layer against misuse of the instance. +# Still a read only slave exports by default all the administrative commands +# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve +# security of read only slaves using 'rename-command' to shadow all the +# administrative / dangerous commands. +slave-read-only yes + +# Replication SYNC strategy: disk or socket. +# +# ------------------------------------------------------- +# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY +# ------------------------------------------------------- +# +# New slaves and reconnecting slaves that are not able to continue the replication +# process just receiving differences, need to do what is called a "full +# synchronization". An RDB file is transmitted from the master to the slaves. +# The transmission can happen in two different ways: +# +# 1) Disk-backed: The Redis master creates a new process that writes the RDB +# file on disk. Later the file is transferred by the parent +# process to the slaves incrementally. +# 2) Diskless: The Redis master creates a new process that directly writes the +# RDB file to slave sockets, without touching the disk at all. +# +# With disk-backed replication, while the RDB file is generated, more slaves +# can be queued and served with the RDB file as soon as the current child producing +# the RDB file finishes its work. With diskless replication instead once +# the transfer starts, new slaves arriving will be queued and a new transfer +# will start when the current one terminates. +# +# When diskless replication is used, the master waits a configurable amount of +# time (in seconds) before starting the transfer in the hope that multiple slaves +# will arrive and the transfer can be parallelized. +# +# With slow disks and fast (large bandwidth) networks, diskless replication +# works better. +repl-diskless-sync no + +# When diskless replication is enabled, it is possible to configure the delay +# the server waits in order to spawn the child that trnasfers the RDB via socket +# to the slaves. +# +# This is important since once the transfer starts, it is not possible to serve +# new slaves arriving, that will be queued for the next RDB transfer, so the server +# waits a delay in order to let more slaves arrive. +# +# The delay is specified in seconds, and by default is 5 seconds. To disable +# it entirely just set it to 0 seconds and the transfer will start ASAP. +repl-diskless-sync-delay 5 + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets the replication timeout for: +# +# 1) Bulk transfer I/O during SYNC, from the point of view of slave. +# 2) Master timeout from the point of view of slaves (data, pings). +# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +# Disable TCP_NODELAY on the slave socket after SYNC? +# +# If you select "yes" Redis will use a smaller number of TCP packets and +# less bandwidth to send data to slaves. But this can add a delay for +# the data to appear on the slave side, up to 40 milliseconds with +# Linux kernels using a default configuration. +# +# If you select "no" the delay for data to appear on the slave side will +# be reduced but more bandwidth will be used for replication. +# +# By default we optimize for low latency, but in very high traffic conditions +# or when the master and slaves are many hops away, turning this to "yes" may +# be a good idea. +repl-disable-tcp-nodelay no + +# Set the replication backlog size. The backlog is a buffer that accumulates +# slave data when slaves are disconnected for some time, so that when a slave +# wants to reconnect again, often a full resync is not needed, but a partial +# resync is enough, just passing the portion of data the slave missed while +# disconnected. +# +# The bigger the replication backlog, the longer the time the slave can be +# disconnected and later be able to perform a partial resynchronization. +# +# The backlog is only allocated once there is at least a slave connected. +# +# repl-backlog-size 1mb + +# After a master has no longer connected slaves for some time, the backlog +# will be freed. The following option configures the amount of seconds that +# need to elapse, starting from the time the last slave disconnected, for +# the backlog buffer to be freed. +# +# A value of 0 means to never release the backlog. +# +# repl-backlog-ttl 3600 + +# The slave priority is an integer number published by Redis in the INFO output. +# It is used by Redis Sentinel in order to select a slave to promote into a +# master if the master is no longer working correctly. +# +# A slave with a low priority number is considered better for promotion, so +# for instance if there are three slaves with priority 10, 100, 25 Sentinel will +# pick the one with priority 10, that is the lowest. +# +# However a special priority of 0 marks the slave as not able to perform the +# role of master, so a slave with priority of 0 will never be selected by +# Redis Sentinel for promotion. +# +# By default the priority is 100. +slave-priority 100 + +# It is possible for a master to stop accepting writes if there are less than +# N slaves connected, having a lag less or equal than M seconds. +# +# The N slaves need to be in "online" state. +# +# The lag in seconds, that must be <= the specified value, is calculated from +# the last ping received from the slave, that is usually sent every second. +# +# This option does not GUARANTEE that N replicas will accept the write, but +# will limit the window of exposure for lost writes in case not enough slaves +# are available, to the specified number of seconds. +# +# For example to require at least 3 slaves with a lag <= 10 seconds use: +# +# min-slaves-to-write 3 +# min-slaves-max-lag 10 +# +# Setting one or the other to 0 disables the feature. +# +# By default min-slaves-to-write is set to 0 (feature disabled) and +# min-slaves-max-lag is set to 10. + +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +requirepass password + +# Command renaming. +# +# It is possible to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# hard to guess so that it will still be available for internal-use tools +# but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possible to completely kill a command by renaming it into +# an empty string: +# +# rename-command CONFIG "" +# +# Please note that changing the name of commands that are logged into the +# AOF file or transmitted to slaves may cause problems. + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default +# this limit is set to 10000 clients, however if the Redis server is not +# able to configure the process file limit to allow for the specified limit +# the max number of allowed clients is set to the current file limit +# minus 32 (as Redis reserves a few file descriptors for internal uses). +# +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. +# +# maxclients 10000 + +# If Redis is to be used as an in-memory-only cache without any kind of +# persistence, then the fork() mechanism used by the background AOF/RDB +# persistence is unnecessary. As an optimization, all persistence can be +# turned off in the Windows version of Redis. This will redirect heap +# allocations to the system heap allocator, and disable commands that would +# otherwise cause fork() operations: BGSAVE and BGREWRITEAOF. +# This flag may not be combined with any of the other flags that configure +# AOF and RDB operations. +# persistence-available [(yes)|no] + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys +# according to the eviction policy selected (see maxmemory-policy). +# +# If Redis can't remove keys according to the policy, or if the policy is +# set to 'noeviction', Redis will start to reply with errors to commands +# that would use more memory, like SET, LPUSH, and so on, and will continue +# to reply to read-only commands like GET. +# +# This option is usually useful when using Redis as an LRU cache, or to set +# a hard memory limit for an instance (using the 'noeviction' policy). +# +# WARNING: If you have slaves attached to an instance with maxmemory on, +# the size of the output buffers needed to feed the slaves are subtracted +# from the used memory count, so that network problems / resyncs will +# not trigger a loop where keys are evicted, and in turn the output +# buffer of slaves is full with DELs of keys evicted triggering the deletion +# of more keys, and so forth until the database is completely emptied. +# +# In short... if you have slaves attached it is suggested that you set a lower +# limit for maxmemory so that there is some free RAM on the system for slave +# output buffers (but this is not needed if the policy is 'noeviction'). +# +# WARNING: not setting maxmemory will cause Redis to terminate with an +# out-of-memory exception if the heap limit is reached. +# +# NOTE: since Redis uses the system paging file to allocate the heap memory, +# the Working Set memory usage showed by the Windows Task Manager or by other +# tools such as ProcessExplorer will not always be accurate. For example, right +# after a background save of the RDB or the AOF files, the working set value +# may drop significantly. In order to check the correct amount of memory used +# by the redis-server to store the data, use the INFO client command. The INFO +# command shows only the memory used to store the redis data, not the extra +# memory used by the Windows process for its own requirements. Th3 extra amount +# of memory not reported by the INFO command can be calculated subtracting the +# Peak Working Set reported by the Windows Task Manager and the used_memory_peak +# reported by the INFO command. +# +# maxmemory + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached. You can select among five behaviors: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key according to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys-random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with any of the above policies, Redis will return an error on write +# operations, when there are no suitable keys for eviction. +# +# At the date of writing these commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy volatile-lru + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can select as well the sample +# size to check. For instance for default Redis will check three keys and +# pick the one that was used less recently, you can change the sample size +# using the following configuration directive. +# +# maxmemory-samples 3 + +############################## APPEND ONLY MODE ############################### + +# By default Redis asynchronously dumps the dataset on disk. This mode is +# good enough in many applications, but an issue with the Redis process or +# a power outage may result into a few minutes of writes lost (depending on +# the configured save points). +# +# The Append Only File is an alternative persistence mode that provides +# much better durability. For instance using the default data fsync policy +# (see later in the config file) Redis can lose just one second of writes in a +# dramatic event like a server power outage, or a single write if something +# wrong with the Redis process itself happens, but the operating system is +# still running correctly. +# +# AOF and RDB persistence can be enabled at the same time without problems. +# If the AOF is enabled on startup Redis will load the AOF, that is the file +# with the better durability guarantees. +# +# Please check http://redis.io/topics/persistence for more information. + +appendonly no + +# The name of the append only file (default: "appendonly.aof") +appendfilename "appendonly.aof" + +# The fsync() call tells the Operating System to actually write data on disk +# instead of waiting for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. +# +# Redis supports three different modes: +# +# no: don't fsync, just let the OS flush the data when it wants. Faster. +# always: fsync after every write to the append only log . Slow, Safest. +# everysec: fsync only one time every second. Compromise. +# +# The default is "everysec", as that's usually the right compromise between +# speed and data safety. It's up to you to understand if you can relax this to +# "no" that will let the operating system flush the output buffer when +# it wants, for better performances (but if you can live with the idea of +# some data loss consider the default persistence mode that's snapshotting), +# or on the contrary, use "always" that's very slow but a bit safer than +# everysec. +# +# More details please check the following article: +# http://antirez.com/post/redis-persistence-demystified.html +# +# If unsure, use "everysec". + +# appendfsync always +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving, the durability of Redis is +# the same as "appendfsync none". In practical terms, this means that it is +# possible to lose up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size grows by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (if no rewrite has happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a percentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +# An AOF file may be found to be truncated at the end during the Redis +# startup process, when the AOF data gets loaded back into memory. +# This may happen when the system where Redis is running +# crashes, especially when an ext4 filesystem is mounted without the +# data=ordered option (however this can't happen when Redis itself +# crashes or aborts but the operating system still works correctly). +# +# Redis can either exit with an error when this happens, or load as much +# data as possible (the default now) and start if the AOF file is found +# to be truncated at the end. The following option controls this behavior. +# +# If aof-load-truncated is set to yes, a truncated AOF file is loaded and +# the Redis server starts emitting a log to inform the user of the event. +# Otherwise if the option is set to no, the server aborts with an error +# and refuses to start. When the option is set to no, the user requires +# to fix the AOF file using the "redis-check-aof" utility before to restart +# the server. +# +# Note that if the AOF file will be found to be corrupted in the middle +# the server will still exit with an error. This option only applies when +# Redis will try to read more data from the AOF file but not enough bytes +# will be found. +aof-load-truncated yes + +################################ LUA SCRIPTING ############################### + +# Max execution time of a Lua script in milliseconds. +# +# If the maximum execution time is reached Redis will log that a script is +# still in execution after the maximum allowed time and will start to +# reply to queries with an error. +# +# When a long running script exceeds the maximum execution time only the +# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be +# used to stop a script that did not yet called write commands. The second +# is the only way to shut down the server in the case a write command was +# already issued by the script but the user doesn't want to wait for the natural +# termination of the script. +# +# Set it to 0 or a negative value for unlimited execution without warnings. +lua-time-limit 5000 + +################################ REDIS CLUSTER ############################### +# +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however +# in order to mark it as "mature" we need to wait for a non trivial percentage +# of users to deploy it in production. +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# +# Normal Redis instances can't be part of a Redis Cluster; only nodes that are +# started as cluster nodes can. In order to start a Redis instance as a +# cluster node enable the cluster support uncommenting the following: +# +# cluster-enabled yes + +# Every cluster node has a cluster configuration file. This file is not +# intended to be edited by hand. It is created and updated by Redis nodes. +# Every Redis Cluster node requires a different cluster configuration file. +# Make sure that instances running in the same system do not have +# overlapping cluster configuration file names. +# +# cluster-config-file nodes-6379.conf + +# Cluster node timeout is the amount of milliseconds a node must be unreachable +# for it to be considered in failure state. +# Most other internal time limits are multiple of the node timeout. +# +# cluster-node-timeout 15000 + +# A slave of a failing master will avoid to start a failover if its data +# looks too old. +# +# There is no simple way for a slave to actually have a exact measure of +# its "data age", so the following two checks are performed: +# +# 1) If there are multiple slaves able to failover, they exchange messages +# in order to try to give an advantage to the slave with the best +# replication offset (more data from the master processed). +# Slaves will try to get their rank by offset, and apply to the start +# of the failover a delay proportional to their rank. +# +# 2) Every single slave computes the time of the last interaction with +# its master. This can be the last ping or command received (if the master +# is still in the "connected" state), or the time that elapsed since the +# disconnection with the master (if the replication link is currently down). +# If the last interaction is too old, the slave will not try to failover +# at all. +# +# The point "2" can be tuned by user. Specifically a slave will not perform +# the failover if, since the last interaction with the master, the time +# elapsed is greater than: +# +# (node-timeout * slave-validity-factor) + repl-ping-slave-period +# +# So for example if node-timeout is 30 seconds, and the slave-validity-factor +# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the +# slave will not try to failover if it was not able to talk with the master +# for longer than 310 seconds. +# +# A large slave-validity-factor may allow slaves with too old data to failover +# a master, while a too small value may prevent the cluster from being able to +# elect a slave at all. +# +# For maximum availability, it is possible to set the slave-validity-factor +# to a value of 0, which means, that slaves will always try to failover the +# master regardless of the last time they interacted with the master. +# (However they'll always try to apply a delay proportional to their +# offset rank). +# +# Zero is the only value able to guarantee that when all the partitions heal +# the cluster will always be able to continue. +# +# cluster-slave-validity-factor 10 + +# Cluster slaves are able to migrate to orphaned masters, that are masters +# that are left without working slaves. This improves the cluster ability +# to resist to failures as otherwise an orphaned master can't be failed over +# in case of failure if it has no working slaves. +# +# Slaves migrate to orphaned masters only if there are still at least a +# given number of other working slaves for their old master. This number +# is the "migration barrier". A migration barrier of 1 means that a slave +# will migrate only if there is at least 1 other working slave for its master +# and so forth. It usually reflects the number of slaves you want for every +# master in your cluster. +# +# Default is 1 (slaves migrate only if their masters remain with at least +# one slave). To disable migration just set it to a very large value. +# A value of 0 can be set but is useful only for debugging and dangerous +# in production. +# +# cluster-migration-barrier 1 + +# By default Redis Cluster nodes stop accepting queries if they detect there +# is at least an hash slot uncovered (no available node is serving it). +# This way if the cluster is partially down (for example a range of hash slots +# are no longer covered) all the cluster becomes, eventually, unavailable. +# It automatically returns available as soon as all the slots are covered again. +# +# However sometimes you want the subset of the cluster which is working, +# to continue to accept queries for the part of the key space that is still +# covered. In order to do so, just set the cluster-require-full-coverage +# option to no. +# +# cluster-require-full-coverage yes + +# In order to setup your cluster make sure to read the documentation +# available at http://redis.io web site. + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 128 + +################################ LATENCY MONITOR ############################## + +# The Redis latency monitoring subsystem samples different operations +# at runtime in order to collect data related to possible sources of +# latency of a Redis instance. +# +# Via the LATENCY command this information is available to the user that can +# print graphs and obtain reports. +# +# The system only logs operations that were performed in a time equal or +# greater than the amount of milliseconds specified via the +# latency-monitor-threshold configuration directive. When its value is set +# to zero, the latency monitor is turned off. +# +# By default latency monitoring is disabled since it is mostly not needed +# if you don't have latency issues, and collecting data has a performance +# impact, that while very small, can be measured under big load. Latency +# monitoring can easily be enalbed at runtime using the command +# "CONFIG SET latency-monitor-threshold " if needed. +latency-monitor-threshold 0 + +############################# Event notification ############################## + +# Redis can notify Pub/Sub clients about events happening in the key space. +# This feature is documented at http://redis.io/topics/notifications +# +# For instance if keyspace events notification is enabled, and a client +# performs a DEL operation on key "foo" stored in the Database 0, two +# messages will be published via Pub/Sub: +# +# PUBLISH __keyspace@0__:foo del +# PUBLISH __keyevent@0__:del foo +# +# It is possible to select the events that Redis will notify among a set +# of classes. Every class is identified by a single character: +# +# K Keyspace events, published with __keyspace@__ prefix. +# E Keyevent events, published with __keyevent@__ prefix. +# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... +# $ String commands +# l List commands +# s Set commands +# h Hash commands +# z Sorted set commands +# x Expired events (events generated every time a key expires) +# e Evicted events (events generated when a key is evicted for maxmemory) +# A Alias for g$lshzxe, so that the "AKE" string means all the events. +# +# The "notify-keyspace-events" takes as argument a string that is composed +# of zero or multiple characters. The empty string means that notifications +# are disabled. +# +# Example: to enable list and generic events, from the point of view of the +# event name, use: +# +# notify-keyspace-events Elg +# +# Example 2: to get the stream of the expired keys subscribing to channel +# name __keyevent@0__:expired use: +# +# notify-keyspace-events Ex +# +# By default all notifications are disabled because most users don't need +# this feature and the feature has some overhead. Note that if you don't +# specify at least one of K or E, no events will be delivered. +notify-keyspace-events "" + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded using a memory efficient data structure when they have a +# small number of entries, and the biggest entry does not exceed a given +# threshold. These thresholds can be configured using the following directives. +hash-max-ziplist-entries 512 +hash-max-ziplist-value 64 + +# Similarly to hashes, small lists are also encoded in a special way in order +# to save a lot of space. The special representation is only used when +# you are under the following limits: +list-max-ziplist-entries 512 +list-max-ziplist-value 64 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happen to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# HyperLogLog sparse representation bytes limit. The limit includes the +# 16 bytes header. When an HyperLogLog using the sparse representation crosses +# this limit, it is converted into the dense representation. +# +# A value greater than 16000 is totally useless, since at that point the +# dense representation is more memory efficient. +# +# The suggested value is ~ 3000 in order to have the benefits of +# the space efficient encoding without slowing down too much PFADD, +# which is O(N) with the sparse encoding. The value can be raised to +# ~ 10000 when CPU is not a concern, but space is, and the data set is +# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. +hll-sparse-max-bytes 3000 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation Redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into a hash table +# that is rehashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# actively rehash the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply from time to time +# to queries with 2 milliseconds delay. +# +# use "activerehashing yes" if you don't have such hard requirements but +# want to free memory asap when possible. +activerehashing yes + +# The client output buffer limits can be used to force disconnection of clients +# that are not reading data from the server fast enough for some reason (a +# common reason is that a Pub/Sub client can't consume messages as fast as the +# publisher can produce them). +# +# The limit can be set differently for the three different classes of clients: +# +# normal -> normal clients including MONITOR clients +# slave -> slave clients +# pubsub -> clients subscribed to at least one pubsub channel or pattern +# +# The syntax of every client-output-buffer-limit directive is the following: +# +# client-output-buffer-limit +# +# A client is immediately disconnected once the hard limit is reached, or if +# the soft limit is reached and remains reached for the specified number of +# seconds (continuously). +# So for instance if the hard limit is 32 megabytes and the soft limit is +# 16 megabytes / 10 seconds, the client will get disconnected immediately +# if the size of the output buffers reach 32 megabytes, but will also get +# disconnected if the client reaches 16 megabytes and continuously overcomes +# the limit for 10 seconds. +# +# By default normal clients are not limited because they don't receive data +# without asking (in a push way), but just after a request, so only +# asynchronous clients may create a scenario where data is requested faster +# than it can read. +# +# Instead there is a default limit for pubsub and slave clients, since +# subscribers and slaves receive data in a push fashion. +# +# Both the hard or the soft limit can be disabled by setting them to zero. +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 256mb 64mb 60 +client-output-buffer-limit pubsub 32mb 8mb 60 + +# Redis calls an internal function to perform many background tasks, like +# closing connections of clients in timeot, purging expired keys that are +# never requested, and so forth. +# +# Not all tasks are perforemd with the same frequency, but Redis checks for +# tasks to perform according to the specified "hz" value. +# +# By default "hz" is set to 10. Raising the value will use more CPU when +# Redis is idle, but at the same time will make Redis more responsive when +# there are many keys expiring at the same time, and timeouts may be +# handled with more precision. +# +# The range is between 1 and 500, however a value over 100 is usually not +# a good idea. Most users should use the default of 10 and raise this up to +# 100 only in environments where very low latency is required. +hz 10 + +# When a child rewrites the AOF file, if the following option is enabled +# the file will be fsync-ed every 32 MB of data generated. This is useful +# in order to commit the file to the disk more incrementally and avoid +# big latency spikes. +aof-rewrite-incremental-fsync yes + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis server but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# include /path/to/local.conf +# include /path/to/other.conf diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6380/redis.conf b/codes/redis/redis-config/sentinel3/windows-password/server-6380/redis.conf new file mode 100644 index 0000000..8a15215 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6380/redis.conf @@ -0,0 +1,5 @@ +# Relative to .\sentinel3\windows +include redis.windows.conf + +port 6380 +dir .\server-6380\state diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6380/sentinel.conf b/codes/redis/redis-config/sentinel3/windows-password/server-6380/sentinel.conf new file mode 100644 index 0000000..5c82927 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6380/sentinel.conf @@ -0,0 +1,6 @@ +# Relative to .\sentinel3\windows + +port 26380 +dir .\server-6380\state +sentinel monitor mymaster 127.0.0.1 6380 2 +sentinel auth-pass mymaster password diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6380/start.cmd b/codes/redis/redis-config/sentinel3/windows-password/server-6380/start.cmd new file mode 100644 index 0000000..cad1edb --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6380/start.cmd @@ -0,0 +1,8 @@ +@echo off +SET redis_server=..\..\bin\windows\redis-server +SET redis_sentinel=..\..\bin\windows\redis-server + +pushd .. +start %redis_server% server-6380/redis.conf +start %redis_sentinel% server-6380/sentinel.conf --sentinel +popd diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6380/state/dump.rdb b/codes/redis/redis-config/sentinel3/windows-password/server-6380/state/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..31184355816ea2228dd162975584bd9346b799ce GIT binary patch literal 438 zcmWG?b@2=~FfcIt$H2gnomy$cR+gAknraBi0K35$S%VRr2eK8;0qcf49V7*J0*GUXVg!nN4B@)K yW}vDxh3Nws0{1W2RVWG#QM_*m*9KOJ;u5$N$VAkjKy?;O?!V_A2hUmOd^!Nh)qz?7 literal 0 HcmV?d00001 diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6380/stop.cmd b/codes/redis/redis-config/sentinel3/windows-password/server-6380/stop.cmd new file mode 100644 index 0000000..b59b6bd --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6380/stop.cmd @@ -0,0 +1,7 @@ +@echo off +SET redis_cli=..\..\bin\windows\redis-cli + +pushd .. +%redis_cli% -p 26380 SHUTDOWN NOSAVE +%redis_cli% -p 6380 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6381/redis.conf b/codes/redis/redis-config/sentinel3/windows-password/server-6381/redis.conf new file mode 100644 index 0000000..97214a6 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6381/redis.conf @@ -0,0 +1,6 @@ +# Relative to .\sentinel3\windows +include redis.windows.conf + +port 6381 +dir .\server-6381\state +slaveof 127.0.0.1 6380 diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6381/sentinel.conf b/codes/redis/redis-config/sentinel3/windows-password/server-6381/sentinel.conf new file mode 100644 index 0000000..b52f8d6 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6381/sentinel.conf @@ -0,0 +1,6 @@ +# Relative to .\sentinel3\windows + +port 26381 +dir .\server-6381\state +sentinel monitor mymaster 127.0.0.1 6380 2 +sentinel auth-pass mymaster password diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6381/start.cmd b/codes/redis/redis-config/sentinel3/windows-password/server-6381/start.cmd new file mode 100644 index 0000000..319d79d --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6381/start.cmd @@ -0,0 +1,8 @@ +@echo off +SET redis_server=..\..\bin\windows\redis-server +SET redis_sentinel=..\..\bin\windows\redis-server + +pushd .. +start %redis_server% server-6381/redis.conf +start %redis_sentinel% server-6381/sentinel.conf --sentinel +popd diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6381/state/dump.rdb b/codes/redis/redis-config/sentinel3/windows-password/server-6381/state/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..31184355816ea2228dd162975584bd9346b799ce GIT binary patch literal 438 zcmWG?b@2=~FfcIt$H2gnomy$cR+gAknraBi0K35$S%VRr2eK8;0qcf49V7*J0*GUXVg!nN4B@)K yW}vDxh3Nws0{1W2RVWG#QM_*m*9KOJ;u5$N$VAkjKy?;O?!V_A2hUmOd^!Nh)qz?7 literal 0 HcmV?d00001 diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6381/stop.cmd b/codes/redis/redis-config/sentinel3/windows-password/server-6381/stop.cmd new file mode 100644 index 0000000..d33c919 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6381/stop.cmd @@ -0,0 +1,7 @@ +@echo off +SET redis_cli=..\..\bin\windows\redis-cli + +pushd .. +%redis_cli% -p 26381 SHUTDOWN NOSAVE +%redis_cli% -p 6381 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6382/redis.conf b/codes/redis/redis-config/sentinel3/windows-password/server-6382/redis.conf new file mode 100644 index 0000000..cead32a --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6382/redis.conf @@ -0,0 +1,6 @@ +# Relative to .\sentinel3\windows +include redis.windows.conf + +port 6382 +dir .\server-6382\state +slaveof 127.0.0.1 6380 diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6382/sentinel.conf b/codes/redis/redis-config/sentinel3/windows-password/server-6382/sentinel.conf new file mode 100644 index 0000000..80c7b71 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6382/sentinel.conf @@ -0,0 +1,6 @@ +# Relative to .\sentinel3\windows + +port 26382 +dir .\server-6382\state +sentinel monitor mymaster 127.0.0.1 6380 2 +sentinel auth-pass mymaster password diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6382/start.cmd b/codes/redis/redis-config/sentinel3/windows-password/server-6382/start.cmd new file mode 100644 index 0000000..0c7e62b --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6382/start.cmd @@ -0,0 +1,8 @@ +@echo off +SET redis_server=..\..\bin\windows\redis-server +SET redis_sentinel=..\..\bin\windows\redis-server + +pushd .. +start %redis_server% server-6382/redis.conf +start %redis_sentinel% server-6382/sentinel.conf --sentinel +popd diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6382/state/dump.rdb b/codes/redis/redis-config/sentinel3/windows-password/server-6382/state/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..31184355816ea2228dd162975584bd9346b799ce GIT binary patch literal 438 zcmWG?b@2=~FfcIt$H2gnomy$cR+gAknraBi0K35$S%VRr2eK8;0qcf49V7*J0*GUXVg!nN4B@)K yW}vDxh3Nws0{1W2RVWG#QM_*m*9KOJ;u5$N$VAkjKy?;O?!V_A2hUmOd^!Nh)qz?7 literal 0 HcmV?d00001 diff --git a/codes/redis/redis-config/sentinel3/windows-password/server-6382/stop.cmd b/codes/redis/redis-config/sentinel3/windows-password/server-6382/stop.cmd new file mode 100644 index 0000000..54a5c29 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/server-6382/stop.cmd @@ -0,0 +1,7 @@ +@echo off +SET redis_cli=..\..\bin\windows\redis-cli + +pushd .. +%redis_cli% -p 26382 SHUTDOWN NOSAVE +%redis_cli% -p 6382 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/windows-password/start-all.cmd b/codes/redis/redis-config/sentinel3/windows-password/start-all.cmd new file mode 100644 index 0000000..7df778a --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/start-all.cmd @@ -0,0 +1,22 @@ +@echo off +SET redis_server=..\..\bin\windows\redis-server +SET redis_sentinel=..\..\bin\windows\redis-server +SET redis_cli=..\..\bin\windows\redis-cli + +start %redis_server% server-6380\redis.conf +start %redis_sentinel% server-6380\sentinel.conf --sentinel + +start %redis_server% server-6381\redis.conf +start %redis_sentinel% server-6381\sentinel.conf --sentinel + +start %redis_server% server-6382\redis.conf +start %redis_sentinel% server-6382\sentinel.conf --sentinel + +echo Press enter to see sentinel info on masters and slaves... +pause + +%redis_cli% -p 26380 sentinel master mymaster +%redis_cli% -p 26381 sentinel slaves mymaster + +echo Press enter again to close this window +pause diff --git a/codes/redis/redis-config/sentinel3/windows-password/stop-all.cmd b/codes/redis/redis-config/sentinel3/windows-password/stop-all.cmd new file mode 100644 index 0000000..77310cb --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows-password/stop-all.cmd @@ -0,0 +1,10 @@ +@echo off +SET redis_cli=..\..\bin\windows\redis-cli + +%redis_cli% -p 26382 SHUTDOWN NOSAVE +%redis_cli% -p 26381 SHUTDOWN NOSAVE +%redis_cli% -p 26380 SHUTDOWN NOSAVE + +%redis_cli% -p 6382 SHUTDOWN NOSAVE +%redis_cli% -p 6381 SHUTDOWN NOSAVE +%redis_cli% -p 6380 SHUTDOWN NOSAVE diff --git a/codes/redis/redis-config/sentinel3/windows/redis.windows.conf b/codes/redis/redis-config/sentinel3/windows/redis.windows.conf new file mode 100644 index 0000000..6e5880e --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/redis.windows.conf @@ -0,0 +1,963 @@ +# Redis configuration file example + +# Note on units: when memory size is needed, it is possible to specify +# it in the usual form of 1k 5GB 4M and so forth: +# +# 1k => 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis servers but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# from admin or Redis Sentinel. Since Redis always uses the last processed +# line as value of a configuration directive, you'd better put includes +# at the beginning of this file to avoid overwriting config change at runtime. +# +# If instead you are interested in using includes to override configuration +# options, it is better to use include as the last line. +# +# include .\path\to\local.conf +# include c:\path\to\other.conf + +################################ GENERAL ##################################### + +# On Windows, daemonize and pidfile are not supported. +# However, you can run redis as a Windows service, and specify a logfile. +# The logfile will contain the pid. + +# Accept connections on the specified port, default is 6379. +# If port 0 is specified Redis will not listen on a TCP socket. +port 6379 + +# TCP listen() backlog. +# +# In high requests-per-second environments you need an high backlog in order +# to avoid slow clients connections issues. Note that the Linux kernel +# will silently truncate it to the value of /proc/sys/net/core/somaxconn so +# make sure to raise both the value of somaxconn and tcp_max_syn_backlog +# in order to get the desired effect. +tcp-backlog 511 + +# By default Redis listens for connections from all the network interfaces +# available on the server. It is possible to listen to just one or multiple +# interfaces using the "bind" configuration directive, followed by one or +# more IP addresses. +# +# Examples: +# +# bind 192.168.1.100 10.0.0.1 +# bind 127.0.0.1 + + +# Specify the path for the Unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /tmp/redis.sock +# unixsocketperm 700 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 0 + +# TCP keepalive. +# +# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence +# of communication. This is useful for two reasons: +# +# 1) Detect dead peers. +# 2) Take the connection alive from the point of view of network +# equipment in the middle. +# +# On Linux, the specified value (in seconds) is the period used to send ACKs. +# Note that to close the connection the double of the time is needed. +# On other kernels the period depends on the kernel configuration. +# +# A reasonable value for this option is 60 seconds. +tcp-keepalive 0 + +# Specify the server verbosity level. +# This can be one of: +# debug (a lot of information, useful for development/testing) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +loglevel notice + +# Specify the log file name. Also 'stdout' can be used to force +# Redis to log on the standard output. +logfile "" + +# To enable logging to the Windows EventLog, just set 'syslog-enabled' to +# yes, and optionally update the other syslog parameters to suit your needs. +# If Redis is installed and launched as a Windows Service, this will +# automatically be enabled. +# syslog-enabled no + +# Specify the source name of the events in the Windows Application log. +# syslog-ident redis + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################ SNAPSHOTTING ################################ +# +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +# +# Note: you can disable saving completely by commenting out all "save" lines. +# +# It is also possible to remove all the previously configured save +# points by adding a save directive with a single empty string argument +# like in the following example: +# +# save "" + +save 900 1 +save 300 10 +save 60 10000 + +# By default Redis will stop accepting writes if RDB snapshots are enabled +# (at least one save point) and the latest background save failed. +# This will make the user aware (in a hard way) that data is not persisting +# on disk properly, otherwise chances are that no one will notice and some +# disaster will happen. +# +# If the background saving process will start working again Redis will +# automatically allow writes again. +# +# However if you have setup your proper monitoring of the Redis server +# and persistence, you may want to disable this feature so that Redis will +# continue to work as usual even if there are problems with disk, +# permissions, and so forth. +stop-writes-on-bgsave-error yes + +# Compress string objects using LZF when dump .rdb databases? +# For default that's set to 'yes' as it's almost always a win. +# If you want to save some CPU in the saving child set it to 'no' but +# the dataset will likely be bigger if you have compressible values or keys. +rdbcompression yes + +# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. +# This makes the format more resistant to corruption but there is a performance +# hit to pay (around 10%) when saving and loading RDB files, so you can disable it +# for maximum performances. +# +# RDB files created with checksum disabled have a checksum of zero that will +# tell the loading code to skip the check. +rdbchecksum yes + +# The filename where to dump the DB +dbfilename dump.rdb + +# The working directory. +# +# The DB will be written inside this directory, with the filename specified +# above using the 'dbfilename' configuration directive. +# +# The Append Only File will also be created inside this directory. +# +# Note that you must specify a directory here, not a file name. +dir ./ + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. A few things to understand ASAP about Redis replication. +# +# 1) Redis replication is asynchronous, but you can configure a master to +# stop accepting writes if it appears to be not connected with at least +# a given number of slaves. +# 2) Redis slaves are able to perform a partial resynchronization with the +# master if the replication link is lost for a relatively small amount of +# time. You may want to configure the replication backlog size (see the next +# sections of this file) with a sensible value depending on your needs. +# 3) Replication is automatic and does not need user intervention. After a +# network partition slaves automatically try to reconnect to masters +# and resynchronize with them. +# +# slaveof + +# If the master is password protected (using the "requirepass" configuration +# directive below) it is possible to tell the slave to authenticate before +# starting the replication synchronization process, otherwise the master will +# refuse the slave request. +# +# masterauth + +# When a slave loses its connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of date data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale-data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# You can configure a slave instance to accept writes or not. Writing against +# a slave instance may be useful to store some ephemeral data (because data +# written on a slave will be easily deleted after resync with the master) but +# may also cause problems if clients are writing to it because of a +# misconfiguration. +# +# Since Redis 2.6 by default slaves are read-only. +# +# Note: read only slaves are not designed to be exposed to untrusted clients +# on the internet. It's just a protection layer against misuse of the instance. +# Still a read only slave exports by default all the administrative commands +# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve +# security of read only slaves using 'rename-command' to shadow all the +# administrative / dangerous commands. +slave-read-only yes + +# Replication SYNC strategy: disk or socket. +# +# ------------------------------------------------------- +# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY +# ------------------------------------------------------- +# +# New slaves and reconnecting slaves that are not able to continue the replication +# process just receiving differences, need to do what is called a "full +# synchronization". An RDB file is transmitted from the master to the slaves. +# The transmission can happen in two different ways: +# +# 1) Disk-backed: The Redis master creates a new process that writes the RDB +# file on disk. Later the file is transferred by the parent +# process to the slaves incrementally. +# 2) Diskless: The Redis master creates a new process that directly writes the +# RDB file to slave sockets, without touching the disk at all. +# +# With disk-backed replication, while the RDB file is generated, more slaves +# can be queued and served with the RDB file as soon as the current child producing +# the RDB file finishes its work. With diskless replication instead once +# the transfer starts, new slaves arriving will be queued and a new transfer +# will start when the current one terminates. +# +# When diskless replication is used, the master waits a configurable amount of +# time (in seconds) before starting the transfer in the hope that multiple slaves +# will arrive and the transfer can be parallelized. +# +# With slow disks and fast (large bandwidth) networks, diskless replication +# works better. +repl-diskless-sync no + +# When diskless replication is enabled, it is possible to configure the delay +# the server waits in order to spawn the child that trnasfers the RDB via socket +# to the slaves. +# +# This is important since once the transfer starts, it is not possible to serve +# new slaves arriving, that will be queued for the next RDB transfer, so the server +# waits a delay in order to let more slaves arrive. +# +# The delay is specified in seconds, and by default is 5 seconds. To disable +# it entirely just set it to 0 seconds and the transfer will start ASAP. +repl-diskless-sync-delay 5 + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets the replication timeout for: +# +# 1) Bulk transfer I/O during SYNC, from the point of view of slave. +# 2) Master timeout from the point of view of slaves (data, pings). +# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +# Disable TCP_NODELAY on the slave socket after SYNC? +# +# If you select "yes" Redis will use a smaller number of TCP packets and +# less bandwidth to send data to slaves. But this can add a delay for +# the data to appear on the slave side, up to 40 milliseconds with +# Linux kernels using a default configuration. +# +# If you select "no" the delay for data to appear on the slave side will +# be reduced but more bandwidth will be used for replication. +# +# By default we optimize for low latency, but in very high traffic conditions +# or when the master and slaves are many hops away, turning this to "yes" may +# be a good idea. +repl-disable-tcp-nodelay no + +# Set the replication backlog size. The backlog is a buffer that accumulates +# slave data when slaves are disconnected for some time, so that when a slave +# wants to reconnect again, often a full resync is not needed, but a partial +# resync is enough, just passing the portion of data the slave missed while +# disconnected. +# +# The bigger the replication backlog, the longer the time the slave can be +# disconnected and later be able to perform a partial resynchronization. +# +# The backlog is only allocated once there is at least a slave connected. +# +# repl-backlog-size 1mb + +# After a master has no longer connected slaves for some time, the backlog +# will be freed. The following option configures the amount of seconds that +# need to elapse, starting from the time the last slave disconnected, for +# the backlog buffer to be freed. +# +# A value of 0 means to never release the backlog. +# +# repl-backlog-ttl 3600 + +# The slave priority is an integer number published by Redis in the INFO output. +# It is used by Redis Sentinel in order to select a slave to promote into a +# master if the master is no longer working correctly. +# +# A slave with a low priority number is considered better for promotion, so +# for instance if there are three slaves with priority 10, 100, 25 Sentinel will +# pick the one with priority 10, that is the lowest. +# +# However a special priority of 0 marks the slave as not able to perform the +# role of master, so a slave with priority of 0 will never be selected by +# Redis Sentinel for promotion. +# +# By default the priority is 100. +slave-priority 100 + +# It is possible for a master to stop accepting writes if there are less than +# N slaves connected, having a lag less or equal than M seconds. +# +# The N slaves need to be in "online" state. +# +# The lag in seconds, that must be <= the specified value, is calculated from +# the last ping received from the slave, that is usually sent every second. +# +# This option does not GUARANTEE that N replicas will accept the write, but +# will limit the window of exposure for lost writes in case not enough slaves +# are available, to the specified number of seconds. +# +# For example to require at least 3 slaves with a lag <= 10 seconds use: +# +# min-slaves-to-write 3 +# min-slaves-max-lag 10 +# +# Setting one or the other to 0 disables the feature. +# +# By default min-slaves-to-write is set to 0 (feature disabled) and +# min-slaves-max-lag is set to 10. + +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +# Command renaming. +# +# It is possible to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# hard to guess so that it will still be available for internal-use tools +# but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possible to completely kill a command by renaming it into +# an empty string: +# +# rename-command CONFIG "" +# +# Please note that changing the name of commands that are logged into the +# AOF file or transmitted to slaves may cause problems. + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default +# this limit is set to 10000 clients, however if the Redis server is not +# able to configure the process file limit to allow for the specified limit +# the max number of allowed clients is set to the current file limit +# minus 32 (as Redis reserves a few file descriptors for internal uses). +# +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. +# +# maxclients 10000 + +# If Redis is to be used as an in-memory-only cache without any kind of +# persistence, then the fork() mechanism used by the background AOF/RDB +# persistence is unnecessary. As an optimization, all persistence can be +# turned off in the Windows version of Redis. This will redirect heap +# allocations to the system heap allocator, and disable commands that would +# otherwise cause fork() operations: BGSAVE and BGREWRITEAOF. +# This flag may not be combined with any of the other flags that configure +# AOF and RDB operations. +# persistence-available [(yes)|no] + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys +# according to the eviction policy selected (see maxmemory-policy). +# +# If Redis can't remove keys according to the policy, or if the policy is +# set to 'noeviction', Redis will start to reply with errors to commands +# that would use more memory, like SET, LPUSH, and so on, and will continue +# to reply to read-only commands like GET. +# +# This option is usually useful when using Redis as an LRU cache, or to set +# a hard memory limit for an instance (using the 'noeviction' policy). +# +# WARNING: If you have slaves attached to an instance with maxmemory on, +# the size of the output buffers needed to feed the slaves are subtracted +# from the used memory count, so that network problems / resyncs will +# not trigger a loop where keys are evicted, and in turn the output +# buffer of slaves is full with DELs of keys evicted triggering the deletion +# of more keys, and so forth until the database is completely emptied. +# +# In short... if you have slaves attached it is suggested that you set a lower +# limit for maxmemory so that there is some free RAM on the system for slave +# output buffers (but this is not needed if the policy is 'noeviction'). +# +# WARNING: not setting maxmemory will cause Redis to terminate with an +# out-of-memory exception if the heap limit is reached. +# +# NOTE: since Redis uses the system paging file to allocate the heap memory, +# the Working Set memory usage showed by the Windows Task Manager or by other +# tools such as ProcessExplorer will not always be accurate. For example, right +# after a background save of the RDB or the AOF files, the working set value +# may drop significantly. In order to check the correct amount of memory used +# by the redis-server to store the data, use the INFO client command. The INFO +# command shows only the memory used to store the redis data, not the extra +# memory used by the Windows process for its own requirements. Th3 extra amount +# of memory not reported by the INFO command can be calculated subtracting the +# Peak Working Set reported by the Windows Task Manager and the used_memory_peak +# reported by the INFO command. +# +# maxmemory + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached. You can select among five behaviors: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key according to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys-random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with any of the above policies, Redis will return an error on write +# operations, when there are no suitable keys for eviction. +# +# At the date of writing these commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy volatile-lru + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can select as well the sample +# size to check. For instance for default Redis will check three keys and +# pick the one that was used less recently, you can change the sample size +# using the following configuration directive. +# +# maxmemory-samples 3 + +############################## APPEND ONLY MODE ############################### + +# By default Redis asynchronously dumps the dataset on disk. This mode is +# good enough in many applications, but an issue with the Redis process or +# a power outage may result into a few minutes of writes lost (depending on +# the configured save points). +# +# The Append Only File is an alternative persistence mode that provides +# much better durability. For instance using the default data fsync policy +# (see later in the config file) Redis can lose just one second of writes in a +# dramatic event like a server power outage, or a single write if something +# wrong with the Redis process itself happens, but the operating system is +# still running correctly. +# +# AOF and RDB persistence can be enabled at the same time without problems. +# If the AOF is enabled on startup Redis will load the AOF, that is the file +# with the better durability guarantees. +# +# Please check http://redis.io/topics/persistence for more information. + +appendonly no + +# The name of the append only file (default: "appendonly.aof") +appendfilename "appendonly.aof" + +# The fsync() call tells the Operating System to actually write data on disk +# instead of waiting for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. +# +# Redis supports three different modes: +# +# no: don't fsync, just let the OS flush the data when it wants. Faster. +# always: fsync after every write to the append only log . Slow, Safest. +# everysec: fsync only one time every second. Compromise. +# +# The default is "everysec", as that's usually the right compromise between +# speed and data safety. It's up to you to understand if you can relax this to +# "no" that will let the operating system flush the output buffer when +# it wants, for better performances (but if you can live with the idea of +# some data loss consider the default persistence mode that's snapshotting), +# or on the contrary, use "always" that's very slow but a bit safer than +# everysec. +# +# More details please check the following article: +# http://antirez.com/post/redis-persistence-demystified.html +# +# If unsure, use "everysec". + +# appendfsync always +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving, the durability of Redis is +# the same as "appendfsync none". In practical terms, this means that it is +# possible to lose up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size grows by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (if no rewrite has happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a percentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +# An AOF file may be found to be truncated at the end during the Redis +# startup process, when the AOF data gets loaded back into memory. +# This may happen when the system where Redis is running +# crashes, especially when an ext4 filesystem is mounted without the +# data=ordered option (however this can't happen when Redis itself +# crashes or aborts but the operating system still works correctly). +# +# Redis can either exit with an error when this happens, or load as much +# data as possible (the default now) and start if the AOF file is found +# to be truncated at the end. The following option controls this behavior. +# +# If aof-load-truncated is set to yes, a truncated AOF file is loaded and +# the Redis server starts emitting a log to inform the user of the event. +# Otherwise if the option is set to no, the server aborts with an error +# and refuses to start. When the option is set to no, the user requires +# to fix the AOF file using the "redis-check-aof" utility before to restart +# the server. +# +# Note that if the AOF file will be found to be corrupted in the middle +# the server will still exit with an error. This option only applies when +# Redis will try to read more data from the AOF file but not enough bytes +# will be found. +aof-load-truncated yes + +################################ LUA SCRIPTING ############################### + +# Max execution time of a Lua script in milliseconds. +# +# If the maximum execution time is reached Redis will log that a script is +# still in execution after the maximum allowed time and will start to +# reply to queries with an error. +# +# When a long running script exceeds the maximum execution time only the +# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be +# used to stop a script that did not yet called write commands. The second +# is the only way to shut down the server in the case a write command was +# already issued by the script but the user doesn't want to wait for the natural +# termination of the script. +# +# Set it to 0 or a negative value for unlimited execution without warnings. +lua-time-limit 5000 + +################################ REDIS CLUSTER ############################### +# +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however +# in order to mark it as "mature" we need to wait for a non trivial percentage +# of users to deploy it in production. +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# +# Normal Redis instances can't be part of a Redis Cluster; only nodes that are +# started as cluster nodes can. In order to start a Redis instance as a +# cluster node enable the cluster support uncommenting the following: +# +# cluster-enabled yes + +# Every cluster node has a cluster configuration file. This file is not +# intended to be edited by hand. It is created and updated by Redis nodes. +# Every Redis Cluster node requires a different cluster configuration file. +# Make sure that instances running in the same system do not have +# overlapping cluster configuration file names. +# +# cluster-config-file nodes-6379.conf + +# Cluster node timeout is the amount of milliseconds a node must be unreachable +# for it to be considered in failure state. +# Most other internal time limits are multiple of the node timeout. +# +# cluster-node-timeout 15000 + +# A slave of a failing master will avoid to start a failover if its data +# looks too old. +# +# There is no simple way for a slave to actually have a exact measure of +# its "data age", so the following two checks are performed: +# +# 1) If there are multiple slaves able to failover, they exchange messages +# in order to try to give an advantage to the slave with the best +# replication offset (more data from the master processed). +# Slaves will try to get their rank by offset, and apply to the start +# of the failover a delay proportional to their rank. +# +# 2) Every single slave computes the time of the last interaction with +# its master. This can be the last ping or command received (if the master +# is still in the "connected" state), or the time that elapsed since the +# disconnection with the master (if the replication link is currently down). +# If the last interaction is too old, the slave will not try to failover +# at all. +# +# The point "2" can be tuned by user. Specifically a slave will not perform +# the failover if, since the last interaction with the master, the time +# elapsed is greater than: +# +# (node-timeout * slave-validity-factor) + repl-ping-slave-period +# +# So for example if node-timeout is 30 seconds, and the slave-validity-factor +# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the +# slave will not try to failover if it was not able to talk with the master +# for longer than 310 seconds. +# +# A large slave-validity-factor may allow slaves with too old data to failover +# a master, while a too small value may prevent the cluster from being able to +# elect a slave at all. +# +# For maximum availability, it is possible to set the slave-validity-factor +# to a value of 0, which means, that slaves will always try to failover the +# master regardless of the last time they interacted with the master. +# (However they'll always try to apply a delay proportional to their +# offset rank). +# +# Zero is the only value able to guarantee that when all the partitions heal +# the cluster will always be able to continue. +# +# cluster-slave-validity-factor 10 + +# Cluster slaves are able to migrate to orphaned masters, that are masters +# that are left without working slaves. This improves the cluster ability +# to resist to failures as otherwise an orphaned master can't be failed over +# in case of failure if it has no working slaves. +# +# Slaves migrate to orphaned masters only if there are still at least a +# given number of other working slaves for their old master. This number +# is the "migration barrier". A migration barrier of 1 means that a slave +# will migrate only if there is at least 1 other working slave for its master +# and so forth. It usually reflects the number of slaves you want for every +# master in your cluster. +# +# Default is 1 (slaves migrate only if their masters remain with at least +# one slave). To disable migration just set it to a very large value. +# A value of 0 can be set but is useful only for debugging and dangerous +# in production. +# +# cluster-migration-barrier 1 + +# By default Redis Cluster nodes stop accepting queries if they detect there +# is at least an hash slot uncovered (no available node is serving it). +# This way if the cluster is partially down (for example a range of hash slots +# are no longer covered) all the cluster becomes, eventually, unavailable. +# It automatically returns available as soon as all the slots are covered again. +# +# However sometimes you want the subset of the cluster which is working, +# to continue to accept queries for the part of the key space that is still +# covered. In order to do so, just set the cluster-require-full-coverage +# option to no. +# +# cluster-require-full-coverage yes + +# In order to setup your cluster make sure to read the documentation +# available at http://redis.io web site. + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 128 + +################################ LATENCY MONITOR ############################## + +# The Redis latency monitoring subsystem samples different operations +# at runtime in order to collect data related to possible sources of +# latency of a Redis instance. +# +# Via the LATENCY command this information is available to the user that can +# print graphs and obtain reports. +# +# The system only logs operations that were performed in a time equal or +# greater than the amount of milliseconds specified via the +# latency-monitor-threshold configuration directive. When its value is set +# to zero, the latency monitor is turned off. +# +# By default latency monitoring is disabled since it is mostly not needed +# if you don't have latency issues, and collecting data has a performance +# impact, that while very small, can be measured under big load. Latency +# monitoring can easily be enalbed at runtime using the command +# "CONFIG SET latency-monitor-threshold " if needed. +latency-monitor-threshold 0 + +############################# Event notification ############################## + +# Redis can notify Pub/Sub clients about events happening in the key space. +# This feature is documented at http://redis.io/topics/notifications +# +# For instance if keyspace events notification is enabled, and a client +# performs a DEL operation on key "foo" stored in the Database 0, two +# messages will be published via Pub/Sub: +# +# PUBLISH __keyspace@0__:foo del +# PUBLISH __keyevent@0__:del foo +# +# It is possible to select the events that Redis will notify among a set +# of classes. Every class is identified by a single character: +# +# K Keyspace events, published with __keyspace@__ prefix. +# E Keyevent events, published with __keyevent@__ prefix. +# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... +# $ String commands +# l List commands +# s Set commands +# h Hash commands +# z Sorted set commands +# x Expired events (events generated every time a key expires) +# e Evicted events (events generated when a key is evicted for maxmemory) +# A Alias for g$lshzxe, so that the "AKE" string means all the events. +# +# The "notify-keyspace-events" takes as argument a string that is composed +# of zero or multiple characters. The empty string means that notifications +# are disabled. +# +# Example: to enable list and generic events, from the point of view of the +# event name, use: +# +# notify-keyspace-events Elg +# +# Example 2: to get the stream of the expired keys subscribing to channel +# name __keyevent@0__:expired use: +# +# notify-keyspace-events Ex +# +# By default all notifications are disabled because most users don't need +# this feature and the feature has some overhead. Note that if you don't +# specify at least one of K or E, no events will be delivered. +notify-keyspace-events "" + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded using a memory efficient data structure when they have a +# small number of entries, and the biggest entry does not exceed a given +# threshold. These thresholds can be configured using the following directives. +hash-max-ziplist-entries 512 +hash-max-ziplist-value 64 + +# Similarly to hashes, small lists are also encoded in a special way in order +# to save a lot of space. The special representation is only used when +# you are under the following limits: +list-max-ziplist-entries 512 +list-max-ziplist-value 64 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happen to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# HyperLogLog sparse representation bytes limit. The limit includes the +# 16 bytes header. When an HyperLogLog using the sparse representation crosses +# this limit, it is converted into the dense representation. +# +# A value greater than 16000 is totally useless, since at that point the +# dense representation is more memory efficient. +# +# The suggested value is ~ 3000 in order to have the benefits of +# the space efficient encoding without slowing down too much PFADD, +# which is O(N) with the sparse encoding. The value can be raised to +# ~ 10000 when CPU is not a concern, but space is, and the data set is +# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. +hll-sparse-max-bytes 3000 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation Redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into a hash table +# that is rehashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# actively rehash the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply from time to time +# to queries with 2 milliseconds delay. +# +# use "activerehashing yes" if you don't have such hard requirements but +# want to free memory asap when possible. +activerehashing yes + +# The client output buffer limits can be used to force disconnection of clients +# that are not reading data from the server fast enough for some reason (a +# common reason is that a Pub/Sub client can't consume messages as fast as the +# publisher can produce them). +# +# The limit can be set differently for the three different classes of clients: +# +# normal -> normal clients including MONITOR clients +# slave -> slave clients +# pubsub -> clients subscribed to at least one pubsub channel or pattern +# +# The syntax of every client-output-buffer-limit directive is the following: +# +# client-output-buffer-limit +# +# A client is immediately disconnected once the hard limit is reached, or if +# the soft limit is reached and remains reached for the specified number of +# seconds (continuously). +# So for instance if the hard limit is 32 megabytes and the soft limit is +# 16 megabytes / 10 seconds, the client will get disconnected immediately +# if the size of the output buffers reach 32 megabytes, but will also get +# disconnected if the client reaches 16 megabytes and continuously overcomes +# the limit for 10 seconds. +# +# By default normal clients are not limited because they don't receive data +# without asking (in a push way), but just after a request, so only +# asynchronous clients may create a scenario where data is requested faster +# than it can read. +# +# Instead there is a default limit for pubsub and slave clients, since +# subscribers and slaves receive data in a push fashion. +# +# Both the hard or the soft limit can be disabled by setting them to zero. +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 256mb 64mb 60 +client-output-buffer-limit pubsub 32mb 8mb 60 + +# Redis calls an internal function to perform many background tasks, like +# closing connections of clients in timeot, purging expired keys that are +# never requested, and so forth. +# +# Not all tasks are perforemd with the same frequency, but Redis checks for +# tasks to perform according to the specified "hz" value. +# +# By default "hz" is set to 10. Raising the value will use more CPU when +# Redis is idle, but at the same time will make Redis more responsive when +# there are many keys expiring at the same time, and timeouts may be +# handled with more precision. +# +# The range is between 1 and 500, however a value over 100 is usually not +# a good idea. Most users should use the default of 10 and raise this up to +# 100 only in environments where very low latency is required. +hz 10 + +# When a child rewrites the AOF file, if the following option is enabled +# the file will be fsync-ed every 32 MB of data generated. This is useful +# in order to commit the file to the disk more incrementally and avoid +# big latency spikes. +aof-rewrite-incremental-fsync yes + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis server but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# include /path/to/local.conf +# include /path/to/other.conf diff --git a/codes/redis/redis-config/sentinel3/windows/server-6380/redis.conf b/codes/redis/redis-config/sentinel3/windows/server-6380/redis.conf new file mode 100644 index 0000000..8a15215 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6380/redis.conf @@ -0,0 +1,5 @@ +# Relative to .\sentinel3\windows +include redis.windows.conf + +port 6380 +dir .\server-6380\state diff --git a/codes/redis/redis-config/sentinel3/windows/server-6380/sentinel.conf b/codes/redis/redis-config/sentinel3/windows/server-6380/sentinel.conf new file mode 100644 index 0000000..7dce0f9 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6380/sentinel.conf @@ -0,0 +1,13 @@ +# Relative to .\sentinel3\windows + +port 26380 +dir "D:\\tools\\Redis\\redis-config\\sentinel3\\windows\\server-6380\\state" +sentinel monitor mymaster 127.0.0.1 6380 2 +# Generated by CONFIG REWRITE +sentinel config-epoch mymaster 0 +sentinel leader-epoch mymaster 0 +sentinel known-slave mymaster 127.0.0.1 6381 +sentinel known-slave mymaster 127.0.0.1 6382 +sentinel known-sentinel mymaster 127.0.0.1 26382 5b1271b82300c0747f430faf3bb8ba13b20c88ad +sentinel known-sentinel mymaster 127.0.0.1 26381 75707fc2fad924d0382d976debcdb4483313ab0f +sentinel current-epoch 0 diff --git a/codes/redis/redis-config/sentinel3/windows/server-6380/start.cmd b/codes/redis/redis-config/sentinel3/windows/server-6380/start.cmd new file mode 100644 index 0000000..cad1edb --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6380/start.cmd @@ -0,0 +1,8 @@ +@echo off +SET redis_server=..\..\bin\windows\redis-server +SET redis_sentinel=..\..\bin\windows\redis-server + +pushd .. +start %redis_server% server-6380/redis.conf +start %redis_sentinel% server-6380/sentinel.conf --sentinel +popd diff --git a/codes/redis/redis-config/sentinel3/windows/server-6380/state/dump.rdb b/codes/redis/redis-config/sentinel3/windows/server-6380/state/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..38f2e743636257ae8efe8e4f6c396cc2c1c1eda4 GIT binary patch literal 438 zcmWG?b@2=~FfcIt$H2gnomy$eR+gAknraB<7{WNLKp8_6o{=SroH2|CGQ$MM0ckTb zK;{|3c_4+RFewnn0>%Mb26qS840D(qNTCso1C~NjXozAW+)-eKD6TR@alSE%tKd@1 yK+6uuF@SZWSZauB7OKlpR2reW0Um@Pf51HjwgA--R5_Th{$G9fPVnv83!wnu_Ja`s literal 0 HcmV?d00001 diff --git a/codes/redis/redis-config/sentinel3/windows/server-6380/stop.cmd b/codes/redis/redis-config/sentinel3/windows/server-6380/stop.cmd new file mode 100644 index 0000000..b59b6bd --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6380/stop.cmd @@ -0,0 +1,7 @@ +@echo off +SET redis_cli=..\..\bin\windows\redis-cli + +pushd .. +%redis_cli% -p 26380 SHUTDOWN NOSAVE +%redis_cli% -p 6380 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/windows/server-6381/redis.conf b/codes/redis/redis-config/sentinel3/windows/server-6381/redis.conf new file mode 100644 index 0000000..97214a6 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6381/redis.conf @@ -0,0 +1,6 @@ +# Relative to .\sentinel3\windows +include redis.windows.conf + +port 6381 +dir .\server-6381\state +slaveof 127.0.0.1 6380 diff --git a/codes/redis/redis-config/sentinel3/windows/server-6381/sentinel.conf b/codes/redis/redis-config/sentinel3/windows/server-6381/sentinel.conf new file mode 100644 index 0000000..fc94af6 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6381/sentinel.conf @@ -0,0 +1,13 @@ +# Relative to .\sentinel3\windows + +port 26381 +dir "D:\\tools\\Redis\\redis-config\\sentinel3\\windows\\server-6381\\state" +sentinel monitor mymaster 127.0.0.1 6380 2 +# Generated by CONFIG REWRITE +sentinel config-epoch mymaster 0 +sentinel leader-epoch mymaster 0 +sentinel known-slave mymaster 127.0.0.1 6381 +sentinel known-slave mymaster 127.0.0.1 6382 +sentinel known-sentinel mymaster 127.0.0.1 26380 35ad958d795fe021134acebea9b0d936461d91b0 +sentinel known-sentinel mymaster 127.0.0.1 26382 5b1271b82300c0747f430faf3bb8ba13b20c88ad +sentinel current-epoch 0 diff --git a/codes/redis/redis-config/sentinel3/windows/server-6381/start.cmd b/codes/redis/redis-config/sentinel3/windows/server-6381/start.cmd new file mode 100644 index 0000000..319d79d --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6381/start.cmd @@ -0,0 +1,8 @@ +@echo off +SET redis_server=..\..\bin\windows\redis-server +SET redis_sentinel=..\..\bin\windows\redis-server + +pushd .. +start %redis_server% server-6381/redis.conf +start %redis_sentinel% server-6381/sentinel.conf --sentinel +popd diff --git a/codes/redis/redis-config/sentinel3/windows/server-6381/state/dump.rdb b/codes/redis/redis-config/sentinel3/windows/server-6381/state/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..38f2e743636257ae8efe8e4f6c396cc2c1c1eda4 GIT binary patch literal 438 zcmWG?b@2=~FfcIt$H2gnomy$eR+gAknraB<7{WNLKp8_6o{=SroH2|CGQ$MM0ckTb zK;{|3c_4+RFewnn0>%Mb26qS840D(qNTCso1C~NjXozAW+)-eKD6TR@alSE%tKd@1 yK+6uuF@SZWSZauB7OKlpR2reW0Um@Pf51HjwgA--R5_Th{$G9fPVnv83!wnu_Ja`s literal 0 HcmV?d00001 diff --git a/codes/redis/redis-config/sentinel3/windows/server-6381/stop.cmd b/codes/redis/redis-config/sentinel3/windows/server-6381/stop.cmd new file mode 100644 index 0000000..d33c919 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6381/stop.cmd @@ -0,0 +1,7 @@ +@echo off +SET redis_cli=..\..\bin\windows\redis-cli + +pushd .. +%redis_cli% -p 26381 SHUTDOWN NOSAVE +%redis_cli% -p 6381 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/windows/server-6382/redis.conf b/codes/redis/redis-config/sentinel3/windows/server-6382/redis.conf new file mode 100644 index 0000000..cead32a --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6382/redis.conf @@ -0,0 +1,6 @@ +# Relative to .\sentinel3\windows +include redis.windows.conf + +port 6382 +dir .\server-6382\state +slaveof 127.0.0.1 6380 diff --git a/codes/redis/redis-config/sentinel3/windows/server-6382/sentinel.conf b/codes/redis/redis-config/sentinel3/windows/server-6382/sentinel.conf new file mode 100644 index 0000000..9939cdd --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6382/sentinel.conf @@ -0,0 +1,13 @@ +# Relative to .\sentinel3\windows + +port 26382 +dir "D:\\tools\\Redis\\redis-config\\sentinel3\\windows\\server-6382\\state" +sentinel monitor mymaster 127.0.0.1 6380 2 +# Generated by CONFIG REWRITE +sentinel config-epoch mymaster 0 +sentinel leader-epoch mymaster 0 +sentinel known-slave mymaster 127.0.0.1 6381 +sentinel known-slave mymaster 127.0.0.1 6382 +sentinel known-sentinel mymaster 127.0.0.1 26381 75707fc2fad924d0382d976debcdb4483313ab0f +sentinel known-sentinel mymaster 127.0.0.1 26380 35ad958d795fe021134acebea9b0d936461d91b0 +sentinel current-epoch 0 diff --git a/codes/redis/redis-config/sentinel3/windows/server-6382/start.cmd b/codes/redis/redis-config/sentinel3/windows/server-6382/start.cmd new file mode 100644 index 0000000..0c7e62b --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6382/start.cmd @@ -0,0 +1,8 @@ +@echo off +SET redis_server=..\..\bin\windows\redis-server +SET redis_sentinel=..\..\bin\windows\redis-server + +pushd .. +start %redis_server% server-6382/redis.conf +start %redis_sentinel% server-6382/sentinel.conf --sentinel +popd diff --git a/codes/redis/redis-config/sentinel3/windows/server-6382/state/dump.rdb b/codes/redis/redis-config/sentinel3/windows/server-6382/state/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..38f2e743636257ae8efe8e4f6c396cc2c1c1eda4 GIT binary patch literal 438 zcmWG?b@2=~FfcIt$H2gnomy$eR+gAknraB<7{WNLKp8_6o{=SroH2|CGQ$MM0ckTb zK;{|3c_4+RFewnn0>%Mb26qS840D(qNTCso1C~NjXozAW+)-eKD6TR@alSE%tKd@1 yK+6uuF@SZWSZauB7OKlpR2reW0Um@Pf51HjwgA--R5_Th{$G9fPVnv83!wnu_Ja`s literal 0 HcmV?d00001 diff --git a/codes/redis/redis-config/sentinel3/windows/server-6382/stop.cmd b/codes/redis/redis-config/sentinel3/windows/server-6382/stop.cmd new file mode 100644 index 0000000..54a5c29 --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/server-6382/stop.cmd @@ -0,0 +1,7 @@ +@echo off +SET redis_cli=..\..\bin\windows\redis-cli + +pushd .. +%redis_cli% -p 26382 SHUTDOWN NOSAVE +%redis_cli% -p 6382 SHUTDOWN NOSAVE +popd diff --git a/codes/redis/redis-config/sentinel3/windows/start-all.cmd b/codes/redis/redis-config/sentinel3/windows/start-all.cmd new file mode 100644 index 0000000..7df778a --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/start-all.cmd @@ -0,0 +1,22 @@ +@echo off +SET redis_server=..\..\bin\windows\redis-server +SET redis_sentinel=..\..\bin\windows\redis-server +SET redis_cli=..\..\bin\windows\redis-cli + +start %redis_server% server-6380\redis.conf +start %redis_sentinel% server-6380\sentinel.conf --sentinel + +start %redis_server% server-6381\redis.conf +start %redis_sentinel% server-6381\sentinel.conf --sentinel + +start %redis_server% server-6382\redis.conf +start %redis_sentinel% server-6382\sentinel.conf --sentinel + +echo Press enter to see sentinel info on masters and slaves... +pause + +%redis_cli% -p 26380 sentinel master mymaster +%redis_cli% -p 26381 sentinel slaves mymaster + +echo Press enter again to close this window +pause diff --git a/codes/redis/redis-config/sentinel3/windows/stop-all.cmd b/codes/redis/redis-config/sentinel3/windows/stop-all.cmd new file mode 100644 index 0000000..77310cb --- /dev/null +++ b/codes/redis/redis-config/sentinel3/windows/stop-all.cmd @@ -0,0 +1,10 @@ +@echo off +SET redis_cli=..\..\bin\windows\redis-cli + +%redis_cli% -p 26382 SHUTDOWN NOSAVE +%redis_cli% -p 26381 SHUTDOWN NOSAVE +%redis_cli% -p 26380 SHUTDOWN NOSAVE + +%redis_cli% -p 6382 SHUTDOWN NOSAVE +%redis_cli% -p 6381 SHUTDOWN NOSAVE +%redis_cli% -p 6380 SHUTDOWN NOSAVE