一.codis介紹
- Codis是一個分佈式Redis解決方案,對於上層的應用來講,鏈接到Codis Proxy和鏈接原生的RedisServer沒有明顯的區別,有部分命令不支持
- Codis底層會處理請求的轉發,不停機的數據遷移等工做,全部後邊的一切事情,對於前面的客戶端來講是透明的,能夠簡單的認爲後邊鏈接的是一個內存無限大的Redis服務.
- Codis由四部分組成
- Codis-proxy:實現redis協議,因爲自己是無狀態的,所以能夠部署不少個節點
- Codis-config :是codis的管理工具,包括添加/刪除redis節點添加刪除proxy節點,發起數據遷移等操做,自帶httpserver,支持管理後臺方式管理配置
- Codis-server :是codis維護的redis分支,基於2.8.21分支,加入了slot的支持和原子的數據遷移指令; codis-proxy和codis-config只能和這個版本的redis交互才能正常運行
- Zookeeper,用於codis集羣元數據的存儲,維護codis集羣節點
二.Codis優缺點
優勢
- 對客戶端透明,與codis交互方式和redis自己交互同樣
- 支持在線數據遷移,遷移過程對客戶端透明有簡單的管理和監控界面
- 支持高可用,不管是redis數據存儲仍是代理節點
- 自動進行數據的均衡分配
- 最大支持1024個redis實例,存儲容量海量
- 高性能
缺點
- 採用自有的redis分支,不能與原版的redis保持同步
- 若是codis的proxy只有一個的狀況下, redis的性能會降低20%左右
- 某些命令不支持,好比事務命令muti
- 國內開源產品,活躍度相對弱一些
三.部署codis,並寫代碼訪問codis
3.1 zookeeper
- 1.三集羣節點
172.16.10.142 zoo1 172.16.10.143 zoo2 172.16.10.144 zoo3 # 確保每一個節點hostname -i返回的是正確IP地址
- 2.獲取安裝軟件
wget http://apache.fayea.com/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz scp -rp zookeeper-3.4.12 172.16.10.143:/usr/local scp -rp zookeeper-3.4.12 172.16.10.144:/usr/local mv zookeeper-3.4.12 /usr/local/zookeeper-3.4.12/
- 3.設置環境變量
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.12/ export PATH=$PATH:$ZOOKEEPER_HOME/bin
- 4.單機環境配置文件
cd /usr/local/zookeeper-3.4.12/conf
cp -rp zoo_sample.cfg zoo.cfg
vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/log
clientPort=2181
# tickTime : 服務器與客戶端之間交互的基本時間單元(ms) # dataDir : 保存zookeeper數據路徑 # dataLogDir : 保存zookeeper日誌路徑,當此配置不存在時默認路徑與dataDir一致 # clientPort : 客戶端訪問zookeeper時通過服務器端時的端口號
- 5.集羣環境配置文件
cd /usr/local/zookeeper-3.4.12/conf
cp -rp zoo_sample.cfg zoo.cfg
vi zoo.cfg
tickTime=2000 # tickTime : 服務器與客戶端之間交互的基本時間單元(ms) initLimit=10 # initLimit : 此配置表示容許follower鏈接並同步到leader的初始化時間,它以tickTime的倍數來表示。當超過設置倍數的tickTime時間,則鏈接失敗。 syncLimit=5 # syncLimit : Leader服務器與follower服務器之間信息同步容許的最大時間間隔,若是超過次間隔,默認follower服務器與leader服務器之間斷開連接。 dataDir=/usr/local/zookeeper/data # dataDir : 保存zookeeper數據路徑 dataLogDir=/usr/local/zookeeper/log/tran_logs # dataLogDir : 保存zookeeper日誌路徑,當此配置不存在時默認路徑與dataDir一致,事務日誌,會產生version2目錄 clientPort=2181 # clientPort : 客戶端訪問zookeeper時通過服務器端時的端口號 maxClientCnxns=60 # maxClientCnxns : 限制鏈接到zookeeper服務器客戶端的數量。 server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # server.id=host:port:port : 表示了不一樣的zookeeper服務器的自身標識,做爲集羣的一部分,每一臺服務器應該知道其餘服務器的信息。用戶能夠從「server.id=host:port:port」 中讀取到相關信息。在服務器的data(dataDir參數所指定的目錄)下建立一個文件名爲myid的文件,這個文件的內容只有一行,指定的是自身的id值。好比,服務器「1」應該在myid文件中寫入「1」。這個id必須在集羣環境中服務器標識中是惟一的,且大小在1~255之間。這同樣配置中,zoo1表明第一臺服務器的IP地址。第一個端口號(port)是從follower鏈接到leader機器的端口,第二個端口是用來進行leader選舉時所用的端口。因此,在集羣配置過程當中有三個很是重要的端口:clientPort:2181、port:2888、port:3888。
- 5.寫id到文件
ssh 172.16.10.142 "echo '1' > /usr/local/zookeeper-3.4.12/data/myid" ssh 172.16.10.143 "echo '2' > /usr/local/zookeeper-3.4.12/data/myid" ssh 172.16.10.144 "echo '3' > /usr/local/zookeeper-3.4.12/data/myid"
- 6.更改日誌輸出
/usr/local/zookeeper-3.4.12/conf/log4j.properties
#zookeeper.root.logger=INFO, CONSOLE zookeeper.root.logger=INFO, ROLLINGFILE #log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender #log4j.appender.ROLLINGFILE.MaxFileSize=10MB # 更改app應用的日誌輸出 vi zkEnv.sh if [ "x${ZOO_LOG_DIR}" = "x" ] then ZOO_LOG_DIR="/usr/local/zookeeper/log/app_logs/" fi if [ "x${ZOO_LOG4J_PROP}" = "x" ] then ZOO_LOG4J_PROP="INFO,ROLLINGFILE" fi
3.2 go
- 1.下載
wget https://www.golangtc.com/static/go/1.9.2/go1.9.2.linux-amd64.tar.gz tar -zxvf go1.9.2.linux-amd64.tar.gz -C /usr/local
- 2.配置環境變量
export GOROOT=/usr/local/go //後面的值指向go解壓的目錄 export GOPATH=/usr/local/go/gowork //go環境境的擴展包目錄,全部go環境境共用,工做目錄 PATH=$PATH:$GOROOT/bin:$GOPATH/bin # go命令依賴一個重要的環境變量:$GOPATH # GOPATH容許多個目錄,當有多個目錄時,請注意分隔符,多個目錄的時候Windows是分號;,Linux系統是冒號: # 當有多個GOPATH時默認將go get獲取的包存放在第一個目錄下 # $GOPATH目錄約定有三個子目錄 # - src存放源代碼(好比:.go .c .h .s等) # - pkg編譯時生成的中間文件(好比:.a) # - bin編譯後生成的可執行文件(爲了方便,能夠把此目錄加入到 $PATH 變量中,若是有多個gopath,那麼使用${GOPATH//://bin:}/bin添加全部的bin目錄)
- 3.查看版本
[root@slave01 go]# go version go version go1.8.3 linux/amd64
3.3 CodsLabs
- 1.下載
go get github.com/wandoulabs/codis
# cd .; git clone https://github.com/wandoulabs/codis /usr/local/go/gowork/src/github.com/wandoulabs/codis Cloning into '/usr/local/go/gowork/src/github.com/wandoulabs/codis'... fatal: unable to access 'https://github.com/wandoulabs/codis/': Peer reports incompatible or unsupported protocol version. yum update nss curl git mkdir -p $GOPATH/src/github.com/CodisLabs cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2
1.linux二進制 https://github.com/CodisLabs/codis/releases 2.或者直接下載zip包github
- 2.安裝
cd $GOPATH/src/github.com/CodisLabs/codis $ make
- 3.提取有用程序
# 進入源碼目錄 mkdir /usr/local/codis cp -rp bin admin config /usr/local/codis/
3.4 部署codis-dashboard
- 1.修改配置文件
vi /usr/local/codis/config/dashboard.toml #coordinator_name = "filesystem" #coordinator_addr = "/tmp/codis" coordinator_name = "zookeeper" coordinator_addr = "172.16.10.142:2181,172.16.10.143:2181,172.16.10.144:2181"
- 2.啓動dashboard
cd /usr/local/codis ./admin/codis-dashboard-admin.sh start ss -tpnl |grep 18080 # 能夠查看log確認狀態 /usr/local/codis/log/codis-dashboard.log.
- 3.dashboard地址
admin_addr = "0.0.0.0:18080"
3.5 部署codis-fe管理後臺
- 1.修改啓動文件
vi /usr/local/codis/admin/codis-fe-admin.sh #COORDINATOR_NAME="filesystem" #COORDINATOR_ADDR="/tmp/codis" COORDINATOR_NAME="zookeeper" COORDINATOR_ADDR="172.16.10.142:2181,172.16.10.143:2181,172.16.10.144:2181"
- 2.啓動fe
cd /usr/local/codis ./admin/codis-fe-admin.sh start ss -tpnl|grep 9090 # 能夠查看log確認狀態 /usr/local/codis/log/codis-fe.log.
- 3.後臺管理地址
CODIS_FE_ADDR="0.0.0.0:9090"
3.6 部署codis-server加入集羣
部署4個節點的server 172.16.10.142/143/144/154redis
- 1.全部server機器啓動codis-server
/usr/local/codis/admin/codis-server-admin.sh start
- 2.redis.conf修改了以下參數(僅用於測試)
protected-mode no port 6369 pidfile /usr/local/codis/log/redis_6369.pid logfile "/usr/local/codis/log/redis_6369.log" dbfilename dump_6369.rdb dir /usr/local/codis/log/ appendfilename "appendonly.aof"
-
3.fe管理後臺添加2個group,每一個group分配2個機器
apache
-
4.點擊分配槽位
服務器
3.7 部署codis-proxy代理服務
部署3個節點的server 172.16.10.142/143/144app
- 1.修改配置文件proxy.toml,zookeeper地址
vi /usr/local/codis/config/proxy.toml #jodis_name = "" #jodis_addr = "" jodis_name = "zookeeper" jodis_addr = "172.16.10.142:2181,172.16.10.143:2181,172.16.10.144:2181"
- 2.修改啓動文件並啓動,指向dashboard IP:PORT
vi /usr/local/codis/admin/codis-proxy-admin.sh #CODIS_DASHBOARD_ADDR="127.0.0.1:18080" CODIS_DASHBOARD_ADDR="172.16.10.154:18080" /usr/local/codis/admin/codis-proxy-admin.sh start ss -tpnl |grep 19000
- 3.proxy啓動默認會自動註冊到dashboard中,也能夠在fe中手動添加
3.8 部署redis-sentinel實現集羣HA
部署3個節點的server 172.16.10.142/143/144ssh
- 1.修改配置文件
vi /usr/local/codis/config/sentinel.conf port 26379 dir "/tmp" protected-mode no
- 2啓動sentinel
#sentinel部署官方腳本,是根據codis-server啓動腳本進行修改 # 源文件目錄:./ansible/roles/redis-sentinel/templates/redis-sentinel-admin.sh /usr/local/codis/admin/codis-sentinel-admin.sh start ss -tpnl |grep 26379
- 3.fe界面添加Sentinels