之前的文章《Redis介绍及CentOS 7安装redis 4.0详细步骤》介绍了Redis4.0单实例的安装,在实际的生产中,单实例存在的非常少,所以下面我们就在上述的基础上,部署Redis多实例及主从复制环境;
一、redis主从复制原理
和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构:
1、全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
1)从服务器连接主服务器,发送SYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。
2、增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
备注:redis2.8之前不支持增量,到2.8之后就支持增量了!
3、Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
4、注意事项
如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。
二、Redis单主机多实例部署
前提是之前已经安装了一个单实例的redis,详细可参考:《Redis介绍及CentOS 7安装redis 4.0详细步骤》
1、复制两份redis配置文件
[root@VM_2_13_centos ~]# cp /etc/redis/redis.conf /etc/redis/redis6311.conf [root@VM_2_13_centos ~]# cp /etc/redis/redis.conf /etc/redis/redis6322.conf [root@VM_2_13_centos ~]# ll /etc/redis/ total 192 -rw-r--r-- 1 root root 58976 May 29 20:37 redis6311.conf -rw-r--r-- 1 root root 58976 May 29 20:37 redis6322.conf -rw-r--r-- 1 root root 58976 May 29 20:33 redis.conf
2、修改配置文件redis6311.conf和redis6322.conf
[root@VM_2_13_centos ~]# vim /etc/redis/redis6311.conf # 监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。 port 6311 # 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。 daemonize yes # 当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/run/redis.pid 文件里面 # 但是你可以在这里自己制定它的文件位置。 pidfile /var/run/redis/redis_6311.pid # 指定日志文件的位置,不同的实例设置不同的日志文件,便于问题定位 logfile /var/log/redis/redis_6311.log # 设置dump的文件名称,不同的实例设置不同的db文件,便于问题定位 dbfilename dump_6311.rdb # 工作目录 # 例如上面的 dbfilename 只指定了文件名,但是它会写入到这个目录下。 # 这个配置项一定是个目录,而不能是文件名。 # 这个配置项默认值为“./”,最好改相对路径为绝对路径 # 如果为相对路径,redis在哪里启动,dump.rdb文件就会产生在启动的目录,这也就是有些人重启redis后key值消失的原因 dir /var/lib/redis/6311 #配置密码 requirepass qXXXXXXXX
3、启动端口为6311的redis
[root@VM_2_13_centos ~]# redis-server /etc/redis/redis6311.conf [root@VM_2_13_centos ~]# [root@VM_2_13_centos ~]# ps -ef | grep redis root 6938 1 0 21:14 ? 00:00:00 redis-server 127.0.0.1:6379 root 7001 1 0 21:15 ? 00:00:00 redis-server 127.0.0.1:6311 root 7009 1905 0 21:15 pts/1 00:00:00 grep --color=auto redis
4、客户端登录
[root@VM_2_13_centos ~]# redis-cli -p 6311 127.0.0.1:6311> 127.0.0.1:6311> keys * (error) NOAUTH Authentication required. 127.0.0.1:6311> 127.0.0.1:6311> auth qcloud@2018 OK 127.0.0.1:6311> keys * (empty list or set)
按照上面的方式配置6322端口的redis,并启动
[root@VM_2_13_centos ~]# redis-server /etc/redis/redis6322.conf [root@VM_2_13_centos ~]# ps -ef | grep redis root 6938 1 0 21:14 ? 00:00:00 redis-server 127.0.0.1:6379 root 7001 1 0 21:15 ? 00:00:00 redis-server 127.0.0.1:6311 root 7264 1 0 21:20 ? 00:00:00 redis-server 127.0.0.1:6322 root 7279 1905 0 21:20 pts/1 00:00:00 grep --color=auto redis
三、redis主从环境搭建
1、修改6311和6322的配置文件,主redis为6379端口的redis
[root@VM_2_13_centos ~]# vim /etc/redis/redis6311.conf slaveof localhost 6379 # masterauth masterauth qXXXXXXXX
注意:如果主实例配置了密码,那么从实例必须配置masterauth,否则同步不成功
2、查看配置是否成功
主库:
127.0.0.1:6379> info Replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6311,state=online,offset=179,lag=0 slave1:ip=127.0.0.1,port=6322,state=online,offset=179,lag=0 master_replid:d2450e24238b6612630368c6408fd4a9b098da16 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:179 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:179
从库:
127.0.0.1:6311> info Replication # Replication role:slave master_host:localhost master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:277 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:d2450e24238b6612630368c6408fd4a9b098da16 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:277 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:277 127.0.0.1:6322> info Replication # Replication role:slave master_host:localhost master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:319 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:d2450e24238b6612630368c6408fd4a9b098da16 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:319 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:319
3、主从同步测试:
主库:
127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> 127.0.0.1:6379> set age 22 OK
从库:
[root@VM_2_13_centos ~]# redis-cli -p 6311 127.0.0.1:6311> auth qXXXXXXX OK 127.0.0.1:6311> keys * 1) "name" 127.0.0.1:6311> get age "22" [root@VM_2_13_centos ~]# redis-cli -p 6322 127.0.0.1:6322> auth qXXXXXXXX OK 127.0.0.1:6322> keys * 1) "name" 127.0.0.1:6322> get age "22"
至此,redis多实例以及主从环境搭建完成了;