一、搭建redis主从

1、创建配置文件

主节点:redis.conf

bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"
port 6380
timeout 300
loglevel warning
logfile "redis.log"
databases 16
rdbcompression yes
dbfilename "redis.rdb"
dir "/data"
requirepass "all123456@"
masterauth "all123456@"
maxclients 10000
maxmemory 1000mb
maxmemory-policy allkeys-lru
appendonly yes
appendfsync always

从节点:redis.conf

bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"
port 6380
timeout 300
loglevel warning
logfile "redis.log"
databases 16
rdbcompression yes
dbfilename "redis.rdb"
dir "/data"
requirepass "all123456@"
masterauth "all123456@"
maxclients 10000
maxmemory 1000mb
maxmemory-policy allkeys-lru
appendonly yes
appendfsync always
slaveof 192.168.99.100 6380

注意:redis:5.0版本以后可以使用 replicaof 或者兼容 slaveof

2、docker启动命令

# 主节点
 docker run -d --name redis-master --restart=always -p 6380:6380 \
 -v /root/redis/data/:/data \
 redis:5.0 \
 redis-server  redis.conf

# 从节点
docker run -d --name redis-slaver --restart=always -p 6380:6380 \
-v /root/redis/data/:/data \
redis:5.0 \
redis-server  redis.conf

3、验证主从状态

进入主节点查看主节点状态,主节点Replication信息如下

[root@centos2 ~]# docker exec -it redis-master bash
root@160fe0654a21:/data# redis-cli -h 127.0.0.1 -p 6380 -a all123456@
Warning: Using a password with '-a' or '-u' option on the command line interface may not be 
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.99.100,port=6380,state=online,offset=196,lag=1
master_replid:3b5a3f441d4fb50668310c25798e341da369aa43
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:196
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:196

进入从节点查看从节点状态,从节点Replication信息如下:

root@c56f869e9d05:/data# redis-cli -h 127.0.0.1 -p 6380 -a all123456@
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:192.168.99.108
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:672
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:3b5a3f441d4fb50668310c25798e341da369aa43
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:672
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:672

至此主从搭建完成

二、搭建sentinel哨兵集群

1、哨兵配置文件

sentinel.conf

daemonize no
protected-mode no
port 26379
dir "/data"
sentinel monitor mymaster 192.168.99.108 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster all123456@
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0

2、哨兵集群启动命令

2.1、启动命令如下:

docker run -d --name sentinel1 --restart=always --net=host -p 26379:26379 \
-v /root/sentinel/sentinel.conf:/data/sentinel.conf \
redis:5.0 redis-sentinel sentinel.conf

docker run -d --name sentinel2 --restart=always --net=host -p 26379:26379 \
-v /root/sentinel/sentinel.conf:/data/sentinel.conf \
redis:5.0 redis-sentinel sentinel.conf

docker run -d --name sentinel3 --restart=always --net=host -p 26379:26379 \
-v /root/sentinel/sentinel.conf:/data/sentinel.conf \
redis:5.0 redis-sentinel sentinel.conf

--net=host保证哨兵分不到不用主机也能通信(在同一局域网下),要不然known-sentinel监控的IP地址将会是启动容器docker网桥自动分配的网桥地址,不同主机间不能通信

sentinel known-sentinel mymaster 172.17.0.3 26379 df892f9d04a7a672b390527cfd4ac386c0727b69

2.2、哨兵启动后配置文件变化

启动第一个sentinel哨兵后,配置文件变化如下:

sentinel.conf
[root@centos2 sentinel]# cat sentinel.conf 
daemonize no
protected-mode no
port 26379
dir "/data"
sentinel myid 9a17dff3f1cd2bbdf09c1efcc18e9a4445d21991
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.99.108 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster all123456@
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 192.168.99.100 6380
sentinel current-epoch 0

启动第二个sentinel哨兵后,配置文件变化如下:

.....
sentinel known-replica mymaster 192.168.99.100 6380
sentinel known-sentinel mymaster 192.168.99.100 26379 f706e74cf52a0d960c79929e5761f69b2e78c8fb
sentinel current-epoch 0

启动第三个sentinel哨兵后,配置文件变化如下:

.....
sentinel known-replica mymaster 192.168.99.100 6380
sentinel known-sentinel mymaster 192.168.99.108 26379 9a17dff3f1cd2bbdf09c1efcc18e9a4445d21991
sentinel known-sentinel mymaster 192.168.99.100 26379 f706e74cf52a0d960c79929e5761f69b2e78c8fb
sentinel current-epoch 0

通过比对配置文件可以看出,每个哨兵监控着另一个副本节点(从节点)并且监控着sentinel节点
注意不加--net=host参数,sentinel哨兵之间不能互相发现

三、验证高可用

1、模拟master节点down掉

docker stop redis-master将master节点停止,监控从节点Replication信息,master_link_down_since_seconds为10后,此时从节点成为主节点,完成故障转移(当没有哨兵的时候也能做到),此时查看新master节点配置文件,发现replicaof 192.168.99.100 6380没有了

127.0.0.1:6380> info replication
.....
master_link_down_since_seconds:10
.....
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.99.108,port=6380,state=online,offset=2182,lag=1
master_replid:abecf83438a7e5fdcf1b236943f1b2c18c505d45
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2182

查看哨兵配置文件known-replica监控的是刚才停止掉的主节点

daemonize no
protected-mode no
port 26379
dir "/data"
sentinel myid 1852ac0e6796080d6279f3cdabe66f341e3b26ef
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.99.100 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster all123456@
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel known-replica mymaster 192.168.99.108 6380
sentinel known-sentinel mymaster 192.168.99.108 26379 9a17dff3f1cd2bbdf09c1efcc18e9a4445d21991
sentinel known-sentinel mymaster 192.168.99.100 26379 f706e74cf52a0d960c79929e5761f69b2e78c8fb
sentinel current-epoch 1

2、重启停掉的master节点

进入重启的master节点查看Replication信息,发现此时原master节点变成了slave节点(可以通过停止主节点多次验证),至此高可用集群搭建完毕。

root@160fe0654a21:/data# redis-cli -h 127.0.0.1 -p 6380 -a all123456@
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:192.168.99.100
master_port:6380
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1569147670
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:105ef9c468a488c7f0743d833fac15f418b54942
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

哨兵全部配置

# Example sentinel.conf

# *** IMPORTANT ***
#
# By default Sentinel will not be reachable from interfaces different than
# localhost, either use the 'bind' directive to bind to a list of network
# interfaces, or disable protected mode with "protected-mode no" by
# adding it to this configuration file.
#
# Before doing that MAKE SURE the instance is protected from the outside
# world via firewalling or other means.
#
# For example you may use one of the following:
#
# bind 127.0.0.1 192.168.1.1
#
# protected-mode no

# port <sentinel-port>
# The port that this sentinel instance will run on
port 26379

# By default Redis Sentinel does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis-sentinel.pid when
# daemonized.
daemonize no

# When running daemonized, Redis Sentinel writes a pid file in
# /var/run/redis-sentinel.pid by default. You can specify a custom pid file
# location here.
pidfile /var/run/redis-sentinel.pid

# Specify the log file name. Also the empty string can be used to force
# Sentinel 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 ""

# sentinel announce-ip <ip>
# sentinel announce-port <port>
#
# The above two configuration directives are useful in environments where,
# because of NAT, Sentinel is reachable from outside via a non-local address.
#
# When announce-ip is provided, the Sentinel will claim the specified IP address
# in HELLO messages used to gossip its presence, instead of auto-detecting the
# local address as it usually does.
#
# Similarly when announce-port is provided and is valid and non-zero, Sentinel
# will announce the specified TCP port.
#
# The two options don't need to be used together, if only announce-ip is
# provided, the Sentinel will announce the specified IP and the server port
# as specified by the "port" option. If only announce-port is provided, the
# Sentinel will announce the auto-detected local IP and the specified port.
#
# Example:
#
# sentinel announce-ip 1.2.3.4

# dir <working-directory>
# Every long running process should have a well-defined working directory.
# For Redis Sentinel to chdir to /tmp at startup is the simplest thing
# for the process to don't interfere with administrative tasks such as
# unmounting filesystems.
dir /tmp

# sentinel monitor <master-name> <ip> <redis-port> <quorum>
#
# Tells Sentinel to monitor this master, and to consider it in O_DOWN
# (Objectively Down) state only if at least <quorum> sentinels agree.
#
# Note that whatever is the ODOWN quorum, a Sentinel will require to
# be elected by the majority of the known Sentinels in order to
# start a failover, so no failover can be performed in minority.
#
# Replicas are auto-discovered, so you don't need to specify replicas in
# any way. Sentinel itself will rewrite this configuration file adding
# the replicas using additional configuration options.
# Also note that the configuration file is rewritten when a
# replica 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 <master-name> <password>
#
# Set the password to use to authenticate with the master and replicas.
# Useful if there is a password set in the Redis instances to monitor.
#
# Note that the master password is also used for replicas, so it is not
# possible to set a different password in masters and replicas instances
# if you want to be able to monitor these instances with Sentinel.
#
# However you can have Redis instances without the authentication enabled
# mixed with Redis instances requiring the authentication (as long as the
# password set is the same for all the instances requiring the password) as
# the AUTH command will have no effect in Redis instances with authentication
# switched off.
#
# Example:
#
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd

# sentinel down-after-milliseconds <master-name> <milliseconds>
#
# Number of milliseconds the master (or any attached replica 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 <master-name> <numreplicas>
#
# How many replicas we can reconfigure to point to the new replica simultaneously
# during the failover. Use a low number if you use the replicas to serve query
# to avoid that all the replicas will be unreachable at about the same
# time while performing the synchronization with the master.
sentinel parallel-syncs mymaster 1

# sentinel failover-timeout <master-name> <milliseconds>
#
# Specifies the failover timeout in milliseconds. It is used in many ways:
#
# - The time needed to re-start a failover after a previous failover was
#   already tried against the same master by a given Sentinel, is two
#   times the failover timeout.
#
# - The time needed for a replica 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 replica).
#
# - The maximum time a failover in progress waits for all the replicas to be
#   reconfigured as replicas of the new master. However even after this time
#   the replicas 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 <master-name> <script-path>
# 
# Call the specified notification script for any sentinel event that is
# generated in the WARNING level (for instance -sdown, -odown, and so forth).
# This script should notify the system administrator via email, SMS, or any
# other messaging system, that there is something wrong with the monitored
# Redis systems.
#
# The script is called with just two arguments: the first is the event type
# and the second the event description.
#
# The script must exist and be executable in order for sentinel to start if
# this option is provided.
#
# Example:
#
# sentinel notification-script mymaster /var/redis/notify.sh

# CLIENTS RECONFIGURATION SCRIPT
#
# sentinel client-reconfig-script <master-name> <script-path>
#
# When the master changed because of a failover a script can be called in
# order to perform application-specific tasks to notify the clients that the
# configuration has changed and the master is at a different address.
# 
# The following arguments are passed to the script:
#
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
#
# <state> is currently always "failover"
# <role> is either "leader" or "observer"
# 
# The arguments from-ip, from-port, to-ip, to-port are used to communicate
# the old address of the master and the new address of the elected replica
# (now a master).
#
# This script should be resistant to multiple invocations.
#
# Example:
#
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

# SECURITY
#
# By default SENTINEL SET will not be able to change the notification-script
# and client-reconfig-script at runtime. This avoids a trivial security issue
# where clients can set the script to anything and trigger a failover in order
# to get the program executed.

sentinel deny-scripts-reconfig yes

# REDIS COMMANDS RENAMING
#
# Sometimes the Redis server has certain commands, that are needed for Sentinel
# to work correctly, renamed to unguessable strings. This is often the case
# of CONFIG and SLAVEOF in the context of providers that provide Redis as
# a service, and don't want the customers to reconfigure the instances outside
# of the administration console.
#
# In such case it is possible to tell Sentinel to use different command names
# instead of the normal ones. For example if the master "mymaster", and the
# associated replicas, have "CONFIG" all renamed to "GUESSME", I could use:
#
# SENTINEL rename-command mymaster CONFIG GUESSME
#
# After such configuration is set, every time Sentinel would use CONFIG it will
# use GUESSME instead. Note that there is no actual need to respect the command
# case, so writing "config guessme" is the same in the example above.
#
# SENTINEL SET can also be used in order to perform this configuration at runtime.
#
# In order to set a command back to its original name (undo the renaming), it
# is possible to just rename a command to itsef:
#
# SENTINEL rename-command mymaster CONFIG CONFIG
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐