centos7 Redis主从

环境:

在这里插入图片描述

Redis主从同步:

也叫redis主从复制,当用户往master主库写入数据时,从库会通过redis
rsync机制从主从得到一份数据文件,从库会执行相同的操作,保证数据一致。同时slave可以有二级slave,见上图,192.168.1.11是192.168.1.21的从库,192.168.1.22是192.168.1.21的从库

初始化主从同步步骤

1、从库连接主库,发送sync命令
2、主库接收到SYNC命令后,会执行bgsave,保存数据至rdb快照文件,之后,会在缓冲区继续接收PHP端发送的数据
3、从库接收到主库的快照文件后,先丢掉自己的所有数据,然后执行快照文件中的命令 4、主库发送完快照文件后,会继续向从库发送缓冲区的命令
5、从库执行快照文件后,会继续执行来自主库的缓冲区命令

注:

1、当主从建立时,或从库连接主库时,都会先刷新自己的数据,从库数据会丢失,再去同步主库,执行全量备份
2、主从建立后,当主库有数据写主时,从库会同步执行一遍,叫增量复制或增量同步

案例演示(上面Top)

一、redis软件安装

安装环境软件支持

[root@localhost src]# yum install gcc-c++ -y

下载redis

[root@localhost src]# wget -c http://download.redis.io/releases/redis-5.0.5.tar.gz

编译安装

[root@localhost src]# tar xf redis-5.0.5.tar.gz
[root@localhost src]# cd redis-5.0.5
[root@localhost redis-5.0.5]# vim src/Makefile
PREFIX?=/usr/local/redis
[root@localhost redis-5.0.5]# make PREFIX=/usr/local/redis MALLOC=libc install
[root@localhost redis-5.0.5]# make install
[root@localhost redis-5.0.5]# mkdir -p /usr/local/redis/6379
[root@localhost redis-5.0.5]# cp redis.conf /usr/local/redis/6379/6379.conf
[root@localhost redis-5.0.5]# cp /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis6379-server
[root@localhost redis-5.0.5]# 
[root@localhost redis-5.0.5]# ls /usr/local/redis/
6379  bin
[root@localhost redis-5.0.5]# ls /usr/local/redis/6379/
6379.conf
[root@localhost redis-5.0.5]# ls /usr/local/redis/bin/
redis6379-server  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server

编译sysctl.conf文件

[root@localhost redis-5.0.5]# vim /etc/sysctl.conf
net.core.somaxconn=512
vm.overcommit_memory=1

让redis负责内存管理

[root@localhost redis-5.0.5]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

执行sysctl -p,让内核重新读取sysctl

[root@localhost redis-5.0.5]# sysctl -p
net.core.somaxconn = 512
vm.overcommit_memory = 1

配置启动脚本

[root@localhost redis-5.0.5]# /usr/src/redis-5.0.5/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] 6379		#端口
Please select the redis config file name [/etc/redis/6379.conf] /usr/local/redis/6379/6379.conf	#配置文件
Please select the redis log file name [/var/log/redis_6379.log] /usr/local/redis/6379/redis_6379.log	#日志文件
Please select the data directory for this instance [/var/lib/redis/6379] /usr/local/redis/6379/	#数据目录
Please select the redis executable path [] /usr/local/redis/bin/redis6379-server	#启动脚本
Selected config:
Port           : 6379
Config file    : /usr/local/redis/6379/6379.conf
Log file       : /usr/local/redis/6379/redis_6379.log
Data dir       : /usr/local/redis/6379/
Executable     : /usr/local/redis/bin/redis6379-server
Cli Executable : /usr/local/redis/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@localhost redis-5.0.5]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...

编辑配置文件

vim /usr/local/redis/6379/6379.conf
配置rdb与aof持久化

注:这里只要配置下面4行,其他默认即可
bind 0.0.0.0 监听IP
port 6379 监听端口
appendonly yes 开启AOF持久化
no-appendfsync-on-rewrite yes 当rdb写入时,停止aof写入

[root@localhost redis-5.0.5]#  vim /usr/local/redis/6379/6379.conf
  70 bind 0.0.0.0		监听IP
  89 protected-mode yes	可以查看键值
  93 port 6379			监听端口
  102 tcp-backlog 511	tcp队列长度,这里默认
  114 timeout 0			客户端与服务器之间的连接超时时间,0为永不超时
  131 tcp-keepalive 300300秒给客户端发送ACK握手包
  137 daemonize yes		后台启动
  148 supervised no		可以通过upstart和systemd管理redis守护进程
  159 pidfile /var/run/redis_6379.pid	进程文件
  167 loglevel notice	日志级别,默认即可
  172 logfile /usr/local/redis/6379/redis_6379.log	日志文件路径
  176 # syslog-enabled no	是否输出到系统日志
  187 databases 16		数据库个数0-15编号,共16个数据库
  195 always-show-logo yes	启动时是否显示日志
  219 save 900 1
  220 save 300 10
  221 save 60 10000
  236 stop-writes-on-bgsave-error yes	快照出问题时,不可写
  242 rdbcompression yes	rdb模式,是否启动压缩,启用
  251 rdbchecksum yes	对rdb数据文件操作时,启动校验
  254 dbfilename dump.rdb	rdb持久化的快照文件名
  264 dir /usr/local/redis/6379/	rdb文件路径

 以下是AOF模式配置,这里rdb和AOF持久化都启用
  700 appendonly yes	开启AOF持久化
  704 appendfilename "appendonly.aof"	AOF持久化快照文件名
  730 appendfsync everysec		每秒保存至快照
  752 no-appendfsync-on-rewrite yes	当rdb写入时,停止aof写入
  771 auto-aof-rewrite-percentage 100	aof文件增长100%时,重写
  772 auto-aof-rewrite-min-size 64mb	aof文件大于64M时,重写
  796 aof-load-truncated yes			aof文件加载时,忽略最后一条命令
 

服务重启

[root@localhost redis-5.0.5]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost redis-5.0.5]# ps -ef|grep redis
root      2835     1  0 12:29 ?        00:00:00 /usr/local/redis/bin/redis6379-server 0.0.0.0:6379
root      2840  1672  0 12:29 pts/1    00:00:00 grep --color=auto redis

关闭selinux及配置防火墙

[root@localhost redis-5.0.5]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config  
[root@localhost redis-5.0.5]# firewall-cmd --zone=public --add-port=6379/tcp --permanent
success
[root@localhost redis-5.0.5]# firewall-cmd --reload
success
[root@localhost redis-5.0.5]# firewall-cmd --zone=public --list-ports
80/tcp 22/tcp 6379/tcp

二、主从配置

编译从库192.168.1.11
[root@localhost ~]# vim /usr/local/redis/6379/6379.conf 
 287 # replicaof <masterip> <masterport>
 288 replicaof 192.168.1.21 6379		主库:192.168.1.21 端口:6379
 
服务重启
[root@localhost ~]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
 
编译从从库192.168.1.12
[root@localhost ~]# vim /usr/local/redis/6379/6379.conf 
 287 # replicaof <masterip> <masterport>
 288 replicaof 192.168.1.11 6379		主库:192.168.1.22 端口:6379
 
 服务重启
[root@localhost ~]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...

查看日志-同步过程

停止服务 -> 清空日志 -> 重新启动服务
[root@localhost ~]# /etc/init.d/redis_6379 stop
[root@localhost ~]# > /usr/local/redis/6379/redis_6379.log
[root@localhost ~]# /etc/init.d/redis_6379 start

1、主库192.168.1.21

[root@localhost ~]# tailf /usr/local/redis/6379/redis_6379.log

收到192.168.1.11的sync同步请求
2965:M 16 Jun 2020 13:54:02.535 * Replica 192.168.1.11:6379 asks for synchronization
全量同步
2965:M 16 Jun 2020 13:54:02.535 * Full resync requested by replica 192.168.1.11:6379
开始bgsave保存快照
2965:M 16 Jun 2020 13:54:02.535 * Starting BGSAVE for SYNC with target: disk
保存快照中,进程号2970
2965:M 16 Jun 2020 13:54:02.536 * Background saving started by pid 2970
保存完毕,有0M被保存,因为是演示环境,没有数据,故为0M
2970:C 16 Jun 2020 13:54:02.539 * DB saved on disk
2970:C 16 Jun 2020 13:54:02.540 * RDB: 0 MB of memory used by copy-on-write
2965:M 16 Jun 2020 13:54:02.587 * Background saving terminated with success
回应192.168.1.11
2965:M 16 Jun 2020 13:54:02.588 * Synchronization with replica 192.168.1.11:6379 succeeded

2、从库192.168.1.11

[root@localhost ~]# tailf /usr/local/redis/6379/redis_6379.log 
收到主库回应
3189:S 16 Jun 2020 14:09:21.742 * MASTER <-> REPLICA sync: Finished with success
后台追加文件重写,进程为3193
3189:S 16 Jun 2020 14:09:21.742 * Background append only file rewriting started by pid 3193
AOF重写停止发送差异
3189:S 16 Jun 2020 14:09:21.793 * AOF rewrite child asks to stop sending diffs.
正在完成AOF增量同步
3193:C 16 Jun 2020 14:09:21.793 * Parent agreed to stop sending diffs. Finalizing AOF...
0M增量数据
3193:C 16 Jun 2020 14:09:21.794 * Concatenating 0.00 MB of AOF diff received from parent.
3193:C 16 Jun 2020 14:09:21.794 * SYNC append only file rewrite performed
3193:C 16 Jun 2020 14:09:21.795 * AOF rewrite: 0 MB of memory used by copy-on-write
后台AOF重写成功
3189:S 16 Jun 2020 14:09:21.806 * Background AOF rewrite terminated with success
3189:S 16 Jun 2020 14:09:21.806 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
3189:S 16 Jun 2020 14:09:21.806 * Background AOF rewrite finished successfully
上面为从库身份,同步主库
下面为主库身份,同步二级从库
3189:S 16 Jun 2020 14:09:48.658 * Replica 192.168.1.12:6379 asks for synchronization
3189:S 16 Jun 2020 14:09:48.659 * Full resync requested by replica 192.168.1.12:6379
3189:S 16 Jun 2020 14:09:48.659 * Starting BGSAVE for SYNC with target: disk
3189:S 16 Jun 2020 14:09:48.659 * Background saving started by pid 3195
3195:C 16 Jun 2020 14:09:48.675 * DB saved on disk
3195:C 16 Jun 2020 14:09:48.675 * RDB: 0 MB of memory used by copy-on-write
3189:S 16 Jun 2020 14:09:48.740 * Background saving terminated with success
3189:S 16 Jun 2020 14:09:48.741 * Synchronization with replica 192.168.1.12:6379 succeeded
查看角色信息

主库192.168.1.21

[root@localhost ~]# /usr/local/redis/bin/redis-cli 
127.0.0.1:6379> role
1) "master"		身份:master
2) (integer) 1946
3) 1) 1) "192.168.1.11"	
      2) "6379"
      3) "1946"
127.0.0.1:6379> 
127.0.0.1:6379> INFO replication   也可以通过此命令来看详细信息
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.11,port=6379,state=online,offset=1988,lag=1
master_replid:e907186ab43cb68ab75c49ea8dae6cfb6544676d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1988
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1988
127.0.0.1:6379> 

从库192.168.1.11

[root@localhost ~]# /usr/local/redis/bin/redis-cli 
127.0.0.1:6379> info replication
# Replication
role:slave		身份:从库
master_host:192.168.1.21	主库
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:1400		二级从库
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=192.168.1.12,port=6379,state=online,offset=1400,lag=0
master_replid:e907186ab43cb68ab75c49ea8dae6cfb6544676d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1400
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1400

从库192.16.1.12

[root@localhost ~]# /usr/local/redis/bin/redis-cli 
127.0.0.1:6379> role
1) "slave"		身份是从
2) "192.168.1.11"	主库是192.168.1.11
3) (integer) 6379	
4) "connected"		状态:已连接
5) (integer) 1232

主库192.16.1.21写入数据,看从库是否有此信息

127.0.0.1:6379> SET name toyix
OK
127.0.0.1:6379> get name
"toyix"

从库192.168.1.12查看

[root@localhost ~]# ifconfig |grep 192.168
        inet 192.168.1.12  netmask 255.255.255.0  broadcast 192.168.1.255
[root@localhost ~]# /usr/local/redis/bin/redis-cli 
127.0.0.1:6379> GET name
"toyix"
127.0.0.1:6379> 

----------end

猜你喜欢

转载自blog.csdn.net/oToyix/article/details/106782568