一、說明
redis 3.0 集羣功能出來已經有一段時間了,目前最新穩定版是3.0.5,我瞭解到已經有很多互聯網公司在生產環境使用,比如唯品會、美團等等,剛好公司有個新項目,預估的量單機redis無法滿足,開發又不想在代碼層面做拆分,所以就推薦他們嘗試一下redis集羣,下面做了一些相關筆記,以備後用。
二、環境
1、redis節點
10.10.2.70:6300 10.10.2.70:6301 主從
10.10.2.71:6300 10.10.2.71:6301 主從
10.10.2.85:6300 10.10.2.85:6301 主從
2、redis版本
Redis version 3.0.5
三、安裝配置
1、安裝redis
wget http://download.redis.io/releases/redis-3.0.5.tar.gz
tar -zxvf redis-3.0.5.tar.gz
cd redis-3.0.5
make
cp redis-3.0.5/src/redis-trib.rb /bin/
cp redis-3.0.5/src/redis-server /bin/
cp redis-3.0.5/src/redis-cli /bin/
2、安裝ruby及ruby的redis模塊
yum -y install ruby rubygems
gem install redis --version 3.0.5
3、內核調優
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl -p
4、建立目錄
mkdir /data/redis/6300 -p
mkdir /data/redis/6301
5、撰寫redis配置文件(cp配置文件注意修改端口)
vim /etc/redis_6300.conf
daemonize yes
port 6300
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
maxmemory 10gb
databases 16
dir /data/redis/6300
slave-serve-stale-data yes
loglevel notice
logfile "/data/redis/6300/redis_6300.log"
#slave只讀
slave-read-only yes
#not use default
repl-disable-tcp-nodelay yes
slave-priority 100
#打開aof持久化
appendonly yes
#每秒一次aof寫
appendfsync everysec
#關閉在aof rewrite的時候對新的寫操作進行fsync
no-appendfsync-on-rewrite yes
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
#打開redis集羣
cluster-enabled yes
cluster-config-file /data/redis/6300/nodes-6300.conf
#節點互連超時的閥值(單位毫秒)
cluster-node-timeout 15000
#一個主節點在擁有多少個好的從節點的時候就要割讓一個從節點出來給其他沒有從節點或者從節點掛掉的主節點
cluster-migration-barrier 1
#如果某一些key space沒有被集羣中任何節點覆蓋,最常見的就是一個node掛掉,集羣將停止接受寫入
cluster-require-full-coverage no
#部署在同一機器的redis實例,把auto-aof-rewrite搓開,防止瞬間fork所有redis進程做rewrite,佔用大量內存
auto-aof-rewrite-percentage 80-100
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
6、啓動服務
redis-server /etc/redis_6300.conf
redis-server /etc/redis_6301.conf
echo "redis-server /etc/redis_6300.conf" >> /etc/rc.local
echo "redis-server /etc/redis_6301.conf" >> /etc/rc.local
7、初始化集羣
#節點角色由順序決定,先master之後是slave,本文中6300是master,6301是slave
redis-trib.rb create --replicas 1 10.10.2.70:6300 10.10.2.71:6300 10.10.2.85:6300 10.10.2.70:6301 10.10.2.71:6301 10.10.2.85:6301
8、查看集羣狀態
redis-trib.rb check 10.10.2.70:6300
PS:redis-trib.rb是一個ruby工具,封裝了redis集羣的一些命令,用這個工具操作集羣非常方便,比如上面初始化集羣,查看集羣狀態,還有添加、刪除節點,遷移slot等等功能。
四、redis集羣維護
A、場景1
線上的集羣已經有瓶頸,集羣需要擴容,比如我們已經準備了一主一從(10.10.2.85:6302、10.10.2.85:6303),如下:
1、添加一個主節點
10.10.2.85:6302是要加的新節點,10.10.2.70:6300是集羣中已存在的任意節點。
2、給主節點添加從節點
--slave 指定要加的是從節點,--master-id 指定這個從節點的主節點ID,10.10.2.85:6303是需要新加的從節點,10.10.2.70:6300是集羣已存在的任意節點。
3、遷移一些slot給新節點
B、場景二
上面的例子是集羣擴容,相對的,由於各種原因集羣可能也需要縮容,下面的例子把上文擴容的節點下線,步驟如下:
1、遷移這個節點的slot到其他節點(有slot的節點是不可以直接下線的)
2、然後查看10.10.2.85:6302這個maser上已經沒有slot了
3、下線slave節點
4、下線master節點
C、場景三
集羣中一個節點的master掛掉,從節點提升爲主節點,還沒有來的急給這個新的主節點加從節點,這個新的主節點就又掛掉了,那麼集羣中這個節點就徹底不可以用了,爲了解決這個問題,我們至少保證每個節點的maser下面有兩個以上的從節點,這樣一來,需要的內存資源或者服務器資源就翻倍了,有沒有一個折中的方法呢,答案是肯定的,還節點上文配置文件中的cluster-migration-barrier參數不,我們只需要給集羣中其中一個節點的master掛多個從庫,當其他節點的master下沒有可用的從庫時,有多個從庫的master會割讓一個slave給他,保證整個集羣的可用性。
1、給10.10.2.70:6300 10.10.2.70:6301 這組節點下面加一個從庫10.10.2.85:6302
2、把10.10.2.71:6300 10.10.2.71:6301這組的從節點停掉
redis-cli -h 10.10.2.71 -p 6301 shutdown
3、查看10.10.2.85:6302這個節點是否成爲10.10.2.71:6300的從庫
五、cluster相關命令
參考文章:
http://www.redis.cn/topics/cluster-tutorial.html
http://www.redis.cn/topics/cluster-spec.html
http://redisdoc.com/topic/cluster-tutorial.html