您好,登錄后才能下訂單哦!
Redis主從以及哨兵集群搭建
一、前言
Redis主從同步原理同MySQL的主從原理十分相似,而解決Redis單點故障的哨兵機制(sentinel)又同解決MySQL單點故障的MHA十分相似。因此我們在學習Redis時,可以將學習MySQL的知識遷移,這樣一來,有利于我們快速掌握Redis主從機制,Redis哨兵集群的搭建。Redis的Sentinel機制大概是這樣的。sentinel即哨兵,作用即放哨。開個玩笑,其實哨兵有三個作用:監控、通知和自動故障轉移。哨兵是用來監控Redis的master(主服務器)的,一旦master宕機了,便立刻通知其他slave(從服務器)做好成為master的準備。一旦在自設定的時間內確定master是真的宕機了,就會隨機切換一個slave成為master。但是這里會出現一個問題,哨兵(sentinel)的權利是不是太大了?而且萬一在監控的時間內出問題的是哨兵自己而不是master,那就會出現誤報。因此,我們需要有一個機制限制哨兵的權利。這個機制就是quorum(法定投票機制)機制。我們可以通過投票的方式來決定哨兵的消息是否真實可靠而不是哨兵自己本身宕機了?那既然需要投票,一個哨兵肯定不行,那兩個呢?那肯定也不行!假設一臺哨兵宕機了,而master是沒有宕機的。那這臺哨兵會報告master宕機的消息,而另外一臺哨兵服務器則不會報告master宕機的消息。那這種情況就很尷尬了,左右為難了。因此我們既然要投票而且必須要有一個正確的可靠消息,那需要的哨兵數必然要大于2個了,因此一般推薦哨兵個數三個以上。
二、實驗環境
說明:系統為CentOS7.3。由于是在虛擬機上實驗的,這里為了節省資源將三個從節點也配置了Sentinel的功能,當然你也可以將Sentinel獨立出來為一個集群。
三、實驗配置
1 初始化配置
#node1 /etc/hosts文件修改(其他節點也做類似的修改,保證本機能夠基于主機名通信)
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 node1 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 node1 192.168.0.51 node1 192.168.0.52 node2 192.168.0.53 node3 192.168.0.54 node4
#修改hostname(可立即生效)
hostnamectl set-hostname node1 hostnamectl set-hostname node2 hostnamectl set-hostname node3 hostnamectl set-hostname node4
#查看hostname
[root@localhost ~]# hostnamectl
Static hostname: node1 Icon name: computer-vm Chassis: vm Machine ID: 3d8bf6a9bfb24fae9bedcb9cfc6c5960 Boot ID: 75905236f9eb4d91ade64f99a690d329 Virtualization: vmware Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-514.el7.x86_64 Architecture: x86-64 #注:重新登陸終端,命令提示符就會更改成你修改的hostname
#時間同步(四個節點都要同步)
[root@node1 ~]# ntpdate 172.16.0.1 18 Jul 22:45:00 ntpdate[10418]: step time server 172.16.0.1 offset 0.708020 sec
#另外防火墻規則請自行設置好,selinux確保關閉
2 安裝redis,redis主從配置
#下載好redis rpm包
redis-3.2.3-1.el7.x86_64.rpm
#安裝redis(4個節點都要執行)
yum install -y redis-3.2.3-1.el7.x86_64.rpm
#將配置文件備份(4個節點都要執行)
cp /etc/redis.conf{,.bak}
#修改配置文件(4個節點都要執行)
vim redis.conf bind 192.168.0.51 #改為各個節點的IP
#在從節點(node2、node3、node4)開啟slave功能
vim /etc/redis.conf ################################# REPLICATION ################################# # slaveof <masterip> <masterport> slaveof 192.168.0.51 6379
#啟動redis-server(4個節點都啟動)
redis-server /etc/redis.conf
#查看服務是否啟動(演示node2,其他自行測試)
[root@node2 ~]# ss -tln State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 192.168.0.52:6379 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
#在主機上登陸redis
[root@node1 ~]# redis-cli -h 192.168.0.51 192.168.0.51:6379> KEYS * (empty list or set)
#設置一對鍵值,用于同步測試
192.168.0.51:6379> SET test 'amazing' OK 192.168.0.51:6379> get test "amazing"
#登陸其他三臺從服務器
redis-cli -h 192.168.0.52 redis-cli -h 192.168.0.53 redis-cli -h 192.168.0.54
#三個節點上測試
#node2查看鍵值對,已經同步了 192.168.0.52:6379> keys * 1) "test" 192.168.0.52:6379> get test "amazing" #node3查看鍵值對,已經同步了 192.168.0.53:6379> keys * 1) "test" node4查看鍵值對,已經同步了 192.168.0.54:6379> keys * 1) "test"
由此證明redis主從配置基本實現
#node1上查看主從信息,也可看到主從配置已經實現
192.168.0.51:6379> INFO replication # Replication role:master connected_slaves:3 slave0:ip=192.168.0.52,port=6379,state=online,offset=732,lag=0 slave1:ip=192.168.0.53,port=6379,state=online,offset=732,lag=0 slave2:ip=192.168.0.54,port=6379,state=online,offset=732,lag=0 master_repl_offset:732 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:731
3 sentinel集群實現(哨兵)
接下來在三個從節點上配置sentinel,實現故障轉移。
#三個從節點都需要做如下配置
cp /etc/redis-sentinel.conf{,.bak} vi /etc/redis-sentinel.conf sentinel monitor mymaster 192.168.0.51 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 18000
#啟動服務
redis-sentinel /etc/redis-sentinel.conf
#查看服務是否正常啟動
[root@node ~]# ss -tln State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:26379 *:* LISTEN 0 128 192.168.0.55:6379 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::26379 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
#模擬故障
#殺掉node1 redis進程 [root@node1 ~]# pkill redis [root@node1 ~]# ss -tln State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
#登陸node3,查看信息,發現node3變成master,實現故障轉移
[root@node3 ~]# redis-cli -h 192.168.0.53 192.168.0.53:6379> INFO Replication # Replication role:master connected_slaves:2 slave0:ip=192.168.0.54,port=6379,state=online,offset=23900,lag=0 slave1:ip=192.168.0.52,port=6379,state=online,offset=23900,lag=0 master_repl_offset:24177 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:24176
#再次模擬故障
#殺掉node3 redis [root@node3 ~]# pkill redis [root@node3 ~]# ss -tln State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
#登陸node4 查看信息,發現node4為master,node2為從,此時為一主一次
[root@node4 ~]# redis-cli -h 192.168.0.54 192.168.0.54:6379> INFO Replication # Replication role:master connected_slaves:1 slave0:ip=192.168.0.52,port=6379,state=online,offset=10508,lag=0 master_repl_offset:10508 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:10507
#啟動node1和node3的redis服務,恢復到正常狀態
[root@node1 ~]# redis-server /etc/redis.conf [root@node3 ~]# redis-server /etc/redis.conf
#node3變為主節點,現在為一主三從
[root@node3 ~]# redis-cli -h 192.168.0.53 192.168.0.53:6379> INFO Replication # Replication role:master connected_slaves:3 slave0:ip=192.168.0.51,port=6379,state=online,offset=8008,lag=0 slave1:ip=192.168.0.52,port=6379,state=online,offset=8146,lag=0 slave2:ip=192.168.0.54,port=6379,state=online,offset=7869,lag=1 master_repl_offset:8146 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:8145
(PS:Redis系列第三篇將會介紹Redis的性能優化)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。