本文将利用redis的sentinel,实现redis集群的高可用。
1.服务器规划
服务器资源规划如下表:
机器名 | ip | redis port | redis status | sentinel port |
---|---|---|---|---|
m161p114 | 192.168.161.114 | 6379 | master | 26379 |
m161p115 | 192.168.161.115 | 6379 | slave | 26379 |
m162p203 | 192.168.162.203 | 6379 | slave | 26379 |
将搭建一个redis一主两从的主从复制集群,然后通过sentinel实现故障转移。
2.redis主从配置
redis主从配置详见Redis主从复制的配置过程.
在本文中,节点m161p114作为master节点,只需要在其他slave节点上,执行主从同步的命令即可。
127.0.0.1:6379> slaveof 192.168.161.114 6379
OK
127.0.0.1:6379>
只需要在m161p115、m162p203两个节点执行上述的slaveof命令,就能组建一个以m161p114为master的redis集群。
之后通过info可以确认集群状态:
m161p115:
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.161.114
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:279743
slave_repl_offset:279743
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:00bad10aad1b2ddde89253fd5c026c9a3925d7de
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:279743
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:123059
repl_backlog_histlen:156685
m162p203:
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.161.114
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:290875
slave_repl_offset:290875
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:00bad10aad1b2ddde89253fd5c026c9a3925d7de
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:290875
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:87690
repl_backlog_histlen:203186
127.0.0.1:6379>
3.sentinel配置
现在对3个节点的sentinel进行配置。sentinel的配置文件在redis的安装目录中已经存在,只需要复制到制定的位置即可。
在/opt/redis-6.2.6目录中:
[root@m162p203 redis-6.2.6]# ll
total 244
-rw-rw-r-- 1 root root 33624 Oct 4 18:59 00-RELEASENOTES
-rw-rw-r-- 1 root root 51 Oct 4 18:59 BUGS
-rw-rw-r-- 1 root root 5026 Oct 4 18:59 CONDUCT
-rw-rw-r-- 1 root root 3384 Oct 4 18:59 CONTRIBUTING
-rw-rw-r-- 1 root root 1487 Oct 4 18:59 COPYING
drwxrwxr-x 7 root root 213 Oct 26 11:18 deps
-rw-rw-r-- 1 root root 11 Oct 4 18:59 INSTALL
-rw-rw-r-- 1 root root 151 Oct 4 18:59 Makefile
-rw-rw-r-- 1 root root 6888 Oct 4 18:59 MANIFESTO
-rw-rw-r-- 1 root root 21567 Oct 4 18:59 README.md
-rw-rw-r-- 1 root root 93724 Oct 4 18:59 redis.conf
-rwxrwxr-x 1 root root 275 Oct 4 18:59 runtest
-rwxrwxr-x 1 root root 279 Oct 4 18:59 runtest-cluster
-rwxrwxr-x 1 root root 1079 Oct 4 18:59 runtest-moduleapi
-rwxrwxr-x 1 root root 281 Oct 4 18:59 runtest-sentinel
-rw-rw-r-- 1 root root 13768 Oct 4 18:59 sentinel.conf
drwxrwxr-x 3 root root 12288 Oct 26 11:20 src
drwxrwxr-x 11 root root 182 Oct 4 18:59 tests
-rw-rw-r-- 1 root root 3055 Oct 4 18:59 TLS.md
drwxrwxr-x 9 root root 4096 Oct 26 11:22 utils
现在将sentinel.conf copy到/etc/redis目录:
cp /opt/redis-6.2.6/sentinel.conf /etc/redis/sentinel_26379.conf
由于sentinel与redis实例是一一对应的关系,那么sentinel将使用26379端口。我们将配置文件也做如此命名,便于后续在同一个服务器配置多个redis和sentinel。
在三个节点中的sentinel配置如下:
#监听端口
port 26379
#设置daemonize为yes,否则不会采用守护进程启动,启动命令会阻塞
daemonize yes
# pidfile 加上端口
pidfile "/var/run/redis-sentinel_26379.pid"
#自定义logfile文件的位置
logfile "/opt/redis/logs/sentinel_26379.log"
dir "/tmp"
#sentinel都指向redis集群的主节点
sentinel monitor mymaster 192.168.161.144 6379 2
acllog-max-len 128
sentinel deny-scripts-reconfig yes
sentinel resolve-hostnames no
protected-mode no
user default on nopass ~* &* +@all
sentinel myid 231bd2b57f330458efb37dd895b0b9cdac98c145
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel current-epoch 0
在三个节点m161p114、m161p115、m162p203三个服务中,sentinel的配置都相同。
在sentinel启动的时候,都指向reids的master节点。
之后启动sentinel。
m161p114:
[root@m161p114 redis]# cd /etc/redis
[root@m161p114 redis]# redis-sentinel sentinel_26379.conf
m161p115:
[root@m161p115 redis]# cd /etc/redis
[root@m161p115 redis]# redis-sentinel sentinel_26379.conf
m162p203:
[root@m162p203 redis]# cd /etc/redis
[root@m162p203 redis]# redis-sentinel sentinel_26379.conf
sentinel也支持redis的协议,可以通过redis-cli连接,并查看setinel的信息:
m161p114:
[root@m161p114 ~]# redis-cli -h 192.168.161.114 -p 26379
192.168.161.114: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=ok,address=192.168.161.114:6379,slaves=2,sentinels=3
192.168.161.114:26379>
m161p115:
[root@m161p115 redis]# redis-cli -h 192.168.161.115 -p 26379
192.168.161.115: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=ok,address=192.168.161.114:6379,slaves=2,sentinels=3
m162p203:
192.168.162.203: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=ok,address=192.168.161.114:6379,slaves=2,sentinels=3
192.168.162.203:26379>
三个节点的sentinel信息都一致,sentinel配置成功。
查看sentinel的日志:
15545:X 26