redis-master-slave

本文介绍了Redis主从复制的工作原理及如何搭建一个包含一主三从的Redis集群。通过详细步骤说明了如何配置各实例的端口及主从关系,并验证了数据同步效果。
Redis复制工作原理:

1. 如果设置了一个Slave,无论是第一次连接还是重连到Master,它都会发出一个SYNC命令;
2. 当Master收到SYNC命令之后,会做两件事:
a) Master执行BGSAVE,即在后台保存数据到磁盘(rdb快照文件);
b) Master同时将新收到的写入和修改数据集的命令存入缓冲区(非查询类);
3. 当Master在后台把数据保存到快照文件完成之后,Master会把这个快照文件传送给Slave,而Slave则把内存清空后,加载该文件到内存中;
4. 而Master也会把此前收集到缓冲区中的命令,通过Reids命令协议形式转发给Slave,Slave执行这些命令,实现和Master的同步;
5. Master/Slave此后会不断通过异步方式进行命令的同步,达到最终数据的同步一致;
6. 需要注意的是Master和Slave之间一旦发生重连都会引发全量同步操作。但在2.8之后版本,也可能是部分同步操作。
 
目标:

搭建一个redis 集群(一主三从)

 

master 下挂 slaveA,slaveB

其中:slaveB下挂slaveC

 

准备
sudo wget http://download.redis.io/releases/redis-3.2.6.tar.gz
sudo tar -xzvf redis-2.8.13.tar.gz
cd redis-2.8.13/src

 

 

生成可执行文件:
sudo make

 

 

复制实例以及配置 到某个目录(这个一般是启动目录)
sudo cp /home/q/www/redis/redis-2.8.13/src/redis-server .
sudo cp /home/q/www/redis/redis-2.8.13/src/redis-cli .
sudo cp /home/q/www/redis/redis-2.8.13/src/redis-benchmark .
sudo cp /home/q/www/redis/redis-2.8.13/redis.conf .

 

 

复制(多份配置,用于启动不同的端口号和主从关系等):

sudo cp redis.conf redis_A.conf 

sudo cp redis.conf redis_B.conf 

sudo cp redis.conf redis_C.conf 

 

修改各自实例的端口号:

A:port 6380

B: port 6381

C: port 6382

 

修改主从配置:

A:slaveof 127.0.0.1 6379

B: slaveof 127.0.0.1 6379

C: slaveof 127.0.0.1 6380

 

启动实例:
nohup sudo ./redis-server redis.conf &
nohup sudo ./redis-server redis_A.conf &
nohup sudo ./redis-server redis_B.conf &
nohup sudo ./redis-server redis_C.conf &

 

 

测试:
sudo ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set name xinchun.wang
OK
[xinchun.wang@l-*.f.dev.cn6 ~/redis]$ sudo ./redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> get name
"xinchun.wang"
127.0.0.1:6380> 
[xinchun.wang@l-*.f.dev.cn6 ~/redis]$ sudo ./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> get name
"xinchun.wang"
127.0.0.1:6381> 
[xinchun.wang@l-*.f.dev.cn6 ~/redis]$ sudo ./redis-cli -h 127.0.0.1 -p 6382
127.0.0.1:6382> get name
"xinchun.wang"

 

 

主从配置完毕!

 

继续了解:

127.0.0.1:6379> info

# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=976,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=976,lag=0
 

 注意:

role:master

connected_slaves:2

 

 

 

 

127.0.0.1:6380> info

# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:1046
slave_priority:100
slave_read_only:1
connected_slaves:0

 

 

 

127.0.0.1:6381> info

 

 

# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:2768
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=2754,lag=0

 

关闭实例:
 sudo ./redis-cli -n  6379 shutdown

  

 

其他:

改为 yes # 是否后台运行 (还可以通过文中的nohup & 的方式,不建议使用)

daemonize yes  

 

#数据文件的位置

dbfilename dump.rdb

 

#当前实例启动的端口号

port 6379

 

#配置从

slaveof 127.0.0.1 6379

 

#数据目录:

dir .  # 数据目录

maxmemory项,设最大占用内存为50MB:maxmemory 50mb
有6种内存过期策略,通过maxmemory-policy修改,一般使用默认值或allkeys-lru:
volatile-lru:只对设置了过期时间的key进行LRU(默认值)
allkeys-lru : 是从所有key里 删除 不经常使用的key
volatile-random:随机删除即将过期key
allkeys-random:随机删除
volatile-ttl : 删除即将过期的

noeviction : 永不过期,返回错误 

 

 

以下是关于 Redis 复制功能的几个重要方面:
1. 一个Master可以有多个Slave;
2. Redis使用异步复制。从2.8开始,Slave会周期性(每秒一次)发起一个Ack确认复制流(replication stream)被处理进度;
3. 不仅主服务器可以有从服务器, 从服务器也可以有自己的从服务器, 多个从服务器之间可以构成一个图状结构;
4. 复制在Master端是非阻塞模式的,这意味着即便是多个Slave执行首次同步时,Master依然可以提供查询服务;
5. 复制在Slave端也是非阻塞模式的:如果你在redis.conf做了设置,Slave在执行首次同步的时候仍可以使用旧数据集提供查询;你也可以配置为当Master与Slave失去联系时,让Slave返回客户端一个错误提示;
6. 当Slave要删掉旧的数据集,并重新加载新版数据时,Slave会阻塞连接请求(一般发生在与Master断开重连后的恢复阶段);
7. 复制功能可以单纯地用于数据冗余(data redundancy),也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability): 比如说, 繁重的 SORT 命令可以交给附属节点去运行。
8. 可以通过修改Master端的redis.config来避免在Master端执行持久化操作(Save),由Slave端来执行持久化。

^C[root@k8smaster 2]# kubectl -n redis-server get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES redis-master-966f8c49b-cfk65 0/1 Running 2 5m1s 10.244.0.13 k8smaster <none> <none> redis-slave1-547f7f4df5-7llz8 0/1 Running 2 5m1s 10.244.1.44 k8snode1 <none> <none> redis-slave2-88d55ddb9-n2mlj 0/1 Running 0 5m1s 10.244.2.26 k8snode2 <none> <none> [root@k8smaster 2]# kubectl -n redis-server get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/mysql-master-pv 10Gi RWO Retain Bound mysql-server/mysql-master-pvc 3h7m persistentvolume/mysql-slave1-pv 10Gi RWO Retain Bound mysql-server/mysql-slave1-pvc 3h7m persistentvolume/mysql-slave2-pv 10Gi RWO Retain Bound mysql-server/mysql-slave2-pvc 3h7m persistentvolume/redis-master-pv 1Gi RWO Retain Bound redis-server/redis-master-pvc 5m13s persistentvolume/redis-slave1-pv 1Gi RWO Retain Bound redis-server/redis-slave1-pvc 5m13s persistentvolume/redis-slave2-pv 1Gi RWO Retain Bound redis-server/redis-slave2-pvc 5m13s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/redis-master-pvc Bound redis-master-pv 1Gi RWO 5m13s persistentvolumeclaim/redis-slave1-pvc Bound redis-slave1-pv 1Gi RWO 5m13s persistentvolumeclaim/redis-slave2-pvc Bound redis-slave2-pv 1Gi RWO 5m13s [root@k8smaster 2]# kubectl -n redis-server exec -it redis-master-7d5f8d5f76-2xq4z -- redis-cli -a redispass Error from server (NotFound): pods "redis-master-7d5f8d5f76-2xq4z" not found [root@k8smaster 2]# kubectl -n redis-server exec -it redis-master-966f8c49b-cfk65 -- redis-cli -a redispass Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. AUTH failed: ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct? 127.0.0.1:6379> SET testkey "hello redis" OK 127.0.0.1:6379> exit [root@k8smaster 2]# kubectl -n redis-server exec -it redis-slave1-547f7f4df5-7llz8 -- redis-cli -a redispass GET testkey Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. Could not connect to Redis at 127.0.0.1:6379: Connection refused command terminated with exit code 1
最新发布
10-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值