一、Redis集群理论前言与介绍
1.1 前言
1.2 Redis群集介绍
二、Redis三种模式
2.1 主从模式
2.2 哨兵模式
2.3 Cluster群集
三、实验搭建
3.1 Redis主从复制模式
3.1.1 实验环境
Master节点:192.168.131.11 Slave1节点:192.168.131.12 Slave2节点:192.168.131.13
3.1.2 三台服务器安装Redis5.0.7
[ root@localhost ~ ] # cd / opt/
[ root@localhost opt] # systemctl stop firewalld. service
[ root@localhost opt] # setenforce 0
[ root@localhost opt] # systemctl disable firewalld. service
[ root@localhost opt] # ls
redis- 5.0 .7 . tar. gz rh
[ root@localhost opt] # tar zxvf redis- 5.0 .7 . tar. gz
[ root@localhost opt] # cd redis- 5.0 .7 /
[ root@localhost redis- 5.0 .7 ] # yum - y install gcc gcc- c++ make
[ root@localhost redis- 5.0 .7 ] # make
[ root@localhost redis- 5.0 .7 ] # make PREFIX= / usr/ local/ redis install 【编译并且编译安装目录为/ usr/ local/ redis】
【由于redis源码包中直接提供了Makefile文件,所以在解压完软件包后,不用再执行. /configure进行配置,可直接执行make与make install命令进行安装】
[ root@localhost redis- 5.0 .7 ] # cd utils/
[ root@localhost utils] # ls
build- static - symbols. tcl create- cluster hashtable lru redis_init_script. tpl speed- regression. tcl
cluster_fail_time. tcl generate- command- help. rb hyperloglog redis- copy. rb redis- sha1. rb whatisdoing. sh
corrupt_rdb. c graphs install_server. sh redis_init_script releasetools
[ root@localhost utils] # . /install_server. sh 【执行软件包提供的. /install_server. sh 脚本文件设置redis服务所需要的相关配置文件】
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [ 6379 ] 【回车确认端口号6379 】
Selecting default : 6379
Please select the redis config file name [ / etc/ redis/ 6379. conf] 【回车确认配置文件目录】
Selected default - / etc/ redis/ 6379. conf
Please select the redis log file name [ / var/ log/ redis_6379. log] 【回车确认日志文件目录】
Selected default - / var/ log/ redis_6379. log
Please select the data directory for this instance [ / var/ lib/ redis/ 6379 ] 【回车确认数据文件目录】
Selected default - / var/ lib/ redis/ 6379
【回车到这里的时候需要在[ ] 后面手动输入可执行文件路径(需要一次性输入正确)】
Please select the redis executable path [ ] / usr/ local/ redis/ bin/ redis- server
Selected config:
Port : 6379 【默认侦听端口为6379 】
Config file : / etc/ redis/ 6379. conf 【配置文件路径】
Log file : / var/ log/ redis_6379. log 【日志文件路径】
Data dir : / var/ lib/ redis/ 6379 【数据文件路径】
Executable : / usr/ local/ redis/ bin/ redis- server 【可执行文件路径】
Cli Executable : / usr/ local/ redis/ bin/ redis- cli 【客户端命令工具】
Is this ok? Then press ENTER to go on or Ctrl- C to abort.
Copied / tmp/ 6379. conf = > / etc/ init. d/ redis_6379
Installing service. . .
Successfully added to chkconfig!
Successfully added to runlevels 345 !
Starting Redis server. . .
Installation successful!
【把redis的可执行程序文件放入路径环境变量的目录中便于系统识别】
[ root@localhost utils] # ln - s / usr/ local/ redis/ bin/ * / usr/ local/ bin/
【当install_server. sh脚本运行完毕,redis服务就已开启,默认监听端口为6379 】
[ root@localhost utils] # netstat - tanp | grep 6379 【查看tcp协议6379 端口是否打开】
tcp 0 0 127.0 .0 .1 : 6379 0.0 .0 .0 : * LISTEN 9796 / redis- server 1
3.1.3 Master节点
[ root@localhost utils] # vim / etc/ redis/ 6379. conf
70 bind 0.0 .0 .0 【70 行,修改bind选项(0.0 .0 .0 代表监听所有网段)】
137 daemonize yes 【137 行,开启守护进程】
172 logfile / var/ log/ redis_6379. log 【172 行,指定日志文件目录】
264 dir / var/ lib/ redis/ 6379 【264 行,指定工作目录】
700 appendonly yes 【700 行,开启AOF持久化功能】
[ root@localhost utils] # / etc/ init. d/ redis_6379 restart 【重启服务】
Stopping . . .
Waiting for Redis to shutdown . . .
Redis stopped
Starting Redis server. . .
3.1.4 Slaves节点
[ root@localhost utils] # vim / etc/ redis/ 6379. conf
70 bind 0.0 .0 .0 【70 行,修改bind选项(0.0 .0 .0 代表监听所有网段)】
137 daemonize yes 【137 行,开启守护进程】
172 logfile / var/ log/ redis_6379. log 【172 行,指定日志文件目录】
264 dir / var/ lib/ redis/ 6379 【264 行,指定工作目录】
288 replicaof 192.168 .131 .11 6379 【288 行,指定要同步的Master节点的IP和端口】
700 appendonly yes 【700 行,开启AOF持久化功能】
[ root@localhost utils] # / etc/ init. d/ redis_6379 restart 【重启服务】
Stopping . . .
Waiting for Redis to shutdown . . .
Redis stopped
Starting Redis server. . .
3.1.5 在Master节点查看验证
[ root@localhost utils] # tail - f / var/ log/ redis_6379. log 【在Master节点上看日志】
48099 : M 19 May 2021 14 : 26 : 40.059 * Background saving terminated with success
48099 : M 19 May 2021 14 : 26 : 40.060 * Synchronization with replica 192.168 .131 .13 : 6379 succeeded 【slave2的IP同步成功】
48099 : M 19 May 2021 14 : 26 : 40.089 * Replica 192.168 .131 .12 : 6379 asks for synchronization
48099 : M 19 May 2021 14 : 26 : 40.089 * Full resync requested by replica 192.168 .131 .12 : 6379
48099 : M 19 May 2021 14 : 26 : 40.089 * Starting BGSAVE for SYNC with target: disk
48099 : M 19 May 2021 14 : 26 : 40.090 * Background saving started by pid 48137
48137 : C 19 May 2021 14 : 26 : 40.091 * DB saved on disk
48137 : C 19 May 2021 14 : 26 : 40.091 * RDB: 4 MB of memory used by copy- on- write
48099 : M 19 May 2021 14 : 26 : 40.160 * Background saving terminated with success
48099 : M 19 May 2021 14 : 26 : 40.160 * Synchronization with replica 192.168 .131 .12 : 6379 succeeded 【slave1的IP同步成功】
[ root@localhost utils] # hostnamectl set- hostname master 【永久修改主机名】
[ root@localhost utils] # su 【切换】
[ root@master utils] # redis- cli info replication 【在Master节点查看主从信息】
# Replication
role: master
connected_slaves: 2
slave0: ip= 192.168 .131 .13 , port= 6379 , state= online, offset= 1162 , lag= 1 【Slave1相关信息】
slave1: ip= 192.168 .131 .12 , port= 6379 , state= online, offset= 1162 , lag= 0 【Slave2相关信息】
master_replid: 1 b6a0c842a7ea420f47a1cce9f9a8689c8d120ae
master_replid2: 0000000000000000000000000000000000000000
master_repl_offset: 1162
second_repl_offset: - 1
repl_backlog_active: 1
repl_backlog_size: 1048576
repl_backlog_first_byte_offset: 1
repl_backlog_histlen: 1162
3.2 哨兵模式
3.2.1 修改配置文件
[ root@master utils] # vim / opt/ redis- 5.0 .7 / sentinel. conf
17 protected - mode no 【17 行,关闭保护模式】
21 port 26379 【21 行,Redis哨兵默认的监听端口】
26 daemonize yes 【26 行,指定sentinel(哨兵)为后台启动】
36 logfile "/var/log/sentinel.log" 【36 行,指定日志存放路径】
65 dir "/var/lib/redis/6379" 【65 行,指定数据库存放路径】
84 sentinel monitor mymaster 192.168 .131 .11 6379 2 【84 行,修改IP地址】
【指定该哨兵监控192.168 .131 .11 : 6379 这个主节点,该主节点的名称为mymster】
【最后2 的含义与主节点的故障判定有关,代表至少需要2 个哨兵节点同意后才能判定主节点故障并进行故障转移】
113 sentinel down- after- milliseconds mymaster 30000 【113 行,判定服务器down掉的时间周期,默认30000 毫秒(30 秒)】
146 sentinel failover- timeout mymaster 180000 【146 行,故障节点的最大超时时间为180000 毫秒(180 秒)】
3.2.2 启动哨兵模式
【启动哨兵模式(先启动Master再启动Slaves)】
[ root@master utils] # cd / opt/ redis- 5.0 .7 / 【先切换到/ opt/ redis- 5.0 .7 / 目录下】
[ root@master redis- 5.0 .7 ] # redis- sentinel sentinel. conf & 【使用redis- sentinel命令读取哨兵配置文件】
[ 1 ] 48576
[ root@slave1 redis- 5.0 .7 ] # redis- sentinel sentinel. conf &
[ 1 ] 47036
[ root@slave2 redis- 5.0 .7 ] # redis- sentinel sentinel. conf &
[ 1 ] 46978
3.2.3 模拟故障并查看哨兵信息
[ root@master redis- 5.0 .7 ] # tail - f / var/ log/ sentinel. log 【查看master哨兵日志文件】
[ root@master redis- 5.0 .7 ] # redis- cli - p 26379 info sentinel 【查看哨兵信息】
# Sentinel
sentinel_masters: 1
sentinel_tilt: 0
sentinel_running_scripts: 0
sentinel_scripts_queue_length: 0
sentinel_simulate_failure_flags: 0
【MasterIP为192.168 .131 .11 】
master0: name= mymaster, status= ok, address= 192.168 .131 .11 : 6379 , slaves= 2 , sentinels= 3
[ root@master redis- 5.0 .7 ] # ps aux | grep redis 【查看redis- server进程号】
root 48099 0.1 0.3 156404 7816 ? Ssl 14 : 22 0 : 03 / usr/ local/ redis/ bin/ redis- server 0.0 .0 .0 : 6379
root 48577 0.2 0.3 153844 7520 ? Ssl 14 : 55 0 : 01 redis- sentinel * : 26379 [ sentinel]
root 48722 0.0 0.0 112676 984 pts/ 2 S+ 15 : 07 0 : 00 grep -- color= auto redis
[ root@master redis- 5.0 .7 ] # kill - 9 48099 【将redis进程杀掉,模拟宕机】
[ root@master redis- 5.0 .7 ] # redis- cli - p 26379 info sentinel 【查看哨兵信息】
# Sentinel
sentinel_masters: 1
sentinel_tilt: 0
sentinel_running_scripts: 0
sentinel_scripts_queue_length: 0
sentinel_simulate_failure_flags: 0
【已经切换为salve1 IP 192.168 .131 .12 】
master0: name= mymaster, status= ok, address= 192.168 .131 .12 : 6379 , slaves= 2 , sentinels= 3
3.3 Redis集群模式
3.3.1 实验环境
3.3.2 六台服务器安装redis
[ root@localhost ~ ] # cd / opt/
[ root@localhost opt] # systemctl stop firewalld. service
[ root@localhost opt] # setenforce 0
[ root@localhost opt] # systemctl disable firewalld. service
[ root@localhost opt] # ls
redis- 5.0 .7 . tar. gz rh
[ root@localhost opt] # tar zxvf redis- 5.0 .7 . tar. gz
[ root@localhost opt] # cd redis- 5.0 .7 /
[ root@localhost redis- 5.0 .7 ] # yum - y install gcc gcc- c++ make
[ root@localhost redis- 5.0 .7 ] # make
[ root@localhost redis- 5.0 .7 ] # make PREFIX= / usr/ local/ redis install 【编译并且编译安装目录为/ usr/ local/ redis】
【由于redis源码包中直接提供了Makefile文件,所以在解压完软件包后,不用再执行. /configure进行配置,可直接执行make与make install命令进行安装】
[ root@localhost redis- 5.0 .7 ] # cd utils/
[ root@localhost utils] # ls
build- static - symbols. tcl create- cluster hashtable lru redis_init_script. tpl speed- regression. tcl
cluster_fail_time. tcl generate- command- help. rb hyperloglog redis- copy. rb redis- sha1. rb whatisdoing. sh
corrupt_rdb. c graphs install_server. sh redis_init_script releasetools
[ root@localhost utils] # . /install_server. sh 【执行软件包提供的. /install_server. sh 脚本文件设置redis服务所需要的相关配置文件】
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [ 6379 ] 【回车确认端口号6379 】
Selecting default : 6379
Please select the redis config file name [ / etc/ redis/ 6379. conf] 【回车确认配置文件目录】
Selected default - / etc/ redis/ 6379. conf
Please select the redis log file name [ / var/ log/ redis_6379. log] 【回车确认日志文件目录】
Selected default - / var/ log/ redis_6379. log
Please select the data directory for this instance [ / var/ lib/ redis/ 6379 ] 【回车确认数据文件目录】
Selected default - / var/ lib/ redis/ 6379
【回车到这里的时候需要在[ ] 后面手动输入可执行文件路径(需要一次性输入正确)】
Please select the redis executable path [ ] / usr/ local/ redis/ bin/ redis- server
Selected config:
Port : 6379 【默认侦听端口为6379 】
Config file : / etc/ redis/ 6379. conf 【配置文件路径】
Log file : / var/ log/ redis_6379. log 【日志文件路径】
Data dir : / var/ lib/ redis/ 6379 【数据文件路径】
Executable : / usr/ local/ redis/ bin/ redis- server 【可执行文件路径】
Cli Executable : / usr/ local/ redis/ bin/ redis- cli 【客户端命令工具】
Is this ok? Then press ENTER to go on or Ctrl- C to abort.
Copied / tmp/ 6379. conf = > / etc/ init. d/ redis_6379
Installing service. . .
Successfully added to chkconfig!
Successfully added to runlevels 345 !
Starting Redis server. . .
Installation successful!
【把redis的可执行程序文件放入路径环境变量的目录中便于系统识别】
[ root@localhost utils] # ln - s / usr/ local/ redis/ bin/ * / usr/ local/ bin/
【当install_server. sh脚本运行完毕,redis服务就已开启,默认监听端口为6379 】
[ root@localhost utils] # netstat - tanp | grep 6379 【查看tcp协议6379 端口是否打开】
tcp 0 0 127.0 .0 .1 : 6379 0.0 .0 .0 : * LISTEN 9796 / redis- server 1
3.3.3 修改/etc/redis/6379.conf 配置文件
[ root@master1 utils] # vim / etc/ redis/ 6379. conf
70 bind 0.0 .0 .0 【修改监听地址】
89 protected - mode no 【关闭保护模式】
93 port 5001 【确认端口为开启状态,并将6 台服务机改成不同的端口】
137 daemonize yes 【确认以独立进程启动为开启状态】
833 cluster- enabled yes 【取消注释,开启群集功能,cluster需顶头,否则功能不生效】
841 cluster- config- file nodes- 6379. conf 【取消注释,设置群集节点配置文件(启动后会在目录下生成此文件)】
847 cluster- node- timeout 15000 【取消注释,此项功能为群集超时时间设置】
700 appendonly yes 【开启AOF持久化功能,为了开启同步操作】
[ root@master1 utils] # / etc/ init. d/ redis_6379 restart 【重启服务】
Stopping . . .
Waiting for Redis to shutdown . . .
Redis stopped
Starting Redis server. . .
3.3.4 加入集群并查看
【加入集群,前面3 台是Master后面3 台是Slave】
[ root@master1 utils] # redis- cli -- cluster create 192.168 .131 .11 : 5001 192.168 .131 .12 : 5002 192.168 .131 .13 : 5003 192.168 .131 .14 : 5004 192.168 .131 .15 : 5005 192.168 .131 .16 : 5006 -- cluster- replicas 1
>>> Performing hash slots allocation on 6 nodes. . .
Master[ 0 ] - > Slots 0 - 5460
Master[ 1 ] - > Slots 5461 - 10922
Master[ 2 ] - > Slots 10923 - 16383
Adding replica 192.168 .131 .15 : 5005 to 192.168 .131 .11 : 5001
Adding replica 192.168 .131 .16 : 5006 to 192.168 .131 .12 : 5002
Adding replica 192.168 .131 .14 : 5004 to 192.168 .131 .13 : 5003
M: e708a900933ab5ee40850fe45a085cc9f67c07c2 192.168 .131 .11 : 5001
slots: [ 0 - 5460 ] ( 5461 slots) master
M: 392f fd7be9ae59da9daa8a885bbc7e2c0e5dbaa1 192.168 .131 .12 : 5002
slots: [ 5461 - 10922 ] ( 5462 slots) master
M: 3 caf1bdc8fcff45b4d3af529337353ca4396c889 192.168 .131 .13 : 5003
slots: [ 10923 - 16383 ] ( 5461 slots) master
S: 42 c4f75ce153de4059e2f921f2c4f344812ba9ba 192.168 .131 .14 : 5004
replicates 3 caf1bdc8fcff45b4d3af529337353ca4396c889
S: 3e3 e827a6b77ebb26a5d59b4c99bd695c09de2d2 192.168 .131 .15 : 5005
replicates e708a900933ab5ee40850fe45a085cc9f67c07c2
S: a445e053d0f15ab77f562e44fcb29c2763a966d0 192.168 .131 .16 : 5006
replicates 392f fd7be9ae59da9daa8a885bbc7e2c0e5dbaa1
Can I set the above configuration? ( type 'yes' to accept) : yes 【输入yes】
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
>>> Performing Cluster Check ( using node 192.168 .131 .11 : 5001 )
M: e708a900933ab5ee40850fe45a085cc9f67c07c2 192.168 .131 .11 : 5001
slots: [ 0 - 5460 ] ( 5461 slots) master
1 additional replica ( s)
S: 42 c4f75ce153de4059e2f921f2c4f344812ba9ba 192.168 .131 .14 : 5004
slots: ( 0 slots) slave
replicates 3 caf1bdc8fcff45b4d3af529337353ca4396c889
S: a445e053d0f15ab77f562e44fcb29c2763a966d0 192.168 .131 .16 : 5006
slots: ( 0 slots) slave
replicates 392f fd7be9ae59da9daa8a885bbc7e2c0e5dbaa1
M: 392f fd7be9ae59da9daa8a885bbc7e2c0e5dbaa1 192.168 .131 .12 : 5002
slots: [ 5461 - 10922 ] ( 5462 slots) master
1 additional replica ( s)
S: 3e3 e827a6b77ebb26a5d59b4c99bd695c09de2d2 192.168 .131 .15 : 5005
slots: ( 0 slots) slave
replicates e708a900933ab5ee40850fe45a085cc9f67c07c2
M: 3 caf1bdc8fcff45b4d3af529337353ca4396c889 192.168 .131 .13 : 5003
slots: [ 10923 - 16383 ] ( 5461 slots) master
1 additional replica ( s)
[ OK] All nodes agree about slots configuration.
>>> Check for open slots. . .
>>> Check slots coverage. . .
[ OK] All 16384 slots covered.
[ root@master1 utils] # redis- cli - h 192.168 .131 .11 - p 5001 【进入Master1的redis】
192.168 .131 .11 : 5001 > info replication 【查看Master节点信息】
# Replication
role: master
connected_slaves: 1
slave0: ip= 192.168 .131 .15 , port= 5005 , state= online, offset= 812 , lag= 1
master_replid: 84 eb0b093117f913c96cac7845ad1579ee448d0e
master_replid2: 0000000000000000000000000000000000000000
master_repl_offset: 812
second_repl_offset: - 1
repl_backlog_active: 1
repl_backlog_size: 1048576
repl_backlog_first_byte_offset: 1
repl_backlog_histlen: 812
[ root@slave1 utils] # redis- cli - h 192.168 .131 .14 - p 5004 【进入Slave1的redis】
192.168 .131 .14 : 5004 > info replication 【查看Slave节点信息】
# Replication
role: slave
master_host: 192.168 .131 .13
master_port: 5003
master_link_status: up
master_last_io_seconds_ago: 6
master_sync_in_progress: 0
slave_repl_offset: 868
slave_priority: 100
slave_read_only: 1
connected_slaves: 0
master_replid: 60930877 c56b16b00002a3e73a667f640097f325
master_replid2: 0000000000000000000000000000000000000000
master_repl_offset: 868
second_repl_offset: - 1
repl_backlog_active: 1
repl_backlog_size: 1048576
repl_backlog_first_byte_offset: 1
repl_backlog_histlen: 868
四、总结