环境:
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 300 每300秒给客户端发送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