详解关于Linux下的 Redis集群搭建

由于项目需要,搭建了一个 Redis 服务器集群,实现了主从配置和容灾部署,使得主机出现故障时,可自动进行容灾切换,下面就详细讲解一下如何利用 Redis 来实现。

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

Redis不仅仅支持简单的key-value类型的数据,同时还提供 list,set,zset,hash等数据结构的存储。

一个字,快!传统的关系型数据库如 Mysql 等已经不能适用所有的场景了,比如在高并发,访问流量高峰等情况时,数据库很容易崩了。Redis 运行在内存,能起到一个缓冲作用,由于内存的读写速度远快于硬盘,因此 Redis 在性能上比其他基于硬盘存储的数据库有明显的优势。同时除了快之外,还可应用于集群的自动容灾切换以及数据的读写分离,减轻高并发的压力。

编译完成之后,可以看到解压文件 redis-5.0.7 中会有对应的 src、conf 等文件,如下

由于 src下文件非常多,我们可以将几个常用的命令和 conf 配置文件复制出来进行统一管理,如下:(1)新建 bin 和 etc 文件夹

切换到 bin 目录,使用./redis-server即可启动 redis 服务,但是这种方式没有指明配置文件,redis 将采用默认配置,所以我们需要让 redis 按照我们的配置文件来启动,如下,启动时指定刚才我们复制到 etc 文件夹下的f。

启动后查看redis的进程,如下,可以看到6379端口就是我们运行的 redis 服务(配置文件中默认端口为6379)。

这里我们采用的集群整体架构就是主从结构+哨兵(sentinel),实现容灾的自动切换,如下图所示:

一个主节点(master)可拥有多个从节点(slave),从节点实现对主节点的复制,保证数据同步。而哨兵(sentinel)则对各节点进行监控,主要包括主节点存活检测、主从运行情况检测等,一旦主节点宕机,哨兵可自动进行故障转移 (failover)、主从切换。接下来就开始搭建这样一个集群,首先是主从结构,然后是哨兵模式,接着往下看。

在第一步 Redis 安装部署中我们已经启动了 Redis 服务,但是配置文件并没有做修改,因为主从配置主要就是通过修改配置文件来实现,所以 Redis 配置文件的修改统一在这里进行讲解。

#redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。

#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭设置为no。

#log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了

#指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步

#设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH命令提供密码,默认关闭

#设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置maxclients0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回maxnumberofclientsreached错误信息

#指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

#指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。

#指定更新日志的条件,有三个可选参数-no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全),everysec:表示每秒同步一次(折衷,默认值);

主机(192.168.231.130)需要改动的配置如下所示,修改完毕后先按 esc ,然后:wq命令保存退出。

Redis 默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。

从机的配置和主机相似,相同的地方我就不再详解,不同的地方是需要使用replicaof指定主机(master)的IP地址和端口,需要注意的是老版本使用的是 slaveof,目前我使用的5.0.7版本要使用 replicaof ,如下。

指定当本机为 slave 服务时,设置 master 服务的IP地址及端口,在 redis 启动的时候会自动跟 master 进行数据同步,所以两台从机都这样配置即可。

注:由于我们搭建的集群需要自动容灾切换,主数据库可能会变成从数据库,所以三台机器上都需要同时设置 requirepass 和 masterauth 配置项。

上面我们主从节点的配置文件配置好后,重启 redis 服务,进入 bin 目录即可查看配置文件中指定的redis.log日志文件。

下面我们需要设置一下防火墙,否则主从机之间无法同步数据,命令如下,这里根据自己设置的端口进行更改。

接下来我们在主机(master)添加几条数据,看从机(slave)是否可以获取到,如果能获取,说明数据已经同步到了从机,主机添加数据,如下:

Redis Sentinel是Redis 的高可用性解决方案,由一个或多个Sentinel(哨兵)实例组成。它可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,它的主要功能如下:

监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。

通知(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel可以通过API向管理员或者其他应用程序发送通知。

Sentinel 使用的算法核心是 Raft 算法,主要用途就是用于分布式系统,系统容错,以及Leader选举,每个Sentinel都需要定期的执行以下任务:

每个 Sentinel 会自动发现其他 Sentinel 和从服务器,它以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。

如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有Sentinel要以每秒一次的频率确认主服务器的确进入了主观下线状态。

如果一个主服务器被标记为主观下线, 并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。

在一般情况下, 每个Sentinel会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。

当没有足够数量的Sentinel同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向Sentinel的 PING 命令返回有效回复时, 主服务器的主管下线状态就会被移除。

哨兵的配置主要就是修改f配置文件中的参数,在Redis安装目录即可看到此配置文件,各参数详解如下:

##quorum:当这些quorum个数sentinel哨兵认为master主节点失联那么这时客观上认为主节点失联了

#当在Redis实例中开启了requirepass,所有连接Redis实例的客户端都要提供密码。

#指定主节点应答哨兵sentinel的最大时间间隔,超过这个时间,哨兵主观上认为主节点下线秒

#指定了在发生failover主备切换时,最多可以有多少个slave同时对新的master进行同步。这个数字越小,完成failover所需的时间就越长;反之,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为1,来保证每次只有一个slave,处于不能处理命令请求的状态。

##2.当一个slave从一个错误的master那里同步数据时开始,直到slave被纠正为从正确的master那里同步数据时结束。

##4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向maste。

未经允许不得转载:主机宝贝 » 详解关于Linux下的 Redis集群搭建

评论 抢沙发

评论前必须登录!