十六、Redis进阶-Redis主从复制一主多从一步一步实现

作者: 温新

分类: 【Redis】

阅读: 3449

时间: 2020-09-04 16:07:22

主从复制的概念

在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。

主数据库可以进行读写操作,当主数据库写操作导致数据变化时会自动将数据同步给从数据库;从数据库一般设置为只读,并接受主数据库同步过来的数据。

一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。

什么是主从复制

主从复制是指将一台主节点(master)Redis服务器的数据复制到其他的从节点(slave)Redis服务器。主从之间的复制是单向的,只能是由主节点到从节点。

主从复制的作用

  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余
  • 故障恢复:当主节点出现故障时,可以由从节点提供服务,快速实现故障恢复;实际上是一种服务冗余
  • 负载均衡:在主从复制的基础上配合读写分离,由主节点提供写服务,从节点提供读服务,分摊服务器负载;写少读多的情况下,可以通过从节点分摊读负载,提高Redis服务器并发量
  • 读写分离:用于实现读写分离,主库写,从库读
  • 高可用基石:主从复制是实现哨兵和集群的基础

两种方式实现主从复制

Redis中实现主从复制很容易,只需要在从数据库中加入slaveof 主数据库地址 主数据库端口即可,主数据库不需要进行任何配置。

Redis可以通过slaveof与配置文件两种方式实现主从复制,推荐使用配置文件方式。

方式一、通过saveof命令方式实现主从复制

实现:--slaveof 主库地址 端口

通过命令的方式与通过配置的方式一样,实现起来都很简单,命令行只需要在启动Redis服务器时加上slaveof参数,并指定端口就可以了。

下面在一台服务器上启动3个Redis实例,实现一主二从。

**第一步:直接启动Redis服务。**不带任何参数,Redis实例默认监听6379端口,将此作为主服务

# 启动主服务
 /usr/local/bin/redis-server 

第二步:客户端连接6379主服务

# 查看配置信息
127.0.0.1:6379> info replication
# Replication
role:master			# master主数据库
connected_slaves:0
master_replid:095911c74f50bb8276f869febfa0c77bcd00f016
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

第三步:使用3680端口开启从服务

需要新开窗口进行服务器配置

 /usr/local/bin/redis-server --port 6380 --slaveof 127.0.0.1 6379

连接成功后,主数据库中的任何数据变化通过自动同步到从数据库中(6380)

第四步:客户端连接6380服务

需要新开窗口进行连接

 /usr/local/bin/redis-cli -p 6380

查看主从信息

127.0.0.1:6380> info replication
# Replication
role:slave			# 6380为从库
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:70
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:be3661f87806ca1bb4ae0d9e71b4f07c4e32ae5e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70

第五步:使用6381端口启动服务

x  /usr/local/bin/redis-server --port 6381 --slaveof 127.0.0.1 6379

第六步:客户端连接6381服务

 /usr/local/bin/redis-cli -p 6381

查看配置信息

127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:3959
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:be3661f87806ca1bb4ae0d9e71b4f07c4e32ae5e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3959
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:3834
repl_backlog_histlen:126

第七步:实测

主数据库,新增一个key,2个从库分别查看信息。注意端口

# 主
127.0.0.1:6379> set name ziruchu
OK
# 从
127.0.0.1:6380> get name
"ziruchu"
# 从
127.0.0.1:6381> get name
"ziruchu"

这样通过命令的方式来实现主从复制就已经OK了

方式二、通过confp配置文件实现主从复制

同样还是实现一主多种。三个配置文件redis.conf、redis_6380.conf、redis_6381.conf,其中redis.conf为默认的配置文件,将其作为主服务器的启动配置文件,后面两个配置文件均为从服务器的启动配置文件。

第一步:创建6380与6381的配置文件

6379使用默认的配置文件,下面配置6380与6381两个配置文件,由于这2个配置文件只需要修改一下端口,因此只列出一个配置文件来。

vim /usr/local/bin/redis_conf/redis_6380.conf


#############################
### 以下配置是6380的配置
#############################
# 端口
port 6380

# 后台启动
daemonize yes

pidfile /var/run/redis_6380.pid

loglevel notice

# 日志文件
logfile "/usr/local/bin/redis_6380.log"

# 快照文件
dbfilename 6380_dump.rdb

dir /usr/local/bin/6380

replicaof 127.0.1 6379
replica-read-only yes                     

配置6381时记住修改对应的端口号

步骤二:启动Redis主服务

/usr/local/bin/redis-server /usr/local/bin/redis_conf/redis.conf

步骤三:客户端登录主服务并查看主从信息

[root@192 ~]# /usr/local/bin/redis-cli -p 6379
127.0.0.1:6379> 

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:f57cc8dc1c85a80353c3da29bc4da23537e92bd5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

步骤三:启动Redis6380服务

创建6380、6381目录。不然会启动失败

[root@192 bin]# pwd
/usr/local/bin
[root@192 bin]# mkdir 6380
[root@192 bin]# mkdir 6381

启动Redis6380服务

[root@192 redis_conf]# /usr/local/bin/redis-server /usr/local/bin/redis_conf/redis_6380.conf 

步骤四:客户端使用6380连接

[root@192 redis_conf]# /usr/local/bin/redis-cli -p 6380
127.0.0.1:6380> 

6379主服务器客户端连接查看信息

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=210,lag=1
master_replid:96d032d60dafe0394bd267041d14a8015cd76d33
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:210
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:210
127.0.0.1:6379> 

可以看到有一个已经连接了

步骤五:启动Redis6381服务

启动6381服务

[root@192 redis_conf]# /usr/local/bin/redis-server /usr/local/bin/redis_conf/redis_6381.conf 
[root@192 redis_conf]# ps -ef | grep redis
root       1403   1378  0 07:35 pts/2    00:00:02 ./redis-server 127.0.0.1:6379
root       1500      1  0 07:51 ?        00:00:00 /usr/local/bin/redis-server *:6380
root       1508   1322  0 07:52 pts/0    00:00:00 /usr/local/bin/redis-cli -p 6380
root       1509   1350  0 07:53 pts/1    00:00:00 ../redis-cli -p 6379
root       1516      1  0 07:57 ?        00:00:00 /usr/local/bin/redis-server *:6381
root       1523   1457  0 07:57 pts/3    00:00:00 grep --color=auto redis

步骤六:客户端连接6381服务

[root@192 redis_conf]# /usr/local/bin/redis-cli -p 6381
127.0.0.1:6381> 

步骤七:测试

6379客户端设置一个key;

其他2个从库查看主库设置的信息

# 主库
127.0.0.1:6379> set myname ziruchu
OK

# 从库
127.0.0.1:6380> get myname
"ziruchu"
# 从库
127.0.0.1:6381> get myname
"ziruchu"

注意:

1)这里走了一个坑,因为我使用的版本是6,而从5开始,redis复制的命令已经变更为replicaof。因此我在配置文件的时候没有注意到,还是使用以前的salveof命令,结果在这里坑了不短的时间。

2)关于第一种实现方式,请将所的slaveof命令替换为replicaof。亲测,只是替换了一个词,其他的什么影响都没有。我懒,就不更改了。

2020-09-05

请登录后再评论