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主从复制过程主要有下面几步:
(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台从数据库
不仅主服务器可以有从服务器, 从服务器也可以有自己的从服务器
图中的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、主从验证
主可写,从可查
从不可写
slave上查看状态
四、redis-sentinel
在一个一主多从的redis系统中,slave在整个系统中起到了数据冗余备份和读写分离的作用,当master遇到故障,我们需要手动才能将slave切换为master,且需要将写的操作移到新的master上,这段时间的写数据都会丢失,为此,redis在2.8版本后提供了哨兵机制,顾名思义,哨兵的作用就是监控主从数据库以及哨兵自己,在master故障时自动切换。
Sentinel示意图
这是一个单哨兵监控的示意图,哨兵可以有多个,且哨兵之间互相监控
哨兵配置实例:
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初探之主从与哨兵部署
文章位置:http://azwzsj.com/article/piocjc.html