codis叢集 搭建
CODIS(release3.2.0)叢集搭建
一、CODIS安裝
注:在Mac下測試需要獨立安裝autoconf (如何安裝autoconf),可能需要關注一下版本。
準備工作:版本可以不一樣,都可以去官網下載
2.2 Go使用版本:go1.5.2.Linux-amd64.tar.gz
https://golang.org/doc/install?download=go1.5.2.linux-amd64.tar.gz
2.3 jdk版本:jdk1.8.0_11
http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-linux-x64.tar.gz
2.4 zookeeper版本:zookeeper-3.4.8.tar.g
2.5 codis包
Codis 原始碼需要下載到 $GOPATH/src/github.com/CodisLabs/codis
:
設定編譯環境
注意 $GOPATH
是本機所有第三方庫 go 專案所在目錄,Codis 僅是其中之一。
新增 $GOPATH/bin
到 $PATH
,例如:PATH=$PATH:$GOPATH/bin
。
$ mkdir -p $GOPATH/src/github.com/CodisLabs $ cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2 cd $GOPATH/src/github.com/CodisLabs/codis $ make
二、簡單叢集搭建
1. CODIS叢集架構
CODIS-FE是叢集管理介面,CODIS-DASHBOARD是叢集管理中心,Storage是外部儲存(註冊中心)例如FileSystem、ETCD、Zookeeper,redis-sentinel是redis類似的高可用機制支援自動主從切換(HA),CODIS-PROXY是底層CODIS-SERVER叢集代理,CODIS-GROUP沒有對應的元件是一個虛擬的節點機制通過槽位對映機制實現PROXY與SERVER的對映。官方給出了快速的叢集搭建方法:【官方】官方快速搭建,大致分為以下幾步:
- cd$GOPATH/src/github.com/CodisLabs/codis/admin
./admin/codis-dashboard-admin.sh start 啟動
CODIS-DASHBOARD 外部儲存filesystem(/tmp/codis)./admin/codis-proxy-admin.sh start 啟動
CODIS-PROXY 並加入CODIS-DASHBOARD管理./admin/codis-server-admin.sh start 啟動
CODIS-SERVER./admin/codis-fe-admin.sh start 啟動
CODIS-FE,可以通過127.0.0.1:9090訪問管理介面- 在CODIS-FE介面通過“NEW GROUP”新建一個CODIS-GROUP,然後通過按鈕“Add Server”把CODIS-SERVER註冊到CODIS-DASHBOARD,預設地址是127.0.0.1:6379,然後點選“rebalance all slots”自動給各個分組分配槽位。
這樣就可以通過redis客戶端連線指定的proxy,例如:/usr/local/redis/bin/redis-cli -p 19000,但是這樣並沒有搭建一個叢集,因為只有單一的proxy,單一的server,沒有多個分組,沒有使用zookeeper,etcd沒法使用jodis,needs,同時也沒有啟動涉及到主從同步操作,沒有啟動redid-sentinel,沒有實現高可用。
三、CODIS叢集搭建進階(單機-多機類似)
第一步:啟動Zookeeper (具體過程不贅述)
zk地址127.0.0.1:2181,
然後cd$GOPATH/src/github.com/CodisLabs/codis
第二步:啟動CODIS-DASHBOARD
編輯配置檔案
vim ./config/dashboard.toml
# Set Coordinator, only accept "zookeeper" & "etcd" coordinator_name = "zookeeper" coordinator_addr = "127.0.0.1:2181" #如果是叢集多個環境以“,”隔開 # Set Codis Product {Name/Auth}. product_name = "codis-demo” #區分不同的叢集,註冊到zookeeper也是用這個區分,這個配置很重要,直接影響後面訪問的路徑 product_auth = ""# Set bind address for admin(rpc), tcp only. admin_addr = "0.0.0.0:18080” #用於dashboard與codas-proxy,codis-server進行tcp通訊 |
nohup ./bin/codis-dashboard --ncpu=4 --config=./config/dashboard.toml --log=./log/dashboard.log --log-level=WARN &
第三步:啟動CODIS-FE
nohup ./bin/codis-fe --ncpu=4 --log=./log/fe.log --log-level=WARN --zookeeper=127.0.0.1:2181 --listen=ip:8080 &
注:--zookeeper=後面接zookeeper連線地址,—listen=是fe的介面登入
FE的地址此處為http://ip:8080
第四步:啟動CODIS-PROXY
編輯配置檔案 (只列舉必修項,其他採用預設,等需要時在研究)
vim ./config/proxy.toml,vim ./config/proxy2.toml
# Set Codis Product {Name/Auth}. product_name = "codis-demo” #同codis-dashboard中配置 product_auth = ""# Set bind address for admin(rpc), tcp only. admin_addr = "0.0.0.0:11080” #用於和codis-dashboard進行tcp通訊同步資訊 # Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket". proto_type = "tcp4" proxy_addr = "0.0.0.0:19000” #用於redis客戶端連線,支援redis協議,埠唯一 # Set jodis address & session timeout. jodis_name = “zookeeper” #用於jodis從zookeeper獲取叢集proxy資訊,目前只支援zookeeper,etcd jodis_addr = "127.0.0.1:2181” jodis_timeout = 10jodis_compatible = false |
# Set Codis Product {Name/Auth}. product_name = "codis-demo” #同codis-dashboard中配置 product_auth = ""# Set bind address for admin(rpc), tcp only. admin_addr = "0.0.0.0:11081” #用於和codis-dashboard進行tcp通訊同步資訊 # Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket". proto_type = "tcp4" proxy_addr = "0.0.0.0:19001” #用於redis客戶端連線,支援redis協議,埠唯一 # Set jodis address & session timeout. jodis_name = “zookeeper” #用於jodis從zookeeper獲取叢集proxy資訊,目前只支援zookeeper,etcd jodis_addr = "127.0.0.1:2181” #zk叢集 jodis_timeout = 10jodis_compatible = false |
nohup ./bin/codis-proxy --ncpu=4 --config=./config/proxy.toml --log=./log/proxy.log --log-level=WARN &
nohup ./bin/codis-proxy --ncpu=4 --config=./config/proxy2.toml --log=./log/proxy.log --log-level=WARN &
以上操作啟動了兩個codis-proxy,但是它們還是遊離的,沒有加入codis-dashboard管理,也沒有與任何codis-server建立聯絡,可以通過下面的方法加入codas-dashboard(codis-proxy是通過codis-dashboard來獲取codis-server相關的資訊,大致是客戶端向proxy發起請求,proxy通過slotId=crc32(key)%1024來獲取槽位,從而知道groupId,確定分組之後就知道需要連線的master server):
./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.0.0.1:11080
./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.0.0.1:11081
第五步:啟動CODIS-SERVER
- vim ./config/redis.conf (還有redis_6380.conf redis_6579.conf redis_6580.conf redis_6679.conf redis_6680.conf redis_6879.conf redis_6880.conf),需要修改的有:
pidfile /var/run/redis_6379.pid port 6379 logfile /var/log/redis_6379.log dbfilename dump_6379.rdb |
執行: ./bin/codis-server ./config/redis.conf ./bin/codis-server ./config/redis_6380.conf …... |
group1:6379 主 6380 從 group2:6579 主 6580 從 group3:6679 主 6680 從 group4:6879 主 6880 從 |
第六步:建立CODIS-GROUP
以下可以在FE介面上去執行,主要是啟動每臺機器的proxy和 redis例項
- ./bin/codis-admin --dashboard=127.0.0.1:18080 --create-group --gid=1 #新建group 1 相當於fe頁面“NEW GROUP”按鈕
- ./bin/codis-admin --dashboard=127.0.0.1:18080 --group-add --gid=1 --addr=127.0.0.1:6379 #把server127.0.0.1:6379加入叢集,
- 相當於fe頁面的"Add Server “按鈕,其他server以此類推。
第七步:主從同步
- ./bin/codis-admin --dashboard=127.0.0.1:18080 --sync-action --create --addr=127.0.0.1:6379 相當於fe頁面的”SYNC"按鈕
- ./bin/codis-admin --dashboard=127.0.0.1:18080 --sync-action --create --addr=127.0.0.1:6380 #所有server都要執行
- 以上命令實現group1:6379 主 6380 從 同步,自動選取第一個為master,其他為slave,其他組同樣執行上述命令
第八步:GROUP自動槽位分配
- ./bin/codis-admin --dashboard=127.0.0.1:18080 --rebalance --confirm 相當於fe頁面“Rebalance All Slots”按鈕
- 注:也可以定製化的分配槽位./bin/codis-admin --dashboard=127.0.0.1:18080 --slot-action --create-range --beg=0 --end=300 --gid=1
第八步:啟動CODIS-SERVER sentinel服務
- vim ./config/sentinel.conf (and vim ./config/sentinel2.conf)
sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 10000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 5 sentinel monitor mymaster2 127.0.0.1 6579 2 sentinel down-after-milliseconds mymaster2 10000 sentinel failover-timeout mymaster2 180000 sentinel parallel-syncs mymaster2 5 sentinel monitor mymaster3 127.0.0.1 6679 2 sentinel down-after-milliseconds mymaster3 10000 sentinel failover-timeout mymaster3 180000 sentinel parallel-syncs mymaster3 5 sentinel monitor mymaster4 127.0.0.1 6879 2 sentinel down-after-milliseconds mymaster4 10000 sentinel failover-timeout mymaster4 180000 sentinel parallel-syncs mymaster4 5 |
兩個檔案不同配置: port 26379 port 26579 |
- 然後啟動服務:
- nohup ./bin/codis-server ./config/sentinel.conf --sentinel &
- nohup ./bin/codis-server ./config/sentinel2.conf --sentinel &
- 然後關聯叢集:(同fe頁面“Add Sentinel”按鈕)
- ./bin/codis-admin --dashboard=127.0.0.1:18080 --sentinel-add --addr=127.0.0.1:26379
- ./bin/codis-admin --dashboard=127.0.0.1:18080 --sentinel-add --addr=127.0.0.1:26579
- 然後執行sync操作:(同fe頁面”SYNC"按鈕)
- ./bin/codis-admin --dashboard=127.0.0.1:18080 --sentinel-resync
三、JODIS連線叢集
- JedisResourcePool jedisPool = RoundRobinJedisPool.create()
- .curatorClient("127.0.0.1:2181", 30000).zkProxyDir("/jodis/codis-demo").build();
- try (Jedis jedis = jedisPool.getResource()) {
- jedis.set("foo", "bar");
- String value = jedis.get("foo");
- System.out.println(value);
- }