Redis多实例主从

一、redis多实例

1.创建多实例目录

[root@db01 ~]# mkdir /service/redis/{6380,6381}

2.配置多实例配置文件

#第一台多实例配置
[root@db01 ~]# vim /service/redis/6379/redis.conf 
bind 172.16.1.51 127.0.0.1
port 6379
daemonize yes
pidfile /service/redis/6379/redis_6379.pid
loglevel notice
logfile /service/redis/6379/redis_6379.log
dir /service/redis/6379
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

#第二台多实例配置
[root@db01 ~]# vim /service/redis/6380/redis.conf 
bind 172.16.1.51 127.0.0.1
port 6380
daemonize yes
pidfile /service/redis/6380/redis_6380.pid
loglevel notice
logfile /service/redis/6380/redis_6380.log
dir /service/redis/6380
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

#第三台多实例配置
[root@db01 ~]# vim /service/redis/6381/redis.conf 
bind 172.16.1.51 127.0.0.1
port 6381
daemonize yes
pidfile /service/redis/6381/redis_6381.pid
loglevel notice
logfile /service/redis/6381/redis_6381.log
dir /service/redis/6381
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

3.启动多实例

[root@db01 ~]# redis-server /service/redis/6379/redis.conf 
[root@db01 ~]# redis-server /service/redis/6380/redis.conf 
[root@db01 ~]# redis-server /service/redis/6381/redis.conf

4.检测启动

[root@db01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      14002/redis-server  
tcp        0      0 172.16.1.51:6379        0.0.0.0:*               LISTEN      14002/redis-server  
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      15541/redis-server  
tcp        0      0 172.16.1.51:6380        0.0.0.0:*               LISTEN      15541/redis-server  
tcp        0      0 127.0.0.1:6381          0.0.0.0:*               LISTEN      15545/redis-server  
tcp        0      0 172.16.1.51:6381        0.0.0.0:*               LISTEN      15545/redis-server   

[root@db01 ~]# ps -ef | grep redis
root      14002      1  0 Aug04 ?        00:01:34 redis-server 172.16.1.51:6379
root      15541      1  0 11:50 ?        00:00:00 redis-server 172.16.1.51:6380
root      15545      1  0 11:50 ?        00:00:00 redis-server 172.16.1.51:6381

5.连接多实例

[root@db01 ~]# redis-cli -p 6379
127.0.0.1:6379> quit

[root@db01 ~]# redis-cli -p 6380
127.0.0.1:6380> quit

[root@db01 ~]# redis-cli -p 6381
127.0.0.1:6381> quit

二、redis主从

1.主从复制特点

1.使用异步复制。
2.一个主服务器可以有多个从服务器。
3.从服务器也可以有自己的从服务器。
4.复制功能不会阻塞主服务器。
5.可以通过复制功能来让主服务器免于执行持久化操作,由从服务器去执行持久化操作即可。

#详细版本
1)Redis 使用异步复制。从 Redis2.8开始,从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度。
2)一个主服务器可以有多个从服务器。
3)不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器,多个从服务器之间可以构成一个图状结构。
4)复制功能不会阻塞主服务器:即使有一个或多个从服务器正在进行初次同步, 主服务器也可以继续处理命令请求。
5)复制功能也不会阻塞从服务器:只要在 redis.conf 文件中进行了相应的设置, 即使从服务器正在进行初次同步, 服务器也可以使用旧版本的数据集来处理命令查询。
6)在从服务器删除旧版本数据集并载入新版本数据集的那段时间内,连接请求会被阻塞。
7)还可以配置从服务器,让它在与主服务器之间的连接断开时,向客户端发送一个错误。
8)复制功能可以单纯地用于数据冗余(data redundancy),也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability): 比如说,繁重的SORT命令可以交给附属节点去运行。

2.8版本以前

2.8版本之后

2.主从复制的原理

1.从服务器向主服务器发送 SYNC 命令
2.主库接到 SYNC 命令会调用 BGSAVE 命令创建一个 RDB 文件
3.主库将新的数据记录到缓冲区
4.主库将 RDB 文件传输到从库
5.从库拿到 RDB 文件以后,会清空自己的数据 *****
6.从库读取 RDB 文件并导入数据
7.主库将新的数据从缓冲区传到从库进行同步

3.主从复制的机制

#SYNC与PSYNC

1)在 Redis2.8版本之前,断线之后重连的从服务器总要执行一次完整重同步(fullresynchronization)操作。
2)从 Redis2.8开始,Redis使用PSYNC命令代替SYNC命令。
3)PSYNC比起SYNC的最大改进在于PSYNC实现了部分重同步(partial resync)特性:
在主从服务器断线并且重新连接的时候,只要条件允许,PSYNC可以让主服务器只向从服务器同步断线期间缺失的数据,而不用重新向从服务器同步整个数据库。

PSYNC这个特性需要主服务器为被发送的复制流创建一个内存缓冲区(in-memory backlog), 并且主服务器和所有从服务器之间都记录一个复制偏移量(replication offset)
和一个主服务器 ID(master run id),当出现网络连接断开时,从服务器会重新连接,并且向主服务器请求继续执行原来的复制进程:
1)如果从服务器记录的主服务器ID和当前要连接的主服务器的ID相同,并且从服务器记录的偏移量所指定的数据仍然保存在主服务器的复制流缓冲区里面,
那么主服务器会向从服务器发送断线时缺失的那部分数据,然后复制工作可以继续执行。
2)否则的话,从服务器就要执行完整重同步操作。

#PSYNC优点:
1)PSYNC只会将从服务器断线期间缺失的数据发送给从服务器。两个例子的情况是相同的,但SYNC 需要发送包含整个数据库的 RDB 文件,而PSYNC 只需要发送三个命令。
2)如果主从服务器所处的网络环境并不那么好的话(经常断线),那么请尽量使用 Redis 2.8 或以上版本:通过使用 PSYNC 而不是 SYNC 来处理断线重连接,
可以避免因为重复创建和传输 RDB文件而浪费大量的网络资源、计算资源和内存资源。

4.配置主从

# 注意:
- 如主服务器配置有密码,则从服务器需要在配置文件中添加下方信息,456为密码。然后才能进行主从同步
masterauth 456

1)准备环境

角色 主机 端口
主库 172.16.1.51 6379
从库 172.16.1.51 6380
从库 172.16.1.51 6381

2)连接三台机器

[root@db01 ~]# redis-cli -p 6379
[root@db01 ~]# redis-cli -p 6380
[root@db01 ~]# redis-cli -p 6381

3)查看主从状态

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:6380> 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:6381> 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

4)配置主从

127.0.0.1:6380> SLAVEOF 172.16.1.51 6379
OK

127.0.0.1:6381> SLAVEOF 172.16.1.51 6379
OK

# 解除主从方法:
redis-cli -a 密码 -p 端口 slaveof no one

5)查看主从状态

#查看主库
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.1.51,port=6380,state=online,offset=263,lag=0
slave1:ip=172.16.1.51,port=6381,state=online,offset=263,lag=1
master_repl_offset:263
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:262

#查看从库
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:172.16.1.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:319
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
posted @ 2020-08-05 15:28  元气少女郭德纲!!  阅读(386)  评论(0编辑  收藏  举报