codis3.2集羣部署
(Red Hat 6.3)
軟件包下載:
鏈接: https://pan.baidu.com/s/1X_wtM04yNMJfnEtV1EcBfg 密碼: 9nkj
一、部署環境規劃
IP服務列表:
192.168.209.131 jdk、zk1、go、proxy、server、dashboard、fe
192.168.209.132 jdk、zk2、go、proxy、server
192.168.209.133 jdk、zk3、go、proxy、server
zookeeper集羣:
192.168.209.131
192.168.209.132
192.168.209.133
codis-dashboard:
192.168.209.131:18080
codis-config:
192.168.209.131:8888
codis-proxy:
192.168.209.131:19000 (11080)
192.168.209.132:19000 (11080)
192.168.209.133:19000 (11080)
codis-server:
192.168.209.131:6379(主)、192.168.209.132:6380(從)
192.168.209.132:6379(主)、192.168.209.133:6380(從)
192.168.209.133:6379(主)、192.168.209.131:6380(從)
軟件版本:
jdk-8u191-linux-x64.tar.gz
zookeeper-3.4.13.tar.gz
go1.9.1.linux-amd64.tar.gz
codis-release3.2.zip
二、安裝Jdk1.8
JDK安裝目錄/usr/local/jdk1.8.0_191:
tar -zxf jdk-8u191-linux-x64.tar.gz -C /usr/local/
vim /etc/profile
最後面添加以下幾行:
#set java enviroment
JAVA_HOME=/usr/local/jdk1.8.0_191
JRE_HOME=/usr/local/jdk1.8.0_191/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
重新加載
source /etc/profile
測試檢查是否安裝完成
java -version
三、安裝zookeeper
ZK安裝目錄/usr/local/zookeeper:
tar -zxf zookeeper-3.4.13.tar.gz -C /usr/local/
mv /usr/local/zookeeper-3.4.13 /usr/local/zookeeper
zookeeper目錄下新建data與logs文件夾
mkdir /usr/local/zookeeper/data
mkdir /usr/local/zookeeper/logs
新建配置文件/usr/local/zookeeper/conf/zoo.cfg內容如下
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/log
clientPort=2181
maxClientCnxns=300
server.1=192.168.209.131:2888:3888
server.2=192.168.209.132:2888:3888
server.3=192.168.209.133:2888:3888
參數說明:
注意防火牆,要保證3臺主機之間的端口是可以互通的。
tickTime:這個時間是作爲 Zookeeper 主機之間或客戶端與主機之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。
clientPort:這個端口就是客戶端連接 Zookeeper 主機的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶連接 Zookeeper 主機的客戶端,而是 Zookeeper 主機集羣中連接到 Leader 的 Follower 主機)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是 tickTime)長度後 Zookeeper 主機還沒有收到客戶端的返回信息,那麼表明這個客戶端連接失敗。總的時間長度就是 10*6000=60 秒
syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 5*6000=30 秒
server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號主機;B 是這個主機的 ip 地址;C 表示的是這個主機與集羣中的 Leader 主機交換信息的端口;D 表示的是萬一集羣中的 Leader 主機掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時主機相互通信的端口。如果是僞集羣的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。
設置集羣ID
#192.168.209.131主機
echo '1' > /usr/local/zookeeper/data/myid
#192.168.209.132主機
echo '2' > /usr/local/zookeeper/data/myid
#192.168.209.133主機
echo '3' > /usr/local/zookeeper/data/myid
myid對應的zoo.cfg的server.ID.比如zookeeper-node2對應的myid應該是2,不按規定設置,zookeeper集羣將無法啓動
#啓動
/usr/local/zookeeper/bin/zkServer.sh start
#停止
/usr/local/zookeeper/bin/zkServer.sh stop
#重啓
/usr/local/zookeeper/bin/zkServer.sh restart
#查看 (主:leader,備:follower)
/usr/local/zookeeper/bin/zkServer.sh status
#查看進程
ps -ef | grep zookeeper
#查看端口是否啓動
ss -tlnp | grep 2181
四、安裝go環境
go安裝目錄/usr/local/go:
tar -zxf go1.9.1.linux-amd64.tar.gz -C /usr/local/
在/etc/profile文件末尾加上以下代碼
#set go enviroment
export GOPATH=/usr/local/codis
export GOROOT=/usr/local/go
export PATH=$PATH:/usr/local/go/bin
重新加載/etc/profile
source /etc/profile
檢測是否安裝成功
go version
五、安裝codis3.2
1、安裝依賴
yum install autoconf automake libtool -y
yum install -y gcc glibc gcc-c++ make git
2、設置編譯環境
下載並編譯codis(codis-config、codis-proxy、codis-serve)
codis編譯目錄必須爲$GOPATH/src/github.com/CodisLabs,否則編譯時報找不到目錄,
將codis-release3.2.zip解壓到此目錄後改名爲codis:
unzip codis-release3.2.zip
mkdir -p $GOPATH/src/github.com/CodisLabs
mv codis-release3.2 $GOPATH/src/github.com/CodisLabs/codis
3、編譯Codis源碼
cd $GOPATH/src/github.com/CodisLabs/codis
make
當看到如下內容,編譯成功。
autogen :1
cc-silence :1
debug :0
code-coverage :0
stats :1
prof :0
prof-libunwind :0
prof-libgcc :0
prof-gcc :0
tcache :1
fill :1
utrace :0
valgrind :0
xmalloc :0
munmap :0
lazy_lock :0
tls :1
cache-oblivious :1
===============================================================================
go build -i -o bin/codis-dashboard ./cmd/dashboard
go build -i -tags "cgo_jemalloc" -o bin/codis-proxy ./cmd/proxy
go build -i -o bin/codis-admin ./cmd/admin
go build -i -o bin/codis-ha ./cmd/ha
go build -i -o bin/codis-fe ./cmd/fe
執行測試:
make gotest
執行全部指令後,會在bin文件夾內生成codis-proxy、codis-server等可執行文件。
另外bin/assets文件夾是dashboard的http服務需要的前端資源
4、配置集羣
Codis源碼編譯完成後
組件的啓動腳本目錄:$GOPATH/src/github.com/CodisLabs/codis/admin
配置文件目錄: $GOPATH/src/github.com/CodisLabs/codis/config
日誌目錄: $GOPATH/src/github.com/CodisLabs/codis/log
#複製文件,更改codis目錄,方便管理
mkdir -p /usr/local/codis/{bin,logs,data}/
cp -rf $GOPATH/src/github.com/CodisLabs/codis/bin/* /usr/local/codis/bin
cp -rf $GOPATH/src/github.com/CodisLabs/codis/config /usr/local/codis/
(1)Codis Dashboard (192.168.209.131主機)
dashboard是儀表盤,可以把其他服務綁定到監控儀表盤來進行服務管理及監控。
編輯配置文件/usr/local/codis/config/dashboard.toml
coordinator_name = "zookeeper"
coordinator_addr = "192.168.209.131:2181,192.168.209.132:2181,192.168.209.133:2181"
product_name = "codis-proxy1"
product_auth = "china2008"
admin_addr = "192.168.209.131:18080"
啓動dashboard
nohup /usr/local/codis/bin/codis-dashboard --ncpu=4 --config=/usr/local/codis/config/dashboard.toml --log=/usr/local/codis/logs/dashboard.log --log-level=WARN &
停止dashboard
必須使用命令來停止dashboard,不然會報錯。原因是已經在zk中註冊了,但是沒有正常關閉的話,zk中的信息就不能刪除,再次啓動會報錯。
/usr/local/codis/bin/codis-admin --dashboard=192.168.209.131:18080 --shutdown
(2)Codis Proxy
proxy是對外提供redis服務的入口。
編輯配置文件/usr/local/codis/config/proxy.toml
#主機192.168.209.131
product_name = "codis-proxy1"
product_auth = "china2008"
session_auth = "china2008"
admin_addr = "192.168.209.131:11080"
proto_type = "tcp4"
proxy_addr = "192.168.209.131:19000"
jodis_name = "zookeeper"
jodis_addr = "192.168.209.131:2181,192.168.209.132:2181,192.168.209.133:2181"
jodis_auth = ""
jodis_timeout = "20s"
jodis_compatible = true
#主機192.168.209.132
product_name = "codis-proxy1"
product_auth = "china2008"
session_auth = "china2008"
admin_addr = "192.168.209.132:11080"
proto_type = "tcp4"
proxy_addr = "192.168.209.132:19000"
jodis_name = "zookeeper"
jodis_addr = "192.168.209.131:2181,192.168.209.132:2181,192.168.209.133:2181"
jodis_auth = ""
jodis_timeout = "20s"
jodis_compatible = true
#主機192.168.209.133
product_name = "codis-proxy1"
product_auth = "china2008"
session_auth = "china2008"
admin_addr = "192.168.209.133:11080"
proto_type = "tcp4"
proxy_addr = "192.168.209.133:19000"
jodis_name = "zookeeper"
jodis_addr = "192.168.209.131:2181,192.168.209.132:2181,192.168.209.133:2181"
jodis_auth = ""
jodis_timeout = "20s"
jodis_compatible = true
啓動codis-proxy
nohup /usr/local/codis/bin/codis-proxy --ncpu=4 --config=/usr/local/codis/config/proxy.toml --log=/usr/local/codis/logs/proxy.log --log-level=WARN &
(3)Codis-admin
關聯proxy到dashboard
#主機192.168.209.131
/usr/local/codis/bin/codis-admin --dashboard=192.168.209.131:18080 --create-proxy -x 192.168.209.131:11080
(4)Codis-Server
即創建redis實例,每臺主機都創建2個redis實例
mkdir -p /usr/local/codis/redis/6379
mkdir -p /usr/local/codis/redis/6380
cp $GOPATH/src/github.com/CodisLabs/codis/config/redis.conf /usr/local/codis/redis/6379
cp $GOPATH/src/github.com/CodisLabs/codis/config/redis.conf /usr/local/codis/redis/6380
修改/usr/local/codis/redis/6379/redis.conf配置文件
(maxmemory一定要設置最大內存,否則後面的codis無法使用)
bind 192.168.209.131
pidfile "/usr/local/codis/redis/6379/redis.pid"
daemonize no
protected-mode yes
port 6379
dbfilename "dump_6379.rdb"
dir "/usr/local/codis/redis/6379/"
logfile "/usr/local/codis/redis/6379/redis.log"
requirepass "china2008"
maxmemory 1gb
修改/usr/local/codis/redis/6380/redis.conf配置文件
(maxmemory一定要設置最大內存,否則後面的codis無法使用)
bind 192.168.209.131
pidfile "/usr/local/codis/redis/6380/redis.pid"
daemonize no
protected-mode yes
port 6380
dbfilename "dump_6380.rdb"
dir "/usr/local/codis/redis/6380/"
logfile "/usr/local/codis/redis/6380/redis.log"
requirepass "china2008"
maxmemory 1gb
啓動codis-server
後面需要使用 Codis-fe或者Codis-admin 添加到集羣
nohup /usr/local/codis/bin/codis-server /usr/local/codis/redis/6379/redis.conf &
nohup /usr/local/codis/bin/codis-server /usr/local/codis/redis/6380/redis.conf &
(5)Codis-FE
# 啓動 codis-fe
nohup /usr/local/codis/bin/codis-fe --ncpu=4 --log=/usr/local/codis/logs/fe.log --log-level=WARN --zookeeper=192.168.209.131:2181 --listen=192.168.209.131:8888 &
通過網頁訪問:http://192.168.209.131:8888可以看到codis的管理頁面如下:
在fe界面查看、添加proxy代理服務。
proxy啓動默認會自動註冊到dashboard中,也可以在fe中手動添加,
“Proxy Admin Address”選項中分別填寫如下內容,然後點擊“New Proxy”按鈕添加
192.168.209.131:11080
192.168.209.132:11080
192.168.209.133:11080
備註:主機的codis-proxy服務需要啓動,11080端口是互通的,才能添加成功,結果如下:
部署codis-server加入集羣
添加group
Group欄爲空,因爲我們啓動的codis-server並未加入到集羣,啓動所有主機codis-server服務,
“NEW GROUP”選項分別輸入輸入1,2,3,點擊NEW GROUP添加3個Group。
添加實例(按照部署規劃,添加redis服務)
“Data Center” 選項填 空
“Codis Server Address” 選項填192.168.209.131:6379
“Group”選項填1
“Data Center” 選項填 空
“Codis Server Address” 選項填192.168.209.132:6380
“Group”選項填1
“Data Center” 選項填 空
“Codis Server Address” 選項填192.168.209.132:6379
“Group”選項填2
“Data Center” 選項填 空
“Codis Server Address” 選項填192.168.209.133:6380
“Group”選項填2
“Data Center” 選項填 空
“Codis Server Address” 選項填192.168.209.133:6379
“Group”選項填3
“Data Center” 選項填 空
“Codis Server Address” 選項填192.168.209.131:6380
“Group”選項填3
配置結果如下,圖中按鈕誤亂操作,否則會導致服務切換,若要刪除Group,需要先刪除Group對應的slots
對slots進行分組
Migrate Range選項中,輸入所要分組的slots的起和止的範圍,然後輸入組ID,點擊後面按鈕即可。
也可以直接點擊按鈕“Rebalance All Slots”,讓系統自動分配slots。
六、通過codis-proxy連接redis進行測試
/usr/local/codis/bin/redis-cli -h 192.168.209.131 -p 19000
192.168.209.131:19000> auth china2008
OK
192.168.209.131:19000> info
# Server
redis_version:3.2.11
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9435915580a7413a
redis_mode:standalone
os:Linux 2.6.32-279.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:20655
run_id:9f4c78b2bac2c4f32f4ee596875a582047ea0498
tcp_port:6379
uptime_in_seconds:3063
uptime_in_days:0
hz:10
lru_clock:8436544
executable:/usr/local/codis/bin/codis-server
config_file:/usr/local/codis/redis/6379/redis.conf
# Clients
connected_clients:97
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:5644480
used_memory_human:5.38M
used_memory_rss:14770176
used_memory_rss_human:14.09M
used_memory_peak:9451968
used_memory_peak_human:9.01M
total_system_memory:1028878336
total_system_memory_human:981.21M
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:1073741824
maxmemory_human:1.00G
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.62
mem_allocator:jemalloc-4.0.3
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1551938262
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:109
total_commands_processed:12274
instantaneous_ops_per_sec:3
total_net_input_bytes:426408
total_net_output_bytes:5992109
instantaneous_input_kbps:0.11
instantaneous_output_kbps:2.81
rejected_connections:0
sync_full:1
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:13624
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.209.132,port=6380,state=online,offset=4295,lag=1
master_repl_offset:4295
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:4294
# CPU
used_cpu_sys:4.44
used_cpu_user:2.40
used_cpu_sys_children:0.09
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
192.168.209.131:19000> set id 001
OK
192.168.209.131:19000> get id
"001"
192.168.209.131:19000> set name jack
OK
192.168.209.131:19000> get name
"jack"
web界面驗證key是否添加完成,可以看到已經添加到了group1和group2中:
連接zookeeper,檢查codis的group,slots,proxy等信息是否記錄在zook中
/usr/local/zookeeper/bin/zkCli.sh -server
多個客戶端壓力測試效果如下:
/usr/local/codis/bin/redis-benchmark -h 192.168.209.131 -p 19000 -a china2008 -q -n 1000000 -c 20 -d 100k
/usr/local/codis/bin/redis-benchmark -h 192.168.209.132 -p 19000 -a china2008 -q -n 1000000 -c 20 -d 100k
/usr/local/codis/bin/redis-benchmark -h 192.168.209.133 -p 19000 -a china2008 -q -n 1000000 -c 20 -d 100k
/usr/local/codis/bin/redis-benchmark -h 192.168.209.133 -p 19000 -a china2008 -t set -r 100000 -n 1000000
其他注意事項:
(1) 修復異常退出的 Codis-dashboard
dashboard 非正常退出,或者 kill -9 時使用
/usr/local/codis/bin/codis-admin --remove-lock --product=codis-proxy1 --zookeeper=192.168.209.131:2181
(2)修復異常退出的 Codis-proxy
proxy 非正常退出,或者 kill -9 時使用
/usr/local/codis/bin/codis-admin --dashboard=192.168.209.131:18080 --remove-proxy --addr=192.168.209.131:11080 –force
(3)redis密碼和codis密碼要設置相同,否則通過fe頁面添加集羣配置時會報密碼錯誤
(4)設置編譯環境,編譯目錄必須爲$GOPATH/src/github.com/CodisLabs否則報錯
go build -i -o bin/codis-dashboard ./cmd/dashboard
cmd/dashboard/main.go:19:2:cannot find package "github.com/CodisLabs/codis/pkg/models" in any of:
/usr/local/go/src/github.com/CodisLabs/codis/pkg/models (from $GOROOT)
/usr/local/codis/src/github.com/CodisLabs/codis/pkg/models (from $GOPATH)
cmd/dashboard/main.go:20:2:cannot find package "github.com/CodisLabs/codis/pkg/topom" in any of:
/usr/local/go/src/github.com/CodisLabs/codis/pkg/topom (from $GOROOT)
/usr/local/codis/src/github.com/CodisLabs/codis/pkg/topom (from $GOPATH)
cmd/dashboard/main.go:21:2:cannot find package "github.com/CodisLabs/codis/pkg/utils" in any of:
/usr/local/go/src/github.com/CodisLabs/codis/pkg/utils (from $GOROOT)
/usr/local/codis/src/github.com/CodisLabs/codis/pkg/utils (from $GOPATH)
cmd/dashboard/main.go:22:2:cannot find package "github.com/CodisLabs/codis/pkg/utils/log" in any of:
/usr/local/go/src/github.com/CodisLabs/codis/pkg/utils/log (from $GOROOT)
/usr/local/codis/src/github.com/CodisLabs/codis/pkg/utils/log (from $GOPATH)
cmd/dashboard/main.go:17:2:cannot find package "github.com/docopt/docopt-go" in any of:
/usr/local/go/src/github.com/docopt/docopt-go (from $GOROOT)
/usr/local/codis/src/github.com/docopt/docopt-go (from $GOPATH)
make:*** [codis-dashboard] Error 1