一. 主从模式
I. 主从复制
- 主从复制可以在一定程度上扩展 redis 的性能,redis 的主从复制与关系型数据库的主从复制类似,从机能够精确的复制主机上的内容。
- 实现主从复制之后,一方面能够实现数据的读写分离,降低主机(master)的压力,另一方面也能实现数据的备份。
II. 配置与实现
-
假设现在有三个 redis 实例,地址如下
192.168.248.128:6379 192.168.248.128:6380 192.168.248.128:6381
-
在 redis 安装目录下把 redis.conf 改成 redis6379.conf 便于区分,然后再复制两份,分别是 redis6380.conf 和 redis6381.conf
-
打开 redis6379.conf ,将以下的配置均加上 6379(一般而言,默认就是6379)
port 6379 pidfile /var/run/redis_6379.pid logfile "6379.log" dbfilename dump6379.rdb appendfilename "appendonly6379.aof"
-
同理,将 redis6380.conf 和 redis6381.conf 的配置也改成对应的 6380 和 6381
#在 redis6380.conf 的编辑窗口中,可以使用以下的命令全局替换。 redis6381.conf 也是一样的道理 :%s/6379/6380/g
-
然后分别使用三个不一样的配置启动 redis
[root@localhost redis-7.0.0]# src/redis-server redis6379.conf [root@localhost redis-7.0.0]# src/redis-server redis6380.conf [root@localhost redis-7.0.0]# src/redis-server redis6381.conf
-
然后分别在三个实例的控制台指定 port 进入 redis
[root@localhost redis-7.0.0]# src/redis-cli -p 6379 [root@localhost redis-7.0.0]# src/redis-cli -p 6380 [root@localhost redis-7.0.0]# src/redis-cli -p 6381
-
此时我们就搭建好了三个 redis 实例了,但他们彼此之间此时是没有任何关系的,是相互独立的三个 redis 实例。那么需要怎么去配置呢?我们可以进入到从机的配置文件中( redis6380.conf 和 redis6381.conf ),指定哪一个是主机。
# replicaof <masterip> <masterport> # masterauth <master-password> # 把从机配置中的上面那两个,指定一个主机(这里 6379 是主机) replicaof 127.0.0.1 6379 masterauth 123
-
当然,也可以分别在 6380 和 6381 上执行如下命令:
#表示修改当前服务器,使其转变为指定服务器的从属服务器(Slave Server) 127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
-
搭建好之后,在主机上输入 INFO replication 便可查看当前实例状态
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=182,lag=1
slave1:ip=127.0.0.1,port=6380,state=online,offset=182,lag=0
master_failover_state:no-failover
master_replid:73b049a114d7cf8e6ef61e6a492a273a11851f2d
master_replid2:fc81fd6eacea040420bce1c50805c5c871634961
master_repl_offset:182
second_repl_offset:155
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:155
repl_backlog_histlen:28
-
可以看到 6379 主机上面挂了两个从机(connected_slaves:2),两个从机的地址、端口号等信息都展现出来了。如果在从机上执行 INFO replication ,显示信息如下:
127.0.0.1:6380> INFO replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_read_repl_offset:0 slave_repl_offset:0 master_link_down_since_seconds:-1 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:137bf1903a366a5befefc1cedec140d8e5aaf8c1 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 127.0.0.1:6380> SHUTDOWN not connected> exit [root@localhost redis-7.0.0]# vi redis6380.conf [root@localhost redis-7.0.0]# src/redis-server redis6380.conf [root@localhost redis-7.0.0]# src/redis-cli -p 6380 -a 123 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6380> INFO replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:9 master_sync_in_progress:0 slave_read_repl_offset:448 slave_repl_offset:448 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:73b049a114d7cf8e6ef61e6a492a273a11851f2d master_replid2:fc81fd6eacea040420bce1c50805c5c871634961 master_repl_offset:448 second_repl_offset:155 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15 repl_backlog_histlen:434
-
此时,我们在主机中存储数据,在从机中就可以 get 到主机中存储的数据了。
III. 主从复制的注意点
- 如果主机已经运行了一段时间,并且已经存储了一些数据,此时从机连上来,那么从机会将
主机上所有的数据进行备份
,而不是从连接上来的那个时间点开始备份。 - 配置了主从复制之后,主机上可读可写,但是从机只能读取不能写入。(但不是绝对的,可以通过修改 redis.conf中 replica-read-only 的值让从机也可以执行写操作,但我们一般不去这样做 )
- 在整个主从结构运行过程中,如果主机不幸运挂掉,重启之后,他依然是主机,主从复制操作也能够继续进行。
二. 哨兵模式
I. 配置与实现
-
当主机宕机时,从机就会有群龙无首的情况。如果在主机宕机时,能够在从机中选出一个来充当主机,那么就不用我们每次宕机时去手动重启主机了。
-
在上面的配置好的基础下,我的主机是 6379,两个从机分别是 6380 和 6381。然后在 redis 目录下打开 sentinel.conf 文件,进行如下配置
# sentinel monitor <master-name> <ip> <redis-port> <quorum> # sentinel auth-pass <master-name> <password> # 对上面的配置进行更改 sentinel monitor mymaster 127.0.0.1 6379 1 sentinel auth-pass mymaster 123
其中,mymaster 是给要监控的主机取一个名字,自己定义,后面的是主机地址,最后面的 1 表示有多少个 sentinel 认为主机挂掉了,就进行切换。
-
配置完成后,输入
redis-sentinel sentinel.conf
启动哨兵 -
重新启动 6379、6380、6381 这一主二仆架构,关闭 master 之后,即可以代表主机宕机了。redis 内部重新选了其中一个从机当做主机。在这里假设 6380 被选上了,成为了主机。
-
那么,如果 6379 重新上线了,原先被选上的 6380 就需要退位了,屈身成为了 slave ,6379 重新成为主机。
II. 注意问题
- 由于所有的写操作都是在 Master 上操作,然后同步更新到 Slave 中,所以从 Master 同步到 Slave 的过程中会有一定延迟。当系统繁忙时,这个延迟的问题会尤为严重,Slave 数量的增加也会使这个问题加重。
- 因此,我们还需要集群来进一步提升 redis 性能。
更详细的 Redis 总结可以参考一下这里:Redis 总结