Redis 主从服务集群搭建

搭建Redis集群的时候,我们一般会考虑主从复制模式(master-slave),实现主从备份。当主节点(master)坏掉,自动启动从节点(slave)为主节点继续服务。一个主节点可以有N个从节点,根据业务不同,从节点的数量设置也不同。

基础知识

Redis 类型及端口

  1. Redis的数据类型:字符串(string)、列表(list)、集合(set)、有序集合(sorted sets)、哈希表(hash)
  2. Redis服务默认端口是6379,默认前台运行(daemonize为false)

Redis与Memcache对比

  1. Redis可以用来做存储(storage),memcache是用来做缓存(cache),这是得益于Redis的持久化特性
  2. Redis存储存储的数据有结构(类型),而对于memcache,存储的数据只有字符串(string)一种类型

Redis的持久化方法

Redis将数据存储在内存中,或被配置为使用虚拟内存。有两种方法可以实现持久化:

  1. 使用截图的方式,将内存中的数据不断写入磁盘(性能高,但是可能会引起一定概率的数据丢失)
  2. 使用类似mysql的方式,记录每次更新的日志

适用场景

读写分离场景:master以写为主,可读可写;slave只可读,不可写。

容灾恢复场景:Master上写入的数据会自动同步到slave上,这样如果master出现故障造成数据丢失,可以通过slave进行恢复。注:由于数据不是实时同步的,所以当从slave恢复的数据可能会有丢失。

主从特点

  1. 一个master可以有多个slave
  2. slave除了可以连接到master外,也可以连接到其他slave
  3. master初次同步数据到slave时,不会阻塞client与master的通信,master会继续处理来自client的请求;相反,slave初次从master同步数据时,会阻塞而不处理来自client的请求。
  4. master-slave模式可以提高系统的可伸缩性,可以用多个slave专门处理用户的读请求,Slave也可以用作简单的数据冗余
  5. 可以再master上禁用数据持久化,在slave做数据持久化即可,只需要在配置文件里注释掉save配置即可
  6. 可以用作读写分离和容灾恢复

常用方式

  1. 一主二仆M(S1,S2),即一个master两个slave
  2. 薪火相传M->S1->S2,S1既是从M的从节点,又是S2的主节点。
  3. 反客为主(主节点down掉,手动升级从节点为主节点)及哨兵模式(主节点down掉,自动升级从节点为主节点)

搭建服务

我们演示一下“一主二仆”在Centos服务上的单机搭建方式。对于其他方式,可以看完这个流程后自然明白。对于多久搭建,只需要放到不同机器上,改下配置文件的IP地址即可。

1. 下载安装包

可以到redis官网下载:http://download.redis.io/releases/

我们这里下载redis-stable.tar.gz包,当然如果你要部署服务最好用这个包,稳定性高一点。

2. 解压安装包并进行install

tar -xvf redis-stable.tar.gz

cd redis-stable

make

cd src

make install PREFIX=/usr/local/redis

cd ..

cp redis.conf /usr/local/redis/redis.conf

3. 由于我们要部署1主2从三个节点,我们把redis.conf复制为3份分别为:

cd /usr/local/redis/

redis-master-6379.conf

redis-slave-6380.conf

redis-slave-6381.conf

结果如下:

4. 在进行master-slave的配置之前,我们先来了解一下redis.conf的内容

  • daemonize:配置是否把redis转为后台运行,默认为no,即启动redis时,命令行处于阻塞模式;如果改成yes,则启动redis后,命令不会被阻塞,可以继续做其他操作
  • pdifile:pid文件的存放路径,默认为/var/run/redis.pid,可以配置到其他地址
  • bind:指定redis接收的IP请求,如果不设置则接收并处理所有的请求,在线上环境最好能设置为特定的IP
  • port:监听端口,默认为6379
  • timeout:设置客户端连接的超时时间,单位为秒
  • loglevel:分为四个等级:debug、revbose、notice及warning,生产环境一般开启notice
  • logfile:log文件的存储地址,默认为标准输出,即打印在命令行终端上
  • database:设置数据库的个数,默认使用的数据库为0
  • save:设置redis数据库镜像存储的频率
  • rdbfilename:镜像备份文件的文件名
  • dir:数据库镜像备份的文件放置的路径
  • replicaof:设置数据库为其他数据库的从数据库,之前版本的配置项为slaveof,大家配置的时候留意一下
  • masterauth:当连接主数据库时需要的密码验证
  • requirepass:设置客户端连接后进行任何其他操作时需要使用的密码
  • maxclients:限制同时连接的客户端数量
  • maxmemory:设置redis能够使用的最大内存,这也觉得了我们memory能够cache的数据量大小
  • appendonly:开启appendonly模式后,redis把每次接收到的写操作都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态
  • appendfsync:设置appendonly.aof文件进行同步的频率
  • vm_enabled:是否开启虚拟内存
  • vm_swap_file:设置虚拟内存的交换文件的路径
  • vm_page_size:设置虚拟内存页的大小,通常我们使用4k的倍数
  • vm_max_threads:设置vm IO同时使用的线程数量

5. 根据配置文件的描述,我们把三个配置文件的daemonize设置为yes,让redis在后台运行。

redis configure file修改
  daemonize pdifile bind port replicaof
redis-master-6379.conf yes /var/run/redis-6379.pid 127.0.0.1 6379 # replicaof <masterip> <masterport> (注释)
redis-slave-6380.conf yes /var/run/redis-6380.pid 127.0.0.1 6380 replicaof 127.0.0.1 6379
redis-slave-6381.conf yes /var/run/redis-6381.pid 127.0.0.1 6381 replicaof 127.0.0.1 6379

6. 我们尝试启动主从redis服务进行测试,注意:一定要先启动主节点再启动从节点。启动主节点:

cd /usr/local/redis/

./bin/redis-server redis-master-6379.conf

可以看到configure被load成功了。

7. 再开另外两个窗口,分别启动两个slave节点

8. 回到主窗口,然后通过client(redis-cli)登录到master节点,使用“info replication”命令可以查看master节点连接的slave情况

可以看到有两个slave从端口6380和6380来的连接。

9. 同样可以在另外两个窗口查看slave的状态

可以看到连接的本节点是slave,连接的master的status是“up”状态

10. 我们可以尝试在redis的master窗口发送测试“set test hello”

其中set是发送指令,test是测试指示,hello是测试用的信息,可以任意信息

11. 在slave窗口可以接受测试信息

12. 至此,redis相关的配置已经完成了,后面会继续添加关于sentinel自动切换slave为master的方法。

从安装包里复制sentinel.conf为sentinel-6380.conf 和sentinel-6381.conf分别为两个slave做配置。如果两个slave放到不同机器上,记得把这两个文件也分别放到对应的机器上。

sentinel configure file修改
  daemonize pdifile bind port monitor
sentinel-6380.conf yes /var/run/redis-sentinel-6380.pid 127.0.0.1 26380 sentinel monitor mymaster 127.0.0.1 6379 2
sentinel-6381.conf yes /var/run/redis-sentinel-6381.pid 127.0.0.1 26381 sentinel monitor mymaster 127.0.0.1 6379

13. 分别启动两个sentinel。注意:这里直接用redis-server启动的,也可以用redis-sentinel启动也是一样的,redis-sentinel实际上是redis-server的软连接

14. 查看sentinel的状态,可以redis-cli登录之后使用info查看所有相关信息,发现最后的Sentinel信息

15. 再次查看redis相关进程时,发现有两个sentinel已经处于活跃状态

16. 我们试图kill掉master,正常情况下,sentinel的Ping test会检测到master死掉,并通过之前获取的master的info信息找到对应slave,会从两个slave里面选择一个作为master,并修改配置文件。如果再次把原来的master加入,则会变成slave存在。从实验中,我们可以看到选择了端口为6381的slave作为了master。

当然可以对redis及sentinel加log(添加logfile字段指向对应的存放目录),可以方便的查看状态及相关的信息。

发布了83 篇原创文章 · 获赞 18 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/lwc5411117/article/details/86750589