一、简介
Redis支持将数据同步到多台slave上,这种特性对提高读取性能非常有益
1)master可以有多台slave
2) 除了多个slave连到相同master外,slave也可以连接到其它slave形成图状结构
3)主从复制不会阻塞master,也就是说当一个或多个slave与master连接进行复制时,master可以继续处理客户端发来的请求,相反slave在初次同步数据时则会阻塞,不能处理客户端请求
4)主从复制可以用来提高系统的伸缩性,我们可以用多个slave专门负责客户端的读请求,可以做数据冗余
5)可以在master禁用数据持久化,只需要注释掉master配置文件redis.conf的save配置,然后只在slave配置持久化
二、Demo
博主这里就没装多台机器,本来可以用三台虚拟机建一个局域网,来实现redis的主从复制,在这里偷下懒,利用启动多个配置文件来取代,这里一共有三个redis.conf文件,如下:
[jacky@jacky ~]$ su 密码: [root@jacky jacky]# cd /etc/redis [root@jacky redis]# ls -l 总用量 176 -rw-r--r--. 1 root root 41576 11月 3 22:03 redis6379.conf -rw-r--r--. 1 root root 41560 11月 3 20:08 redis6380.conf -rw-r--r--. 1 root root 41560 11月 3 20:08 redis6381.conf
2.1、主要修改配置文件的以下信息,例如修改redis8381.conf,同理,redis6379.conf和redis6380.conf也一样
daemonize yes pidfile /var/run/redis6381.pid port 6381 logfile "6381.log" dbfilename dump6381.rdb
2.2、一主二从
在这里博主设置79为master;80和81为slave,配置redis主从复制的时候只需要配置从机不需要配置主机(配主补配从)
6380 配置
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
6381 配置
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
就这样,一主二从配置就完毕了,哈哈,很简单吧,79原来的数据和新的数据都会同步到80和81上,如下
6379
127.0.0.1:6379> set k1 v1 #没配置主从之前插入的 OK 127.0.0.1:6379> set k2 v2 #没配置主从之前插入的 OK 127.0.0.1:6379> set k3 v3 #没配置主从之前插入的 OK 127.0.0.1:6379> set k4 v4 #配置主从之后插入的 OK
6380
k1和k4都能拿到
127.0.0.1:6380> get k4 "v4" 127.0.0.1:6380> get k1 "v1"
6381
k3和k4都能拿到
127.0.0.1:6381> get k4 "v4" 127.0.0.1:6381> get k3 "v3"
到这里,一主二从配置成功,但是在生产时,master和slave都有可能突然之间死机,
1)如果主机死掉了,默认情况下,主机重新启动,角色还是主机
2)如果从机死掉了,默认情况下,从机重新启动,角色变成没有独立主机了,需要重新配置,除非从机在redis.conf文件里配置了,否则从机不会
重新连接主机
3)读写分离,是指redis从机只能负责读,不能写,主机能够写能够读
2.3、新火相传
新火相传的意思其实就是去中心化,现在只有80和81两台slave连接master,假如,有100台slave的话,那么master就压力很大了,所以redis又推出了新火相传的解决方案,上一台slave,可以下一台slave的master.
79和80不改变,在81上配置如下:
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 OK
这样就在79上插入一个值,也可以同步到81
2.4、反客为主
上面提到了,当master死机的时候,重写启动还是master,现在时,我是想当master死机的时候,让某一台从机变成主机,这里是,让80变成主机,
只要当master死机器的时候,手动在80执行如下命令:
127.0.0.1:6380> SLAVEOF no one
同时,81也要重新配置,配置80为主机
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 OK
2.5、哨兵模式
简单的说,哨兵模式,就是反客为主的自动版,通过监控主机,当主机挂掉的时候,就几台从机中透过投票选出新的主机
2.5.1 在 /etc/redis/目录下新建一个sentinel.conf文件
里面的内容为
sentinel monitor host6379 127.0.0.1 6379 1
host6379为监控的主机名词,自定义的,后面的“1”表示,当主机挂掉的时候,从机自动进行投票,谁的票数首先超过“1”,谁就为主机
2.5.2 启动sentinel.conf 文件
[root@jacky bin]# ./redis-sentinel /etc/redis/sentinel.conf 15482:X 05 Nov 17:44:31.958 * Increased maximum number of open files to 10032 (it was originally set to 1024). 15482:X 05 Nov 17:44:31.960 # Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now. _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.0.6 (00000000/0) 32 bit .-`` .-```. ```/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 15482 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 15482:X 05 Nov 17:44:31.966 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 15482:X 05 Nov 17:44:31.966 # Sentinel runid is 7cb8075de28bb16320934364995643e41ac24f67 15482:X 05 Nov 17:44:31.966 # +monitor master host6379 127.0.0.1 6379 quorum 1 15482:X 05 Nov 17:45:01.982 # +sdown master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:01.982 # +odown master host6379 127.0.0.1 6379 #quorum 1/1 15482:X 05 Nov 17:45:01.982 # +new-epoch 1 15482:X 05 Nov 17:45:01.982 # +try-failover master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:01.997 # +vote-for-leader 7cb8075de28bb16320934364995643e41ac24f67 1 15482:X 05 Nov 17:45:01.997 # +elected-leader master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:01.997 # +failover-state-select-slave master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:02.060 # -failover-abort-no-good-slave master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:02.129 # Next failover delay: I will not start a failover before Sat Nov 5 17:51:02 2016
这样就算完成了
注意:就是当原来的master回来后,不是做独立的mater,而是做新主机的slave