从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的方式,
它还会自动将从服务器变为主服务器。
哨兵的支持者,开发模块的大人您真是太客气了。