redis配置、安裝、集羣

前言


Redis 是咱們目前大規模使用的緩存中間件,因爲它強大高效而又便捷的功能,獲得了普遍的使用。單節點的Redis已經就達到了很高的性能,爲了提升可用性咱們可使用Redis集羣。 固然了,如今集羣的方式有不少,隧道模式(還有更高級的虛擬隧道模式)、行星模型、智能路由、P2P模式,各類各樣的,算是各有各的好處吧,也有官方給了一種cluster工具,不過本文不用官方的,由於他的官方的這個是在一個服務器上折騰。。。一臺機器死了,直接全崩,有點不必,本文主要講 主從模式的redis.node

redis簡介


  • 分佈式 - linux

    1. 所謂的分佈式就是否是單獨跑在一臺服務器上的,無論公司花多少錢一臺服務器多牛,它也是有極限的,1000t內存也是極限,因此單臺服務器風險仍是比較大的,萬一它死了,整個公司徹底癱了也不合適。
    2. 因此分佈式就是說讓我這一個服務是部署在一個一個的服務器上,這樣的話就算是有一個服務器由於各類各樣的緣由癱了,不要緊,繼續跑,只不過整個系統性能會有所降低,而後過一段時間等這些節點從新恢復了它又能夠接入分佈式的系統當中。
  • 內存數據存儲 - noSQLredis

    1. 我們知道跟數據庫全部的打交道都須要用SQL語言來完成,結構化查詢語言。
    2. 它有的時候也叫noSQL,由於我們那個數據庫,說實話它很強,各類關係,各類亂七八糟的東西,可是數據庫,它更適合複雜的查詢,對於簡單的查詢,性能反不如noSQL,由於noSQL是爲了這種簡單的 好比 key value對兒的這種簡單查詢優化過的。因此它的性能反而會更高,在這種場景下。

分佈式原理


請求、數據、計算分散出去數據庫

好比有十我的,一人負責一種數據,如今有一堆數據在等着,數據末尾是1的找第一我的,數據末尾是2的找第二我的。。。提及來很簡單,可是這個怎麼分散,以及分散以後萬一有人掛了備份怎麼備,怎麼找,備份機器也掛了該怎麼辦,學文仍是不少的。vim

安裝、配置redis


本文須要用到至少三個服務器最好是四個,由於一臺單獨的機器去控制方便查看,你們請自行配好防火牆網關等配置且克隆,若是遇到問題可留言緩存

  1. 下載 - wget download.redis.io/releases/re…
  2. 解壓 - tar -zxf redis-5.0.5.tar.gz
  3. 安裝基礎依賴
  4. yum install tcl gcc make -y

如今完這些後在服務器中先打開剛剛解壓的redis文件: bash

cd redis-5.0.5
複製代碼

而後能夠ls看一下里面的目錄,有一個deps文件夾,也打開它:服務器

cd deps
複製代碼

接下來我們就能夠make了,編譯redis裏的幾個模塊,它裏面有四大模塊,接下來還有另外一件事,就是把這些編譯好的模塊組裝成程序。在linux下不少東西都是這樣,先編譯再組裝,不少玩法。微信

make hiredis jemalloc linenoise lua
複製代碼

安裝markdown

make install
複製代碼

配置redis

  1. ./install_server.sh
  2. 問題
  3. Please select the redis port for this instance:  指定一個端口
  4. Please select the redis config file name  指定一個配置文件
  5. Please select the redis log file name   指定一個日誌文件
  6. Please select the data directory for this instance 指定磁盤文件的位置
  7. Please select the redis executable path  可執行文件放哪裏
  8. 設置隨機啓動

systemctl enable redis_port  

集羣


前面說了分佈式的原理,這裏說一下,集羣和分佈式基本上是一個意思,可是集羣能夠表明除分佈式之外的意思。

還拿以前分佈式的例子來講,好比如今有三個服務,我須要 set 'name' 'aaa'  或者是 get name 這樣一個操做,他會拿着你這個 key ,也就是例子說的 name ,去計算一個所謂的 crc 。 crc 是所謂的 循環冗餘校驗  是一種數據裏經常使用的一種專門作散列、哈希的方法。說白了就是吧這個key轉換成一個數字,轉成一個數字以後會去%一個數,這個是redis本身定的,反正就是可能會有餘數,好比%完以後是0的,找第0個服務,1的是第一個服務,大概是這意思。

並且,還有一個很重要的一點,就是備份,若是其中的一個掛了,服務要馬上去找別的機器上的這個服務,並且要交叉着備,全放在一個裏也跟沒作同樣。

這種方案基本上能解決99%的錯誤了,由於硬件不可能常常壞,若是要99.999%,那可能就須要兩套交叉備份方案,看我的需求。

我們這邊講的主要是主從服務。好比說一臺服務器裏,開了兩個,一個是主服務,一個是從服務,若是服務器掛了那確定兩個一塊死,若是是主服務死了,那個從服務會立馬跟上,變成主服務,過一會剛纔死的主服務恢復了又回變成從服務,而後他繼續運行。

redis集羣配置


再次強調一下,配集羣前最好準備四臺虛擬機,最好網卡配上static,要否則每次重啓會很抓狂

redis集羣我比較喜歡手動配置,由於官方提供了一個一鍵配置的方法,可是它有個要求,這個集羣必須工做在一臺服務器上,這。。。純屬字就給本身找事兒幹。直接開個進程完事兒了

而後先在一臺機器上建一個配置文件,名字隨便取,我比較喜歡叫 redis.conf 

vim redis.conf
複製代碼

redis.conf

#端口7000
port 7000

#關閉保護模式——不帶密碼啓動
protected-mode no

#集羣特性啓用
cluster-enabled yes

#存儲節點信息配置文件——全部節點會互相同步
cluster-config-file nodes.conf

#存活時間——超過5s沒有心跳自動刪除節點並廣播
cluster-node-timeout 5000

#只追加,不刪除
appendonly yes
複製代碼

接下來,我們就能夠直接按着我們的配置跑一下redis試一,直接

redis-server ./redis.conf
複製代碼

若是沒問題的話,你會看到這個頁面 image.png剛纔我們說了我們的模式是是主從模式,有了一個主節點以後,還須要一個從節點,直接

cp redis.conf redis2.conf
複製代碼

而後把 redis2.conf 裏的端口改一下,改爲你心動的那個數字,還有就是 cluster-config-file 這個配置文件也換一個名字,要否則啓動的時候就報錯了

接下來,就是scp 把這個 redis.conf 以及 redis2.conf 分別傳到另外克隆的兩臺虛擬機上,這裏就很少介紹了。 scp 本地文件路徑 遠程用戶@服務器地址:對方服務器路徑

最後的最後,就是啓動我們的集羣了

順便一說,若是走到這一步了你尚未開防火牆的話,而且沒注意到我這句話你就要無比的酸爽了,由於意味着上邊一半的步驟你要刪了重來

直接每臺服務器來一句

firewall-cmd --add-port=7000/tcp --permanent
firewall-cmd --add-port=17000/tcp --permanent
複製代碼

爲何開兩個端口呢,由於redis定的。。。。 一個是你本身指定的,好比說7000,另外一個就是你的數+ 10000 7000 是負責數據通訊的 17000 專門來作命令通訊的,走redis本身的一套協議

啓動集羣


redis-cli --cluster create 192.168.181.130:7000 192.168.181.130:7001 192.168.181.131:7000 192.168.181.131:7001 192.168.181.132:7000 192.168.181.132:7001 --cluster-replicas 1
複製代碼

--cluster 集羣配置 create  建立 --cluster-replicas 1 集羣冗餘 1

這裏把這些地址改爲你虛擬機的地址便可

redis弱點——redis沒法保證一致性


  1. set操做若是主節點成功,就會success
  2. 主節點自動去同步,若是沒同步完主節點掛了
  3. 獲取會獲得之前的數據

緣由:爲了性能考慮

解決方法

  1. 關鍵數據不用redis
  2. set成功後不認爲成功,get確認一下

參考微信頭像換了以後偶爾換完了以後別人半天刷新不過來

redis主從模式腳本


上面扯了這麼多,有不少東西是及其的不方便的,好比redis的控制,如今是三臺服務器,100臺一個個搞公司離職率會出奇的搞,因此乾脆寫一個腳原本統一控制一下會很方便。 這裏我秉承這linux社區一貫「會用用,不會用滾」的這麼一個友好的態度,把腳本放出來你們本身會用用不會留言吧,反正我也不會看的。。。。。。

#!/usr/bin/env bash

if [ ! $1 ]
then
  echo 'command:' $0 '[cmd]'
  exit
fi

cmd=$1;

if [ $cmd == 'initall' ]
then
  for item in `cat server_list.txt`
  do
    echo init $item;
    scp redis_sh.sh root@$item:/root/;

    ssh root@$item '/root/redis_sh.sh init 7000';
    ssh root@$item '/root/redis_sh.sh init 7001';
  done

elif [ $cmd == 'startall' ]
then
  for item in `cat server_list.txt`
  do
    echo start $item;

    ssh root@$item '/root/redis_sh.sh start 7000';
    ssh root@$item '/root/redis_sh.sh start 7001';
  done

elif [ $cmd == 'ps' ]
then
  for item in `cat server_list.txt`
  do
    echo $item;

    ssh root@$item 'ps -ef | grep [r]edis';
  done


elif [ $cmd == 'stopall' ]
then
  for item in `cat server_list.txt`
  do
    echo stopall $item;

    ssh root@$item '/root/redis_sh.sh stopall';
  done

elif [ $cmd == 'create' ]
then
  servers=''

  for item in `cat server_list.txt`
  do
    servers+=$item:7000' ';
    servers+=$item:7001' ';
  done

  redis-cli --cluster create $servers --cluster-replicas 1

else
  echo no this command: $1

fi
複製代碼

有什麼感興趣的,或者遇到什麼問題能夠直接加我好友,我們一塊兒溝通

微信:Dyy916829411 qq: 916829411

相關文章
相關標籤/搜索