1. 程式人生 > >Redis離線搭建主從結構

Redis離線搭建主從結構

最近給跟總公司那邊做專案,許可權管理比較嚴個,伺服器不能連結外網沒辦法yum安裝redis服務,寫下這篇記錄下離線搭建redis過程。

 

本次搭建的機器屬性:centos7.2  root許可權下,由於保密協議本文出現的ip地址為修改的虛假地址

redis搭建主從結構,安裝包都是一樣的,直接從官網下載穩定版本即可,最終主從的實現是通過修改配置檔案達到的,redis官網下載地址為:https://redis.io/download

在安裝redis之前,必須要先說明依賴;

有許多公司新上的伺服器上安裝的Linux都是精簡版,可能連GCC等依賴都沒有安裝,若是在可以連網的情況下,可以直接yum install gcc安裝依賴,但是本次是在離線下實現,這裡順帶講解下依賴的安裝;


redis是基於c上執行的,如果伺服器未安裝GCC依賴,在編譯redis階段會報錯:

/bin/bash:cc:未找到命令

在安裝redis之前,我們先檢查下伺服器是否有安裝GCC依賴:

命令:gcc -v

列:
[[email protected] bin]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) 

如果伺服器安裝了gcc,則會有例子下的內容顯示,如果沒有安裝GCC則會報錯命令不存在

 

離線安裝GCC:

我的GCC來源於centos映象中的rpm包,當然也可以去網上下載對應的rpm包,為了和伺服器版本一致,我下載了centos7.2的dvd映象,解壓得到package資料夾,該資料夾裡有許多rpm包,我們需要找到如下圖對應的rpm包並上傳到伺服器進行安裝:

rpm包名稱是:

mpfr-3.1.1-4.el7.x86_64.rpm
libmpc-1.0.1-3.el7.x86_64.rpm
kernel-headers-3.10.0-123.el7.x86_64.rpm
glibc-headers-2.17-55.el7.x86_64.rpm
glibc-devel-2.17-55.el7.x86_64.rpm
cpp-4.8.2-16.el7.x86_64.rpm
gcc-4.8.2-16.el7.x86_64.rpm

將這些包上傳到伺服器後,進入對應的目錄執行命令安裝:

rpm -ivh + 包名

或者使用統一安裝命令:

rpm -Uvh *.rpm --nodeps --force

安裝完成後,在執行 gcc -v 驗證安裝成功


安裝完gcc後,就可以上傳下載好的redis的tar包了,上傳到伺服器後解壓:

tar -xzf redis-4.0.8.tar.gz

--這裡我用的是4.0.8版本包

解壓完後進入redis目錄進行編譯:

cd redis-4.0.8

編譯,這裡編譯可以指定到一個資料夾,若不指定,這會直接安裝到當前目錄,建議有指定安裝目錄的情況
進行指定安裝

編譯:
make

如果編譯通過,會出現:
......    
INSTALL redis-sentinel
    CC redis-cli.o
    LINK redis-cli
    CC redis-benchmark.o
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: It's a good idea to run 'make test' ;)


進行編譯測試:
make test

如果沒有安裝GCC,編譯這裡就會出現之前缺失GCC的報錯日誌

編譯測試還會有一種報錯情況出現:

error: jemalloc/jemalloc.h: No such file or directory
該報錯原因是:
分配器allocator, 如果有MALLOC  這個 環境變數, 會有用這個環境變數的 去建立Redis。
而且libc 並不是預設的 分配器, 預設的是 jemalloc, 因為 jemalloc 被證明 有更少的 fragmentation problems 比libc。但是如果你又沒有jemalloc 而只有 libc 當然 make 出錯


解決方法:指定分配器
執行:
make MALLOC=libc

成功後會出現編譯成功的提示:Hint: It's a good idea to run 'make test' ;)


編譯完成後,安裝redis,可以指定目錄也可以不指定安裝目錄;
make install PREFIX=/data/redis  --可以只執行make install,安裝到當前目錄下

目前redis 已經安裝成功了redis 的相關命令都存放在../redis-4.0.8/src(安裝到當前目錄下情況),同時在/usr/local/bin/ 目錄下生成了如下檔案:

[[email protected] bin]# ls
dump.rdb  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli   redis-sentinel  redis-server

本次我是直接安裝到當前目錄,未指定到某個安裝目錄下

 到這裡單機redis已經安裝完成了,啟動單機redis檢查是否成功:

# 編譯生成的可執行檔案都在src目錄下
cd src

#指定配置檔案執行redis
./redis-server ../redis.conf

出現如下如顯示:

 

由於啟動redis不是後臺啟動,我們驗證是否能使用埠,新開一個shell介面,進入到安裝的src資料夾:

執行連結測試
./redis-cli -h 127.0.0.1 -p 6379

 能進入代表服務成功

ctrl+c退出redis,執行:

ps -ef|grep redis  

結果如下:

redis執行成功,目前我們配置的redis是在前臺執行,接下來進行後臺執行 配置;


切換回上一個shell頁面,ctrl+c退出redis-server,或者在當前shell執行:./ redis-cli shutdown  關閉redis;

把安裝包中的redis配置檔案複製到安裝完成路徑bin目錄下,之前已經說過會在/usr/local/bin目錄下生成相關執行檔案,需要把配置檔案複製一份到該目錄,之後我們從bin目錄下進行啟動;

命令:
cp /data/pkdata/redis-4.0.8/redis.conf /usr/local/bin


指定配置檔案啟動: ./redis-server  redis.conf

最後關閉redis,接下來準備主從配置

 


主從配置之前,首先各個伺服器都需要之前步驟進行redis安裝,各個伺服器redis安裝完成後,這裡開始進行主從配置檔案調整和主從連結;

在bin目錄下編輯conf檔案:

vim redis.conf

Redis預設不是以守護程序的方式執行,可以通過該配置項修改,使用yes啟用守護程序

引數1:daemonize no
     #修改為yes
     daemonize yes

繫結的主機地址,bind後面再新增主機的ip,後面主從複製 從Redis需要通過IP連線

引數2:
bind 127.0.0.1 90.101.22.3  --保密協議,IP這裡不是我的真實ip

如果設定了bind 連線還不能生效,可以在配置檔案中將redis保護模式關閉,但記得使用密碼來保證安全性
可選引數:
protected-mode no

設定Redis 密碼

引數3:
# requirepass foobared
  requirepass admin123

設定Redis 埠號,預設是6479,可以指定

引數4:
     port 6379

---------------主節點基本引數如上----------------------------------------------
--------------分割---------------------------從節點額外引數配置----------------

修改slave的redis配置檔案

從節點額外引數1:
slaveof 90.101.22.3 6379 (對映到主伺服器上,6379是埠號)

加入主節點的密碼驗證masterauth

從節點額外引數2:
masterauth admin123


接下來啟動master服務:

在bin目錄下執行: ./redis-server redis.conf 

ctrl+c退出服務讓其後臺執行

繼續執行命令進入redis互動介面:./redis-cli

這裡需要注意,如果我們redis配置檔案沒有配置密碼,可以執行輸入info引數即可檢視redis資訊,如果conf檔案配置了密碼,需要輸入密碼,否則會報錯如下:

Redis (error) NOAUTH Authentication required

解決方法:

1、在互動介面 輸入 auth admin123

2、在啟動redis-cli時加入密碼進行啟動:./redis-cli -a admin123

 

輸入info命令,顯示如下:

在salve節點會顯示role是salve,這裡redis主從搭建成功;

注意為了之後的哨兵搭建,建議redis主從的密碼一致;


 

redis遠端連結

Redis 遠端連線
用法:redis-cli [OPTIONS] [cmd [arg [arg …]]]

-h <主機ip>,預設是127.0.0.1

-p <埠>,預設是6379

-a <密碼>,如果redis加鎖,需要傳遞密碼

–help,顯示幫助資訊

如:

redis-cli -h 90.101.22.3 -p 6379 -a admin123

 


如果所連線的redis例項因為故障下線了,而主從模式也沒有提供一定的手段通知客戶端另外可連線的客戶端地址,因而需要手動更改客戶端配置重新連線。另外,主從模式下,如果主節點由於故障下線了,那麼從節點因為沒有主節點而同步中斷,因而需要人工進行故障轉移工作。為了解決上面的這個不能自動進行故障轉移的問題,在2.8版本之後redis正式提供了sentinel(哨兵)架構,關於哨兵,我準備單獨寫一篇進行記錄