codis介紹前端
Codis 是一個分佈式 Redis 解決方案, 對於上層的應用來講, 鏈接到 Codis Proxy 和鏈接原生的 Redis Server 沒有顯著區別 , 上層應用能夠像使用單機的 Redis 同樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工做, 全部後邊的一切事情, 對於前面的客戶端來講是透明的, 能夠簡單的認爲後邊鏈接的是一個內存無限大的 Redis 服務。java
codis組件node
codis server:基於redis-3.2.8 分支開發。增長了額外的數據結構,以支持slot有關的操做以及數據遷移指令linux
codis proxy:客戶端鏈接的redis代理服務,實現了redis協議。除部分命令不支持之外(不支持的命令列表),表現的和原生的redis沒有區別。對於同一個業務集羣而言,能夠同時部署多個codis-proxy實例;不一樣codis-proxy之間由codis-dashboard保證狀態同步。git
codis dashboard:集羣管理工具,支持codis-proxy、codis-server的添加、刪除、以及數據遷移操做。在集羣狀態發生改變時,codis-dashboard維護集羣下全部codis-proxy的狀態一致性,對於同一個業務集羣而言,同一時刻codis-dashboard只能有0個或者1個,全部對集羣的修改都必須經過codis-dashboard完成。github
codis FE:集羣管理界面,多個集羣實例共享能夠共享同一個前端展現頁面,經過配置文件管理後端codis-dashboard列表,配置文件可自動更新。golang
storage:提供namespace概念,不一樣集羣會按照不一樣product name進行組織;目前僅提供了zookeeper、etcd、fs三種實現,可是提供了抽象的interface可自行擴展。web
codis分片:Codis 採用 Pre-sharding 的技術來實現數據的分片, 默認分紅 1024 個 slots (0-1023), 對於每一個key來講, 經過如下公式肯定所屬的 Slot Id : SlotId = crc32(key) % 1024。redis
每個 slot 都會有一個且必須有一個特定的 server group id 來表示這個 slot 的數據由哪一個 server group 來提供。數據的遷移也是以slot爲單位的。apache
codis 集羣部署
機器環境分佈
節點 |
IP |
系統 |
測試配置 |
node1 |
192.168.0.198 |
centos7.2 (最小化安裝) |
2核2G --30G盤 |
node2 |
192.168.0.199 | centos7.2 (最小化安裝) | 2核2G --30G盤 |
node3 |
192.168.0.200 | centos7.2 (最小化安裝) | 2核2G --30G盤 |
codis部署架構圖(來源網絡-西門飛兵)
codis 主從分佈
系統環境三臺機器準備
安裝centos7.2系統,最小化安裝
設置好網絡和防火牆 網絡須要能訪問外網,
下面關閉防火牆
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/g' /etc/sysconfig/selinux
設置yum源
cd /etc/yum.repos.d/
wget http://mirrors.aliyun.com/repo/Centos-7.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install epel-release
yum -y install vim wget lrzsz net-tools
----------------------------------------------------------------------
安裝JDK (zk須要jdk(三臺機器))
yum install java-1.8.0-openjdk.x86_64 -y
yum install java-1.8.0-openjdk*-y
安裝zookeeper集羣(三臺機器)
下載zk包(三臺機器)
cd /usr/local/src
wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.14.tar.gz ##zk版本在變化,鏈接可能失效
tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/
配置環境變量(三臺機器)
vim /etc/profile
ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source /etc/profile ##生效
建立zk的數據日誌目錄及配置文件(三臺機器)
mkdir -p /data/zookeeper/{data,log}
cp /usr/local/zookeeper-3.4.14/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.14/conf/zoo.cfg
vim /usr/local/zookeeper-3.4.14/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
maxClientCnxns=300
server.1=192.168.0.198:2888:3888
server.2=192.168.0.199:2888:3888
server.3=192.168.0.200:2888:3888
建立myid文件(三臺機器)
三臺機器分別爲:
echo 1 > /data/zookeeper/data/myid ##198機器
echo 2 > /data/zookeeper/data/myid ##199機器
echo 3 > /data/zookeeper/data/myid ##200機器
啓動zk服務
/usr/local/zookeeper-3.4.14/bin/zkServer.sh start ##啓動
/usr/local/zookeeper-3.4.14/bin/zkServer.sh status ##查看狀態
[root@localhost ]# /usr/local/zookeeper-3.4.14/bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg Mode: follower [root@localhost ]# /usr/local/zookeeper-3.4.14/bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg Mode: leader
======================================
安裝go環境(三臺機器)
yum -y install golang
配置go環境
mkdir /data/go -p
vim /etc/profile
export GOPATH=/data/go
export PATH=$PATH:$GOPATH/bin
source /etc/profile ##生效
安裝godep
yum -y install git
go get -u github.com/tools/godep && which godep
#/data/go/bin/godep
安裝codis3.2 (三臺機器)
下載編譯安裝
yum install gcc autoconf automake libtool -y
cd /data/go/src/github.com/CodisLabs
git clone https://github.com/CodisLabs/codis.git -b release3.2
cd codis/
make
修改配置
dashboard配置修改(三臺機器)
vim config/dashboard.toml
coordinator_name = "zookeeper"
coordinator_addr = "192.168.0.200:2181,192.168.0.199:2181,192.168.0.198:2181"
product_name = "test-codis"
codis-proxy配置修改(三臺機器)
vim config/proxy.toml
product_name = "test-codis"
jodis_name = "zookeeper"
jodis_addr = "192.168.0.200:2181,192.168.0.199:2181,192.168.0.198:2181"
jodis_auth = ""
jodis_timeout = "20s"
jodis_compatible = true
codis-server配置 (三臺機器)
cd /data/go/src/github.com/CodisLabs/codis/extern/redis-3.2.11
建立配置目錄(三臺機器)
mkdir /data/redis
mkdir /data/redis/redis_6379 -p
mkdir /data/redis/redis_6380 -p
mkdir /data/redis/redis_6381 -p
先在198上修改三個配置文件,後面複製到其餘機器
建立配置文件
cp redis.conf /data/redis/redis-6379.conf
cp redis.conf /data/redis/redis-6380.conf
cp redis.conf /data/redis/redis-6381.conf
修改配置文件
vim /data/redis/redis-6379.conf
bind 0.0.0.0
port 6379
pidfile "/tmp/redis_6379.pid"
logfile "/tmp/redis_6379.log"
dbfilename "dump_6379.rdb"
dir "/data/redis/redis_6379"
vim /data/redis/redis-6380.conf
bind 0.0.0.0
port 6380
pidfile "/tmp/redis_6380.pid"
logfile "/tmp/redis_6380.log"
dbfilename "dump_6380.rdb"
dir "/data/redis/redis_6380"
vim /data/redis/redis-6381.conf
bind 0.0.0.0
port 6381
pidfile "/tmp/redis_6381.pid"
logfile "/tmp/redis_6381.log"
dbfilename "dump_6381.rdb"
dir "/data/redis/redis_6381"
複製配置文件到其餘兩個機器
scp /data/redis/*.conf 192.168.0.199:/data/redis/
scp /data/redis/*.conf 192.168.0.200:/data/redis/
服務啓動及集羣初始化
cd /data/go/src/github.com/CodisLabs/codis
啓動codis-dashboard (選一臺機器198)
nohup ./bin/codis-dashboard --ncpu=1 --config=config/dashboard.toml --log=dashboard.log --log-level=WARN >> /var/log/codis_dashboard.log &
啓動codis-proxy (三臺機器)
nohup ./bin/codis-proxy --ncpu=1 --config=config/proxy.toml --log=proxy.log --log-level=WARN >> /var/log/codis_proxy.log &
啓動codis-server(三臺機器)
nohup ./bin/codis-server /data/redis/redis-6379.conf & nohup ./bin/codis-server /data/redis/redis-6380.conf & nohup ./bin/codis-server /data/redis/redis-6381.conf &
啓動codis-fe (選一臺機器198)
nohup ./bin/codis-fe --ncpu=1 --log=fe.log --log-level=WARN --zookeeper=192.168.0.198:2181,192.168.0.199:2181,192.168.0.200:2181 --listen=192.168.0.198:8090 &
訪問管理界面並配置
瀏覽器打開192.168.0.198:8090
選擇test-codis,並增長三個proxy,(填寫11080端口才能夠增長)
接着添加 group和server
先添加123group 而後把server加入到group中
而後初始化solt
新增的集羣 slot 狀態是 offline,所以咱們須要對它進行初始化(將 1024 個 slot 分配到各個 group),而初始化最快的方法可經過 fe 提供的 rebalance all slots 按鈕來作,點擊按鈕,咱們便可快速完成了一個集羣的搭建。也能夠填寫不一樣的solt範圍進行分配,本例將逐一分配solt)點migrate range按鈕
上圖已經將solt分配到三個group了
經過鏈接codis-proxy進行驗證
[root@localhost codis]# ./bin/redis-cli -h 192.168.0.199 -p 19000 192.168.0.199:19000> info 能夠查看集羣代理信息 192.168.0.199:19000> set test 999 OK 192.168.0.199:19000> get test "999"
壓力測試
./bin/redis-benchmark -h 192.168.0.200 -p 19000 -c 100 -d 100 -t set -n 10000 -r 10000 上述命令的意思是,使用redis-benchmark壓力測試命令鏈接codis集羣, 同時併發10000個(-c),測試set操做(-t),每一個測試數據集是100字節(-d), 請求數是100000(-n),使用使用隨機數插入數值(-r)
壓測後能夠看到分到後端group的數據均衡狀況
修改sentinel配置文件(三臺機器)
mkdir
/data/redis/logs/
mkdir
/data/redis/db/
cd /data/go/src/github.com/CodisLabs/codis
cp extern/redis-3.2.11/sentinel.conf /data/redis/
先在一臺機器上修改配置,而後複製到其餘機器
vim /data/redis/sentinel.conf
bind 0.0.0.0
port 26379
pidfile "/data/redis/logs/sentinel.pid"
logfile "/data/redis/logs/sentinel.log"
dir "/data/redis/db"
sentinel monitor codis-server-01 192.168.0.198 6379 2
sentinel down-after-milliseconds codis-server-01 5000
sentinel failover-timeout codis-server-01 60000
sentinel parallel-syncs codis-server-01 2
sentinel monitor codis-server-02 192.168.0.199 6380 2
sentinel down-after-milliseconds codis-server-02 5000
sentinel failover-timeout codis-server-02 60000
sentinel parallel-syncs codis-server-02 2
sentinel monitor codis-server-03 192.168.0.200 6381 2
sentinel down-after-milliseconds codis-server-03 5000
sentinel failover-timeout codis-server-03 60000
sentinel parallel-syncs codis-server-03 2
複製配置到其餘機器
scp /data/redis/sentinel.conf 192.168.0.199:/data/redis/
scp /data/redis/sentinel.conf 192.168.0.200:/data/redis/
啓動sentinel(三臺機器)
cd /data/go/src/github.com/CodisLabs/codis
nohup ./bin/redis-sentinel /data/redis/sentinel.conf &
而後回到web管理界面添加sentinel,添加時的端口爲26379
配置完成後能夠在group中看到明顯的HA標誌
到此基本完成了codis集羣搭建
更多內容可參考Codis的github:https://github.com/CodisLabs/codis
以及http://www.fblinux.com/?p=1463 https://blog.51cto.com/brucewang/2159131等文章