redis初探之主从与哨兵部署

一、单机版radis部署

1、安装gcc

yum install gcc

2、安装redis

tar -zxvf redis-3.2.9.tar.gz -C /usr/src/
cd /usr/src/redis-3.2.9/
make
cd src && make install

3、创建redis目录存放命令和配置文件

mkdir -p /usr/local/redis/{etc,bin}

4、移动文件

cd /usr/src/redis-3.2.9/
mv redis.conf /usr/local/redis/etc
cd src
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /usr/local/redis/bin

5、配置环境变量

echo 'PATH=${PATH}:/usr/local/redis/bin/' >> /etc/profile
source /etc/profile

6、启动服务

启动redis服务需要指定配置文件的,后台启动的话需要修改redis.conf文件,daemonize no ---- >daemonize yes。redis服务端默认链接端口是6379,最好也将IP绑定为本机IP。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网络空间、营销软件、网站建设、靖宇网站维护、网站推广。


redis-server /usr/local/redis/etc/redis.conf 

7、客户端连接

redis-cli -h 192.168.118.137 -p 6379

8、停止redis服务

192.168.118.137:6379> shutdown

或者:
[root@node1 bin]# ps -ef|grep redis
root      49245   2816  0 10:39 pts/1    00:00:00 redis-server 127.0.0.1:6379
root      49559   2816  0 10:59 pts/1    00:00:00 grep --color=auto redis
[root@node1 bin]# kill -9 49245

二、主从复制

1、复制简述

redis的复制可以实现当一台数据库中的数据更新后,自动将新数据复制到其他数据库上;复制过程本身是异步的,也就是说,在有客户端对master执行写命令时,master在执行完命令后立即将结果返回客户端,并异步的将命令同步给slave,而不会等slave接收到命令在返回给客户端结果;这是一种乐观复制的策略,即容忍在一定时间内主从的数据不一致,但两者最终会数据同步,redis正是采用了乐观复制(optimistic replication)。

2、主从

redis分为两类,一类是主数据库(master),另一类是从数据库(slave)。master可以对数据进行读和写的操作,同时在有新的数据写入时,根据配置文件的设置将数据复制给slave,slave是只读的,所以一般对于数据库的写操作在master上,占据大量IO的读操作在slave上。

3、主从复制的原理

下面我们用一个图来讲解redis主从复制的过程。
 
redis初探之主从与哨兵部署
 
Redis主从复制过程示意图
 
 
从上面的示意图可以看出,主服务器与从服务器建立连接之后,Redis主从复制过程主要有下面几步:
(1)从服务器都将向主服务器发送一个 SYNC 命令。
(2)主服务器接到 SYNC 命令后开启一个后台子进程并开始执行 BGSAVE,并在保存操作执行期间, 将所有新执行的写入命令都保存到一个缓冲区里面。
(3)当 BGSAVE 执行完毕后, 主服务器将执行保存操作所得的 .rdb 文件发送给从服务器, 从服务器接收这个 .rdb 文件, 并将文件中的数据载入到内存中。
(4)主服务器会以 Redis 命令协议的格式, 将写命令缓冲区中积累的所有内容都发送给从服务器。
从上面的主从复制过程中,有两个问题:一是当主从断开时BGSAVE操作是一次完整复制;二是每一次BGSAVE操作master都会将RDB文件保存在硬盘上,基于这两点,2.8以后的版本引入了无硬盘复制和增量复制

无硬盘复制
redis的复制是基于RDB方式的持久化实现的,即master接到SYNC后保存RDB快照文件,并将rdb文件复制给slave。这种方式在复制初始化时需要在硬盘上创建RDB文件,当硬盘性能变低时,就会导致复制性能降低,所以无硬盘复制就是master不再保存RDB文件在硬盘上,而是直接将RDB文件网络传输给slave。

增量复制:
当主从数据库断开连接时,slave发送SYNC时,master会进行一次完整复制操作,这时可能总从数据库的数据基本一致,即使这样,也要将完整的rdb文件传给slave;这种情况下,增量复制可以让每次主从中断时不对数据进行全量复制,减少了资源消耗,提高了效率;设置为增量复制时,slave发送给master的是PSYNC命令。

4、主从复制的结构

最基础的redis主从是有一台主数据库,N台从数据库
redis初探之主从与哨兵部署

不仅主服务器可以有从服务器, 从服务器也可以有自己的从服务器
redis初探之主从与哨兵部署
图中的master会将数据同步至slave-master1和slave1,slave-master1会将数据同步至slave2和slave3,向slave-master1写入数据只会同步到slave2和slave3中,不会同步到master和slave1中。

三、主从部署

1、从数据库部署

重复第一步,并复制redis.conf为redis-repl.conf
redis配置一个从服务器非常简单, 只要在从服务器的配置文件redis-repl.conf中增加主服务器的IP地址和端口号就可以,如果主服务器设置了客户端密码,还需要在从服务器中配置主服务器的密码,如下

slaveof 192.168.118.137 6379
#masterauth 123456

2、启动从服务器

redis-server /usr/local/redis/etc/redis-repl.conf

3、主从验证

redis初探之主从与哨兵部署
主可写,从可查
redis初探之主从与哨兵部署
从不可写
redis初探之主从与哨兵部署
slave上查看状态

redis初探之主从与哨兵部署

四、redis-sentinel

在一个一主多从的redis系统中,slave在整个系统中起到了数据冗余备份和读写分离的作用,当master遇到故障,我们需要手动才能将slave切换为master,且需要将写的操作移到新的master上,这段时间的写数据都会丢失,为此,redis在2.8版本后提供了哨兵机制,顾名思义,哨兵的作用就是监控主从数据库以及哨兵自己,在master故障时自动切换。

Sentinel示意图
redis初探之主从与哨兵部署
这是一个单哨兵监控的示意图,哨兵可以有多个,且哨兵之间互相监控
redis初探之主从与哨兵部署

哨兵配置实例:

1、配置单机多端口主从

Master :192.168.118.141:6379
Slave1:192.168.118.141:6380
Slave2:192.168.118.141:6381

2、启动主从

[root@node1 etc]# redis-server /usr/local/redis/etc/redis.conf 
[root@node1 etc]# redis-server /usr/local/redis/etc/redis-6380.conf 
[root@node1 etc]# redis-server /usr/local/redis/etc/redis-6381.conf 

3、查看主从状态

[root@node1 ~]# redis-cli -h 192.168.118.141 -p 6379
192.168.118.141:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.118.141,port=6380,state=online,offset=85,lag=1
slave1:ip=192.168.118.141,port=6381,state=online,offset=85,lag=1
master_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84

4、准备哨兵配置文件

[root@node1 etc]# cat sentinel.conf 
sentinel monitor mymaster 192.168.118.141 6379 1

5、哨兵配置文件

mymaster:监控的主数据库名,自定义
192.168.118.141:监控的主数据库IP
6379:监控的主数据库端口
1:表示执行故障恢复操作前至少需要几个哨兵节点同意

6、开启哨兵

[root@node1 etc]# redis-sentinel sentinel.conf 
60725:X 14 Mar 23:13:53.909 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 60725
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

60725:X 14 Mar 23:13:53.915 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to 
the lower value of 128.60725:X 14 Mar 23:13:53.925 # Sentinel ID is fe3fb6bef25af9641e46f40f76a0e00fd491acbb
60725:X 14 Mar 23:13:53.925 # +monitor master mymaster 192.168.118.141 6379 quorum 1
60725:X 14 Mar 23:13:53.927 * +slave slave 192.168.118.141:6380 192.168.118.141 6380 @ mymaster 192.168.118.141 6379
60725:X 14 Mar 23:13:53.928 * +slave slave 192.168.118.141:6381 192.168.118.141 6381 @ mymaster 192.168.118.141 6379

7、关闭主数据库:哨兵自动切换master

[root@node1 ~]# redis-cli -h 192.168.118.141 -p 6379
192.168.118.141:6379> shutdown
not connected> 
[root@node1 ~]# redis-cli -h 192.168.118.141 -p 6380
192.168.118.141:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.118.141,port=6381,state=online,offset=0,lag=1
master_repl_offset:1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:0

参考文章:
redis官方:https://redis.io/documentation
菜鸟教程:http://www.runoob.com/redis/redis-tutorial.html


本文题目:redis初探之主从与哨兵部署
本文URL:http://azwzsj.com/article/piocjc.html