环境:
3台安装有redis软件的服务器 Centos7
Redis01 192.168.100.208
Redis02 192.168.100.209
Redis03 192.168.100.210
软件版本:redis-5.0.9
1.1 安装redis
yum -y install gcc-c++
mkdir /software && cd /software
wget https://download.redis.io/releases/redis-5.0.9.tar.gz
tar xzf redis-5.0.9.tar.gz
cd redis-5.0.9/
make
make install
安装完成之后 关于redis的命令都在/usr/local/bin/下
[root@redis01 software]# cd /usr/local/bin/
[root@redis01 bin]# ls
dump.rdb redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
1.2 修改配置文件
需要注意的地方有
bind 127.0.0.1 192.168.100.208 //这里的话需要指明Bind的ip地址 或者也可以把这一行都注销掉
protected-mode no //这里的话 默认是yes 需要更改为no
1.3 启动redis
将三台服务器的redis都启动
我这里把修改好的配置文件 放在了/redis 文件夹下(这个文件夹自己新建的)
redis-server /redis/redis.conf
进入redis 下面两个命令都可以
redis-cli -p 6379
redis-cli -h 192.168.100.208 -p 6379
1.4 配置主从复制
因为redis默认就是master模式 所以配置主从复制 只需要在slave主机上配置就可以了
Redis02
192.168.100.209:6379> info replication //配置主从复制前
# Replication
role:master
connected_slaves:0
master_replid:e5f164f408d8e47a1711d36fa285ed7d10a8211c
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
192.168.100.209:6379> SLAVEOF 192.168.100.208 6379 //配置主从复制命令 想要永久生效的话 需要修改redis.conf 添加一行 replicaof 192.168.100.208 6379
OK
192.168.100.209:6379> info replication //配置主从复制后
# Replication
role:slave
master_host:192.168.100.208
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1ca03edea9b5d8b411cd4d1d74e2bdd2fa5ee365
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
Redis03
192.168.100.210:6379> SLAVEOF 192.168.100.208 6379
OK
192.168.100.210:6379> info replication
# Replication
role:slave
master_host:192.168.100.208
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:126
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1ca03edea9b5d8b411cd4d1d74e2bdd2fa5ee365
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:113
repl_backlog_histlen:14
Redis01
当redis01被设置为redis02 redis03的master主机之前
[root@redis01 redis]# redis-cli -h 192.168.100.208 -p 6379
192.168.100.208:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:8239d784c26b3a125b43399829c1c327d79426d5
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
当redis01被设置为redis02 redis03的master主机之后
192.168.100.208:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.100.209,port=6379,state=online,offset=350,lag=0
slave1:ip=192.168.100.210,port=6379,state=online,offset=350,lag=1
master_replid:1ca03edea9b5d8b411cd4d1d74e2bdd2fa5ee365
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:350
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:350
到这里 主从复制配置完成。在redis01上set一个值 在redis02 redis03上都可以get到。
上面使用的是在命令行执行的 要想要永久生效 需要在配置文件里面配置
在redis.conf里面配置master的地址
replicaof 192.168.100.208 6379 //要不要配置在配置文件里 这个根据应用场景来定
只有master主机可以写(set操作),salve主机只能读,即只能get.
salve主机 想要set值的话 会报错.
192.168.100.209:6379> set key2 v2
(error) READONLY You can't write against a read only replica.
模拟故障情景:
1、只有一台master主机的情况下 master主机发生故障了(模拟故障 将master主机的redis shutdown)
192.168.100.209:6379> get key1 //原slave主机 依然可以正常获取到值
"v1"
192.168.100.209:6379> info replication//原slave主机 依然把192.168.100.208作为master主机 只是status变成down了
# Replication
role:slave
master_host:192.168.100.208
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:19766
master_link_down_since_seconds:15
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1ca03edea9b5d8b411cd4d1d74e2bdd2fa5ee365
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:19766
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:19766
这种情况下 将master主机的redis服务恢复正常
无需其他操作 在master主机上 新设置的值,在slave主机上 也可以获取到。
但是要是master主机 短期无法恢复的话 如果让slave主机恢复为master角色呢?
执行SLAVEOF no one的命令//没有哨兵概念之前 都是手动执行让其成为master
2、slave主机发生故障的情况
2.1 使用命令行配置的话 重新启动redis后,需要重新配置。重新配置之后 会重新同步master主机上的所有值。
所以master主机和salve主机之间的数据是如何同步的呢?
a.salve主机 启动成功,与master主机建立连接之后,salve主机会发送一个sync同步命令给master主机。
b.master主机接收到sync请求之后 会把整个数据文件夹传送到salve主机 完成一次完全的同步
c.完全同步完成之后,之后的变化 会被依次同步给salve主机。
所以每次重新建立连接 就会完成一次完全同步。
2.2 使用配置文件配置主从复制的话 重新启动redis后 无需重新配置
Redis集群 一般会配合哨兵模式来使用。