1. 程式人生 > >codis叢集部署

codis叢集部署

簡介

對於Redis叢集方案有好多種,基本常用的就是twemproxy,codis、redis cluster這三種解決方案。codis是一個分散式的Redis解決方案,對於上層的應用來說,連線Codis proxy和連線原生的Redis Server沒有明顯的區別(不支援的命令列表),上層應用可以像使用單機的Redis一樣使用,Codis底層會處理請求的轉發,不停機的資料遷移等工作,所有後邊的一切事情,對於前面客戶端來說是透明的,可以簡單的認為後邊連線是一個記憶體無限大的Redis服務。

codis3.2叢集架構

這裡寫圖片描述

Codis 3.x 由以下元件組成:

Codis Server:基於 redis-2.8.21 分支開發。增加了額外的資料結構,以支援 slot 有關的操作以及資料遷移指令。具體的修改可以參考文件 redis 的修改。

Codis Proxy:客戶端連線的Redis代理服務, 實現了Redis協議。 除部分命令不支援以外(不支援的命令列表),表現的和原生的Redis沒有區別(就像Twemproxy)。

  • 對於同一個業務叢集而言,可以同時部署多個codis-proxy例項;

  • 不同codis-proxy之間由codis-dashboard保證狀態同步。

Codis Dashboard:叢集管理工具,支援codis-proxy、codis-serve的新增、刪除,以及據遷移等操作。在叢集狀態發生改變時,codis-dashboard 維護叢集下所有 codis-proxy的狀態的一致性。

  • 對於同一個業務叢集而言,同一個時刻 codis-dashboard 只能有 0個或者1個;

  • 所有對叢集的修改都必須通過 codis-dashboard 完成。

Codis Admin:叢集管理的命令列工具。

  • 可用於控制codis-proxy、codis-dashboard狀態以及訪問外部儲存。

Codis FE:叢集管理介面。

  • 多個叢集例項共享可以共享同一個前端展示頁面;

  • 通過配置檔案管理後端codis-dashboard列表,配置檔案可自動更新。

Codis HA:為叢集提供高可用。

  • 依賴codis-dashboard例項,自動抓取叢集各個元件的狀態;

  • 會根據當前叢集狀態自動生成主從切換策略,並在需要時通過codis-dashboard完成主從切換。

Storage:為叢集狀態提供外部儲存。

  • 提供Namespace概念,不同叢集的會按照不同product name進行組織;

  • 目前僅提供了Zookeeper和Etcd兩種實現,但是提供了抽象的interface可自行擴充套件。

即:
服務端:codis-fe——codis-dashboard——codis-proxy——codis-group——codis-server
客戶端:client——nginx-tcp——codis-proxy
cdis-fe可以管理多個codis-dashboard
每個codis-dashboard代表一個產品線,每個codis-dashboard可以管理多個codis-proxy
每個codis-proxy可以管理多個codis-server group
每個codis-server group至少由兩個codis-server組成,最少1主1備

安裝與編譯

安裝JDK

sh jdk-6u45-linux-x64.bin
mv jdk1.6.0_45/ /usr/local/
mv /usr/local/jdk1.6.0_45/ /usr/local/jdk

安裝zookeeper

wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.g
z
tar zxf zookeeper-3.4.6.tar.gz -C /usr/local/
mv /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper

編譯zookeeper配置檔案/usr/local/zookeeper/conf/zoo.cfg

maxClientCnxns=60
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/db
dataLogDir=/data/zookeeper/log
clientPort=2181
# cluster configure
server.1=172.25.21.4:2888:3888
server.2=172.25.21.6:2888:3888
server.3=172.25.21.7:2888:3888

其中2888表示zookeeper程式監聽埠,3888表示zookeeper選舉通訊埠。

下面需要生成ID,這裡需要注意,myid對應的zoo.cfg的server.ID,比如第二臺zookeeper主機對應的myid應該是2,以此類推

mkdir /data/zookeeper/{db,log} -p
[root@server4 ~]# echo 1 > /data/zookeeper/db/myid
[root@server6 ~]# echo 2 > /data/zookeeper/db/myid
[root@server7 ~]# echo 3 > /data/zookeeper/db/myid

更改配置環境變數

vim /etc/profile    #最後面新增
export PATH=$PATH:/usr/local/zookeeper/bin/
source /etc/profile    #重新整理環境變數
zkServer.sh start    #每個主機都啟動服務
[root@server4 redis-6379]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@server6 ~]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@server7 ~]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

安裝 Go 執行環境

下載並解壓

wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz
tar -zxf go1.4.1.linux-amd64.tar.gz -C /usr/local/
vim /etc/profile.d/go.sh    #修改環境變數

#!/bin/bash

export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis/
export PATH=$PATH:$GOROOT/bin
chmod +x /etc/profile.d/go.sh
source /etc/profile.d/go.sh
go version
go version go1.8 linux/amd64
source /etc/profile    #重新整理環境變數

下載並編譯安裝codis 3.2

cd
mkdir /usr/local/codis/src/github.com/CodisLabs
cd /usr/local/codis/src/github.com/CodisLabs/
wget https://github.com/CodisLabs/codis/archive/codis-release3.2.zip
unzip codis-release3.2.zip
mv codis-release3.2  codis
cd codis
make  

直接通過 make 進行編譯時,如果出現下面的報錯

In file included from adlist.c:34:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/root/redis-4.0.1/src'
make: *** [all] Error 2

輸入下面的命令

make MALLOC=libc

這裡寫圖片描述
在bin資料夾內生成codis-admin、codis-dashboard、codis-fe、codis-ha、codis-proxy、codis-server六個可執行檔案。另外, bin/assets資料夾是codis-dashboard http服務需要的前端資源, 需要和codis-dashboard放置在同一資料夾下。

vim /etc/profile.d/go.sh    #修改環境變數

#!/bin/bash

export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis/
export PATH=$PATH:$GOROOT/bin
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
export PATH=$PATH:/usr/local/codis/src/github.com/CodisLabs/codis/bin/
#export PATH=$PATH:/data/codis/redis/bin
source /etc/profile.d/go.sh

為Codis建立標準目錄

mkdir -p /data/codis/sh
mkdir -p /data/codis/conf
mkdir -p /data/codis/log
mkdir -p /data/codis/run
mkdir -p /data/codis/redis/bin
mkdir -p /data/codis/redis/redis-6379
mkdir -p /data/codis/redis/redis-6380

新增環境變數

vim /etc/profile.d/go.sh

#!/bin/bash

export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis/
export PATH=$PATH:$GOROOT/bin
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
export PATH=$PATH:/usr/local/codis/src/github.com/CodisLabs/codis/bin/
export PATH=$PATH:/data/codis/redis/bin
source /etc/profile.d/go.sh

配置啟動Codis各元件—-啟動Redis

codis伺服器

vim /data/codis/redis/redis-6379/redis.conf

daemonize yes
pidfile /data/codis/run/redis-6379.pid
port 6379
tcp-backlog 65535
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/codis/log/redis-6379.log"
databases 16
lua-time-limit 5000
maxclients 10000

###慢日誌引數###
slowlog-log-slower-than 10000
slowlog-max-len 128

###記憶體引數###
maxmemory 3G
maxmemory-policy noeviction

###RDB持久化引數###
#save 3600 1
#stop-writes-on-bgsave-error yes
#rdbcompression yes
#rdbchecksum yes
#dbfilename dump.rdb

###AOF持久化引數###
#no-appendfsync-on-rewrite yes
#appendonly yes
#appendfilename "appendonly.aof"
#appendfsync no
#auto-aof-rewrite-min-size 512mb
#auto-aof-rewrite-percentage 100
#aof-load-truncated yes
#aof-rewrite-incremental-fsync yes

###客戶端Buffer引數### 
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

###其他引數###
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
latency-monitor-threshold 0

###安全引數###
#requirepass  123456789
vim /data/codis/redis/redis-6380/redis.conf

###基本引數###
daemonize yes
pidfile /data/codis/run/redis-6380.pid
port 6380
tcp-backlog 65535
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/codis/log/redis-6380.log"
databases 16
lua-time-limit 5000
maxclients 10000

###慢日誌引數###
slowlog-log-slower-than 10000
slowlog-max-len 128

###記憶體引數###
maxmemory 3G
maxmemory-policy noeviction

###RDB持久化引數###
#save 3600 1
#stop-writes-on-bgsave-error yes
#rdbcompression yes
#rdbchecksum yes
#dbfilename dump.rdb

###AOF持久化引數###
no-appendfsync-on-rewrite yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync no
auto-aof-rewrite-min-size 512mb
auto-aof-rewrite-percentage 100
aof-load-truncated yes
aof-rewrite-incremental-fsync yes

###客戶端Buffer引數### 
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

###其他引數###
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
latency-monitor-threshold 0

###安全引數###
#requirepass  123456789

使用codis-server啟動redis

codis-server /data/codis/redis/redis-6379/redis.conf
codis-server /data/codis/redis/redis-6380/redis.conf

配置啟動Codis各元件—啟動dashboard(叢集中某一個節點)

生成預設的配置檔案:

codis-dashboard --default-config | tee /data/codis/conf/dashboard.toml

修改配置檔案

# Set Coordinator, only accept "zookeeper" & "etcd"
coordinator_name = "zookeeper"
coordinator_addr = "172.25.21.4:2181,172.25.21.6:2181,172.25.21.7:2181"

# Set Codis Product {Name/Auth}.
product_name = "codis-demo"
product_auth = ""

# Set bind address for admin(rpc), tcp only.
admin_addr = "0.0.0.0:18080"

#配置檔案引數說明:
coordinator_name:外部儲存型別,接受zookeeper/etcd,這裡我們使用的zookeeper叢集。
coordinator_addr:外部儲存地址。
product_name:叢集名稱,滿足正則\w[\w\.\-]*。
product_auth:叢集密碼,預設為空。
admin_addr:RESTful API埠。

啟動dashboard

nohup codis-dashboard --ncpu=2 --config=/data/codis/conf/dashboard.toml --log=/data/codis/log/dashboard.log --log-level=WARN &

引數解釋:
–ncpu=N:最大使用CPU個數。
-c CONF, –config=CONF:指定啟動配置檔案。
-l FILE, –log=FILE:設定log輸出檔案。
–log-level=LEVEL:設定log輸出等級:INFO,WARN,DEBUG,ERROR,預設INFO,推薦WARN。

PS:dashboard只需要在一個節點啟動即可,啟動時會向zookeeper註冊資訊(topom),如果有其他節點也啟動dashboard時,向zookeeper註冊資訊發現裡面有資訊時,就會無法啟動的。

配置啟動Codis各元件—-啟動codis-proxy(叢集中所有節點)

生成預設的配置檔案:

codis-proxy --default-config | tee /data/codis/conf/proxy.toml
vim /data/codis/conf/proxy.toml

product_name = "codis-demo"
product_auth = ""
admin_addr = "0.0.0.0:11080"
proto_type = "tcp4"
proxy_addr = "0.0.0.0:19000"
jodis_addr = "10.0.60.152:2181,10.0.60.153:2181,10.0.60.154:2181"
jodis_timeout = 10
backend_ping_period = 5
session_max_timeout = 1800
session_max_bufsize = 131072
session_max_pipeline = 1024
session_keepalive_period = 60

#配置檔案引數介紹:
product_name:產品名稱, 這個codis叢集的名字, 可以認為是名稱空間, 不同名稱空間的codis沒有交集。
product_auth:叢集密碼,預設為空。Codis 3.x支援AUTH,但是要求所有元件使用的AUTH必須完全相同。
admin_addr:RESTful API埠。
proto_type:Redis埠型別,接受tcp/tcp4/tcp6/unix/unixpacket。
proxy_addr:Redis埠地址或者路徑。
jodis_addr:Jodis註冊zookeeper地址。
jodis_timeout:Jodis註冊session timeout時間,單位second。
backend_ping_period:與codis-server探活週期,單位second,0表示禁止。
session_max_timeout:與client連線最大讀超時,單位second,0表示禁止。
session_max_bufsize:與client連線讀寫緩衝區大小,單位byte。
session_max_pipeline:與client連線最大的pipeline大小。
session_keepalive_period:與client的tcp keepalive週期,僅tcp有效,0表示禁止。

啟動codis-proxy

nohup codis-proxy --ncpu=2 --config=/data/codis/conf/proxy.toml --log=/data/codis/log/proxy.log --log-level=WARN &

codis-proxy啟動後,處於waiting狀態,監聽proxy_addr地址,但是不會accept連線,新增到叢集並完成叢集狀態的同步,才能改變狀態為online。
通過codis-fe新增。

配置啟動Codis元件—啟動codis-fe

生成預設的配置檔案:

codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 | tee /data/codis/conf/codis.json
vim /data/codis/conf/codis.json
[
    {
        "name": "codis-demo",
        "dashboard": "172.25.21.4:18080"
    }
]

啟動codis-fe,注意啟動codis-fe的時候,必須要使用codis-fe的全路徑進行啟動

nohup /usr/local/codis/src/github.com/CodisLabs/codis/admin/codis-fe --ncpu=2 --log=/data/codis/log/fe.log --log-level=WARN --dashboard-list=/data/codis/conf/codis.json \
--listen=0.0.0.0:8080 &

在Group的New Group下輸入1並點選New Group新增組
在Add Server 下新增 172.25.21.4:6379 to 1,並點選Add Server新增redis到1這個組中,可以繼續新增其他的redis到組中,然後點選圖示‘扳手‘,即重新整理,會自動分配新增的redis的角色,一般情況下每個組中只有一個master,並且第一個新增的redis為master,其他均為slave。
我新增的如下圖所示:
這裡寫圖片描述

這樣codis叢集就搭建完成。