本文共 9554 字,大约阅读时间需要 31 分钟。
目录
第一部分——。
当我们决定摆脱memcached时,整个故事就开始了。
目前,我们已经在我们的后端服务器上运行memcahced和Redis。
并且memcached,Redis实例作为独立应用程序运行,即它们没有连接任何类型的复制,这导致了一个问题:
我们有这个方案,因为我们从一个旧的基础设施迁移我们的后端应用程序,其中只使用了一个主机并且仍然没有时间更新它,尽管它在我们的主机上很长一段时间了。
目前,为了解决这些问题,我们在后端有一堆“黑客”,它会进行额外的检查以确保数据是最新的,现在为了摆脱它们,我们决定:
这样的设置将在下面的内容中描述。
第一个示例——使用基本的主从复制和第二个示例——哨兵设置和配置。
这里将使用Debian 9的AWS EC2实例。
要与Redis主机一起使用,将使用三个域名——redis-0.setevoy.org.ua用于主服务器,redis-1.setevoy.org.ua和redis-2.setevoy.org.ua用于其两个从服务器。
最小设置中的从机只能是一个,但这里的第二个例子将是哨兵——让我们从一开始就有三个。
这样,从机将成为主机的只读从机,保留将添加到主机中的相同数据。
主机将向其从机发送所有数据更新——新密钥到期等。
如果主机和从机之间的链路断开——从机将尝试重新连接到主机并进行部分同步以从先前同步被中断的位置更新数据。
如果不能进行这种部分同步——从机将要求主机进行完全同步,并且主机将执行其数据完整快照,该快照将被发送到该从机,此后,将恢复通常的同步。
这里有几点需要注意:
安装Redis:
root@redis-0:/home/admin# apt -y install redis-server
编辑/etc/redis/redis.conf并在bind集接口中监听:
...bind 0.0.0.0...
您可以在此处指定以空格分隔的多个IP:.
...bind 127.0.0.1 18.194.229.23...
其他有价值的选择:
重启服务:
root@redis-0:/home/admin# systemctl restart redis
使用-a密码检查:
root@redis-0:/home/admin# redis-cli -a foobared pingPONG
检查数据复制状态:
root@redis-0:/home/admin# redis-cli -a foobared info replicationReplicationrole:masterconnected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0
添加新数据:
root@redis-0:/home/admin# redis-cli -a foobared set test 'test'OK
返回数据:
root@redis-0:/home/admin# redis-cli -a foobared get test"test"
好的——这里一切正常。
在左侧的两台主机上,进行从机配置。
两者都是一样的——只需重复一遍即可。
安装Redis:
root@redis-1:/home/admin# apt -y install redis-server
编辑/etc/redis/redis.conf:
...slaveof redis-0.setevoy.org.ua 6379...masterauth foobared...requirepass foobared...
这里:
重启服务:
root@redis-1:/home/admin# systemctl restart redis
检查其状态:
root@redis-1:/home/admin# redis-cli -a foobared info replicationReplicationrole:slavemaster_host:redis-0.setevoy.org.uamaster_port:6379master_link_status:upmaster_last_io_seconds_ago:5master_sync_in_progress:0...
检查日志:
root@redis-1:/home/admin# tail -f /var/log/redis/redis-server.log16961:S 29 Mar 10:54:36.263 * Connecting to MASTER redis-0.setevoy.org.ua:637916961:S 29 Mar 10:54:36.308 * MASTER <-> SLAVE sync started16961:S 29 Mar 10:54:36.309 * Non blocking connect for SYNC fired the event.16961:S 29 Mar 10:54:36.309 * Master replied to PING, replication can continue...16961:S 29 Mar 10:54:36.310 * Partial resynchronization not possible (no cached master)16961:S 29 Mar 10:54:36.311 * Full resync from master: 93585eeb7e32c0550c35f8d4935c9a18c4177ab9:116961:S 29 Mar 10:54:36.383 * MASTER <-> SLAVE sync: receiving 92 bytes from master16961:S 29 Mar 10:54:36.383 * MASTER <-> SLAVE sync: Flushing old data16961:S 29 Mar 10:54:36.383 * MASTER <-> SLAVE sync: Loading DB in memory16961:S 29 Mar 10:54:36.383 * MASTER <-> SLAVE sync: Finished with success
建立连接到主机,同步完成——好吧,检查数据:
root@redis-1:/home/admin# redis-cli -a foobared get test"test"
数据存在——这里所有工作都正常运行。
如果主机将关闭——您必须切换其中一个从机成为新的主机。
如果您尝试在当前从机上添加任何数据——由于从机处于只读模式,Redis将引发错误:
...slave-read-only yes...
尝试添加一些东西:
root@redis-1:/home/admin# redis-cli -a foobared set test2 'test2'(error) READONLY You can't write against a read only slave.
现在连接到从机:
root@redis-1:/home/admin# redis-cli
授权:
127.0.0.1:6379> auth foobaredOK
禁用slave-role:
127.0.0.1:6379> slaveof no oneOK
立即检查其状态:
127.0.0.1:6379> info replicationReplicationrole:masterconnected_slaves:0master_repl_offset:1989repl_backlog_active:0repl_backlog_size:1048576
再次添加新密钥:
127.0.0.1:6379> set test2 'test2'OK
得到返回值:
127.0.0.1:6379> get test2"test2"
请记住,我们直接在Redis节点中进行了这些更改——重新启动后,它将再次成为从属服务器,因为它仍然在其/etc/redis/redis.conf文件中使用slaveof参数进行设置。
现在让我们将哨兵添加到我们的复制中,它将监视Redis节点并自动执行角色切换。
整个计划将是下一个:
这里:
M1和S1——将对应redis-0,R 1和S2——对应redis -1,R 2和S3——对应redis-2。
要运行哨兵守护程序,redis-server只能使用单独的配置——/etc/redis/哨兵.conf。
首先,让我们在Redis Master主机上创建这样的配置文件:
sentinel monitor redis-test redis-0.setevoy.org.ua 6379 2sentinel down-after-milliseconds redis-test 6001sentinel failover-timeout redis-test 60000sentinel parallel-syncs redis-test 1bind 0.0.0.0sentinel auth-pass redis-test foobared
这里:
运行:
root@redis-0:/home/admin# redis-server /etc/redis/sentinel.conf --sentinel...10447:X 29 Mar 14:15:53.193 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.10447:X 29 Mar 14:15:53.195 # Sentinel ID is e9fb72c8edb8ec2028e6ce820b9e72e56e07cf1e10447:X 29 Mar 14:15:53.195 # +monitor master redis-test 35.158.154.25 6379 quorum 210447:X 29 Mar 14:15:53.196 * +slave slave 3.121.223.95:6379 3.121.223.95 6379 @ redis-test 35.158.154.25 637910447:X 29 Mar 14:16:43.402 * +slave slave 18.194.45.17:6379 18.194.45.17 6379 @ redis-test 35.158.154.25 6379
使用26379端口检查哨兵的状态:
root@redis-0:/home/admin# redis-cli -p 26379 info sentinelSentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=redis-test,status=ok,address=35.158.154.25:6379,slaves=2,sentinels=1
这里:
您可以在这里获得一些基本信息,例如——主机的IP:
root@redis-0:/home/admin# redis-cli -p 26379 sentinel get-master-addr-by-name redis-test1) "35.158.154.25"2) "6379"
现在使用与我们在主机和哨兵日志中执行的配置相同的配置重复两个从机上的哨兵启动,您必须看到连接的新实例:
...10447:X 29 Mar 14:18:40.437 * +sentinel sentinel fdc750c7d6388a6142d9e27b68172f5846e75d8c 172.31.36.239 26379 @ redis-test 35.158.154.25 637910447:X 29 Mar 14:18:42.725 * +sentinel sentinel ecddb26cd27c9a17c4251078c977761faa7a3250 172.31.35.218 26379 @ redis-test 35.158.154.25 6379...
再次检查状态:
root@redis-0:/home/admin# redis-cli -p 26379 info sentinelSentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=redis-test,status=ok,address=18.194.229.23:6379,slaves=2,sentinels=3
哨兵s=3——好的。
此外,哨兵将在需要时执行自己的设置更新:
root@redis-1:/home/admin# cat /etc/redis/sentinel.confsentinel myid fdc750c7d6388a6142d9e27b68172f5846e75d8csentinel monitor redis-test 35.158.154.25 6379 2sentinel down-after-milliseconds redis-test 6001bind 0.0.0.0sentinel failover-timeout redis-test 60000Generated by CONFIG REWRITEport 26379dir "/home/admin"sentinel auth-pass redis-test foobaredsentinel config-epoch redis-test 0sentinel leader-epoch redis-test 0sentinel known-slave redis-test 18.194.45.17 6379sentinel known-slave redis-test 3.121.223.95 6379sentinel known-sentinel redis-test 172.31.35.218 26379 ecddb26cd27c9a17c4251078c977761faa7a3250sentinel known-sentinel redis-test 172.31.47.184 26379 e9fb72c8edb8ec2028e6ce820b9e72e56e07cf1esentinel current-epoch 0
这是添加的哨兵myid fdc750c7d6388a6142d9e27b68172f5846e75d8c以及#CONFIG REWRITE生成的整个块。
现在让我们来看看如果主机会失败将会发生什么。
您可以通过调用kill -9或使用redis-cli和以及DEBUG以秒为单位发送命令来手动执行此操作,以使主机“关闭”或通过发送信号来杀死主机。
root@redis-0:/home/admin# redis-cli -a foobared DEBUG sleep 30
哨兵登录主机:
...10447:X 29 Mar 14:24:56.549 # +sdown master redis-test 35.158.154.25 637910447:X 29 Mar 14:24:56.614 # +new-epoch 110447:X 29 Mar 14:24:56.615 # +vote-for-leader ecddb26cd27c9a17c4251078c977761faa7a3250 110447:X 29 Mar 14:24:56.649 # +odown master redis-test 35.158.154.25 6379 #quorum 3/210447:X 29 Mar 14:24:56.649 # Next failover delay: I will not start a failover before Fri Mar 29 14:26:57 201910447:X 29 Mar 14:24:57.686 # +config-update-from sentinel ecddb26cd27c9a17c4251078c977761faa7a3250 172.31.35.218 26379 @ redis-test 35.158.154.25 637910447:X 29 Mar 14:24:57.686 # +switch-master redis-test 35.158.154.25 6379 3.121.223.95 637910447:X 29 Mar 14:24:57.686 * +slave slave 18.194.45.17:6379 18.194.45.17 6379 @ redis-test 3.121.223.95 637910447:X 29 Mar 14:24:57.686 * +slave slave 35.158.154.25:6379 35.158.154.25 6379 @ redis-test 3.121.223.95 637910447:X 29 Mar 14:25:03.724 # +sdown slave 35.158.154.25:6379 35.158.154.25 6379 @ redis-test 3.121.223.95 6379...
目前,我们对这两行感兴趣:
...10384:X 29 Mar 14:24:57.686 # +config-update-from sentinel ecddb26cd27c9a17c4251078c977761faa7a3250 172.31.35.218 26379 @ redis-test 35.158.154.25 637910384:X 29 Mar 14:24:57.686 # +switch-master redis-test 35.158.154.25 6379 3.121.223.95 6379...
哨兵执行从机到主机的重新配置。
35.158.154.25——现在已经死了的老主机,3.121.223.95是从从机中选出的新主机——它在redis-1主机上运行。
尝试在此处添加数据:
root@redis-1:/home/admin# redis-cli -a foobared set test3 'test3'OK
当对现在成为从机的旧主机进行类似的尝试时,将导致错误:
root@redis-0:/home/admin# redis-cli -a foobared set test4 'test4'(error) READONLY You can't write against a read only slave.
让我们杀死一个节点,看看哨兵现在会做什么:
root@redis-0:/home/admin# redis-cli -a foobared DEBUG SEGFAULTError: Server closed the connection
日志:
...10447:X 29 Mar 14:26:21.897 * +reboot slave 35.158.154.25:6379 35.158.154.25 6379 @ redis-test 3.121.223.95 6379
嗯——哨兵刚刚重启了那个节点
哨兵命令
命令 | 描述 |
sentinel masters | 列出所有主机及其状态 |
sentinel master | 一个主机的身份 |
sentinel slaves | 列出所有从机及其状态 |
sentinel sentinels | 列出所有哨兵实例及其状态 |
sentinel failover | 手动运行故障转移 |
sentinel flushconfig | 强制哨兵重写其在磁盘上的配置 |
sentinel monitor | 添加一个新的主机 |
sentinel remove | 从被检测中移除主机 |
原文地址:
转载地址:http://mczhj.baihongyu.com/