1、是什么?
主机更新后根据配置和策略,自动同步到备机的master/slave机制,Master以写为主,Slave以读为
主。
2、能干嘛?
- 读写分离,性能扩展,降低主服务器的压力
- 容灾,快速恢复,主机挂掉时,从机变为主机
3、主从复制:怎么玩?
3.1、配置1主2从
下面我们来配置1主2从的效果,现实中是需要3台机器的,为了方便,我们就在一台机器上来演示,通过不同的端口来区分机器,3台机器的配置
3.2、配置主从
1)创建案例工作目录:master-slave
执行下面命令创建 /opt/master-slave 目录,本次所有操作,均在 master-slave 目录进行。
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9 # 方便演示,停止所有的
redis
mkdir /opt/master-slave
cd /opt/master-slave/
2)将redis.conf复制到master-slave目录
cp /opt/redis-6.2.1/redis.conf /opt/master-slave/
3)创建master的配置文件:redis-6379.conf
在/opt/master-slave目录创建 redis-6379.conf 文件,内容如下,注意 192.168.200.129 是这个测试
机器的ip,大家需要替换为自己的
#redis.conf是redis原配置文件,内部包含了很多默认的配置,这里使用include将其引用,相当于把
redis.conf内容直接贴进来了
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.200.129
#配置密码
requirepass 123456
dir /opt/master-slave/
logfile /opt/master-slave/6379.log
#端口
port 6379
#rdb文件
dbfilename dump_6379.rdb
#pid文件
pidfile /var/run/redis_6379.pid
4)创建slave1的配置文件:redis-6380.conf
在/opt/master-slave目录创建 redis-6380.conf 文件,内容如下,和上面master的类似,多了后面2行
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.200.129
requirepass 123456
dir /opt/master-slave/
port 6380
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
logfile /opt/master-slave/6380.log
#用来指定主机:slaveof 主机ip 端口
slaveof 192.168.200.129 6379
#主机的密码
masterauth 123456
5)创建slave2的配置文件:redis-6381.conf
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.200.129
requirepass 123456
dir /opt/master-slave/
port 6381
dbfilename dump_6381.rdb
pidfile /var/run/redis_6381.pid
logfile /opt/master-slave/6381.log
#用来指定主机:slaveof 主机ip 端口
slaveof 192.168.200.129 6379
#主机的密码
masterauth 123456
6)启动maste
redis-server /opt/master-slave/redis-6379.conf
7)启动slave1
redis-server /opt/master-slave/redis-6380.conf
8)启动slave2
redis-server /opt/master-slave/redis-6381.conf
9)查看主机的信息
通过redis-cli命令连接主机,如下
redis-cli -h 192.168.200.129 -p 6379 -a 123456
通过下面命令,查看主机信息
info Replication
10)查看slave1的信息
通过下面2个命令查询从机slave1的信息
redis-cli -h 192.168.200.129 -p 6380 -a 123456
info Replication
11)同样查看slave2的信息
redis-cli -h 192.168.200.129 -p 6381 -a 123456
info Replication
12)验证主从同步效果
在master上面执行下面2个命令
192.168.200.129:6379> flushdb
OK
192.168.200.129:6379> set name ready
OK
192.168.200.129:6379> set age 30
OK
到slave1上执行下面命令,可以看出来数据已经同步过来了
192.168.200.129:6380> mget name age
1) "ready"
2) "30"
192.168.200.129:6380>
同样到slave2上也执行一下,效果如下
192.168.200.129:6381> mget name age
1) "ready"
2) "30"
192.168.200.129:6381>
3.3、主从复制原理
- slave启动成功连接到master后,会给master发送数据同步消息(发送sync命令)
- master接收到slave发来的数据同步消息后,把主服务器的数据进行持久化到rdb文件,同时会收集接收到的用于修改数据的命令,master将传rdb文件发送给你slave,完成一次完全同步
- 全量复制:而slave服务在接收到master发来的rdb文件后,将其存盘并加载到内存
- 增量复制:master继续将收集到的修改命令依次传给slave,完成同步
- 但是只要重新连接master,一次完全同步(全量复制)将会被自动执行
3.4、小结
主redis挂掉以后情况会如何?从机是上位还是原地待命?
主机挂掉后,从机会待命,小弟还是小弟,会等着大哥恢复,不会篡位。
从挂掉后又恢复了,会继续从主同步数据么?
会的,当从重启之后,会继续将中间缺失的数据同步过来。
info Replication:查看主从复制信息
上面已经演示过了,主、从上都可以执行,用来查看主从信息。
2、常用的主从结构
2.1、一主二从
刚刚上面演示的就是一主二从,不过采用的都是配置文件的方式,实际上从机可以采用命令的方式配置,下面我们来演示一遍,大家看好了。
1)创建案例工作目录:master-slave
执行下面命令创建 /opt/master-slave 目录,本次所有操作,均在 master-slave 目录进行。
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9 # 方便演示,停止所有的
redis
mkdir /opt/master-slave
cd /opt/master-slave/
2)将redis.conf复制到master-slave目录
cp /opt/redis-6.2.1/redis.conf /opt/master-slave/
3)创建master的配置文件:redis-6379.conf
在/opt/master-slave目录创建 redis-6379.conf 文件,内容如下,注意 192.168.200.129 是这个测试
机器的ip,大家需要替换为自己的
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.200.129
requirepass 123456
dir /opt/master-slave/
port 6379
dbfilename dump_6379.rdb
pidfile /var/run/redis_6379.pid
logfile /opt/master-slave/6379.log
4)创建slave1的配置文件:redis-6380.conf
在/opt/master-slave目录创建 redis-6380.conf 文件,内容如下,和上面master的类似,只是将6379
换成6380了
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.200.129
requirepass 123456
dir /opt/master-slave/
port 6380
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
logfile /opt/master-slave/6380.log
5)创建slave2的配置文件:redis-6381.conf
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.200.129
requirepass 123456
dir /opt/master-slave/
port 6381
dbfilename dump_6381.rdb
pidfile /var/run/redis_6381.pid
logfile /opt/master-slave/6381.log
6)启动master
redis-server /opt/master-slave/redis-6379.conf
7)启动slave1
redis-server /opt/master-slave/redis-6380.conf
8)启动slave2
redis-server /opt/master-slave/redis-6381.conf
9)分别登陆3台机器,查看各自主从信息
本次我们并没有在slave1和slave2的配置文件通过 slaveof 命令配置主从信息,所以目前3台机器的角色都是master。
分别登陆对3个redis,然后用 info replication 命令看下3个的主从信息,如下:
下面我们将通过控制台命令来指定slave1和slave2的为master的从库。
10)配置slave1为master的从库
(1)执行下面命令,连接slave1
redis-cli -h 192.168.200.129 -p 6380 -a 123456
(2)执行下面命令,设置master的密码
由于master需要密码,所以在slave1中需要指定master的密码,否则无法同步数据。
config set masterauth 123456
(3)执行下面命令,指定slave1的作为master的从机
slaveof 192.168.200.129 6379
(4)如下,使用 info replication 查看下slave1的主从信息
11)配置slave2为master的从库
(1)执行下面命令,连接slave2
redis-cli -h 192.168.200.129 -p 6381 -a 123456
(2)执行下面命令,设置master的密码
由于master需要密码,所以在slave2中需要指定master的密码,否则无法同步数据。
config set masterauth 123456
(3)执行下面命令,指定slave2的作为master的从机
slaveof 192.168.200.129 6379
(4)如下,使用 info replication 查看下slave2的主从信息
12)再来看看master的主从信息
[root@hspEdu01 ~]# redis-cli -h 192.168.200.129 -p 6379 -a 123456
192.168.200.129:6379> info replication
注意:通过 slaveof 命令指定主从的方式,slave重启之后主从配置会失效,所以,重启后需要在slave上重新通过 slaveof 命令进行设置,这个不要忘记了。
中途通过 slaveof 变更转向,本地的数据会被清除,会从新的master重新同步数据。
2.2、薪火相传
若master下面挂很多slave,master会有压力,实际上slave下面也可以挂slave,如下图,配置这里就不演示了,和上面的类似。
当master挂掉之后,我们可以从slave中选择一个作为主机。
比如我们想让slave1作为主机,那么可以在slave1上执行下面的命令就可以了。
slaveof no one
此时slave1就变成主机了,然后再去其他slave上面执行 slaveof 命令将其挂在slave1上。
这种主备切换有个缺点:需要手动去执行命令去操作,不是太方便。