学海无涯
go,go,go

redis的主从复制

主从原理
1.redis的从服务器发送SYNC到主服务器,主服务器接到从服务器的sync,主服务器会调用BGSAVE命令,创建一个RDB的持久化文件保存数据,并使用缓冲区记录接下来执行的所有命令。
2.当主服务器执行完BGSAVE 命令时,他会向从服务器发送RDB的持久化文件,而从服务器会接收这个文件,并载入RDB的数据实现同步
3.主服务只要产生新的命令,就将缓冲区存储的所有写命令发送给从服务器执行。
redis是采用命令传播的方式,只要主库发生什么事执行什么命令,都会自动的发送给从库,从库不需要请求只需要接收就可以了。
主服务器已安装好redis
2台从服务器安装redis
mkdir /nosql -p
cd /nosql
wget http://download.redis.io/releases/redis-3.2.12.tar.gz
tar xzf redis-3.2.12.tar.gz
mv redis-3.2.12 redis
cd redis
make 
配置环境变量
echo 'PATH=/application/mysql/bin/:/nosql/redis/src:$PATH' >>/etc/profile
source /etc/profile

主的配置文件
[root@web04 redis]# cat /nosql/6379/redis.conf 
daemonize yes
port 6379
logfile /var/log/redis.log
dir /nosql/6379
dbfilename dump.rdbRDB
requirepass qwe123
bind 192.168.2.115  127.0.0.1
save   900      1
save   300      10
save   60       10000

配置从1配置文件
mkdir -p /nosql/6379
cat >/nosql/6379/redis.conf<<'EOF'
daemonize yes
port 6379
logfile /var/log/redis.log
dir /nosql/6379
dbfilename dump.rdbRDB
requirepass qwe123
bind 192.168.2.210  127.0.0.1
save   900      1
save   300      10
save   60       10000
SLAVEOF 192.168.2.115 6379
masterauth qwe123
EOF

配置从2配置文件
mkdir -p /nosql/6379
cat >/nosql/6379/redis.conf<<'EOF'
daemonize yes
port 6379
logfile /var/log/redis.log
dir /nosql/6379
dbfilename dump.rdbRDB
requirepass qwe123
bind 192.168.2.212  127.0.0.1
save   900      1
save   300      10
save   60       10000
SLAVEOF 192.168.2.115 6379
masterauth qwe123
EOF

启动数据库
cd /nosql/redis
src/redis-server &

重启redis数据库
redis-cli -a qwe123 shutdown && redis-server /nosql/6379/redis.conf &

链接redis数据库
redis-cli -a qwe123

主库
[root@web04 redis]# ss -lnt|grep 6379
LISTEN     0      511    127.0.0.1:6379          *:*                  
LISTEN     0      511    192.168.2.115:6379          *:* 

从库1
[root@centos7 redis]#  ss -lnt|grep 6379
LISTEN     0      511    127.0.0.1:6379          *:*                  
LISTEN     0      511    192.168.2.210:6379          *:* 

从库2
[root@web02 redis]# ss -lnt|grep 6379
LISTEN     0      511    127.0.0.1:6379          *:*                  
LISTEN     0      511    192.168.2.212:6379          *
检查主从数据库的状态
主库
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.2.210,port=6379,state=online,offset=1,lag=0
slave1:ip=192.168.2.212,port=6379,state=online,offset=1,lag=0
master_repl_offset:1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:0

从库1
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.2.115
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:15
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

从库2
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.2.115
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:29
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

手工开启主从,2个从库执行命令,主库不需要执行任何命令。
SLAVEOF 192.168.2.115 6379
也可以直接在配置文件中直接把主从配置好,就不需要在从库执行命令了
注意主库配置密码了的化必须在配置文件加上masterauth qwe123

主库
127.0.0.1:6379> set test 111
OK
127.0.0.1:6379> get test
"111"

从库1
127.0.0.1:6379> get test
"111"
从库2
127.0.0.1:6379> get test
"111"

从库切为主库,模拟主库故障
关闭主库
127.0.0.1:6379> shutdown
not connected> 

把从库1变成主库
检查从库1状态
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.2.115
master_port:6379
master_link_status:down主库处于宕机的状态
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:448
master_link_down_since_seconds:65
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
关闭做为从库
127.0.0.1:6379> slaveof no one 
OK
再次查看变成了主库
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

从库2链接从库1
关闭主从状态
127.0.0.1:6379> SLAVEOF no one
OK
链接新的主库
127.0.0.1:6379> SLAVEOF 192.168.2.210 6379
OK
检查状态
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.2.210
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:15
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

新主库检查
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.2.212,port=6379,state=online,offset=57,lag=1
master_repl_offset:57
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:56
把原主库变为从库
在配置文件加上新主库的密码
echo 'masterauth qwe123' >>/nosql/6379/redis.conf

重启redis
[root@web04 redis]# redis-cli -a qwe123 shutdown && redis-server /nosql/6379/redis.conf &
[1] 10552

链接redis
[root@web04 redis]# redis-cli -a qwe123
关闭主从状态
127.0.0.1:6379> SLAVEOF no one
OK
链接新的主库
127.0.0.1:6379> SLAVEOF 192.168.2.210 6379
OK
检查状态
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.2.210
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:351
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

新的主库再次检查状态
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.2.212,port=6379,state=online,offset=57,lag=1
master_repl_offset:57
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:56
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.2.212,port=6379,state=online,offset=449,lag=0
slave1:ip=192.168.2.115,port=6379,state=online,offset=449,lag=0
master_repl_offset:449
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:448

slaveof no one 表示关闭主从状态
恢复为初始环境
主库
127.0.0.1:6379> slaveof no one 
OK

从库1
127.0.0.1:6379> slaveof no one 
OK

从库2
127.0.0.1:6379> slaveof no one 
OK

主库把配置文件的密码注释掉
[root@web04 redis]# cat /nosql/6379/redis.conf
daemonize yes
port 6379
logfile /var/log/redis.log
dir /nosql/6379
dbfilename dump.rdbRDB
requirepass qwe123
bind 192.168.2.115  127.0.0.1
save   900      1
save   300      10
save   60       10000

3台redis服务器都重启redis
redis-cli -a qwe123 shutdown && redis-server /nosql/6379/redis.conf &
redis-cli  shutdown
主库检查
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.2.210,port=6379,state=online,offset=1,lag=1
slave1:ip=192.168.2.212,port=6379,state=online,offset=1,lag=1
master_repl_offset:1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:0
成功恢复
赞(0) 打赏
未经允许不得转载:YYQ运维技术博客_运维的工作学习之路 » redis的主从复制
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

运维devops

联系我们关于本博客

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏