中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis主從以及哨兵集群搭建(二)

發布時間:2020-07-19 15:35:02 來源:網絡 閱讀:3222 作者:PowerMichael 欄目:關系型數據庫

Redis主從以及哨兵集群搭建

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個了,因此一般推薦哨兵個數三個以上。

二、實驗環境

  Redis主從以及哨兵集群搭建(二)

    說明:系統為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的性能優化)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉山县| 华阴市| 教育| 承德市| 铜陵市| 射洪县| 大石桥市| 蚌埠市| 呼玛县| 漳浦县| 家居| 治县。| 义乌市| 西和县| 湘潭县| 娄烦县| 濮阳县| 奎屯市| 安达市| 威海市| 潼关县| 和硕县| 诏安县| 鱼台县| 鄯善县| 报价| 苏尼特右旗| 西峡县| 綦江县| 宁国市| 平湖市| 蒙城县| 武强县| 融水| 体育| 武穴市| 濮阳县| 秀山| 泌阳县| 台东市| 获嘉县|