一、codis介紹
codis是一個(gè)分布式redis集群解決方案,對(duì)于上層的應(yīng)用來(lái)說(shuō), 連接到codis-proxy和連接原生的redis-server沒(méi)有明顯的區(qū)別。
上層應(yīng)用可以像使用單機(jī)的redis一樣使用,codis底層會(huì)處理請(qǐng)求的轉(zhuǎn)發(fā),不停機(jī)的數(shù)據(jù)遷移等工作。所有后邊的一切事情,對(duì)于前面的客戶端來(lái)說(shuō)是透明的,可以簡(jiǎn)單的認(rèn)為后邊連接的是一個(gè)內(nèi)存無(wú)限大的redis服務(wù)。
codis由四部分組成:
codis proxy(codis-proxy)
codis dashboard(codis-config)
codis redis(codis-server)
zookeeper/etcd
codis-proxy是客戶端連接的redis代理服務(wù),codis-proxy本身實(shí)現(xiàn)了redis協(xié)議,表現(xiàn)得和一個(gè)原生的redis沒(méi)什么區(qū)別(就像twemproxy),對(duì)于一個(gè)業(yè)務(wù)來(lái)說(shuō),可以部署多個(gè)codis-proxy,codis-proxy本身是無(wú)狀態(tài)的。
codis-config是codis的管理工具,支持包括:添加/刪除redis節(jié)點(diǎn),添加/刪除proxy節(jié)點(diǎn),發(fā)起數(shù)據(jù)遷移等操作。
codis-config本身還自帶了一個(gè)http-server,會(huì)啟動(dòng)一個(gè)dashboard,用戶可以直接在瀏覽器上觀察codis集群的運(yùn)行狀態(tài)。
codis-server是codis項(xiàng)目維護(hù)的一個(gè)redis分支,基于redis2.8.21開(kāi)發(fā),加入了slot的支持和原子的數(shù)據(jù)遷移指令。codis上層的codis-proxy和codis-config只能和這個(gè)版本的redis交互才能正常運(yùn)行。
codis依賴(lài)zookeeper來(lái)存放數(shù)據(jù)路由表和codis-proxy節(jié)點(diǎn)的元信息,codis-config發(fā)起的命令都會(huì)通過(guò)zookeeper同步到各個(gè)存活的codis-proxy。
codis支持按照namespace區(qū)分不同的產(chǎn)品,擁有不同的product name的產(chǎn)品,各項(xiàng)配置都不會(huì)沖突。
codis架構(gòu)圖如下:
二、環(huán)境準(zhǔn)備
codis集群的搭建,需要zookeeper集群,有關(guān)zookeeper集群的搭建,可以參考這篇文章《爛泥:zookeeper集群搭建》。
除了zookeeper集群之外,我們還需要安裝go語(yǔ)言環(huán)境,因?yàn)閏odis是基于go語(yǔ)言開(kāi)發(fā)的。
2.1 ****安裝基礎(chǔ)依賴(lài)
安裝基礎(chǔ)依賴(lài),使用如下命令:
yum install -y git gcc make g++ gcc-c++ automake openssl-devel zlib-*

基礎(chǔ)依賴(lài)安裝往后,我們現(xiàn)在開(kāi)始配置go語(yǔ)言環(huán)境。
2.2 go****語(yǔ)言環(huán)境搭建**
codis是基于go語(yǔ)言開(kāi)發(fā)的,所以我們要在所有服務(wù)器上都配置go語(yǔ)言環(huán)境。
GOPATH, GOROOT配置:https://golang.org/doc/install
下載go語(yǔ)言包,如下:
wget https://storage.googleapis.com/golang/go1.6.1.linux-amd64.tar.gz
下載完畢后,解壓到/usr/local,如下:
tar -C /usr/local -xf go1.6.1.linux-amd64.tar.gz

把go加入到系統(tǒng)的環(huán)境變量,如下:
GOPATH:是go的工作目錄
GOROOT:是go的安裝目錄
vim /etc/profile
export GOROOT=$PATH:/usr/local/go/bin
export GOPATH=/usr/local/go/work

讓剛剛加入的環(huán)境變量生效,并查看go是否配置成功,如下:
source /etc/profile
env
go version

通過(guò)上圖,我們可以很明顯的看出go語(yǔ)言環(huán)境配置成功。
三、安裝codis
codis的安裝,我們可以通過(guò)三種不同的方式進(jìn)行:通過(guò)go下載安裝、通過(guò)git方式和通過(guò)源碼方式,下面分別介紹下。
3.1 ****通過(guò)go下載安裝
官方github地址為:https://github.com/CodisLabs/codis
cd /usr/local/go/work/src/github.com/CodisLabs/codis
官方使用文檔地址為:
https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md
按照官方github介紹,codis首選方式是通過(guò)go下載安裝的。命令如下:
go get -u -d github.com/CodisLabs/codis
注意:由于眾所周知的原因,這一步比較慢,需要耐心等待。上一步執(zhí)行完畢后,我們切換到目錄下,進(jìn)行編譯,如下:
make



注意:這一步也比較慢,需要耐心等待。
make編譯執(zhí)行完畢后后,會(huì)在bin目錄下生成codis-config、codis-proxy、codis-server三個(gè)可執(zhí)行文件以及assets目錄。
其中assets是codis-config的dashboard http 服務(wù)需要的前端資源,需要和codis-config放置在同一目錄下。如下:
ll bin/

編譯完畢后,我們現(xiàn)在來(lái)測(cè)試編譯的結(jié)果,使用如下命令:
make gotest

通過(guò)上圖,我們可以看到codis已經(jīng)安裝成功。
3.2 ****通過(guò)git方式
上一章節(jié),我們介紹了codis通過(guò)go下載安裝的方法,這一章節(jié),我們通過(guò)git方式進(jìn)行安裝。
首先下載codis最新的git倉(cāng)庫(kù),使用如下命令:
git clone https://github.com/CodisLabs/codis.git
git倉(cāng)庫(kù)下載完畢后,我們接下來(lái)進(jìn)行如下的操作。如下:
mkdir -p /usr/local/src/github.com/CodisLabs/
cp -r codis /usr/local/src/github.com/CodisLabs/
cd /usr/local/src/github.com/CodisLabs/codis/

以上操作完畢后,就和通過(guò)go下載安裝方式一樣了。執(zhí)行make命令進(jìn)行編譯,然后執(zhí)行make gotest命令進(jìn)行測(cè)試。
3.3 ****通過(guò)下載源碼
下面我們來(lái)介紹下,通過(guò)源碼方式的安裝。下載codis源碼文件,如下:
wget https://github.com/CodisLabs/codis/archive/3.0.3.tar.gz
解壓源碼包,如下:
tar -xf 3.0.3.tar.gz
cd codis-3.0.3/

然后進(jìn)行編譯,使用make命令,如下:




這一步很慢,需要下載各種依賴(lài),然后是make gotest。
基本和go下載安裝方式一樣,不過(guò)需要說(shuō)明下,我通過(guò)源碼方式一直沒(méi)有安裝成功。報(bào)如下錯(cuò)誤:

所以以上三種安裝的方法,建議使用第一、二種,盡管有點(diǎn)慢。
四、配置codis集群
codis安裝完畢后,我們現(xiàn)在來(lái)配置codis集群。在正式配置集群之前,先創(chuàng)建相關(guān)的目錄,然后復(fù)制相關(guān)文件到新的目錄下。使用如下命令:
cd /usr/local/go/work/src/github.com/CodisLabs/codis
mkdir -p /usr/local/codis/{log,redis_conf}
cp -rf bin/ /usr/local/codis/
cp config.ini /usr/local/codis/
cp extern/redis-test/conf/6379.conf /usr/local/codis/redis_conf/20189.conf
cp extern/redis-test/conf/6380.conf /usr/local/codis/redis_conf/20190.conf

4.1 ****編輯codis配置文件
上述操作完畢后,我們來(lái)修改codis的配置文件config.ini,在此我們只需要修改相關(guān)的選項(xiàng)即可。如下:
vim /usr/local/codis/config.ini
coordinator=zookeeper
zk=192.168.1.9:2181,192.168.1.124:2181,192.168.1.231:2181
product=test
dashboard_addr=192.168.1.9:18087
password=
backend_ping_period=5
session_max_timeout=1800
session_max_bufsize=131072
session_max_pipeline=1024
zk_session_timeout=30000
proxy_id=proxy_9
該配置文件中,我們需要注意三個(gè)參數(shù):zk、dashboard_addr、proxy_id。
其中zk是表示zookeeper集群的服務(wù)器IP地址,dashboard_addr表示codis web管理的IP地址及端口,proxy_id表示codis的id,注意每臺(tái)codis服務(wù)器該值要唯一。
另外兩臺(tái)服務(wù)器的codis配置文件,內(nèi)容如下:


到此codis配置文件修改完畢。
4.2 ****編輯redis配置文件
codis配置文件修改完畢后,我們現(xiàn)在來(lái)修改redis配置文件。
每臺(tái)codis服務(wù)器上,我們要啟動(dòng)兩個(gè)redis實(shí)例(也可以啟動(dòng)多個(gè)redis實(shí)例),所以我們要配置兩個(gè)redis。如下:
vim /usr/local/codis/redis_conf/20189.conf
daemonize no
pidfile /var/run/redis20189.pid
port 20189
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile /var/log/redis/20189.log
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump20189.rdb
dir /usr/local/codis/
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename “appendonly.aof”
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
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
hll-sparse-max-bytes 3000
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
配置第二個(gè)redis實(shí)例,如下:
yes|cp /usr/local/codis/redis_conf/20189.conf /usr/local/codis/redis_conf/20190.conf
sed -i ‘s/20189/20190/g’ /usr/local/codis/redis_conf/20190.conf
mkdir -p /var/log/redis/

每臺(tái)codis服務(wù)器上redis配置完畢后,我們來(lái)啟動(dòng)redis實(shí)例,如下:
/usr/local/codis/bin/codis-server /usr/local/codis/redis_conf/20189.conf &
/usr/local/codis/bin/codis-server /usr/local/codis/redis_conf/20190.conf &
ps -ef |grep codis-server

注意:我們每臺(tái)codis服務(wù)器上的redis實(shí)例都需要啟動(dòng)。
4.3 ****啟動(dòng)codis dashboard
redis實(shí)例全部啟動(dòng)后,我們現(xiàn)在來(lái)啟動(dòng)codis的dashboard。
注意,我們一定要在192.168.1.9這臺(tái)codis服務(wù)器上啟動(dòng)該命令,這是因?yàn)槲覀冊(cè)?.1章節(jié)codis配置文件中配置的dashboard地址就是192.168.1.9。
使用如下命令啟動(dòng)dashboard:
nohup /usr/local/codis/bin/codis-config -c config.ini dashboard &
netstat -tunlp
codis dashboard訪問(wèn)端口是18087,如下:
http://codis.ilanni.com:18087/admin/

通過(guò)上圖,我們可以很明顯的看出codis dashboard已經(jīng)正常啟動(dòng)。
4.4 ****創(chuàng)建redis server分組
codis dashboard已經(jīng)正常啟動(dòng)后,我們現(xiàn)在來(lái)創(chuàng)添加redis server分組。如下:



這樣我們第一個(gè)redis server分組就創(chuàng)建完畢了,可以使用同樣的方法創(chuàng)建第二、三個(gè)分組。如下:

這樣三組redis server分組就創(chuàng)建完畢了。
當(dāng)然我們也可以通過(guò)命令進(jìn)行創(chuàng)建,如下:
/usr/local/codis/bin/codis-config server add-group 1
/usr/local/codis/bin/codis-config server add-group 2
/usr/local/codis/bin/codis-config server add-group 3
/usr/local/codis/bin/codis-config server list

注意:上述命令在三臺(tái)codis服務(wù)器上任意一臺(tái)上執(zhí)行。
到此codis的redis server分組添加完畢。
4.5 ****添加redis實(shí)例
redis server分組添加完畢后,我們現(xiàn)在來(lái)為每一個(gè)分組添加redis實(shí)例。先為group_1添加redis實(shí)例,如下:

這個(gè)里面可以填寫(xiě)任何一個(gè)codis服務(wù)器上的redis實(shí)例(哪怕不是codis服務(wù)器的redis實(shí)例),在此我們填寫(xiě)的是192.168.1.9這臺(tái)服務(wù)器上的redis實(shí)例。

可以看到group_1組的第一個(gè)redis實(shí)例,被自動(dòng)配置為master類(lèi)型。
現(xiàn)在我們來(lái)添加第二個(gè)redis實(shí)例,如下:


通過(guò)上圖,我們可以很明顯的看到第二個(gè)添加的redis實(shí)例被默認(rèn)配置為slave類(lèi)型。
注意:redis官方的支持的集群也是master-slave主從式的集群。
group_2組和group_3組的redis實(shí)例添加和上面的操作一樣,如下:

這樣三組redis實(shí)例就全部添加完畢。
當(dāng)然我們也可以通過(guò)命令進(jìn)行添加,如下:
/usr/local/codis/bin/codis-config server add 1 192.168.1.9:20189 master
/usr/local/codis/bin/codis-config server add 1 192.168.1.9:20190 slave
/usr/local/codis/bin/codis-config server add 2 192.168.1.124:20189 master
/usr/local/codis/bin/codis-config server add 2 192.168.1.124:20190 slave
/usr/local/codis/bin/codis-config server add 3 192.168.1.231:20189 master
/usr/local/codis/bin/codis-config server add 3 192.168.1.231:20190 slave
注意:上述命令中的數(shù)字,表示的是哪一個(gè)分組,master/slave表示的是所屬類(lèi)型。

我們也可以通過(guò)命令查看,各個(gè)redis server組的信息,如下:
/usr/local/codis/bin/codis-config server list

注意:每組添加的第一個(gè)redis實(shí)例不能被刪除,因?yàn)閏odis默認(rèn)把該redis實(shí)例設(shè)置為master。
到此redis server分組的redis實(shí)例添加完畢。
4.6 ****分配slot范圍
codis采用pre-sharding的技術(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的分片,默認(rèn)分成1024個(gè)slot(0-1023)。對(duì)于每個(gè)key來(lái)說(shuō),可以通過(guò)以下公式確定所屬的slot id:slotid=crc32(key)%1024。
每一個(gè)slot都會(huì)有一個(gè)且必須有一個(gè)特定的server group id來(lái)表示這個(gè)slot的數(shù)據(jù)由哪個(gè)server group來(lái)提供。
在分配slot之前,我們需要初始化slot。
在codis服務(wù)器任意一臺(tái)上執(zhí)行bin/codis-config slot init命令,該命令會(huì)在zookeeper上創(chuàng)建slot相關(guān)信息。如下:
cd /usr/local/codis
/usr/local/codis/bin/codis-config -c config.ini slot init
slot初始化完畢后,我們現(xiàn)在來(lái)分配slot范圍。如下:


上圖中的New Group Id是自定義的。

通過(guò)上圖,我們可以看到第一組slot分配成功。
現(xiàn)在來(lái)查看slot分配信息,如下:


通過(guò)上圖,我們可以很明顯的看出組1分配的slot是0-334,335以后還沒(méi)有分配?,F(xiàn)在來(lái)分配剩下的slot,如下:


這樣slot已經(jīng)全部分配完畢。
當(dāng)然我們也可以通過(guò)命令進(jìn)行分配,如下:
/usr/local/codis/bin/codis-config slot range-set 0 334 1 online
/usr/local/codis/bin/codis-config slot range-set 335 669 2 online
/usr/local/codis/bin/codis-config slot range-set 670 1023 3 online

查看slot信息,如下:
/usr/local/codis/bin/codis-config slot info 1
/usr/local/codis/bin/codis-config slot info 2
/usr/local/codis/bin/codis-config slot info 3

4.7 ****啟動(dòng)codis-proxy
以上全部配置完畢后,我們來(lái)啟動(dòng)codis-proxy,使用如下命令:
nohup /usr/local/codis/bin/codis-proxy
-c /usr/local/codis/config.ini
--log-level=error
-L /usr/local/codis/log/proxy.log
--cpu=2
--addr=192.168.1.9:19000
--http-addr=192.168.1.9:11000 &
下面對(duì)以上命令中的參數(shù)進(jìn)行解釋?zhuān)?br>
-c 配置文件地址。
-L 日志輸出文件地址。
–log-level=<loglevel> 輸出日志級(jí)別(debug<info (default)<warn<error<fatal)。
–cpu=<cpu_num> proxy占用的cpu核數(shù),默認(rèn)1,最好設(shè)置為機(jī)器的物理cpu數(shù)的一半到2/3左右。
–addr=<proxy_listen_addr> proxy的redis server監(jiān)聽(tīng)的地址, 格式<ip or hostname>:<port>, 如: localhost:9000, :9001。
–http-addr=<debug_http_server_addr> proxy的調(diào)試信息啟動(dòng)的http server,可以訪問(wèn) http://debug_http_server_addr/debug/vars。
codis-proxy啟動(dòng)后,我們可以在dashboard上進(jìn)行查看,如下:

到此codis集群就搭建完畢。
五、連接codis集群
codis集群搭建完畢后,現(xiàn)在我們來(lái)連接codis集群。要連接codis集群,我們只需要連接codis-proxy即可。即連接4.7章節(jié)中的codis-proxy服務(wù)器地址,然后加19000端口。使用redis-cli命令連接,如下:
redis-cli -h 192.168.1.9 -p 19000
info
通過(guò)上圖,我們可以很明顯的看到連接codis集群是ok的。
我們現(xiàn)在對(duì)codis集群做一些壓力測(cè)試,同時(shí)在dashboard上觀察鍵值對(duì)的情況。如下:
redis-benchmark -h 192.168.1.9 -p 19000 -c 10000 -d 100 -t set -n 100000 -r 100000
上述命令的意思是,使用redis-benchmark壓力測(cè)試命令連接codis集群,同時(shí)并發(fā)10000個(gè)(-c),測(cè)試set操作(-t),每個(gè)測(cè)試數(shù)據(jù)集是100字節(jié)(-d),請(qǐng)求數(shù)是100000(-n),使用使用隨機(jī)數(shù)插入數(shù)值(-r)。

通過(guò)上圖,可以很明顯的看到codis集群的性能還是很不錯(cuò)的呢。
而我們laravel框架中redis的配置直接填寫(xiě)codis-proxy的連接地址即可。如下:

六、其他
在codis搭建和使用過(guò)程中,我們還是會(huì)碰到一些其他問(wèn)題的,下面就稍微提下。
6.1 ****報(bào)zk節(jié)點(diǎn)不存在錯(cuò)誤
如果要kill的dashboard的話,強(qiáng)烈建議通過(guò)kill -15 pid來(lái)關(guān)閉。
如果是直接使用kill -9進(jìn)行kill的話,可能會(huì)報(bào)zk節(jié)點(diǎn)不存在錯(cuò)誤的話。
這樣的話,我們需要通過(guò)連接zookeeper集群,刪除相關(guān)節(jié)點(diǎn),然后再進(jìn)行操作。刪除節(jié)點(diǎn)操作,操作如下:
cd /usr/local/zookeeper/
./bin/zkCli.sh -server 127.0.0.1:2181
ls /zk/codis/db_test
rmr /zk/codis/db_test

6.2 ****與阿里云slb集成
在這里我們大致介紹下,codis在與阿里云的slb(負(fù)載均衡)進(jìn)行集成的線上生產(chǎn)環(huán)境的案例。
目前我們連接codis集群是通過(guò)單個(gè)codis-proxy來(lái)進(jìn)行的,如果這個(gè)節(jié)點(diǎn)掛了,就會(huì)出現(xiàn)了單點(diǎn)故障的危險(xiǎn)。
所以我們這邊在codis集群每臺(tái)服務(wù)器上,都啟動(dòng)一個(gè)codis-proxy。然后前端使用slb進(jìn)行統(tǒng)一接入,slb后端就有三臺(tái)codis-proxy服務(wù)器。
codis集群的搭建和前面是一樣的,只是在此我們的codis所在ecs(服務(wù)器)只有內(nèi)網(wǎng)IP(省錢(qián)),而且slb我們是要的也是內(nèi)網(wǎng)(省錢(qián))。如下:

這樣的話,客戶端連接slb的地址就是連接codis整個(gè)集群了,同時(shí)也避免了單點(diǎn)故障的問(wèn)題。
公司的redis有時(shí)background save db不成功,通過(guò)log發(fā)現(xiàn)下面的告警,很可能由它引起的:
[13223] 17 Mar 13:18:02.207 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
于是通過(guò)搜索,也有人跟我遇到同樣的問(wèn)題,基本可以確定是由它引起的。
**內(nèi)核參數(shù)overcommit_memory **
它是 內(nèi)存分配策略
可選值:0、1、2。0, 表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請(qǐng)?jiān)试S;否則,內(nèi)存申請(qǐng)失敗,并把錯(cuò)誤返回給應(yīng)用進(jìn)程。1, 表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何。2, 表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存
****什么是Overcommit和OOM****
Linux對(duì)大部分申請(qǐng)內(nèi)存的請(qǐng)求都回復(fù)"yes",以便能跑更多更大的程序。因?yàn)樯暾?qǐng)內(nèi)存后,并不會(huì)馬上使用內(nèi)存。這種技術(shù)叫做Overcommit。當(dāng)linux發(fā)現(xiàn)內(nèi)存不足時(shí),會(huì)發(fā)生OOM killer(OOM=out-of-memory)。它會(huì)選擇殺死一些進(jìn)程(用戶態(tài)進(jìn)程,不是內(nèi)核線程),以便釋放內(nèi)存。
當(dāng)oom-killer發(fā)生時(shí),linux會(huì)選擇殺死哪些進(jìn)程?選擇進(jìn)程的函數(shù)是oom_badness函數(shù)(在mm/oom_kill.c中),該函數(shù)會(huì)計(jì)算每個(gè)進(jìn)程的點(diǎn)數(shù)(0~1000)。點(diǎn)數(shù)越高,這個(gè)進(jìn)程越有可能被殺死。每個(gè)進(jìn)程的點(diǎn)數(shù)跟oom_score_adj有關(guān),而且oom_score_adj可以被設(shè)置(-1000最低,1000最高)。
解決方法:
/etc/sysctl.conf
vm.overcommit_memory=1 或者sysctl vm.overcommit_memory=1
或者
echo 1 > /proc/sys/vm/overcommit_memory
內(nèi)核參數(shù)說(shuō)明如下:
overcommit_memory文件指定了內(nèi)核針對(duì)內(nèi)存分配的策略,其值可以是0、1、2。
0, 表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請(qǐng)?jiān)试S;否則,內(nèi)存申請(qǐng)失敗,并把錯(cuò)誤返回給應(yīng)用進(jìn)程。 1, 表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何。2, 表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存
redis數(shù)據(jù)同步
git clone https://github.com/CodisLabs/redis-port
cd redis-port
make
./bin/redis-port sync --from 10.168.22.140:6379 --filterdb=3 --target 10.251.241.246:19000
轉(zhuǎn)自: http://www.ilanni.com/?p=11524#五、連接codis集群














