您好,登錄后才能下訂單哦!
Redis主從以及哨兵集群搭建
一、前言
Redis主從同步原理同MySQL的主從原理十分相似,而解決Redis單點故障的哨兵機制(sentinel)又同解決MySQL單點故障的MHA十分相似。因此我們在學(xué)習(xí)Redis時,可以將學(xué)習(xí)MySQL的知識遷移,這樣一來,有利于我們快速掌握Redis主從機制,Redis哨兵集群的搭建。Redis的Sentinel機制大概是這樣的。sentinel即哨兵,作用即放哨。開個玩笑,其實哨兵有三個作用:監(jiān)控、通知和自動故障轉(zhuǎn)移。哨兵是用來監(jiān)控Redis的master(主服務(wù)器)的,一旦master宕機了,便立刻通知其他slave(從服務(wù)器)做好成為master的準(zhǔn)備。一旦在自設(shè)定的時間內(nèi)確定master是真的宕機了,就會隨機切換一個slave成為master。但是這里會出現(xiàn)一個問題,哨兵(sentinel)的權(quán)利是不是太大了?而且萬一在監(jiān)控的時間內(nèi)出問題的是哨兵自己而不是master,那就會出現(xiàn)誤報。因此,我們需要有一個機制限制哨兵的權(quán)利。這個機制就是quorum(法定投票機制)機制。我們可以通過投票的方式來決定哨兵的消息是否真實可靠而不是哨兵自己本身宕機了?那既然需要投票,一個哨兵肯定不行,那兩個呢?那肯定也不行!假設(shè)一臺哨兵宕機了,而master是沒有宕機的。那這臺哨兵會報告master宕機的消息,而另外一臺哨兵服務(wù)器則不會報告master宕機的消息。那這種情況就很尷尬了,左右為難了。因此我們既然要投票而且必須要有一個正確的可靠消息,那需要的哨兵數(shù)必然要大于2個了,因此一般推薦哨兵個數(shù)三個以上。
二、實驗環(huán)境
說明:系統(tǒng)為CentOS7.3。由于是在虛擬機上實驗的,這里為了節(jié)省資源將三個從節(jié)點也配置了Sentinel的功能,當(dāng)然你也可以將Sentinel獨立出來為一個集群。
三、實驗配置
1 初始化配置
#node1 /etc/hosts文件修改(其他節(jié)點也做類似的修改,保證本機能夠基于主機名通信)
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
#時間同步(四個節(jié)點都要同步)
[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
#另外防火墻規(guī)則請自行設(shè)置好,selinux確保關(guān)閉
2 安裝redis,redis主從配置
#下載好redis rpm包
redis-3.2.3-1.el7.x86_64.rpm
#安裝redis(4個節(jié)點都要執(zhí)行)
yum install -y redis-3.2.3-1.el7.x86_64.rpm
#將配置文件備份(4個節(jié)點都要執(zhí)行)
cp /etc/redis.conf{,.bak}
#修改配置文件(4個節(jié)點都要執(zhí)行)
vim redis.conf bind 192.168.0.51 #改為各個節(jié)點的IP
#在從節(jié)點(node2、node3、node4)開啟slave功能
vim /etc/redis.conf ################################# REPLICATION ################################# # slaveof <masterip> <masterport> slaveof 192.168.0.51 6379
#啟動redis-server(4個節(jié)點都啟動)
redis-server /etc/redis.conf
#查看服務(wù)是否啟動(演示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)
#設(shè)置一對鍵值,用于同步測試
192.168.0.51:6379> SET test 'amazing' OK 192.168.0.51:6379> get test "amazing"
#登陸其他三臺從服務(wù)器
redis-cli -h 192.168.0.52 redis-cli -h 192.168.0.53 redis-cli -h 192.168.0.54
#三個節(jié)點上測試
#node2查看鍵值對,已經(jīng)同步了 192.168.0.52:6379> keys * 1) "test" 192.168.0.52:6379> get test "amazing" #node3查看鍵值對,已經(jīng)同步了 192.168.0.53:6379> keys * 1) "test" node4查看鍵值對,已經(jīng)同步了 192.168.0.54:6379> keys * 1) "test"
由此證明redis主從配置基本實現(xiàn)
#node1上查看主從信息,也可看到主從配置已經(jīng)實現(xiàn)
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集群實現(xiàn)(哨兵)
接下來在三個從節(jié)點上配置sentinel,實現(xiàn)故障轉(zhuǎn)移。
#三個從節(jié)點都需要做如下配置
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
#啟動服務(wù)
redis-sentinel /etc/redis-sentinel.conf
#查看服務(wù)是否正常啟動
[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進(jìn)程 [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,查看信息,發(fā)現(xiàn)node3變成master,實現(xiàn)故障轉(zhuǎn)移
[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 查看信息,發(fā)現(xiàn)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服務(wù),恢復(fù)到正常狀態(tài)
[root@node1 ~]# redis-server /etc/redis.conf [root@node3 ~]# redis-server /etc/redis.conf
#node3變?yōu)橹鞴?jié)點,現(xiàn)在為一主三從
[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的性能優(yōu)化)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。