1. 程式人生 > >codis叢集 搭建

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 = 10

jodis_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 = 10

jodis_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

  1. 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例項

  1. ./bin/codis-admin --dashboard=127.0.0.1:18080 --create-group --gid=1         #新建group 1  相當於fe頁面“NEW GROUP”按鈕  
  2. ./bin/codis-admin --dashboard=127.0.0.1:18080 --group-add     --gid=1   --addr=127.0.0.1:6379   #把server127.0.0.1:6379加入叢集,  
  3. 相當於fe頁面的"Add Server “按鈕,其他server以此類推。  

第七步:主從同步

  1. ./bin/codis-admin  --dashboard=127.0.0.1:18080 --sync-action --create --addr=127.0.0.1:6379  相當於fe頁面的”SYNC"按鈕  
  2. ./bin/codis-admin  --dashboard=127.0.0.1:18080 --sync-action --create --addr=127.0.0.1:6380  #所有server都要執行  
  3. 以上命令實現group1:6379 主  6380 從    同步,自動選取第一個為master,其他為slave,其他組同樣執行上述命令  

第八步:GROUP自動槽位分配

  1. ./bin/codis-admin  --dashboard=127.0.0.1:18080 --rebalance --confirm  相當於fe頁面“Rebalance All Slots”按鈕  
  2. 注:也可以定製化的分配槽位./bin/codis-admin  --dashboard=127.0.0.1:18080 --slot-action --create-range --beg=0 --end=300   --gid=1  

第八步:啟動CODIS-SERVER sentinel服務

  1. 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

  1. 然後啟動服務:  
  2. nohup ./bin/codis-server ./config/sentinel.conf --sentinel &  
  3. nohup ./bin/codis-server ./config/sentinel2.conf --sentinel &  
  4. 然後關聯叢集:(同fe頁面“Add Sentinel”按鈕)  
  5. ./bin/codis-admin  --dashboard=127.0.0.1:18080 --sentinel-add   --addr=127.0.0.1:26379  
  6. ./bin/codis-admin  --dashboard=127.0.0.1:18080 --sentinel-add   --addr=127.0.0.1:26579  
  7. 然後執行sync操作:(同fe頁面”SYNC"按鈕)  
  8. ./bin/codis-admin  --dashboard=127.0.0.1:18080 --sentinel-resync  

三、JODIS連線叢集

  1. JedisResourcePool jedisPool = RoundRobinJedisPool.create()  
  2.                 .curatorClient("127.0.0.1:2181"30000).zkProxyDir("/jodis/codis-demo").build();  
  3.         try (Jedis jedis = jedisPool.getResource()) {  
  4.             jedis.set("foo""bar");  
  5.             String value = jedis.get("foo");  
  6.             System.out.println(value);  
  7.         }