从Perl使用redis-sentinel

这篇文章的内容。

    • redisの準備

 

    • redis-sentinelの準備

 

    perlから利用する方法

記述此項目。

请查看Redis Sentinel文档,了解如何在应用中使用Sentinel。
有关Sentinel的详细信息,请参阅Redis Sentinel文档。

首先

只需一种选择,将以下句子以中文母语重新表达:
这次使用一台服务器。

    • redis 2セット(master / slave)

 

    sentinel 3セット

准备这个。

我们假设操作系统为CentOS 7系列。

在商业上,至少必须

    • master(redis + sentinel)

 

    • slave(redis + sentinel)

 

    sentinel(sentinel)

我们需要3台服务器。
每台服务器都将运行一个sentinel进程。

Redis的安装

安装软件包。

$ sudo yum install redis

将会生成/etc/redis.conf和/etc/redis-sentinel.conf文件。

由于这次是一个实验,我们将在主目录下创建一个工作目录。

$ cd 
$ mkdir redis-work
$ cd redis-work

我会创建两个用于master/slave的配置。
最初,将16379设置为master,将16380设置为slave。
(master/slave会通过sentinel动态更改)

$ vim 16379.conf
bind 127.0.0.1
port 16379
daemonize yes

pidfile /tmp/redis_16379.pid

slave-read-only yes
$ vim 16380.conf
bind 127.0.0.1
port 16380
daemonize yes

pidfile /tmp/redis_16380.pid

slaveof 127.0.0.1 16379
slave-read-only yes

使用这个配置文件来启动。

$ redis-server 16379.conf
$ redis-server 16380.conf

让我们确认主/从设备是否正常连接。

$ redis-cli -p 16379 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=16380,state=online,offset=1,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-cli -p 16380 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:16379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:15
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

你的表现很正常呢。

Redis Sentinel的安装步骤。

如果使用yum安装redis,还会同时安装redis-sentinel命令。
实际上,它只是指向redis-server的符号链接。

换句话说,移动的二进制文件是相同的。

可以的

redis根据启动时的argv[0]来改变其运行模式,因此在启动sentinel时,应该

    • redis-sentinelコマンドを使う

 

    redis-server –sentinel オプションを使う

必须在其中一个上启动。

以上可忽略不计。

开始设定。

在同一个工作目录下,我们将创建3个用于sentinel的配置文件。
(唯一不同的是端口和进程ID)。

$ cd ~/redis-work/
$ vim sentinel1.conf
bind 127.0.0.1
port 26379
daemonize yes

pidfile /tmp/redis_sentinel1.pid


# sentinel monitor <master-name>  <ip>       <redis-port>  <quorum>
sentinel monitor   servers1       127.0.0.1  16379         2

sentinel down-after-milliseconds servers1 2500
sentinel failover-timeout servers1 10000
$ vim sentinel2.conf
bind 127.0.0.1
port 26380
daemonize yes

pidfile /tmp/redis_sentinel2.pid


# sentinel monitor <master-name>  <ip>       <redis-port>  <quorum>
sentinel monitor   servers1       127.0.0.1  16379         2

sentinel down-after-milliseconds servers1 2500
sentinel failover-timeout servers1 10000
$ vim sentinel3.conf
bind 127.0.0.1
port 26381
daemonize yes

pidfile /tmp/redis_sentinel3.pid


# sentinel monitor <master-name>  <ip>       <redis-port>  <quorum>
sentinel monitor   servers1       127.0.0.1  16379         2

sentinel down-after-milliseconds servers1 2500
sentinel failover-timeout servers1 10000

好的,接下来将进行启动,
Sentinel会自动修改配置文件,
所以必须注意这一点。

$ redis-sentinel sentinel1.conf
$ redis-sentinel sentinel2.conf
$ redis-sentinel sentinel3.conf

稍等片刻,三个文件的配置都已被更改。

$ cat sentinel1.conf
bind 127.0.0.1
port 26379
daemonize yes

pidfile "/tmp/redis_sentinel1.pid"

# sentinel monitor <master-name>  <ip>       <redis-port>  <quorum>
sentinel myid 15c12113c628851836e39a1de9bf579879fd5005

sentinel deny-scripts-reconfig yes
sentinel monitor servers1 127.0.0.1 16379 2
# Generated by CONFIG REWRITE
dir "/home/vagrant/redis-work"
maxclients 4064
sentinel down-after-milliseconds servers1 2500
sentinel failover-timeout servers1 10000
sentinel config-epoch servers1 19
sentinel leader-epoch servers1 19
sentinel known-slave servers1 127.0.0.1 16380
sentinel known-sentinel servers1 127.0.0.1 26381 d00ffb8bb57f4c78f825dba247f0d18d155d2de2
sentinel known-sentinel servers1 127.0.0.1 26380 2b79180a7f9ba77012461d0e522a27d838927ea5
sentinel current-epoch 19

通常的配置文件只需说明主服务器的连接地址,但在原始配置文件中,我们可以看到还额外追加了其他sentinel和从服务器的信息。

这样,sentinel的准备工作就完成了。

使用 Redis Sentinel

本次使用的是Perl的Redis模块Redis::Fast。虽然Redis::Jet的处理速度更快,但因为没有实现sentinel功能,所以选择了Redis::Fast。

所以,使用哨兵时与常规的连接方式不同,
需要将哨兵服务器的连接地址进行记录。

use strict;
use warnings;
use 5.020;
use Redis::Fast;

my $redis   = Redis::Fast->new(
    sentinels   => [qw/
        127.0.0.1:26379
        127.0.0.1:26380
        127.0.0.1:26381
    /],
    service     => "servers1",
    sentinels_write_timeout => 1,
    sentinels_read_timeout  => 1,
    sentinels_cnx_timeout   => 0.1,
    reconnect => 10, every  => 300_000
);


my $i   = 0;
my $key = "hoge";
while (1) {
    eval {
        $redis->set($key, $i);
        say $redis->get($key);
    };

    if ($@) {
        warn "$@";
        next;
    }
    $i++;
    sleep(1);
}

在中国人的角度来看,最重要的是

    • new時にsentinelsでsentilelサーバ群の接続先を書くこと

redis-serverではない。

serviceに、sentinelで指定したを指定すること
reconnect(秒数), every(ミリ秒)を適切に設定すること

設定しないと再接続しない

是的。

进行实验。

运行程序。

$ perl test-sentinel.pl
0
1
2
...

打开一个新的终端,然后终止当前的主进程。

$ redis-cli  -p 26379 SENTINEL get-master-addr-by-name servers1
1) "127.0.0.1"
2) "16379"

$ pkill -f 127.0.0.1:16379 

然后,大约3秒的时间过去了。

$ redis-cli  -p 26379 SENTINEL get-master-addr-by-name servers1
1) "127.0.0.1"
2) "16380"

接下来,方系将晋升为主节点。
然后,我们将重新启动掉线的redis。

$ redis-server 16379.conf

$ redis-cli -p 16379 info replication                              
# Replicationn
role:master
connected_slaves:0
master_replid:621891c20bbffd2019a2980976ca212c792ca39f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

一开始是以master的身份启动,等待一段时间后再次进行检查,

$  redis-cli -p 16379 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:16380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:97189
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:4fc10a2b219a9dcaf13a14cbc41652032733706a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:97189
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:90363
repl_backlog_histlen:6827

像这样,成为了奴隶。

请确认此时程序的输出,应该是连续的数字。

请注意

在进行实验时,请确保有两台Redis服务器处于主/从状态,然后杀死主服务器。只有在杀死主服务器后再重新启动之前,不要再次杀死主服务器,否则故障转移将无法成功。

Finally

由于redis-sentinel可以告诉sentinel服务器它应该连接的主服务器,
因此不需要例如通过keepalived为VIP创建VIP,并在应用程序中连接到VIP的方式,
它还会自动将从服务器变为主服务器。

哨兵的支持者,开发模块的大人您真是太客气了。

广告
将在 10 秒后关闭
bannerAds