一。名詞解釋:
Codis Server:基于 redis-3.2.8 分支開發(fā)。增加了額外的數(shù)據(jù)結(jié)構(gòu),以支持 slot 有關(guān)的操作以及數(shù)據(jù)遷移指令。具體的修改可以參考文檔redis 的修改。
Codis Proxy:客戶端連接的 Redis 代理服務(wù), 實(shí)現(xiàn)了 Redis 協(xié)議。 除部分命令不支持以外,表現(xiàn)的和原生的 Redis 沒(méi)有區(qū)別(就像 Twemproxy)。對(duì)于同一個(gè)業(yè)務(wù)集群而言,可以同時(shí)部署多個(gè) codis-proxy 實(shí)例;不同 codis-proxy 之間由 codis-dashboard 保證狀態(tài)同步。
Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、刪除,以及據(jù)遷移等操作。在集群狀態(tài)發(fā)生改變時(shí),codis-dashboard 維護(hù)集群下所有 codis-proxy 的狀態(tài)的一致性。對(duì)于同一個(gè)業(yè)務(wù)集群而言,同一個(gè)時(shí)刻 codis-dashboard 只能有 0個(gè)或者1個(gè);(單點(diǎn)?)所有對(duì)集群的修改都必須通過(guò) codis-dashboard 完成。
Codis Admin:集群管理的命令行工具。可用于控制 codis-proxy、codis-dashboard 狀態(tài)以及訪問(wèn)外部存儲(chǔ)。
Codis FE:集群管理界面。多個(gè)集群實(shí)例共享可以共享同一個(gè)前端展示頁(yè)面;通過(guò)配置文件管理后端 codis-dashboard 列表,配置文件可自動(dòng)更新。
Storage:為集群狀態(tài)提供外部存儲(chǔ)。提供 Namespace 概念,不同集群的會(huì)按照不同 product name 進(jìn)行組織;目前僅提供了 Zookeeper、Etcd、Fs 三種實(shí)現(xiàn),但是提供了抽象的 interface 可自行擴(kuò)展。
安裝包下載
#go:?wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
#zookeeper:?wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
#codis:?git clone https://github.com/CodisLabs/codis.git -b release3.2
一。 codis 部署
1:解壓:
tar -xf zookeeper-3.4.12.tar.gz
mv zookeeper-3.4.12 /usr/local/zookeeper
2:編輯配置文件:
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
配置文件(zoo.cfg)見下面,對(duì)比單機(jī)模式多了server.ID
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
#要是一臺(tái)裝三個(gè)zk,可以按照端口區(qū)分:192.168.163.131:2887:3887/192.168.163.132:2887:3887/192.168.163.133:2887:3887
server.1=192.168.163.131:2888:3888
server.2=192.168.163.132:2888:3888
server.3=192.168.163.133:2888:3888
注意:2888表示zookeeper監(jiān)聽端口,3888表示zookeeper選舉通信端口;以上server.1 server.2 server.3都要配置到三臺(tái)zookeeper的zoo.cfg文件。
配置說(shuō)明:
集群模式中, 集群中的每臺(tái)機(jī)器都需要感知其它機(jī)器, 在 zoo.cfg 配置文件中, 可以按照如下格式進(jìn)行配置, 每一行代表一臺(tái)服務(wù)器配置:server.id=host:port:port
id 被稱為 Server ID, 用來(lái)標(biāo)識(shí)服務(wù)器在集群中的序號(hào)。同時(shí)每臺(tái) ZooKeeper 服務(wù)器上, 都需要在數(shù)據(jù)目錄(即 dataDir 指定的目錄) 下創(chuàng)建一個(gè) myid 文件, 該文件只有一行內(nèi)容, 即對(duì)應(yīng)于每臺(tái)服務(wù)器的Server ID。
ZooKeeper 集群中, 每臺(tái)服務(wù)器上的 zoo.cfg 配置文件內(nèi)容一致。
server.1 的 myid 文件內(nèi)容就是 "1"。每個(gè)服務(wù)器的 myid 內(nèi)容都不同, 且需要保證和自己的 zoo.cfg 配置文件中 "server.id=host:port:port" 的 id 值一致。
id 的范圍是 1 ~ 255。
創(chuàng)建myid文件:設(shè)置zookeeper的id,和server.ID對(duì)應(yīng)。
在 dataDir 指定的目錄下 (即 /data/zookeeper/data 目錄) 創(chuàng)建名為 myid 的文件, 文件內(nèi)容和 zoo.cfg 中當(dāng)前機(jī)器的 id 一致。根據(jù)上述配置, master 的 myid 文件內(nèi)容為 1。
按照相同步驟, 為 132 和 133 配置 zoo.cfg 和 myid 文件。zoo.cfg文件內(nèi)容相同, 132 的 myid 文件內(nèi)容為 2, 133 的 myid 文件內(nèi)容為 3。
#在第1臺(tái)zookeeper(192.168.163.131)上設(shè)置id=1
echo "1" >/data/zookeeper/data/myid
#在第2臺(tái)zookeeper(192.168.163.132)上設(shè)置id=2
echo "2" >/data/zookeeper/data/myid
#在第3臺(tái)zookeeper(192.168.163.133)上設(shè)置id=3
echo "3" >/data/zookeeper/data/myid
三臺(tái)啟動(dòng):zkServer.sh start
# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
zkServer.sh status
root@test1:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
root@test2:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
root@test3:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
關(guān)閉:zkServer.sh stop
root@test2:~#zkServer.sh stop
ZooKeeper JMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
到此Zookeeper安裝完畢。
新建codis-server(redis):三臺(tái)上都安裝
cp/usr/local/codis/extern/redis-3.2.11/redis.conf /etc/codis/codis-server/redis7021.conf
修改redis7021.conf:
# bind 127.0.0.1
protected-mode no
port 7021
daemonize yes
pidfile /var/lib/redis_7021/redis_7021.pid
logfile "/var/lib/redis_7021/redis_7021.log"
dbfilename 7021dump.rdb
dir /var/lib/redis_7021/
appendfilename ?"7021appendonly.aof"
創(chuàng)建配置文件里所需的目錄:
mkdir/var/lib/redis_7021
再新建一個(gè)codis-server:
cd /etc/codis/codis-server
cp redis7021.conf redis7022.conf?
sed-i"s/7021/7022/g" redis7022.conf mkdir/var/lib/redis_7022
開啟codis-server:
codis-server /etc/codis/codis-server/redis7021.conf
codis-server /etc/codis/codis-server/redis7022.conf
說(shuō)明:每臺(tái)機(jī)器上有2個(gè)codis-server實(shí)例,端口為:7021、7022,沒(méi)有做主從。為了防止單點(diǎn)的問(wèn)題,可以交錯(cuò)的設(shè)置主從,防止一臺(tái)服務(wù)器掛掉,codis-server不可用。如下表格所示:
Group ? ? ?主 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?從
1 ? ? ? ? ? ?192.168.163.131:7021 ? ? ? ? ? ? ? ? ? ?192.168.163.132:7022
2 ? ? ? ? ? ?192.168.163.132:7021 ? ? ? ? ? ? ? ? ? ?192.168.163.133:7022
3 ? ? ? ? ? ?192.168.163.133:7021 ? ? ? ? ? ? ? ? ? ?192.168.163.131:7022
通過(guò)codis-fe ?添加各個(gè)Group節(jié)點(diǎn):需要先開啟 codis-dashboard 和 codis-fe,在?⑤?之后操作。
③ 配置codis-dashboard(一臺(tái))
cd /etc/codis/codis-dashboard/?
cp/usr/local/codis/config/dashboard.toml ?/etc/codis/codis-dashboard/
修改配置:vim /etc/codis/codis-dashboard/dashboard.toml
##################################################
#? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
#? ? ? ? ? ? ? ? ? Codis-Dashboard? ? ? ? ? ? ? #
#? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
##################################################
# Set Coordinator, only accept "zookeeper"&"etcd"&"filesystem".
# forzookeeper/etcd, coorinator_auth accept"user:password"
# Quick Start
#coordinator_name ="filesystem"
#coordinator_addr ="/tmp/codis"
coordinator_name ="zookeeper"
coordinator_addr ="192.168.163.131:2181,192.168.163.132:2181,192.168.163.133:2181"??
#zk地址,多個(gè)逗號(hào)隔開
#coordinator_auth =""
# Set Codis Product Name/Auth.
product_name ="codis-testX"?
#集群名稱product_auth ="" ? ? ?#集群密碼
# Set bind address foradmin(rpc), tcp only.
admin_addr ="192.168.163.131:18080" ? ? ? ? #restful api地址
# Set arguments fordata migration (only accept'sync'&'semi-async').
migration_method ="semi-async"
migration_parallel_slots =100
migration_async_maxbulks =200
migration_async_maxbytes ="32mb"
migration_async_numkeys =500
migration_timeout ="30s"
# Set configs for redis sentinel.
sentinel_client_timeout ="10s"
sentinel_quorum =2
sentinel_parallel_syncs =1
sentinel_down_after ="30s"
sentinel_failover_timeout ="5m"
sentinel_notification_script =""
sentinel_client_reconfig_script =""
coordinator_name外部存儲(chǔ)類型,接受 zookeeper/etcd
coordinator_addr外部存儲(chǔ)地址
product_name集群名稱,滿足正則\w[\w\.\-]*
product_auth集群密碼,默認(rèn)為空
admin_addrRESTful API 端口
創(chuàng)建codis日志目錄(存放codis所有l(wèi)og):
mkdir/usr/local/codis/logs
啟動(dòng)codis-dashboard服務(wù):(一臺(tái))
codis-dashboard --ncpu=1--config=/etc/codis/codis-dashboard/dashboard.toml --log=/usr/local/codis/logs/dashboard.log --log-level=warn &
參數(shù)說(shuō)明:##--ncpu=N 最大使用 CPU 個(gè)數(shù);
## -c? CONF, --config=CONF 指定啟動(dòng)配置文件;
## -l? FILE, --log=FILE 設(shè)置 log 輸出文件;
##--log-level=LEVEL 設(shè)置 log 輸出等級(jí):INFO,WARN,DEBUG,ERROR;默認(rèn)INFO,推薦WARN;
##對(duì)于同一個(gè)業(yè)務(wù)集群而言,可以同時(shí)部署多個(gè)codis-proxy 實(shí)例;
##不同 codis-proxy 之間由 codis-dashboard 保證狀態(tài)同步。
關(guān)閉codis-dashboard服務(wù):
codis-admin --dashboard=192.168.163.131:18080--shutdown
④:配置codis-proxy(三臺(tái)):每臺(tái)配置一個(gè)Proxy,也可以一臺(tái)配置多個(gè)Proxy。
注意參數(shù):proxy_max_clients
cd /etc/codis/codis-proxy/cp/usr/local/codis/config/proxy.toml /etc/codis/codis-proxy/
修改配置:vim /etc/codis/codis-proxy/proxy.toml
##################################################
#? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
#? ? ? ? ? ? ? ? ? Codis-Proxy? ? ? ? ? ? ? ? ? #
#? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
##################################################
# Set Codis Product Name/Auth.
product_name ="codis-testX" ? ? ? ? ? #和dashboard對(duì)應(yīng)
product_auth =""
# Set auth for client session
#? 1. product_auth is usedforauth validation among codis-dashboard,
#? ? ? codis-proxy and codis-server.
#? 2. session_auth is different from product_auth, it requires clients
#? ? ? to issue AUTH before processing any other commands.
session_auth =""
# Set bind address foradmin(rpc), tcp only.
admin_addr ="192.168.163.131:11080" ? ? ? ? ?#同一臺(tái)服務(wù)器可以根據(jù)端口創(chuàng)建多個(gè)Proxy
# Set bind address forproxy, proto_type can be"tcp","tcp4","tcp6","unix"or"unixpacket".
proto_type ="tcp4"
proxy_addr ="192.168.163.131:19000" ? ? ? ? ??#同一臺(tái)服務(wù)器可以根據(jù)端口創(chuàng)建多個(gè)Proxy
# Set jodis address & session timeout
#? 1. jodis_name isshortforjodis_coordinator_name, only accept"zookeeper"&"etcd".
#? 2. jodis_addr isshortfor jodis_coordinator_addr
#? 3. jodis_auth isshortforjodis_coordinator_auth,forzookeeper/etcd,"user:password" is accepted.
#? 4. proxy will be registered as node:
#? ? ? ? ifjodis_compatible =true (not suggested):
#? ? ? ? ? /zk/codis/db_{PRODUCT_NAME}/proxy-{HASHID} (compatible with Codis2.0)
#? ? ? ? or else#? ? ? ? ? /jodis/{PRODUCT_NAME}/proxy-{HASHID}
jodis_name ="zookeeper"
jodis_addr="192.168.163.131:2181,192.168.163.132:2181,192.168.163.133:2181"
jodis_auth =""
jodis_timeout ="20s"
jodis_compatible =false...
...
參數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說(shuō)明:
product_name ? ? ? ? ? ? ? ? ? ? ? ? ?集群名稱,參考 dashboard 參數(shù)說(shuō)明
product_auth ? ? ? ? ? ? ? ? ? ? ? ? ? ?集群密碼,默認(rèn)為空
admin_addr ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?RESTful API 端口
proto_typeRedis ? ? ? ? ? ? ? ? ? ? ? 端口類型,接受 tcp/tcp4/tcp6/unix/unixpacket
proxy_addrRedis ? ? ? ? ? ? ? ? ? ? ? 端口地址或者路徑
jodis_addr ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Jodis 注冊(cè) zookeeper 地址
jodis_timeoutJodis ? ? ? ? ? ? ? ? ? ? ?注冊(cè) session timeout 時(shí)間,單位 second
jodis_compatibleJodis ? ? ? ? ? ? ? ? 注冊(cè) zookeeper 的路徑
backend_ping_period ? ? ? ? ? ? ? ? ? 與 codis-server 探活周期,單位 second,0 表示禁止
session_max_timeout與 client ? ? ? 連接最大讀超時(shí),單位 second,0 表示禁止
session_max_bufsize與 client ? ? ? ? 連接讀寫緩沖區(qū)大小,單位 byte
session_max_pipeline與 client ? ? ? ? 連接最大的 pipeline 大小
session_keepalive_period ? ? ? ? ? ? ? ? 與 client 的 tcp keepalive 周期,僅 tcp 有效,0 表示禁止
啟動(dòng)codis-proxy服務(wù)(三臺(tái)):
codis-proxy --ncpu=1--config=/etc/codis/codis-proxy/proxy.toml --log=/usr/local/codis/logs/proxy.log --log-level=warn &
codis-proxy 啟動(dòng)后,處于waitingonline 狀態(tài)(日志查詢),監(jiān)聽proxy_addr地址,但是不會(huì)accept連接,添加到集群并完成集群狀態(tài)的同步,才能改變狀態(tài)為online。添加的方法有以下兩種:
通過(guò) codis-fe 添加:通過(guò)Add Proxy按鈕,將admin_addr加入到集群中;⑤之后。
通過(guò) codis-admin 命令行工具添加,方法如下:
codis-admin --dashboard=192.168.163.131:18080 --create-proxy -x 192.168.163.131:11080
其中192.168.163.131:18080以及192.168.163.131:11080分別為 dashboard 和 proxy 的admin_addr地址;可以在后面的codis-fe里看到
添加過(guò)程中,dashboard 會(huì)完成如下一系列動(dòng)作:
獲取 proxy 信息,對(duì)集群 name 以及 auth 進(jìn)行驗(yàn)證,并將其信息寫入到外部存儲(chǔ)中(zookeeper);
同步 slots 狀態(tài);
標(biāo)記 proxy 狀態(tài)為online,此后 proxy 開始accept連接并開始提供服務(wù);
停止codis-proxy服務(wù):
codis-admin --proxy=192.168.163.131:11080 --shutdown
注意:直接kill Proxy進(jìn)程zk的codis3里會(huì)有殘留數(shù)據(jù),建議codis-admin方式停codis-proxy服務(wù)?
⑤:配置codis-fe(一臺(tái))
配置文件 codis.json 可以手動(dòng)編輯,也可以通過(guò) codis-admin 從外部存儲(chǔ)中拉取:
cd /etc/codis/codis-fe/
codis-admin --dashboard-list --zookeeper=192.168.163.131:2181 | teecodis.json
啟動(dòng)codis-fe:
codis-fe --ncpu=1--dashboard-list=/etc/codis/codis-fe/codis.json --listen=192.168.163.131:18090--log=/usr/local/codis/logs/fe.log --log-level=warn --assets-dir=/usr/local/codis/bin/assets/ &
關(guān)閉codis-fe:
ps-ef | grep codis-fe| grep-v grep| awk'{print $2}'| xargs ? kill