使用Redis配置复制
总结来说
-
- Redisは、データのレプリケーションが可能
-
- 永続化を有効にしていない場合、マスターの自動再起動設定を行わないこと
- マスターのフェイルオーバーを行いたい場合は、Redis ClusterやRedis Sentinelを検討すること
Redis的复制
您可以在Redis中直接为主从角色进行配置。
文件在这边。
复制
有几点是写在上面的。
首先,关于行动。
-
- マスター・レプリカ間が接続できている場合、マスターからレプリカへデータの変更(書き込み、有効期限切れなど)の更新コマンドを送信する
-
- ネットワーク的に、マスターとレプリカが分断されても、復旧して接続できればレプリカは部分的な同期を試みる
部分的な同期が不可能な場合、レプリカは完全な再同期が必要となり、マスターにデータのスナップショットの作成と送信、以後の継続的な更新イベントの送信を要求する
如果发生主节点故障等问题,无法进行所谓的HA故障转移。如果需要这样的功能,则需要考虑使用Redis Cluster或Redis Sentinel。
另外,复制的特点和注意事项大致如下。
-
- 非同期で動作する
-
- マスターに対して、レプリカは複数存在することができる
-
- レプリケーションは、マスター、レプリカそれぞれでノンブロッキングで動作する
レプリケーション中に、マスターは継続してクエリを処理可能
レプリカ側で、大きなデータセットをロードする必要が出てきた場合は、ブロックが発生するパターンがある
マスターが再起動した時に、空のデータセットで処理を受け付けられるようになった場合、空のデータセットがレプリカへ同期され、レプリカ側も空になることになるので注意
暂时先调查到此,让我们实际操作一下试试看。
环境
这次的确认环境。
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
$ uname -a
Linux localhost.localdomain 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ redis-server -v
Redis server v=5.0.5 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=619d60bfb0a92c36
我們準備了兩台伺服器,內容如下。
-
- マスター … 192.168.33.10
レプリカ … 192.168.33.11
在CentOS上安装Redis。
从Remi存储库中尽可能地安装最新的Redis。
$ sudo yum install epel-release
$ sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ sudo yum --enablerepo=remi install redis
主人的设定
修改/etc/redis.conf。
这次,首先仅修正绑定的 IP 地址。
bind 0.0.0.0
顺便提一下,通过Remi Repository安装的Redis 5.0.5的默认设置如下。
$ sudo grep -v '#' /etc/redis.conf | grep -v '^$'
bind 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
Redis已启动。
$ sudo systemctl start redis
连接。
$ redis-cli -h 192.168.33.10
输入数据并确认。
192.168.33.10:6379> set key1 value1
OK
192.168.33.10:6379> set key2 value2
OK
192.168.33.10:6379> keys *
1) "key1"
2) "key2"
设置复制品
在复制端,我们在/etc/redis.conf文件中除了bind之外还需要指定replicaof。
replicaof 192.168.33.10 6379
指定给 replicaof 的是主节点的 IP 地址(或主机名)和端口。
启动Redis Replica。
$ sudo systemctl start redis
连接。
$ redis-cli -h 192.168.33.11
已经存在数据了。
192.168.33.11:6379> get key1
"value1"
192.168.33.11:6379> get key2
"value2"
在从Remi Repository安装的Redis中,默认配置为replica-read-only为是,因此在副本端无法进行写入操作。
192.168.33.11:6379> set key3 value3
(error) READONLY You can't write against a read only replica.
要查看复制信息,使用info replication。
如果在主机上执行。
$ redis-cli -h 192.168.33.10
192.168.33.10:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.33.11,port=6379,state=online,offset=135,lag=1
master_replid:0bff47e7ae6b3513e56f6f7f1b571fdc8b668418
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:135
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:135
如果在复制品上执行。
$ redis-cli -h 192.168.33.11
192.168.33.11:6379> info replication
# Replication
role:slave
master_host:192.168.33.10
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:135
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:0bff47e7ae6b3513e56f6f7f1b571fdc8b668418
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:135
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:135
关闭持久化功能,然后尝试重新启动主控。
试试将配置文件简化到这个程度,同时删除一次 RDB 文件。
师傅。
bind 0.0.0.0
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
dbfilename dump.rdb
dir /var/lib/redis
复制品方。
bind 0.0.0.0
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
dbfilename dump.rdb
dir /var/lib/redis
replica-read-only yes
replicaof 192.168.33.10 6379
我会将数据输入到主控系统中。
$ redis-cli -h 192.168.33.10
192.168.33.10:6379> keys *
(empty list or set)
192.168.33.10:6379> set key1 value1
OK
192.168.33.10:6379> set key2 value2
OK
我会确认副本。
$ redis-cli -h 192.168.33.11
192.168.33.11:6379> keys *
1) "key2"
2) "key1"
重新启动主机。
$ sudo systemctl stop redis
$ sudo systemctl start redis
我要确认主人。由于没有进行持久化存储,数据已经丢失了。
$ redis-cli -h 192.168.33.10
192.168.33.10:6379> keys *
(empty list or set)
我会确认副本。
$ redis-cli -h 192.168.33.11
192.168.33.11:6379> keys *
(empty list or set)
这边也变得非常干净了。
顺便提一下,RDB文件是用于定义设置的。
dbfilename dump.rdb
dir /var/lib/redis
当需要完整传输数据时,似乎需要临时创建转储文件。如果取消此设置,则在需要完全同步时无法创建快照并导致错误。
Opening the temp file needed for MASTER <-> REPLICA synchronization: Permission denied
数据的持久性本身已经删除了以下原始文件的内容,因此不再进行定期保存。
save 900 1
save 300 10
save 60 10000
Redis 5.0 的配置
在这种情况下,重新启动Redis不会丢失数据。
对于持久化设置和重启设置,请小心处理哦。