簡介
Codis 是一個分布式 Redis 解決方案, 對于上層的應(yīng)用來說, 連接到 Codis Proxy 和連接原生的 Redis Server 沒有明顯的區(qū)別 (不支持的命令列表), 上層應(yīng)用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉(zhuǎn)發(fā), 不停機的數(shù)據(jù)遷移等工作, 所有后邊的一切事情, 對于前面的客戶端來說是透明的, 可以簡單的認(rèn)為后邊連接的是一個內(nèi)存無限大的 Redis 服務(wù).
- Codis Proxy (codis-proxy)
- Codis Manager (codis-config)
- Codis Redis (codis-server)
- ZooKeeper
codis-proxy 是客戶端連接的 Redis 代理服務(wù), codis-proxy 本身實現(xiàn)了 Redis 協(xié)議, 表現(xiàn)得和一個原生的 Redis 沒什么區(qū)別 (就像 Twemproxy), 對于一個業(yè)務(wù)來說, 可以部署多個 codis-proxy, codis-proxy 本身是無狀態(tài)的.
codis-config 是 Codis 的管理工具, 支持包括, 添加/刪除 Redis 節(jié)點, 添加/刪除 Proxy 節(jié)點, 發(fā)起數(shù)據(jù)遷移等操作. codis-config 本身還自帶了一個 http server, 會啟動一個 dashboard, 用戶可以直接在瀏覽器上觀察 Codis 集群的運行狀態(tài).
codis-server 是 Codis 項目維護的一個 Redis 分支, 基于 2.8.13 開發(fā), 加入了 slot 的支持和原子的數(shù)據(jù)遷移指令. Codis 上層的 codis-proxy 和 codis-config 只能和這個版本的 Redis 交互才能正常運行.
Codis 依賴 ZooKeeper 來存放數(shù)據(jù)路由表和 codis-proxy 節(jié)點的元信息, codis-config 發(fā)起的命令都會通過 ZooKeeper 同步到各個存活的 codis-proxy.
Codis 支持按照 Namespace 區(qū)分不同的產(chǎn)品, 擁有不同的 product name 的產(chǎn)品, 各項配置都不會沖突.
Codis架構(gòu)圖
v特性
- 自動平衡
- 使用非常簡單
- 圖形化的面板和管理工具
- 支持絕大多數(shù) Redis 命令,完全兼容twemproxy
- 支持 Redis 原生客戶端
- 安全而且透明的數(shù)據(jù)移植,可根據(jù)需要輕松添加和刪除節(jié)點
- 提供命令行接口
- RESTful APIs
v安裝步驟
1.1 安裝Go
1.1.1 下載Go壓縮包
習(xí)慣系在最新的環(huán)境虐拓,目前最新版的go是1.12.5的引谜,這里我們就用最新版的金砍。最新版更新可以在這里看英妓。https://golang.org/dl/
wget https://storage.googleapis.com/golang/go1.12.5.linux-amd64.tar.gz
1.1.2 解壓Go壓縮包
tar -zxvf go1.12.5.linux-amd64.tar.gz
1.1.3 設(shè)置環(huán)境變量
如圖,go的安裝目錄是 /usr/local
vim /etc/profile
export GOROOT=/usr/local/go #設(shè)置為go安裝的路徑
export GOPATH=/usr/local/gopath #默認(rèn)安裝包的路徑
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
更新/etc/profile, wq
保存以舒,使用source /etc/profile
命令可以使新建立的環(huán)境變量立刻生效而不用重新啟動系統(tǒng)霎肯。
1.1.4 helloword go go go
新建一個go文件擎颖,然后運行。
package main
import "fmt"
func main(){
fmt.Printf("hello,world\n")
}
1.2 安裝JDK
沒有安裝Java JDK的朋友可以直接看這里观游。《CentOS安裝Java JDK》
1.3 安裝ZooKeeper
1.3.1 下載ZooKeeper壓縮包
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
1.3.2 解壓ZooKeeper壓縮包
tar -zxvf zookeeper-3.4.13.tar.gz
1.3.3 刪除ZooKeeper壓縮包
rm -f zookeeper-3.4.13.tar.gz
1.3.4 拷貝配置文件
cd /usr/local/zookeeper-3.4.13/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
這個zoo.cfg是zookeeper的配置文件搂捧,這里我搭的是單機版,如果想搭集群版也是通過修改配置文件即可懂缕。
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper-3.4.13/data #這里最好自己設(shè)置
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=cnblogs01:8888:9888 #這里修改為自己的主機名或者IP
server.2=cnblogs02:8888:9888
server.3=cnblogs03:8888:9888
創(chuàng)建/usr/local/zookeeper-3.4.13/data文件夾允跑,新建一個myid,寫入1
mkdir data
vim myid
1.3.5 啟動ZooKeeper
/usr/local/zookeeper-3.4.13/bin/zkServer.sh start
1.4 安裝Codis
1.4.1 安裝Codis
Codis 源代碼需要下載到 $GOPATH/src/github.com/CodisLabs/codis
mkdir -p $GOPATH/src/github.com/CodisLabs
cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2
1.4.2 編譯Codis
cd $GOPATH/src/github.com/CodisLabs/codis
make
直接通過 make 進(jìn)行編譯,這里報了個錯./autogen.sh:行5: autoconf: 未找到命令
安裝autoconf
yum install autoconf
安裝autoconf之后,繼續(xù)通過make
編譯。
dashboard,proxy,admin,ha,fe這些codis的組件編譯完成了聋丝。
注意的是索烹,目錄結(jié)構(gòu)一定要是,gopath的自己的定義,單后后面的目錄需要新建弱睦,必須和官網(wǎng)一樣百姓,不一樣,要報錯况木。 $GOPATH/src/github.com/CodisLabs/
1.4.3 啟動codis-dashboard
使用 codis-dashboard-admin.sh
腳本啟動 dashboard垒拢,并查看 dashboard 日志確認(rèn)啟動是否有異常。
./admin/codis-dashboard-admin.sh start
tail -100 ./log/codis-dashboard.log.2019-05-26
注意:2019-05-26為當(dāng)前日期火惊。
1.4.3 啟動codis-proxy
使用 codis-proxy-admin.sh
腳本啟動 codis-proxy求类,并查看 proxy 日志確認(rèn)啟動是否有異常。
./admin/codis-proxy-admin.sh start
tail -100 ./log/codis-proxy.log.2019-05-26
1.4.4 啟動codis-server
使用 codis-server-admin.sh
腳本啟動 codis-server矗晃,并查看 redis 日志確認(rèn)啟動是否有異常仑嗅。
./admin/codis-server-admin.sh start
tail -100 /tmp/redis_6379.log
查看日志如下圖所示宴倍,啟動codis時報錯提示:
21875:M 26 May 20:51:24.154 * Increased maximum number of open files to 10032 (it was originally set to 1024).
21875:M 26 May 20:51:24.154 # Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use
因為Redis默認(rèn)端口號就是6379张症,由于之前(centos安裝Redis)設(shè)置了本機默認(rèn)開機啟動Redis,所以6379已被占用鸵贬。
解決方案
如下圖所示俗他,修改/usr/local/gopath/src/github.com/CodisLabs/codis/config/redis.conf
配置文件的端口號。改為6380
修改端口號以后再通過./admin/codis-server-admin.sh start
啟動codis-server阔逼。
tail -100 /tmp/redis_6379.log
查看日志如下:
注意:如果redis.conf中對應(yīng)的logfile也改成6380的話兆衅,查看日志就得用tail -100 /tmp/redis_6380.log
1.4.5 啟動codis-fe
使用 codis-fe-admin.sh
腳本啟動 codis-fe,并查看 fe 日志確認(rèn)啟動是否有異常嗜浮。
./admin/codis-fe-admin.sh start
tail -100 ./log/codis-fe.log.2019-05-26
1.5 通過fe添加group
通過web瀏覽器訪問集群管理頁面(fe地址:127.0.0.1:9090) 選擇我們剛搭建的集群 codis-demo羡亩,在 Proxy 欄可看到我們已經(jīng)啟動的 Proxy, 但是 Group 欄為空危融,因為我們啟動的 codis-server 并未加入到集群 添加 NEW GROUP畏铆,NEW GROUP 行輸入 1,再點擊 NEW GROUP 即可 添加 Codis Server吉殃,Add Server 行輸入我們剛剛啟動的 codis-server 地址辞居,添加到我們剛新建的 Group,然后再點擊 Add Server 按鈕即可蛋勺,如下圖所示:
1.6 通過fe初始化slot
新增的集群 slot 狀態(tài)是 offline瓦灶,因此我們需要對它進(jìn)行初始化(將 1024 個 slot 分配到各個 group),而初始化最快的方法可通過 fe 提供的 rebalance all slots
按鈕來做抱完,如下圖所示贼陶,點擊此按鈕,我們即快速完成了一個集群的搭建。
1.7 通過 ansible 快速部署集群
使用 ansible 可快速在單機每界、多機部署多套 codis 集群捅僵。 ansible 文件夾包含了部署 codis 集群的 playbook,根據(jù)自己部署環(huán)境修改 groups_var/all
文件里參數(shù)眨层,修改 hosts 文件添加部署的環(huán)境 IP 即可庙楚。 ansible 安裝也及其簡單,各部署機器無需安裝任何額外的 agent趴樱,彼此之間通過 ssh 通信馒闷。
git clone https://github.com/ansible/ansible.git -b stable-2.3
cd ./ansible
source ./hacking/env-setup
cd $codis_dir/ansible
ansible-playbook -i hosts site.yml
集群配置
2.1 添加Redis實例
這里再分別添加6381、6382兩個Redis實例叁征。
cp config/redis.conf config/redis6381.conf
cp config/redis.conf config/redis6382.conf
分別更新6381纳账、6382.conf的port、pidfile和logfile
vim config/redis6381.conf
更新之后捺疼,啟動新增的兩個Redis實例疏虫。
./bin/codis-server ./config/redis6381.conf
./bin/codis-server ./config/redis6382.conf
按照上面add server的方法(如下圖)添加兩個實例,注意啤呼,若未執(zhí)行./bin/codis-server ./config/redis6381.conf
卧秘,添加時會報錯。
剛添加進(jìn)來的默認(rèn)狀態(tài)是NO:ONE官扣,如下圖翅敌,點擊小扳手(SLAVEOF 127.0.0.1:6380)。
測試效果:
注意:如上圖惕蹄,開啟集群管理之后蚯涮,6380可讀可寫,81和82只有只讀權(quán)限。
2.2 創(chuàng)建新的分組
按照上面步驟繼續(xù)創(chuàng)建7380和7381.
在Codis ? Dashboard(http://ip:9090/#codis-demo)中添加新的分組和server成員。