redis实现主从复制,redis哨兵模式实现主从故障切换

mac2024-12-26  59

实验环境

server3(192.168.34.4)是主库,server4(192.168.34.5)是从库

server3:

[root@server3 ~]# tar zxf redis-5.0.3.tar.gz [root@server3 ~]# cd redis-5.0.3 [root@server3 redis-5.0.3]# yum install gcc -y [root@server3 redis-5.0.3]# make && make install ##make可能出现错误,是因为解压过程中可能会出现错误,可以删除重新解压 [root@server3 redis-5.0.3]# cd utils/ [root@server3 utils]# ./install_server.sh ##初始化 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] 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/bin/redis-server] Selected config: Port : 6379 Config file : /etc/redis/6379.conf Log file : /var/log/redis_6379.log Data dir : /var/lib/redis/6379 Executable : /usr/local/bin/redis-server Cli Executable : /usr/local/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! Starting Redis server... Installation successful! [root@server3 utils]# netstat -antuple ##查看端口只有内部能使用 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN [root@server3 utils]# vim /etc/redis/6379.conf 70 bind 0.0.0.0 # 监听本机所有端口 187 databases 16 # 默认数据库为16293 # masterauth <master-password> # 设定redis的认证,因为我们这是内网网段进行操作,所以此处不用设定 457 min-replicas-to-write 1 [root@server3 utils]# /etc/init.d/redis_6379 restart ##重启服务 Stopping ... Redis stopped Starting Redis server...

server4:

[root@server4 ~]# tar zxf redis-5.0.3.tar.gz [root@server4 ~]# cd redis-5.0.3 [root@server4 redis-5.0.3]# yum install gcc -y [root@server4 redis-5.0.3]# make && make install [root@server4 redis-5.0.3]# ls 00-RELEASENOTES deps README.md runtest-sentinel utils BUGS INSTALL redis.conf sentinel.conf CONTRIBUTING Makefile runtest src COPYING MANIFESTO runtest-cluster tests [root@server4 redis-5.0.3]# cd utils/ [root@server4 utils]# ./install_server.sh 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] 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/bin/redis-server] Selected config: Port : 6379 Config file : /etc/redis/6379.conf Log file : /var/log/redis_6379.log Data dir : /var/lib/redis/6379 Executable : /usr/local/bin/redis-server Cli Executable : /usr/local/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! [root@server4 utils]# vim /etc/redis/6379.conf bind 0.0.0.0 slaveof 172.25.34.4 6379 ##设置master [root@server4 utils]# /etc/init.d/redis_6379 restart Stopping ... Redis stopped Starting Redis server... [root@server4 utils]# netstat -antuple Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN

测试:

server3:

[root@server3 utils]# redis-cli 127.0.0.1:6379> set name su OK 127.0.0.1:6379> get name "su"

server4:

[root@server4 utils]# redis-cli 127.0.0.1:6379> get name "su" 127.0.0.1:6379> set age 18 ##备库默认只能读取不能写 \(error) READONLY You can't write against a read only replica.

redis哨兵机制实现主从故障切换

在来一台备库server5(192.168.34.6)

server5:

[root@server3 ~]# scp -r redis-5.0.3 root@172.25.34.6:/root/ [root@server5 ~]# cd redis-5.0.3/ [root@server5 redis-5.0.3]# make install && make install make[1]: Entering directory `/root/redis-5.0.3/src' Hint: It's a good idea to run 'make test' ;) INSTALL install INSTALL install INSTALL install INSTALL install INSTALL install make[1]: Leaving directory `/root/redis-5.0.3/src' [root@server5 redis-5.0.3]# cd utils/ [root@server5 utils]# ./install_server.sh 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] 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/bin/redis-server] Selected config: Port : 6379 Config file : /etc/redis/6379.conf Log file : /var/log/redis_6379.log Data dir : /var/lib/redis/6379 Executable : /usr/local/bin/redis-server Cli Executable : /usr/local/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! [root@server5 utils]# vim /etc/redis/6379.conf bind 0.0.0.0 slaveof 172.25.34.4 6379 [root@server5 utils]# /etc/init.d/redis_6379 restart Stopping ... Redis stopped Starting Redis server...

server3:

[root@server3 redis-5.0.3]# vi sentinel.conf 16 protected-mode no # 去掉保护模式 84 sentinel monitor mymaster 172.25.78.12 6379 2 # 指定要监控的master,2表示将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 113 sentinel down-after-milliseconds mymaster 10000 # Sentinel 认为服务器已经断线所需的毫秒数即服务多长时间开始下线 121 sentinel parallel-syncs mymaster 1 # 在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长 146 sentinel failover-timeout mymaster 180000 # 三分钟之内还没有完成故障切换,表示超时 [root@server3 redis-5.0.3]# cp sentinel.conf /etc/redis/ —————— [root@server3 redis-5.0.3]# scp sentinel.conf root@172.25.34.5:/etc/redis/ sentinel.conf 100% 9711 9.5KB/s 00:00 [root@server3 redis-5.0.3]# scp sentinel.conf root@172.25.34.6:/etc/redis/ sentinel.conf 100% 9711 9.5KB/s 00:00

注:改完这个文件之后千万不能重启

开启监控

[root@server3 redis]# redis-server /etc/redis/sentinel.conf --sentinel 11300:X 26 Oct 2019 16:06:05.421 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 11300:X 26 Oct 2019 16:06:05.421 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=11300, just started 11300:X 26 Oct 2019 16:06:05.421 # Configuration loaded 11300:X 26 Oct 2019 16:06:05.424 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 5.0.3 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 11300 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 11300:X 26 Oct 2019 16:06:05.427 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 11300:X 26 Oct 2019 16:06:05.437 # Sentinel ID is f4e3b9ba514c6cdea98e555c046679e55ab6249d 11300:X 26 Oct 2019 16:06:05.437 # +monitor master mymaster 172.25.34.4 6379 quorum 2 11300:X 26 Oct 2019 16:06:05.440 * +slave slave 172.25.34.5:6379 172.25.34.5 6379 @ mymaster 172.25.34.4 6379 11300:X 26 Oct 2019 16:06:05.449 * +slave slave 172.25.34.6:6379 172.25.34.6 6379 @ mymaster 172.25.34.4 6379

开一台客户机测试:

[kiosk@foundation34 redis]$ ssh root@172.25.34.4 root@172.25.34.4's password: Last login: Sat Oct 26 09:00:16 2019 from 172.25.34.250 [root@server3 ~]# redis-cli 127.0.0.1:6379> info # Replication role:master connected_slaves:2 slave0:ip=172.25.34.5,port=6379,state=online,offset=11052,lag=1 slave1:ip=172.25.34.6,port=6379,state=online,offset=11052,lag=1 [root@server3 ~]# netstat -antuple Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 0 249173 11300/redis-server tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN [root@server3 ~]# redis-cli -p 26379 127.0.0.1:26379> info # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=172.25.34.4:6379,slaves=2,sentinels=3 [root@server3 ~]# redis-cli ##宕掉主库 127.0.0.1:6379> shutdown

server4:

在监控哨兵的地方可以看到,主库进行了切换

7658:X 26 Oct 2019 16:11:32.177 # +switch-master mymaster 172.25.34.4 6379 172.25.34.5 6379 7658:X 26 Oct 2019 16:11:32.178 * +slave slave 172.25.34.6:6379 172.25.34.6 6379 @ mymaster 172.25.34.5 6379 7658:X 26 Oct 2019 16:11:32.178 * +slave slave 172.25.34.4:6379 172.25.34.4 6379 @ mymaster 172.25.34.5 6379 7658:X 26 Oct 2019 16:11:42.219 # +sdown slave 172.25.34.4:6379 172.25.34.4 6379 @ mymaster 172.25.34.5 6379

连接查看server4上的机制

[kiosk@foundation34 redis]$ ssh root@172.25.34.5 [root@server4 ~]# redis-cli 127.0.0.1:6379> info # Replication role:master connected_slaves:1 slave0:ip=172.25.34.6,port=6379,state=online,offset=144738,lag=0

可以看到server4变为了主库

在三个服务上都进行监控可以打入后台

[root@server3 redis]# redis-server /etc/redis/sentinel.conf --sentinel & [root@server4 redis]# redis-server /etc/redis/sentinel.conf --sentinel & [root@server5 redis]# redis-server /etc/redis/sentinel.conf --sentinel &
最新回复(0)