redis cluster單機僞分佈式搭建--- 3主3從3哨兵集羣

redis cluster單機僞分佈式搭建--- 3主3從3哨兵集羣

最近公司引進微服務框架,之前的一臺redis的預存60G已經無法滿足現在的260G業務需要,經過一番考慮搭建了這套集羣 . 爲了方便我就用一臺服務器演示,生產環境中不建議這麼做(沒啥用),只爲記錄一下過程,至於精細化的配置需要在生產中自行研究

演示環境

[root@localhost ~]# cat /etc/redhat-release   
CentOS Linux release 7.4.1708 (Core)  

redis服務部署過程

  • 我下載的是redis-4.0.14.tar.gz版本的包
  • 解壓安裝
    tar -zxvf redis-4.0.14.tar.gz
    make install
  • 啓動服務
    ./redis-server
  • 驗證,啓動客戶端測試
    ./redis-cli  
    127.0.0.1:6379> set ab b  
    OK  
    127.0.0.1:6379> get ab  
    "b"  
    127.0.0.1:6379> keys *  
    "ab"  
    "foo"  
  • 關閉redis服務
    ./redis-cli shutdown
  • 設置redis後臺啓動,在/usr/local/bin目錄下
    cp /usr/local/redis/redis-4.0.8/redis.conf ./
    修改redis.conf這個配置文件,找到 daemonize no 這一行,將 no 改成 yes 保存
    然後啓動redis時攜帶配置文件,./redis-server redis.conf
  • 在/usr/local/bin目錄下修改好redis.conf配置(主要是設置後臺啓動、bind、密碼、保護模式等)後
    mkdir /etc/redis
    cp /usr/local/bin/redis.conf /etc/redis/6379.conf
  • 將redis自帶的啓動腳本複製到/etc/init.d目錄下,命名爲redisd(通常都以d結尾表示是後臺自啓動服務)
    cp /usr/local/redis/redis-4.0.8/utils/redis_init_script /etc/init.d/redisd
  • 設置爲開機自啓動 chkconfig redisd on
    如果報錯redisd 不支持 chkconfig,在/etc/init.d/redisd中增加如下片段,即可再設置開機自啓動
    #!/bin/sh  
    #chkconfig:   2345 90 10  
    #description:  Redis is a persistent key-value database
  • chkconfig redisd on 成功之後即可以使用啓動腳本來啓動redis

    僞分佈式集羣的搭建

    搭建一個最小的集羣需要6臺機器(由節點投票機制決定至少需要3臺主節點,另外爲了高可用每個主節點至少要備一個從節點,所以總共需要6個節點。這裏6個節點全部設在一臺機上,通過端口號來分別。實現僞分佈式。)

  • 在/usr/local/目錄下創建文件夾redisCluster,並在redisCluster目錄下創建6個文件夾
    mkdir /usr/local/redisCluster
    mkdir /usr/local/redisCluster/redis0{1,2,3,4,5,6}
  • 複製單機單實例下可正常啓動redis情況下的 /usr/local/bin 目錄下的所有文件分別到上面創建的6個文件夾中
    cp /usr/local/bin/* /usr/local/redisCluster/redis01/  
    cp /usr/local/bin/* /usr/local/redisCluster/redis02/  
    cp /usr/local/bin/* /usr/local/redisCluster/redis03/  
    cp /usr/local/bin/* /usr/local/redisCluster/redis04/  
    cp /usr/local/bin/* /usr/local/redisCluster/redis05/  
    cp /usr/local/bin/* /usr/local/redisCluster/redis06/
  • 再對每個實例裏面的redis.conf進行修改(這裏修改其中一份,然後其他5份進行復制之後修改下端口號即可)
    vi /usr/local/redisCluster/redis01/redis.conf  
    第1處: port 6379                  ————> 值 改成 7001  
    第2處: daemonize no               ————> 值 改成 yes  
    第3處: pidfile /var/run/redis_6379.pid        ————> 值 改成 ./redis_7001.pid  
    第4處: logfile ""                     ————> 值 改成 "./logs/redis_7001.log"  
    第5處: bind 127.0.0.1                 ————> 值 改成 本機IP(如我這裏是192.168.25.129)  
    第6處: protected-mode yes                 ————> 值 改成 no  
    第7處: # cluster-enabled yes          ————> 去掉註釋  
    第8處: # cluster-config-file nodes-6379.conf    ————> 去掉註釋,並把數字改成對應端口號,如這裏是7001  
    第9處: # cluster-node-timeout 15000               ————> 去掉註釋   
    第10處:  appendonly no                ————> 值 改成 yes
  • 將上面編輯號保存的/usr/local/redisCluster/redis01/目錄下的redis.conf文件重命名爲7001.conf,然後複製5份分別放到redis02、redis03、redis04、redis05、redis06文件夾下面(可刪除掉原文件夾中的redis.conf文件),然後再對每個文件夾下的.conf文件重命名爲對應端口號.conf,接着編輯裏面的內容,將之前修改爲7001的全部修改成對應端口號保存即可
  • 將ruby腳本拷貝到redisCluster目錄下
    cp /usr/local/redis/redis-4.0.8/src/redis-trib.rb /usr/local/redisCluster/
  • 創建redis集羣啓動、停止的腳本以及ruby創建集羣的腳本並授權
    touch /usr/local/redisCluster/startCluster.sh  
    touch /usr/local/redisCluster/shutdownCluster.sh  
    touch /usr/local/redisCluster/createCluster.sh  
    chmod 777 /usr/local/redisCluster/*.sh

    startcluster.sh 內容如下:

    /usr/local/rediscluster/redis01/redis-server /usr/local/rediscluster/redis01/7001.conf  
    /usr/local/rediscluster/redis02/redis-server /usr/local/rediscluster/redis02/7002.conf  
    /usr/local/rediscluster/redis03/redis-server /usr/local/rediscluster/redis03/7003.conf  
    /usr/local/rediscluster/redis04/redis-server /usr/local/rediscluster/redis04/7004.conf  
    /usr/local/rediscluster/redis05/redis-server /usr/local/rediscluster/redis05/7005.conf  
    /usr/local/rediscluster/redis06/redis-server /usr/local/rediscluster/redis06/7006.conf 

    shutdowncluster.sh 內容如下:

    /usr/local/rediscluster/redis01/redis-cli -c -h 10.11.1.103 -p 7001 shutdown  
    /usr/local/rediscluster/redis02/redis-cli -c -h 10.11.1.103 -p 7002 shutdown  
    /usr/local/rediscluster/redis03/redis-cli -c -h 10.11.1.103 -p 7003 shutdown  
    /usr/local/rediscluster/redis04/redis-cli -c -h 10.11.1.103 -p 7004 shutdown  
    /usr/local/rediscluster/redis05/redis-cli -c -h 10.11.1.103 -p 7005 shutdown  
    /usr/local/rediscluster/redis06/redis-cli -c -h 10.11.1.103 -p 7006 shutdown 

    createcluster.sh 內容如下:
    ruby redis-trib.rb create --replicas 1 10.11.1.103:7001 10.11.1.103:7002 10.11.1.103:7003 10.11.1.103:7004 10.11.1.103:7005 10.11.1.103:7006

  • 用剛剛創建的腳本啓動6個實例,再用ruby腳本創建集羣
    cd /usr/local/redisCluster/  
    ./startCluster.sh  
    ./createcluster.sh(輸入yes)
  • 驗證,查看進程
    [root@localhost rediscluster]# ps -ef |  grep redis|grep -v grep  
    root     23716     1  0 Aug08 ?        00:10:55 /usr/local/rediscluster/redis01/redis-server *:7001 [cluster]  
    root     23721     1  0 Aug08 ?        00:10:53 /usr/local/rediscluster/redis02/redis-server *:7002 [cluster]  
    root     23723     1  0 Aug08 ?        00:10:51 /usr/local/rediscluster/redis03/redis-server *:7003 [cluster]  
    root     23731     1  0 Aug08 ?        00:13:37 /usr/local/rediscluster/redis04/redis-server *:7004 [cluster]  
    root     23736     1  0 Aug08 ?        00:10:55 /usr/local/rediscluster/redis05/redis-server *:7005 [cluster]  
    root     23741     1  0 Aug08 ?        00:08:59 /usr/local/rediscluster/redis06/redis-server *:7006 [cluster]  
  • 集羣就搭建成功了。登錄任意一個節點客戶端驗證(-c 表示以集羣方式登錄),也可以用redis客戶端工具RedisDesktopManager來可視化地管理redis數據庫。
    cd /usr/local/redisCluster/redis01/  
    ./redis-cli -h 10.11.1.103 -p 7001 -c  
    10.11.1.103:7001> set aaaa b  
    OK  
    10.11.1.103:7002> get aaaa  
    -> Redirected to slot [1953] located at 10.11.1.103:7001  
    "b"  
    10.11.1.103:7001> cluster info  
    cluster_state:ok  
    cluster_slots_assigned:16384  
    cluster_slots_ok:16384  
    cluster_slots_pfail:0  
    cluster_slots_fail:0  
    cluster_known_nodes:6  
    cluster_size:3  
    cluster_current_epoch:6  
    cluster_my_epoch:1  
    cluster_stats_messages_ping_sent:367555  
    cluster_stats_messages_pong_sent:342015  
    cluster_stats_messages_publish_sent:903835  
    cluster_stats_messages_sent:1613405  
    cluster_stats_messages_ping_received:342015  
    cluster_stats_messages_pong_received:367550  
    cluster_stats_messages_publish_received:1084495  
    cluster_stats_messages_received:1794060  
    10.11.1.103:7001>  
  • 在redis01 02 03 裏配置哨兵,這裏只配置了redis01的剩餘的按照這個自行配置即可,需要注意的是監視的名稱不可重複(已標出)
    sentinel.conf 配置如下:
    protected-mode no  
    port 27001   
    sentinel deny-scripts-reconfig yes  
    sentinel monitor **mymaster1** 10.11.1.103 7001 2  
    sentinel down-after-milliseconds **mymaster1** 10000  
    logfile "/var/log/sentinel1.log"  
    dir "/usr/local/rediscluster/redis01"  
    sentinel failover-timeout **mymaster1** 15000  
    sentinel config-epoch **mymaster1** 0  
    sentinel leader-epoch **mymaster1** 0  
    sentinel known-slave **mymaster1 10.11.1.103 7004**  
    sentinel current-epoch 0  
  • 在rediscluster目錄下面創建哨兵啓動和關閉的腳本
    startsentinel.sh 的內容如下
    /usr/local/rediscluster/redis01/redis-sentinel /usr/local/rediscluster/redis01/sentinel.conf &  
    /usr/local/rediscluster/redis02/redis-sentinel /usr/local/rediscluster/redis02/sentinel.conf &  
    /usr/local/rediscluster/redis03/redis-sentinel /usr/local/rediscluster/redis03/sentinel.conf &  

    stopsentinel.sh 腳本的內容如下:

    kill -9 `ps -ef |  grep sentinel| grep -v grep|awk '{print $2}'`  
  • 再次查看進程
    [root@localhost rediscluster]# ps -ef |  grep redis|grep -v grep  
    root     23716     1  0 Aug08 ?        00:10:55 /usr/local/rediscluster/redis01/redis-server *:7001 [cluster]  
    root     23721     1  0 Aug08 ?        00:10:53 /usr/local/rediscluster/redis02/redis-server *:7002 [cluster]  
    root     23723     1  0 Aug08 ?        00:10:51 /usr/local/rediscluster/redis03/redis-server *:7003 [cluster]  
    root     23731     1  0 Aug08 ?        00:13:37 /usr/local/rediscluster/redis04/redis-server *:7004 [cluster]  
    root     23736     1  0 Aug08 ?        00:10:55 /usr/local/rediscluster/redis05/redis-server *:7005 [cluster]  
    root     23741     1  0 Aug08 ?        00:08:59 /usr/local/rediscluster/redis06/redis-server *:7006 [cluster]  
    root     23924     1  0 Aug08 ?        00:09:55 /usr/local/rediscluster/redis01/redis-sentinel *:27001 [sentinel]  
    root     23925     1  0 Aug08 ?        00:09:38 /usr/local/rediscluster/redis02/redis-sentinel *:27002 [sentinel]  
    root     23926     1  0 Aug08 ?        00:10:22 /usr/local/rediscluster/redis03/redis-sentinel *:27003 [sentinel] 
  • 這樣就完成搭建,以下是需要聯網安裝的軟件
    yum -y install gcc                    ## make install 命令需要此環境  
    yum -y intall ruby                    ## 安裝ruby(此時安裝的可能使低版本的)  
    curl -L get.rvm.io | bash -s stable   ## 安裝rvm  
    source /usr/local/rvm/scripts/rvm     ## 使安裝的rvm立即生效  
    rvm install 2.4.1                 ## 通過rvm來安裝ruby高級版本  
    gem install redis                     ## 通過ruby的工具包gem來安裝redis接口  
  • 需要注意的是,在關閉redis集羣之後,再次重複步驟啓動集羣時會報錯,此時只需要刪除redis各個實例中生成的文件即可再次按步驟啓動集羣
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章