和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。
1)采用异步复制;
2)一个主redis可以含有多个从redis;
3)每个从redis可以接收来自其他从redis服务器的连接;
4)主从复制对于主redis服务器来说是非阻塞的,这意味着当从服务器在进行主从复制同步过程中,主redis仍然可以处理外界的访问请求;
5)主从复制对于从redis服务器来说也是非阻塞的,这意味着,即使从redis在进行主从复制过程中也可以接受外界的查询请求,只不过这时候从redis返回的是以前老的数据, 如果你不想这样,那么在启动redis时,可以在配置文件中进行设置,那么从redis在复制同步过程中来自外界的查询请求都会返回错误给客户端;(虽然说主从复制过程中 对于从redis是非阻塞的,但是当从redis从主redis同步过来最新的数据后还需要将新数据加载到内存中,在加载到内存的过程中是阻塞的,在这段时间内的请求将会被阻, 但是即使对于大数据集,加载到内存的时间也是比较多的);
6)主从复制提高了redis服务的扩展性,避免单个redis服务器的读写访问压力过大的问题,同时也可以给为数据备份及冗余提供一种解决方案;
7)为了编码主redis服务器写磁盘压力带来的开销,可以配置让主redis不在将数据持久化到磁盘,而是通过连接让一个配置的从redis服务器及时的将相关数据持久化到磁盘, 不过这样会存在一个问题,就是主redis服务器一旦重启,因为主redis服务器数据为空,这时候通过主从同步可能导致从redis服务器上的数据也被清空。
实验环境:
Vm4 master 172.25.77.40
Vm5 slave 172.25.77.50
Vm6 slave 172.25.77.60
1.下载安装包:http://download.redis.io/releases/
2.本次实验用 redis-4.0.8.tar.gz
3.在vm4、vm5、vm6上编译redis
4.修改master监听本机的所有接口
5.修改slave中的配置
6. 测试
Master:
[root@vm4 ~]# ls
anaconda-ks.cfg redis-4.0.8.tar.gz
[root@vm4 ~]# tar zxf redis-4.0.8.tar.gz
[root@vm4 ~]# ls
anaconda-ks.cfg redis-4.0.8 redis-4.0.8.tar.gz
[root@vm4 ~]# cd redis-4.0.8
[root@vm4 redis-4.0.8]# ls
[root@vm4 redis-4.0.8]# yum install -y gcc
[root@vm4 redis-4.0.8]# make && make install
[root@vm4 redis-4.0.8]# cd utils
[root@vm4 utils]# ./install_server.sh
[root@vm4 utils]# vim /etc/redis/6379.conf
bind 0.0.0.0
[root@vm4 utils]# systemctl restart redis_6379.service
[root@vm4 utils]# netstat -antlp | grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 5949/redis-server 0
Slave:
[root@vm5 ~]# ls
anaconda-ks.cfg redis-4.0.8.tar.gz
[root@vm5 ~]# tar zxf redis-4.0.8.tar.gz
[root@vm5 ~]# ls
anaconda-ks.cfg redis-4.0.8 redis-4.0.8.tar.gz
[root@vm5 ~]# cd redis-4.0.8
[root@vm5 redis-4.0.8]# ls
[root@vm5 redis-4.0.8]# yum install -y gcc
[root@vm5 redis-4.0.8]# make && make install
[root@vm5 redis-4.0.8]# cd utils
[root@vm5 utils]# ./install_server.sh
[root@vm5 utils]# vim /etc/redis/6379.conf
Slaveof 172.25.77.40 6379
[root@vm5 utils]# systemctl restart redis_6379.service
Slave:
[root@vm6 ~]# ls
anaconda-ks.cfg redis-4.0.8.tar.gz
[root@vm6 ~]# tar zxf redis-4.0.8.tar.gz
[root@vm6 ~]# ls
anaconda-ks.cfg redis-4.0.8 redis-4.0.8.tar.gz
[root@vm6 ~]# cd redis-4.0.8
[root@vm6 redis-4.0.8]# ls
[root@vm6 redis-4.0.8]# yum install -y gcc
[root@vm6 redis-4.0.8]# make && make install
[root@vm6 redis-4.0.8]# cd utils
[root@vm6 utils]# ./install_server.sh
[root@vm6 utils]# vim /etc/redis/6379.conf
Slaveof 172.25.77.40 6379
[root@vm6 utils]# systemctl restart redis_6379.service
测试:
Master:
[root@vm4 utils]# redis-cli
127.0.0.1:6379> set name westos
OK
127.0.0.1:6379> get name
"westos"
127.0.0.1:6379> set user3 123123
OK
127.0.0.1:6379> get user3
"123123"
Slave:
[root@vm5 utils]# redis-cli
127.0.0.1:6379> get name
"westos"
127.0.0.1:6379> get user3
"123123"
Slave:
[root@vm6 utils]# redis-cli
127.0.0.1:6379> get name
"westos"
127.0.0.1:6379> get user3
"123123"
sentinel是redis高可用的解决方案,sentinel系统(N个sentinel实例,N >= 1)可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。
1.#对master上的sentinel.ocnf文件参数进行修改,然后将master上的修改文件复制到slave的/etc/redis/
[root@vm4 redis-4.0.8]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests
BUGS deps MANIFESTO runtest sentinel.conf utils
CONTRIBUTING INSTALL README.md runtest-cluster src
[root@vm4 redis-4.0.8]# cp sentinel.conf /etc/redis/
[root@vm4 redis-4.0.8]# cd /etc/redis/
[root@vm4 redis]# vim sentinel.conf
protected-mode no
sentinel monitor mymaster 172.25.62.1 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
##修改以上参数
[root@vm4 redis]# scp sentinel.conf [email protected]:/etc/redis/ ##将修改之后的文件复制到slave上
[root@vm4 redis]# scp sentinel.conf [email protected]:/etc/redis/ ##将修改之后的文件复制到slave上
2.用redis-server /path/to/sentinel.conf --sentinel命令来启动sentinel(哨兵)监控,依次在vm4、vm5、vm6运行。
[root@vm4 redis]# redis-server /etc/redis/sentinel.conf --sentinel
2123:X 19 Jan 21:52:14.122 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2123:X 19 Jan 21:52:14.122 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=2123, just started
2123:X 19 Jan 21:52:14.122 # Configuration loaded
2123:X 19 Jan 21:52:14.123 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.8 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 2123
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
2123:X 19 Jan 21:52:14.124 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2123:X 19 Jan 21:52:14.183 # Sentinel ID is d8b29c7d559a64cb38bf19e989b776a66521ccb2
2123:X 19 Jan 21:52:14.183 # +monitor master mymaster 172.25.77.40 6379 quorum 2
2123:X 19 Jan 21:52:14.185 * +slave slave 172.25.77.50:6379 172.25.77.50 6379 @ mymaster 172.25.77.40 6379
2123:X 19 Jan 21:52:14.294 * +slave slave 172.25.77.60:6379 172.25.77.60 6379 @ mymaster 172.25.77.40 6379
2123:X 19 Jan 21:52:20.796 * +sentinel sentinel 89d58d6ff2a64c8bf7c76c058a9bda5c389e3364 172.25.77.50 26379 @ mymaster 172.25.77.40 6379
2123:X 19 Jan 21:52:23.890 * +sentinel sentinel 1f7c6a2c7427404e8fafde46ae133344479bfa89 172.25.77.60 26379 @ mymaster 172.25.77.40 6379
2123:X 19 Jan 21:52:24.240 # +sdown slave 172.25.77.50:6379 172.25.77.50 6379 @ mymaster 172.25.77.40 6379
2123:X 19 Jan 21:52:24.311 # +sdown slave 172.25.77.60:6379 172.25.77.60 6379 @ mymaster 172.25.77.40 6379
3.测试:
重新打开一个终端,连接上master,
[root@vm4 ~]# redis-cli
127.0.0.1:6379> info
[kiosk@foundation77 Desktop]$ ssh [email protected]
[root@vm4 ~]# redis-cli
127.0.0.1:6379> info
# Replication
role:master
connected_slaves:2
slave0:ip=172.25.77.50,port=6379,state=online,offset=27806,lag=0
slave1:ip=172.25.77.60,port=6379,state=online,offset=27806,lag=0
master_replid:96892f0a8f8942fe88a79d58aba155f493b4ffc6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28084
127.0.0.1:6379> SHUTDOWN
not connected>
4.打开vm4,将vm4做成slave加入到主从复制服务中去。
[root@vm4 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@vm4 ~]# vim /etc/redis/6379.conf
slaveof 172.25.77.60 6379
[root@vm4 ~]# redis-cli
127.0.0.1:6379> INFO
# Replication
role:slave
master_host:172.25.77.60
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:119657
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:91e585975362bdf96f125c38fabb547d8869f674
master_replid2:0000000000000000000000000000000000000000
等10秒左右的时间,看见以master转换到了172.25.77.60上。(master宕机,根据哨兵机制投票选举,在slave中随机选取为172.25.77.60)
[root@vm6 ~]# redis-cli
127.0.0.1:6379> INFO
# Replication
role:master
connected_slaves:2
slave0:ip=172.25.77.50,port=6379,state=online,offset=129737,lag=1
slave1:ip=172.25.77.40,port=6379,state=online,offset=129878,lag=0
master_replid:91e585975362bdf96f125c38fabb547d8869f674
master_replid2:80f7f62ac2852b630e8390718ba5e2f04cf45204
master_repl_offset:129878
second_repl_offset:9555