redis的主从复制
实验环境
server2为master server3,server4为slave
server2(master)
1:解压压缩包,编译安装
[root@server2 ~] # tar zxf redis-5.0.3.tar.gz ##解压压缩包
[root@server2 ~]# cd redis-5.0.3
[root@server2 redis-5.0.3]# yum install gcc -y ##安装编译器
[root@server2 redis-5.0.3]# make && make install ##安装
2: 执行启动脚本
root@server2 redis-4.0.8]# cd utils/
[root@server2 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!
3:编辑配置文件
[root@server1 utils]# cd /etc/redis/
[root@server1 redis]# vim 6379.conf ##编辑配置文件
#bind 127.0.0.1
protected-mode no ##是否开启保护模式,默认开启,最好关闭设置成成no
4:启动服务
[root@server2 redis]# systemctl restart redis_6379 ##重新启动服务
[root@server2 redis]# redis-cli ##验证
127.0.0.1:6379> config get bind
1) "bind"
2) "127.0.0.1"
127.0.0.1:6379>
server3(slave):
1:解压压缩包,编译安装
[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 ##安转gcc编译器
[root@server3 redis-5.0.3]# make && make install ##安装
2:执行启动脚本
[root@server3 redis-5.0.3]# cd utils/
[root@server3 utils]# ./install_server.sh ##执行启动脚本
3:编辑配置文件
[root@server3 redis]# vim 6379.conf ##编辑配置文件
#bind 127.0.0.1
protected-mode no
slaveof 172.25.36.2 6379
4:重新启动服务
[root@server3 redis]# systemctl restart redis_6379 ##重新启动服务
server4上操作和server3上一样
验证:
[root@server2 redis]# redis-cli
127.0.0.1:6379> set name yz
OK
127.0.0.1:6379> get name
"yz"
server3:
[root@server3 redis]# redis-cli
127.0.0.1:6379> get name
"yz"
server4:
[root@server4 redis]# redis-cli
127.0.0.1:6379> get name
"yz"
发现主从复制成功
info replication显示更详细的数据:查看此时的主机状态等
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.25.36.3,port=6379,state=online,offset=994,lag=1
master_replid:2f52b2c456ec796f1cfbc58545e93c0d7f551f74
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:994
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:994
====================================================================================
redis高可用(主从切换)
实验环境:server2为master,server3和server4为slave
1:编辑配置文件
[root@server2 redis]# cd
[root@server2 ~]# cd redis-5.0.3
[root@server2 redis-5.0.3]# cp sentinel.conf /etc/redis
[root@server2 redis-5.0.3]# cd /etc/redis/
[root@server2 redis]# vim sentinel.conf ##编辑配置文件
protected-mode no
port 26379
dir /tmp
sentinel monitor mymaster 172.25.36.2 6379 2
sentinel down-after-milliseconds mymaster 10000 #超过100s进行切换
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
2:加载
[root@server2 redis]# grep -v ^# sentinel.conf
protected-mode no
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor mymaster 172.25.36.2 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
3:将配置文件分发给server3,server4
[root@server2 redis]# scp sentinel.conf server3:/etc/redis/ ##分发配置文件‘
sentinel.conf 100% 9710 9.5KB/s 00:00
[root@server2 redis]# scp sentinel.conf server4:/etc/redis/
sentinel.conf 100% 9710 9.5KB/s
00:00
4:打入后台进行运行
[root@server2 redis]# redis-sentinel /etc/redis/sentinel.conf &
[root@server3 redis]# redis-sentinel /etc/redis/sentinel.conf &
[root@server4 redis]# redis-sentinel /etc/redis/sentinel.conf &
检测:
此时在master(server2)上:
[root@server2 redis]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.25.36.3,port=6379,state=online,offset=7195,lag=0
slave1:ip=172.25.36.4,port=6379,state=online,offset=7195,lag=1
master_replid:9b430314a8aae4d1d58e799472ac15fd91aaeeb7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:7332
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:7332
127.0.0.1:6379> shutdown ##关闭
关闭了之前的master(server2),新的msater在server3和server4之间随机产生
[root@server3 redis]# redis-cli ##此时发现server4为master,主从切换成功
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.25.36.4
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:20742
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:28fd394b05ff5ee56426e002513d2af62df241d8
master_replid2:9b430314a8aae4d1d58e799472ac15fd91aaeeb7
master_repl_offset:20742
second_repl_offset:11060
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:20742
[root@server4 redis]# redis-cli ##在server4上查看,srever4为master
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.25.36.3,port=6379,state=online,offset=16604,lag=1
master_replid:28fd394b05ff5ee56426e002513d2af62df241d8
master_replid2:9b430314a8aae4d1d58e799472ac15fd91aaeeb7
master_repl_offset:16878
second_repl_offset:11060
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:16878
127.0.0.1:6379>
此时server2是无法连接的
[root@server2 redis]# vim /etc/redis/6379.conf ##修改配置文件,将server2变成slave
slaveof 172.25.60.4 6379
[root@server2 redis]# systemctl restart redis_6379
[root@server2 redis]# 2167:X 27 Feb 2019 00:24:24.003 # -sdown slave 172.25.36.2:6379 172.25.36.2 6379 @ mymaster 172.25.36.4 6379
[root@server2 redis]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.25.36.4
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:221860
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:28fd394b05ff5ee56426e002513d2af62df241d8
master_replid2:9b430314a8aae4d1d58e799472ac15fd91aaeeb7
master_repl_offset:221860
second_repl_offset:11060
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:11060
repl_backlog_histlen:210801
127.0.0.1:6379>
[root@server3 redis]# vim /etc/redis/6379.conf ##修改配置文件
slaveof 172.25.36.4 6379
[root@server3 redis]# systemctl restart redis_6379
[root@server3 redis]# 2182:X 27 Feb 2019 00:30:08.944 * +reboot slave 172.25.36.3:6379 172.25.36.3 6379 @ mymaster 172.25.36.4 6379
拓展:调整master配置文件参数。该参数不是必须的可以写也可以不写
min-replocas-to-writer 1 ##设置最少有几个slave时,master才具有写的功能
min-replocas-max-lag 10
redis集群
在一台主机上开启多个端口,模拟多个虚拟机,和使用多台虚拟机的效果是一样的
server2:
1:创建目录,模拟多个端口
[root@server2 ~]# sysctl vm.overcommit_memory
vm.overcommit_memory=0
[root@server2 ~]# sysctl -w vm.overcommit_memory=1
vm.overcommit_memory=1
[root@server2 ~]# mkdir /usr/local/rediscluster
[root@server2 ~]# cd /usr/local/rediscluster/
[root@server2 rediscluster]# mkdir 700{1..6}
[root@server2 rediscluster]# ls
7001 7002 7003 7004 7005 7006
2:编辑配置文件
[root@server2 rediscluster]# cd 7001/
[root@server2 7001]# ls
[root@server2 7001]# vim redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7001/redis.pid"
logfile "/usr/local/rediscluster/7001/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7001"
3:启动,会自动生成相应的目录
[root@server2 7001]# redis-server redis.conf
[root@server2 7001]# ls
appendonly.aof nodes.conf redis.conf redis.log redis.pid
4:查看服务是否启动
[root@server2 7001]# ps -ax
2324 ? Ssl 0:00 redis-server *:7001 [cluster]
5:从7001端口登录redis
[root@server2 7001]# redis-cli -p 7001
127.0.0.1:7001> info replication
# Replication
role:master
connected_slaves:0
master_replid:398f6873fbc429e23d1ec43d6cc3528d77465996
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
127.0.0.1:7001> info
6:复制配置文件修改配置文件
[root@server2 7001]# cp redis.conf ../7002/
[root@server2 7001]# cp redis.conf ../7003/
[root@server2 7001]# cp redis.conf ../7004/
[root@server2 7001]# cp redis.conf ../7005/
[root@server2 7001]# cp redis.conf ../7006/
7:剩下的依次修改配置文件,记住修改端口,其他的不变(后面的操作都一样)
[root@server2 7001]# cd ..
[root@server2 rediscluster]# cd 7002/
[root@server2 7002]# ls
redis.conf
[root@server2 7002]# vim redis.conf
[root@server2 7002]# redis-server redis.conf
[root@server2 7002]# ps -ax
2324 ? Ssl 0:00 redis-server *:7001 [cluster]
2340 ? Ssl 0:00 redis-server *:7002 [cluster]
8:最后的结果:
2324 ? Ssl 0:04 redis-server *:7001 [cluster]
2340 ? Ssl 0:04 redis-server *:7002 [cluster]
2347 ? Ssl 0:04 redis-server *:7003 [cluster]
2354 ? Ssl 0:04 redis-server *:7004 [cluster]
2361 ? Ssl 0:04 redis-server *:7005 [cluster]
2368 ? Ssl 0:04 redis-server *:7006 [cluster]
9:创建集群
[root@server2 bin] # redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> slots 0 -5460
Master[1] -> slots 5461 - 10922
Master[2] -> slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 5ce21dc1800362223f47368fcb0fdd092ca97986 127.0.0.1:7001
slots:0-5460 (5461 slots) master
M: fbb437dd78e28c94a596ab675312e03f25c916ab 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
M: 12e878af3ddea913cfcc2585ac54ae5f55d73d7a 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
S: 5f9cbd9552380f737ea3e8e1212372ab346e9bbf 127.0.0.1:7004
replicates fbb437dd78e28c94a596ab675312e03f25c916ab
S: 888d91dd8d5c54fd914432dc68b9aec57850cf70 127.0.0.1:7004
replicates 12e878af3ddea913cfcc2585ac54ae5f55d73d7a
S: 5b945386e888f9f3c05ee7c629888d3d5a9d2457 127.0.0.1:7006
replicates 5ce21dc1800362223f47368fcb0fdd092ca97986
10:登录
[root@server2 ~] # redis-cli --cluster info 127.0.0.1:7001
127.0.0.1:7001 (b14f476d...) -> 0 keys | 5461 slots | 1 slave.
127.0.0.1:7002 (0a3913h3...) -> 0 keys | 5461 slots | 1 slave.
127.0.0.1:7003 (fc1191h3...) -> 0 keys | 5461 slots | 1 slave.
redis集群中的matser 数据 hasi槽个数 master对应的slave的个数
注意:
当一个节点挂掉之后数据不会丢失,但是如果hasi槽不完整的话,当master宕机的话,slave会顶替,当一整个节点的master和slave都宕机时,此时该集群就会挂掉,或者整个集群中半数以上的master挂掉的话,集群也会挂掉,整个集群都会挂掉。默认只有master可写,如果在slave中写的话,会自动保存到master中。
11:登录,无论从那个节点登录的情况都是一样的
尝试其他节点登录:
测试把关闭一个节点的master:
测试:尝试破坏该集群:
之前7002宕机了,此时将7004也宕机,此时该redis集群中的该节点master和slave都宕机了
所有的操作都会保存在配置文件中:
恢复redis集群:
添加节点:此处将主机名换成server1(本人自行进行的操作,存粹无聊,对实验没有一点影响)
1:建立目录,编辑配置文件(只需要修改端口号)
2:添加:
3:给7007(master )添加7008(slave)
此时发现7007(master)上是没有哈希槽的
实验1:给7007添加哈希槽:
实验2:所有的master均分哈希槽
此时查看所有的master的哈希槽的数目都是相等的
===========================================================================================