RedisのReplication(主従レプリケーション)とsentinelメカニズム

36385 ワード

Replication


特徴:1つのMasterに複数のslaveホストがあり、チェーンレプリケーションをサポートする。Masterは非ブロック方式でslaveホストにデータを同期する。

構成パラメータ:


slaveノードの構成:slaveeofホストipホストport設定自機がslavサービスである場合、masterサービスのIPアドレスとポートを設定し、Redis起動時に自動的にmasterからデータ同期を行う.masterauthホストpassword masterサービスにパスワード保護が設定されている場合、slavサービス接続masterのパスワード実験:環境:centos 7.3 2つのノードを準備するmaster:192.168.23.148 slave:192.168.23.149 slaveノードを構成する:
[root@cento7 ~]# vim /etc/redis.conf 

# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Redis to listen only into
# the IPv4 lookback interface address (this means Redis will be able to
# accept connections only from clients running into the same computer it
# is running).
#
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1
bind 192.168.23.149 #         ip      ip
# slaveof   #     IP  
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
# masterauth  #     ip            iP  
#           
[root@cento7 ~]# redis-cli -h 192.168.23.149
192.168.23.149:6379> slaveof 192.168.23.148 6379
OK
192.168.23.149:6379> config set masterauth magedu
OK

ノードからinfo情報ログを表示するには、次の手順に従います.
192.168.23.149:6379> info replication #INFO  
# Replication
role:slave
master_host:192.168.23.148
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:841
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
[root@cento7 ~]# tail /var/log/redis/redis.log #    
1916:S 16 Sep 15:38:52.335 * Connecting to MASTER 192.168.23.148:6379
1916:S 16 Sep 15:38:52.335 * MASTER  SLAVE sync started
1916:S 16 Sep 15:38:52.336 * Non blocking connect for SYNC fired the event.
1916:S 16 Sep 15:38:52.336 * Master replied to PING, replication can continue...
1916:S 16 Sep 15:38:52.337 * Partial resynchronization not possible (no cached master)
1916:S 16 Sep 15:38:52.339 * Full resync from master: 9efb89fac553574f70e5151a4f419750e47768bc:631
1916:S 16 Sep 15:38:52.438 * MASTER  SLAVE sync: receiving 259 bytes from master
1916:S 16 Sep 15:38:52.438 * MASTER  SLAVE sync: Flushing old data
1916:S 16 Sep 15:38:52.439 * MASTER  SLAVE sync: Loading DB in memory
1916:S 16 Sep 15:38:52.439 * MASTER  SLAVE sync: Finished with success

プライマリノードのinfo情報ログ:
192.168.23.148:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.23.149,port=6379,state=online,offset=113,lag=0
master_repl_offset:127
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:126
192.168.23.148:6379> exit
[root@centos7 ~]# tail /var/log/redis/redis.log  #     
7195:M 16 Sep 23:50:25.961 * DB loaded from disk: 0.000 seconds
7195:M 16 Sep 23:50:25.961 * The server is now ready to accept connections on port 6379
7195:M 16 Sep 23:50:26.307 * Slave 192.168.23.149:6379 asks for synchronization
7195:M 16 Sep 23:50:26.307 * Partial resynchronization not accepted: Runid mismatch (Client asked for runid '9efb89fac553574f70e5151a4f419750e47768bc', my runid is '943571b65e4f7f2e287b69a4495193244ca473a1')
7195:M 16 Sep 23:50:26.307 * Starting BGSAVE for SYNC with target: disk
7195:M 16 Sep 23:50:26.308 * Background saving started by pid 7198
7198:C 16 Sep 23:50:26.309 * DB saved on disk
7198:C 16 Sep 23:50:26.310 * RDB: 2 MB of memory used by copy-on-write
7195:M 16 Sep 23:50:26.365 * Background saving terminated with success
7195:M 16 Sep 23:50:26.366 * Synchronization with slave 192.168.23.149:6379 succeeded

sentinelメカニズム


役割:複数のRedisサービスを管理するためにHA 1を実現する.マスターサーバの監視2.通知3.自動故障移転;プロトコル:デマプロトコル、投票プロトコルワークフロー1)サーバ自身が初期化され、redis-serverでsentinel機能専用のコードで実行される。2)sentinel状態を初期化し、所与のプロファイルに基づいて監視するmasterサーバリストを初期化する。3)masterへの接続を作成する;

構成項目:1.sentinel monitor#接続されたプライマリノードは、複数行あり、quorumは法定票数を表し、sentinelノードは奇数個でプライマリノードを示すだけでよいことを提案し、ノードからプライマリノードを通じて自動的に取得する例:sentinel monitor mymaster 127.0.0.1 6379 2.sentinel down-after-milliseconds#あるプライマリノードがオンラインでないタイムアウト時間を判断する例:sentinel down-after-milliseconds mymaster 30000(単位:ミリ秒)3.sentinel parallel-syncs#フェイルオーバを実行する場合(すなわち、新しいプライマリサーバに設定したばかりの場合)、プライマリサーバから接続要求を開始できるサーバの最大数を許可する例:sentinel parallel-syncs mymaster 1 4.sentinel failover-timeout#フェイルオーバのタイムアウト時間、すなわちプライマリサーバに障害が発生した場合、新しいサーバプライマリサーバからのタイムアウト時間を向上させる.例:sentinel failover-timeout mymaster 180000 5.sentinel auth-pass#接続プライマリノードの認証パスワードの例:sentinel auth-pass mymaster magedu

環境:


192.168.23.148はmasterノードであるとともにsentinelノード192.168.23.149と192.168.23.100はそれぞれスレーブノード1である.redisファイル/etc/redisを構成します.confは、ノードからの構成が同じであるため、ここにはファイル構成が1つしか表示されません.
[root@cent7 ~]# vim /etc/redis.conf 

#    network partition slaves automatically try to reconnect to masters
#    and resynchronize with them.
#
 slaveof 192.168.23.148 6379 #        ip     

# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
 masterauth magedu  #      


1.1スレーブノードのinfoスレーブノード192.168.23.149の情報をそれぞれ表示する
192.168.23.149:6379> info replication
# Replication
role:slave
master_host:192.168.23.148
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:1051
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

1.2ノード192.168.23.150からのinfo情報
192.168.23.150:6379> info replication
# Replication
role:slave
master_host:192.168.23.148
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:99
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

1.3プライマリノードのinfo情報:
[root@centos7 ~]# redis-cli -h 192.168.23.148
192.168.23.148:6379> auth magedu
OK
192.168.23.148:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.23.150,port=6379,state=online,offset=155,lag=1
slave1:ip=192.168.23.149,port=6379,state=online,offset=155,lag=1
master_repl_offset:155
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:154

2.マスターノードでsentinelメカニズムを構成して起動し、プロファイル/etc/redis-sentinelを編集する.conf
[root@centos7 ~]# vim /etc/redis-sentinel.conf 
sentinel monitor mymaster 192.168.23.148 6379 1 #       ip   
sentinel down-after-milliseconds mymaster 6000 #             
sentinel failover-timeout mymaster 60000 #         

2.1 sentinelサービスを開始し、ポートを表示する
[root@centos7 ~]# systemctl restart redis-sentinel.service
[root@centos7 ~]# ss -ntlp | grep "sentinel"
LISTEN     0      128          *:26379                    *:*                   users:(("redis-sentinel",pid=3480,fd=5))
LISTEN     0      128         :::26379                   :::*                   users:(("redis-sentinel",pid=3480,fd=4))

2.3 sentinel接続にはbindプライマリノードipが必要
[root@centos7 ~]# redis-cli -h 192.168.23.148 -p 26379
192.168.23.148:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=odown,address=192.168.23.148:6379,slaves=0,sentinels=1
192.168.23.148:26379> sentinel masters #       sentinel  
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.23.148"
    5) "port"
    6) "6379"
    7) "runid"
    8) ""
    9) "flags"
   10) "s_down,o_down,master,disconnected"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "183350"
   17) "last-ok-ping-reply"
   18) "183350"
   19) "last-ping-reply"
   20) "11658"
   21) "s-down-time"
   22) "177345"
   23) "o-down-time"
   24) "177345"
   25) "down-after-milliseconds"
   26) "6000"
   27) "info-refresh"
   28) "1505814771824"
   29) "role-reported"
   30) "master"
   31) "role-reported-time"
   32) "183350"
   33) "config-epoch"
   34) "0"
   35) "num-slaves"
   36) "0"
   37) "num-other-sentinels"
   38) "0"
   39) "quorum"
   40) "1"
   41) "failover-timeout"
   42) "60000"
   43) "parallel-syncs"
   44) "1"

2.4サービス情報からのアクセス注意:すべてのredis-sentinelファイルにパスワードであるsentinel auth-pass mymaster mageduを追加する
[root@centos7 ~]# redis-cli -h 192.168.23.148 -p 26379
192.168.23.148:26379> sentinel slaves mymaster
1)  1) "name"
    2) "192.168.23.150:6379"
    3) "ip"
    4) "192.168.23.150"
    5) "port"
    6) "6379"
    7) "runid"
    8) "5ae3e3ae957c2a3932aaaad5088acaede917e192"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "759"
   19) "last-ping-reply"
   20) "759"
   21) "down-after-milliseconds"
   22) "6000"
   23) "info-refresh"
   24) "2310"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "12374"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "192.168.23.148"
   35) "master-port"
   36) "6379"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "26696"
2)  1) "name"
    2) "192.168.23.149:6379"
    3) "ip"
    4) "192.168.23.149"
    5) "port"
    6) "6379"
    7) "runid"
    8) "e7de20e44506d9813d1fc610c03a63d005f88855"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "759"
   19) "last-ping-reply"
   20) "759"
   21) "down-after-milliseconds"
   22) "6000"
   23) "info-refresh"
   24) "2310"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "12374"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "192.168.23.148"
   35) "master-port"
   36) "6379"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "26696"

2.5メインノードをラインオフさせてホストのsentinel情報を確認し、メインノードが元のスレーブノードアドレスであることを発見する
[root@centos7 ~]# systemctl stop redis.service 
[root@centos7 ~]# redis-cli -h 192.168.23.148 -p 26379
192.168.23.148:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=odown,address=192.168.23.148:6379,slaves=2,sentinels=1
192.168.23.148:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.23.150"
    5) "port"
    6) "6379"
    7) "runid"
    8) "5ae3e3ae957c2a3932aaaad5088acaede917e192"
    9) "flags"
   10) "master"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "433"
   19) "last-ping-reply"
   20) "433"
   21) "down-after-milliseconds"
   22) "6000"
   23) "info-refresh"
   24) "4299"
   25) "role-reported"
   26) "master"
   27) "role-reported-time"
   28) "185550"
   29) "config-epoch"
   30) "14"
   31) "num-slaves"
   32) "2"
   33) "num-other-sentinels"
   34) "0"
   35) "quorum"
   36) "1"
   37) "failover-timeout"
   38) "60000"
   39) "parallel-syncs"
   40) "1"