1. 程式人生 > >ubuntu14.04 redis叢集部署

ubuntu14.04 redis叢集部署

一、redis安裝

apt-get remove redis-server    # 刪除舊版
apt-get autoremove
sudo apt-get install -y python-software-properties
sudo apt-get install software-properties-common
# sudo add-apt-repository ppa:chris-lea/redis-server
sudo add-apt-repository -y ppa:rwky/redis
sudo apt-get update
sudo apt-get install -y redis-server

二、建立六個節點,三個master,三個slave

sudo mkdir /usr/local/redis_cluster
cd /usr/local/redis_cluster
sudo mkdir 7000 7001 7002 7003 7004 7005
# sudo mkdir /usr/local/redis_cluster/{7000,7001,7002,7003,7004,7005}
sudo cp -p /etc/redis/redis.conf /usr/local/redis_cluster/7000/    # 7001、7002、7003、7004、7005也是一樣
  • 修改配置7000/redis.conf,其他節點也是一樣
pidfile /var/run/redis/redis-server-7000.pid    //pidfile檔案對應7000,7002,7003
port  7000                                     //埠7000,7002,7003
logfile /var/log/redis/redis-server-7000.log    //日誌檔案
dbfilename dump-7000.rdb                       //檔案儲存
cluster-enabled  yes
//開啟叢集 把註釋#去掉 cluster-config-file nodes-7000.conf //叢集的配置 配置檔案首次啟動自動生成 7000,7001,7002 cluster-node-timeout 5000 //請求超時 設定5秒夠了 appendonly yes //aof日誌開啟 有需要就開啟,它會每次寫操作都記錄一條日誌

三、使用redis使用者啟動

  • 複製redis執行檔案
sudo cp /etc/init.d/redis-server /etc/init.d/redis-server-7000
  • 修改redis-server-7000配置檔案對應位置
DAEMON=/usr/bin/redis-server
DAEMON_ARGS=/usr/local/redis_cluster/7000/redis.conf
NAME=redis-server
DESC=redis-server-7000

RUNDIR=/var/run/redis
PIDFILE=$RUNDIR/redis-server-7000.pid
  • 啟動redis-server-7000
sudo service redis-server-7000 (start|stop|restart)
  • 開機啟動設定
sudo update-rc.d redis-server-7000 defaults 20    # 開機啟動
  • 其他節點
cd /usr/local/redis_cluster
sudo cp -p 7000/redis.conf 7001/
sudo vim 7001/redis.conf    # 全域性替換7000改成70001

cd /etc/init.d
sudo cp redis-server-7000 redis-server-7001
sudo vim redis-server-7001    # 全域性替換7000改成70001

sudo service redis-server-7001 (start|stop|restart)
sudo update-rc.d redis-server-7001 defaults 20    # 開機啟動
  • ps axu | grep redis #檢視是否啟動成功
    在這裡插入圖片描述
  • sudo netstat -tnlp | grep redis #可以看到redis監聽埠
    在這裡插入圖片描述

四、直接使用root使用者啟動

touch run_cluster_redis.sh

redis-server /usr/local/redis_cluster/7000/redis.conf
redis-server /usr/local/redis_cluster/7001/redis.conf
redis-server /usr/local/redis_cluster/7002/redis.conf
redis-server /usr/local/redis_cluster/7003/redis.conf
redis-server /usr/local/redis_cluster/7004/redis.conf
redis-server /usr/local/redis_cluster/7005/redis.conf
chmod +x run_cluster_redis.sh
sudo ./run_cluster_redis.sh

五、建立叢集

  • redis5.x版本中,redis-cli --cluster命令替代./redis-trib.rb命令
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1

在這裡插入圖片描述

  • 檢視節點資訊
redis-cli -p 7000 cluster nodes

在這裡插入圖片描述

  • 使用叢集新增資料
    在這裡插入圖片描述

六、叢集命令

  • 新增節點
# 第一個引數是新節點的地址,第二個引數是任意一個已經存在的節點的IP和埠. 
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

在這裡插入圖片描述

  • 刪除節點
# 第一個引數是任意一個節點的地址,第二個節點是你想要移除的節點地址。
# 使用同樣的方法移除主節點,不過在移除主節點前,需要確保這個主節點是空的. 如果不是空的,需要將這個節點的資料重新分片到其他主節點上.
redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`

# 刪除7000節點
[email protected]:~$ redis-cli --cluster del-node 127.0.0.1:7001 d9955463de9bd9e8b79a923defde4f3885ab19a6
>>> Removing node d9955463de9bd9e8b79a923defde4f3885ab19a6 from cluster 127.0.0.1:7001
[ERR] Node 127.0.0.1:7000 is not empty! Reshard data away and try again.

# 刪除7006節點
[email protected]:~$ redis-cli --cluster del-node 127.0.0.1:7001 9159f14fcd50f83b85ed4704d64e73ef8d253661
>>> Removing node 9159f14fcd50f83b85ed4704d64e73ef8d253661 from cluster 127.0.0.1:7001
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
  • 重新分片
redis-cli --cluster reshard 127.0.0.1:7000
redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes

  • all和done兩種模式
redis-cli --cluster reshard 127.0.0.1:7000
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 100
What is the receiving node ID? 166fe530d89ba851b540083adb0463bb77c51ae6
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
# 使用all, 獲取100slot,從其他節點均攤
Source node #1: all

# 使用done,選擇要均攤的節點
Source node #1: d9955463de9bd9e8b79a923defde4f3885ab19a6
Source node #2: done

# 從一個節點轉移100個slot到另外一個節點
redis-cli --cluster reshard 127.0.0.1:7000  --cluster-from d9955463de9bd9e8b79a923defde4f3885ab19a6  --cluster-to 166fe530d89ba851b540083adb0463bb77c51ae6  --cluster-slots 100 --cluster-yes

在這裡插入圖片描述

  • 其他命令
[email protected]:~$ redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
  info           host:port
  fix            host:port
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

七、重置叢集

  • 停止所有節點,使用命令殺死程序
 ps axu | grep redis | grep cluster | awk '{print $2}' | xargs sudo kill -9
  • 刪除資料檔案、節點檔案、aof日誌和日誌檔案
sudo rm -rf /var/lib/redis/dump-*
sudo rm -rf /var/lib/redis/nodes-*
sudo rm -rf /var/lib/redis/appendonly.aof
sudo rm -rf /var/log/redis/redis-server-*
  • 重啟服務,再按照上述建立叢集
sudo service redis-server-(7000|7001|7002|7003|7004|7005) start

八、問題

  • Node 127.0.0.1:7000 has slots in importing state 12182.
redis-cli --cluster fix 127.0.0.1:7000

在這裡插入圖片描述

  • [ERR] Node 127.0.0.1:7006 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
# Keyspace
[email protected]:~$ redis-cli -p 7006
127.0.0.1:7006> info
db0:keys=1,expires=0,avg_ttl=0
127.0.0.1:7006> KEYS *
1) "foo"
127.0.0.1:7006> get foo
(error) CLUSTERDOWN The cluster is down
127.0.0.1:7006> flushall
OK

九、參考