目录
Redis单机安装
Redis主从架构安装
Redis单机安装
上传redis安装包 解压缩: tar -xzf redis-6.2.4.tar.gz 进入redis目录: cd redis-6.2.4 运行编译命令: make &&make install
如果没有出错,应该就安装成功了。
然后修改redis.conf文件中的一些配置:
# 绑定地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问 bind 0.0.0.0 # 保护模式,关闭保护模式 protected-mode no # 数据库数量,设置为1 databases 1 # 后台启动设置daemonize no改成yes # 修改redis.conf(128行)文件将里面的daemonize no 改成 yes,让服务在后台启动 # 设置redis访问密码 requirepass 123456
启动Redis:
redis-server redis.conf
停止redis服务:
redis-cli shutdown
Redis主从架构安装
1.创建三个文件夹,名字分别叫7001、7002、7003:
2.mkdir 7001 7002 7003
3.将redis-6.2.4/redis.conf文件拷贝到三个目录中
# 方式一:逐个拷贝 cp redis-6.2.4/redis.conf 7001 cp redis-6.2.4/redis.conf 7002 cp redis-6.2.4/redis.conf 7003 # 方式二:管道组合命令,一键拷贝 echo 700170027003| xargs -t -n 1cp redis-6.2.4/redis.conf
4.修改每个实例的端口、工作目录(可以在文件中手动修改,也可以使用命令修改)
sed -i -e 's/6379/7001/g'-e 's/dir .//dir /tmp/7001//g'7001/redis.conf sed -i -e 's/6379/7002/g'-e 's/dir .//dir /tmp/7002//g'7002/redis.conf sed -i -e 's/6379/7003/g'-e 's/dir .//dir /tmp/7003//g'7003/redis.conf
5.启动
# 第1个redis-server 7001/redis.conf # 第2个redis-server 7002/redis.conf # 第3个redis-server 7003/redis.conf
6.开启主从关系
修改配置文件(永久生效)在redis.conf中添加一行配置: slaveof使用redis-cli客户端连接到redis服务,执行slaveof命令(重启后失效): slaveof 如果redis设置了密码,需配置主redis密码:masterauth 123456 通过redis-cli命令连接7001,执行下面命令: redis-cli -p 7001 #查看状态 info replication
数据同步原理
1. 主从第一次同步是全量同步
master如何判断slave是不是第一次来同步数据?这里会用到两个很重要的概念:
- Replication id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
- offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。
因此slave做数据同步,必须向master声明自己的replication id和offset,master才可以判断到底需要同步哪些数据.
简述全量同步的流程?
- slave节点请求增量同步
- master节点判断replid,发现不一致,拒绝增量同步
- master将完整内存数据生成rdb,发送rdb到slave
- slave清空本地数据,加载master的rdb
- master将rdb期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
2. 主从第一次同步是全量同步,但如果slave重启后同步,则执行增量同步
注意:
repl_baklog大小有上限,写满后会覆盖最早的数据。如果slave断开时间过久,导致尚未备份的数据被覆盖,则无法基于log做增量同步,只能再次全量同步。
repl_baklog大小有上限,写满后会覆盖最早的数据。如果slave断开时间过久,导致数据被覆盖,则无法实现增量同步,只能再次全量同步。
可以从以下几个方面来优化redis主从集群:
- 在master中配置repl-diskkless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO
使用场景:磁盘比较慢,网络非常快时
提高全量同步性能
- redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
提高全量同步性能
- 适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
- 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力
简述全量同步和增量同步区别
(1)全量同步:master将完整内存数据生成rdb,发送rdb到slave,后续命令则记录在repl_baklog,逐个发送给slave。
(2)增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave。
什么时候执行全量同步?
(1)slave节点第一次连接master节点时
(2)slave节点断开时间太久,repl_baklog中的offset已经被覆盖时
什么时候执行增量同步?
slave节点断开又恢复,并且在repl_baklog中能找到offset时



