在redis服务器正常运行的情况下,它的持久化机制能够保证数据在服务器重启后不会丢失。但是如果发生故障,会导致数据丢失,另外,Redis服务器内存是固定大小的,单台redis服务器并不一定能够支撑你的服务。Redis的主从复制能够将单台服务器上的数据同步到另外的服务器上,能够有效的解决上述问题。
redis主从复制结构
在redis主从复制中,有两类服务器,一类是主服务器(master),另一类是从服务器(slave)。一个redis服务器既可以当主服务器,也可以当从服务器。一个主服务器能够有多个从服务器,但是一个从服务器只有一个主服务器。构成树状图如下图所示,B、C是A的从服务器,同时B也是D、E的主服务器,C是F、G的主服务器。
主从复制的特点
1、不会阻塞主服务器,也就是说主服务器与从服务器进行数据同步时,主服务器能够处理客户端的请求,从数据库则会阻塞,处理数据同步,不能处理客户端发来的请求;
2、提高系统的可伸缩性,比如:我们可以分配多个从服务器来专门处理客户端的读请求,从而实现读写分离;
3、在从服务器上持久化,持久化是比较耗时间的,我们可以在从服务器中持久化的,主服务则禁止持久化,这样的好处是,当从服务器出现故障时,主服务器上的数据能够自动同步到从服务器,数据不会丢失。
主从复制的原理:
1、从服务器向主服务器发送psync命令;
2、主服务器接收到从服务器发送过来的psync命令后,执行bgsave命令,生成RDB文件,并且会将执行bgsave命令后接收到的写命令存到一个缓存区中;
3、主服务器生成并保存RDB文件后,会将RDB文件发送给从服务器,从服务器会更新数据库状态;
4、主服务器会将缓存区中的写命令发送给从服务器,从服务器会再次更新数据库状态。
我这里通过在两个虚拟机上装了redis服务器(也可以在两台linux服务器上安装redis或者一台服务器上使用不同端口安装两个redis)来简单操作下redis的主从复制,两台虚拟机ip分别为192.168.136.128和192.168.136.129,准备把128当主服务器,129当从服务器,首先测试下他们是否能ping通
[root@localhost redis-5.0.4]# ping 192.168.136.128
PING 192.168.136.128 (192.168.136.128) 56(84) bytes of data.
64 bytes from 192.168.136.128: icmp_seq=1 ttl=64 time=1.15 ms
64 bytes from 192.168.136.128: icmp_seq=2 ttl=64 time=0.270 ms
64 bytes from 192.168.136.128: icmp_seq=3 ttl=64 time=0.235 ms
64 bytes from 192.168.136.128: icmp_seq=4 ttl=64 time=0.356 ms
^C
--- 192.168.136.128 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3131ms
rtt min/avg/max/mdev = 0.235/0.503/1.151/0.376 ms
上面这个命令有数据返回,说明是可以ping通的。然后使用telnet 192.168.136.128 6379命令
[root@localhost src]# telnet 192.168.136.128 6379
Trying 192.168.136.128...
telnet: connect to address 192.168.136.128: No route to host
解决方案:
1、修改redis主服务器配置,bind 127.0.0.1改成bind 0.0.0.0,就是修改成客户端都可以连接;
2、关闭保护模式,设置protected-mode no;
3、关闭防火墙,service iptables stop。
重启主服务器,在从服务器上再次telnet。Ctrl+]进入telnet命令行,quit退出。
[root@localhost src]# telnet 192.168.136.128 6379
Trying 192.168.136.128...
Connected to 192.168.136.128.
Escape character is '^]'.
telnet> quit
Connection closed.
[root@localhost src]#
找到129的redis配置文件,使用vim redis.conf打开redis的配置文件,再使用?replicaof或者/replicaof找到replicaof配置项(之前版本的可能是slaveof),然后配置主服务器的ip端口
如果主服务器需要密码验证,则必须配置masterauth <master-password>。
主服务器:
[root@localhost src]# ./redis-cli
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth password
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "password"
从服务器:
启动从服务器
src目录下使用命令:./redis-server ../redis.conf &
可以查看redis服务器信息来检查是否配置成功,info [section]
主服务器
从服务器
验证是否可以进行主从复制
1、查看主服务器的key
127.0.0.1:6379> keys *
(empty list or set)
2、查看从服务器中的key
127.0.0.1:6379> keys *
(empty list or set)
3、主服务器新增key,再次查看key
127.0.0.1:6379> set test 11111
OK
127.0.0.1:6379> rpush list a b c
(integer) 3
127.0.0.1:6379> keys *
1) "list"
2) "test"
127.0.0.1:6379> get test
"11111"
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4、查看从服务器中的key,检查是否同步了主服务器中新增的key
127.0.0.1:6379> keys *
1) "list"
2) "test"
127.0.0.1:6379> get test
"11111"
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
以上就是redis的主从复制。
如果有写的不对的地方,请大家多多批评指正,非常感谢!