redis学习(3)--多实例、主从搭建

1.redis多实例搭建

实验环境:CentOS 7 启动3个redis实例

1.1 创建目录,拷贝配置文件

[root@redis ~]# mkdir -p redis/638{0..2}/{conf,log,db}
[root@redis ~]# cp -a /usr/local/redis/etc/redis.conf redis/6380/conf/
[root@redis ~]# cp -a /usr/local/redis/etc/redis.conf redis/6381/conf/
[root@redis ~]# cp -a /usr/local/redis/etc/redis.conf redis/6382/conf/

1.2 修改配置文件

[root@redis ~]# vim redis/6380/conf/redis.conf
...
61   bind 192.168.179.110
84   port 6380
128 daemonize yes
150 pidfile /root/redis/6380/db/redis_6380.pid
163 logfile /root/redis/6380/log/redis_6380.log
...
注:数字为行数,ip为实验主机ip,其余两个实例修改对应配置即可。

1.3 启动实例

[root@redis ~]#  redis-server redis/6380/conf/redis.conf 
[root@redis ~]#  redis-server redis/6381/conf/redis.conf 
[root@redis ~]#  redis-server redis/6382/conf/redis.conf
[root@redis ~]#  netstat -lnpt
tcp   0  0   192.168.179.110:6380    0.0.0.0:*     LISTEN      8380/redis-server 1 
tcp   0  0   192.168.179.110:6381    0.0.0.0:*     LISTEN      8386/redis-server 1 
tcp   0  0   192.168.179.110:6382    0.0.0.0:*     LISTEN      8390/redis-server 1 

2.主从复制

2.1 主从复制原理

       Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
  1)从服务器连接主服务器,发送SYNC命令;
  2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照(全量复制);
  5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令(增量复制);
  
注:但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
在这里插入图片描述

2.2 配置主从同步

主:192.168.179.110:6380
从:192.168.179.110:6381
       192.168.179.110:6382

192.168.179.110:6381
2.2.1 登录redis

[root@redis ~]# redis-cli -h 192.168.179.110 -p 6381

2.2.2 查看当前状态

192.168.179.110:6381> info replication
# Replication
role:master
connected_slaves:0

2.2.3 设置为slave

192.168.179.110:6381> SLAVEOF 192.168.179.110 6380
192.168.179.110:6381> info replication
# Replication
role:slave
master_host:192.168.179.110
master_port:6380
master_link_status:up

注:若是master节点设置了密码认证,在slave端最好也设置密码认证。
且在成为slave节点后要进行认证(设置为slave也可直接在配置文件中修改 salveof 字段为 192.168.179.110 6380 即可)。
192.168.179.110:6381> CONFIG SET masterauth passwd

注:192.168.179.110:6382 同上设置

2.2.4 查看master状态

192.168.179.110:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.179.110,port=6381,state=online,offset=547,lag=1
slave1:ip=192.168.179.110,port=6382,state=online,offset=547,lag=1

注:以上实现一主二从,master写入数据,slave会立刻同步。当配置Redis复制功能时,强烈建议打开主服务器的持久化功能。 否则的话,由于延迟等问题,部署的服务应该要避免自动拉起。

案例:

  1. 假设节点A为主服务器,并且关闭了持久化。 并且节点B和节点C从节点A复制数据
  2. 节点A崩溃,然后由自动拉起服务重启了节点A. 由于节点A的持久化被关闭了,所以重启之后没有任何数据
  3. 节点B和节点C将从节点A复制数据,但是A的数据是空的, 于是就把自身保存的数据副本删除。
           在关闭主服务器上的持久化,并同时开启自动拉起进程的情况下,即便使用Sentinel来实现Redis的高可用性,也是非常危险的。 因为主服务器可能拉起得非常快,以至于Sentinel在配置的心跳时间间隔内没有检测到主服务器已被重启,然后还是会执行上面的数据丢失的流程。
    无论何时,数据安全都是极其重要的,所以应该禁止主服务器关闭持久化的同时自动拉起。

思考:

  1. 若是master突然断开,slave会自动成为master吗?还是等待master重新连接?
    答:当master突然断开后,slave会一直等待master重新连接,不会变为master。
  2. 若slave突然断开,重新连接后仍然还会是slave吗?
    答:当slave突然断开重新连接后,将会默认成为master,若要重新成为slave,需要手动设置。
  3. 是不是slave数量越多越好?
    答:由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。所以slave数量要看具体情况而定。

猜你喜欢

转载自blog.csdn.net/rightlzc/article/details/82932835