linux安裝redis、搭建三主三從一哨兵集羣

安裝最新版本redis,首先查看redis最新版本,上官網:https://redis.io/

截止2019.09.20爲止,最新版本爲 redis-5.0.5.tar.gz 。

打開linux終端,進入某個目錄,執行下載安裝包指令:wget http://download.redis.io/releases/redis-5.0.5.tar.gz

解壓縮安裝包:tar -zxf redis-5.0.5.tar.gz

進入redis目錄:cd redis-5.0.5

執行編譯:make

編譯完成後,我們可以將其安裝在指定目錄下:make install PREFIX=/home/danguohang/redis_5.0.5/ 

最後redis_5.0.5目錄下出現了bin,安裝完成,因爲bin裏面有很多可以使用的程序,如下:

其中,redis-benchmark 用於redis 的壓力測試,redis-check-rdb 用於恢復rdb文件(如果rdb文件受損的話),redis-sentinel用於啓動哨兵實例,redis-check-aof 用於恢復aof文件(如果aof文件受損的話),redis-cli 用於開啓一個客戶端實例,redis-server用於啓動master 或者 slave節點。

搭建redis集羣(3主3從1哨兵)

我的環境是Ubuntu,redis-5.0.5,只有一臺機器,本地IP地址是192.168.9.128

3主:192.168.9.128:6379 、192.168.9.128:6382、192.168.9.128:6380 與3從順序一一對應

3從:192.168.9.128:6383、192.168.9.128:6381、192.168.9.128:6384

1哨兵:192.168.9.128:26379

網上有些資料顯示,要先安裝ruby環境。

首先安裝 apt install yum。  可能出現如下錯誤,原因是已經有一個apt進程佔着那個鎖了,因此可以把那個進程殺死,就可以安裝yum了。

使用ps -aux | grep apt 查看進程,然後kill -9 1346殺死這個進程

殺死進程後,再次執行apt install yum. 即可。

其實根本用不着yum,在Ubuntu下,apt 方式就可以安裝ruby了。

接着, 我發現如果在redis.conf文件裏配置好主、從關係,啓動不了,報錯,說的是在集羣中不允許在從節點配置文件中聲明replicaof 去綁定主節點。

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 2
>>> 'replicaof 192.168.9.128 6379'
replicaof directive not allowed in cluster mode
所以需要用另外一種方法:先寫好6個redis.conf配置文件(三主三從,共6個),不能重名(自己定義名字),此時的配置文件除了端口port、日誌文件,rdb目錄等等不一樣,其它基本一致,不用先去區分主從。給個例子redis_6379.conf,如下:

port 6379
cluster-enabled yes
cluster-config-file /home/danguohang/redis_5.0.5/config/cluster-master-6379.conf
cluster-node-timeout 15000
daemonize yes
pidfile /home/danguohang/redis_5.0.5/config/redis_6379.pid
dbfilename redis_6379.rdb
dir /home/danguohang/redis_5.0.5/config/
logfile /home/danguohang/redis_5.0.5/log/redisNode_6379.log
bind 192.168.9.128
appendonly yes
appendfilename redis_6379.aof 

redis_6380.conf、redis_6381.conf、redis_6382.conf、redis_6383.conf、redis_6384.conf 文件就自行配置吧。

redis.conf 配置文件的每一個屬性是什麼意思,請參考文章:https://blog.csdn.net/dgh112233/article/details/101069766

配置好了6個conf文件後,再配置1個哨兵配置文件sentinel.conf,如下:

bind 192.168.9.128
protected-mode no
port 26379
daemonize yes
pidfile "/home/danguohang/redis_5.0.5/config/redis-sentinel.pid"
logfile "/home/danguohang/redis_5.0.5/log/sentinel_26379.log"

# sentinel announce-ip <ip>
# sentinel announce-port <port>
# sentinel announce-ip 1.2.3.4

dir "/home/danguohang/redis_5.0.5"

# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel myid 3630607f378bc6619d1c1e0b4222b572cf58b50f

# sentinel auth-pass <master-name> <password>
# sentinel auth-pass master_6379 MySUPER--secret-0123passw0rd

# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel deny-scripts-reconfig yes

# sentinel parallel-syncs <master-name> <numreplicas>
sentinel monitor master_6380 192.168.9.128 6380 1
sentinel config-epoch master_6380 0
sentinel leader-epoch master_6380 0

# sentinel failover-timeout <master-name> <milliseconds>
sentinel known-replica master_6380 192.168.9.128 6383

# SCRIPTS EXECUTION

# NOTIFICATION SCRIPT
# sentinel notification-script <master-name> <script-path>
# sentinel notification-script mymaster /var/redis/notify.sh

# CLIENTS RECONFIGURATION SCRIPT
#
# sentinel client-reconfig-script <master-name> <script-path>
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

sentinel monitor master_6379 192.168.9.128 6379 1

# REDIS COMMANDS RENAMING
# SENTINEL rename-command mymaster CONFIG GUESSME
# SENTINEL rename-command mymaster CONFIG CONFIG
# Generated by CONFIG REWRITE
# sentinel known-replica master_6379 192.168.9.128 6380
sentinel config-epoch master_6379 0
sentinel leader-epoch master_6379 1
sentinel known-replica master_6379 192.168.9.128 6381
sentinel monitor master_6381 192.168.9.128 6381 1
sentinel config-epoch master_6381 0
sentinel leader-epoch master_6381 4
sentinel current-epoch 4

一個哨兵可以監控多個主節點。

一切都配置好了之後,接下來就是啓動了,切換到redis安裝目錄下的bin目錄裏,因爲需要用到redis-server 和 redis-sentinel。

redis-server。

啓動這些redis節點:redis-server  redis_6379.conf              這樣執行即可,其它redis節點的啓動類似。

啓動哨兵節點:redis-sentinel  sentinel.conf 

當然如果你嫌麻煩的話,可以自己寫一個shell腳本,把所有的啓動命令都寫進腳本,以後只需運行腳本即可。

現在這些redis節點運行起來了,可以還沒有配置成集羣呢,因爲主從關係沒有確定(我測試的時候,報的錯誤是slot沒有分配,就是槽還沒有初始化好)。

怎麼配置呢?網上有很多資料寫着用redis-trib.rb 工具,我試過了,報錯:redis-trib.rb已經不被支持了,可以使用redis-cli 去完成它的工作。

因此執行命令A:./redis-cli --cluster create 192.168.9.128:6379 192.168.9.128:6382 192.168.9.128:6380 192.168.9.128:6383 192.168.9.128:6381 192.168.9.128:6384 --cluster-replicas 1

命令是什麼意思呢:利用redis-cli去將啓動起來的redis節點搭建成一個redis集羣,參數裏有兩個主要內容:中間的那些IP地址, 和 最後一個數字。 中間的IP是所有redis節點的(包括主、從節點),後面那個數字是主從節點的比例,如果是1,那就是1:1,主從節點各一半,前面一半是主節點,後面一半是從節點,如果是2,那就是1:2,前面1/3是主節點,後面2/3是從節點。而其還有對應關係的,比如,如果是1:1,那麼192.168.9.128:6379(主)對應 192.168.9.128:6383(從),如果是1:2,那麼192.168.9.128:6379(主)對應 192.168.9.128:6380(從)和192.168.9.128:6383(從)。

命令A執行過程中,會問你“yes/no”,你就完整輸入yes,別隻輸入一個y(後面會出錯的)。

到此,集羣搭建完畢。

我們簡單測試一下是否功能完好:

1. redis-cli -h 192.168.9.128:6379    在客戶端連接上192.168.9.128:6379(主節點),存一個鍵值<dan,hello>,但是報了一個錯,說是要將這個值存入192.168.9.128:6380(主節點)的第13016號槽去,爲什麼呢?

原因:存入redis集羣的數據,會根據一個算法確定這個數據應該存入哪個槽(redis集羣共16384個槽,這些槽平分到集羣的每個主節點)當中,由於我們這是比較原始的操作,所以只能手工切換,如果你使用的是java API的話,就不用在存數據之前還要檢查存在哪個槽裏,API自動替你做了。

2. 192.168.9.128:6380 主節點對應的從節點是 192.168.9.128:6384 ,我們測一下,當kill 殺死192.168.9.128:6380,然後在192.168.9.128:6384裏能夠get dan值。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章