十六、Redis进阶-Redis主从复制一主多从一步一步实现
主从复制的概念
在复制的概念中,数据库分为两类,一类是主数据库(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