一.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包
- 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/154
- 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個機器
-
4.點擊分配槽位
3.7 部署codis-proxy代理服務
部署3個節點的server 172.16.10.142/143/144
- 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/144
- 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