1. 程式人生 > >Codis 3.2 部署配置

Codis 3.2 部署配置

codis3.2 codis-proxy codis-dashboard codis-server codis-fe

Codis 3.2 部署配置


一,Codis簡介

Codis 是一個分布式 Redis 解決方案, 對於上層的應用來說, 連接到 Codis Proxy 和連接原生的 Redis Server 沒有顯著區別 (不支持的命令列表), 上層應用可以像使用單機的 Redis 一


樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工作, 所有後邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認為後邊連接的是一個內存無限大的 Redis 服務。

不支持命令列表

https://github.com/CodisLabs/codis/blob/release3.2/doc/unsupported_cmds.md


redis的修改

https://github.com/CodisLabs/codis/blob/release3.2/doc/redis_change_zh.md


go安裝

https://golang.org/doc/install



二,Codis 3.x


最新 release 版本為 codis-3.2,codis-server 基於 redis-3.2.8

支持 slot 同步遷移、異步遷移和並發遷移,對 key 大小無任何限制,遷移性能大幅度提升

相比 2.0:重構了整個集群組件通信方式,codis-proxy 與 zookeeper 實現了解耦,廢棄了codis-config 等

元數據存儲支持 etcd/zookeeper/filesystem 等,可自行擴展支持新的存儲,集群正常運行期間,即便元存儲故障也不再影響 codis 集群,大大提升 codis-proxy 穩定性

對 codis-proxy 進行了大量性能優化,通過控制GC頻率、減少對象創建、內存預分配、引入 cgo、jemalloc 等,使其吞吐還是延遲,都已達到 codis 項目中最佳

proxy 實現 select 命令,支持多 DB

proxy 支持讀寫分離、優先讀同 IP/同 DC 下副本功能

基於 redis-sentinel 實現主備自動切換

實現動態 pipeline 緩存區(減少內存分配以及所引起的 GC 問題)

proxy 支持通過 HTTP 請求實時獲取 runtime metrics,便於監控、運維

支持通過 influxdb 和 statsd 采集 proxy metrics

slot auto rebalance 算法從 2.0 的基於 max memory policy 變更成基於 group 下 slot 數量

提供了更加友好的 dashboard 和 fe 界面,新增了很多按鈕、跳轉鏈接、錯誤狀態等,有利於快速發現、處理集群故障

新增 SLOTSSCAN 指令,便於獲取集群各個 slot 下的所有 key

codis-proxy 與 codis-dashbaord 支持 docker 部署



三,Codis 3.x 由以下組件組成:


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


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


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

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

Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、刪除,以及據遷移等操作。在集群狀態發生改變時,codis-dashboard 維護集群下所有 codis-proxy 的狀態的


一致性。


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

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

Codis Admin:集群管理的命令行工具。


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

Codis FE:集群管理界面。


多個集群實例共享可以共享同一個前端展示頁面;

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

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


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

目前僅提供了 Zookeeper、Etcd、Fs 三種實現,但是提供了抽象的 interface 可自行擴展。




四,安裝部署

二進制部署(官網的支持CentOS7,Glibc2.14以上版本)

tar zxvf /root/codis3.2.0-go1.7.5-linux.tar.gz -C /usr/local/

ln -s /usr/local/codis3.2.0-go1.7.5-linux/ /usr/local/codis

/usr/local/codis/redis-cli -v

/usr/local/codis/redis-cli: /lib64/libc.so.6: version `GLIBC_2.14‘ not found (required by /usr/local/codis/redis-cli)

排錯

strings /lib64/libc.so.6 |grep GLIBC_

GLIBC_2.2.5

GLIBC_2.2.6

GLIBC_2.3

GLIBC_2.3.2

GLIBC_2.3.3

GLIBC_2.3.4

GLIBC_2.4

GLIBC_2.5

GLIBC_2.6

GLIBC_2.7

GLIBC_2.8

GLIBC_2.9

GLIBC_2.10

GLIBC_2.11

GLIBC_2.12

GLIBC_PRIVATE

需要安裝GLIBC_2.14版本

直接使用CentOS7即可解決此問題。




源碼部署(CentOS6/7都可)

1,java環境

yum -y install java-1.8.0

java -version



2,go環境

tar zxvf /root/go1.8.3.linux-amd64.tar.gz -C /usr/local/

/usr/local/go/bin/go version

mkdir -p /data/go


echo ‘export PATH=$PATH:/usr/local/go/bin:/usr/local/codis/bin‘ >>/etc/profile

echo ‘export GOPATH=/data/go‘ >>/etc/profile

source /etc/profile

go env GOPATH


3,codis安裝

mkdir -p /data/go/src/github.com/CodisLabs/

tar -zxvf /root/codis-3.2.0.tar.gz -C /data/go/src/github.com/CodisLabs/

cd /data/go/src/github.com/CodisLabs/

mv codis-3.2.0/ codis

cd codis/

make

./bin/redis-cli -v

ln -s /data/go/src/github.com/CodisLabs/codis/ /usr/local/codis

cat bin/version

version = unknown version

compile = 2017-09-11 16:58:26 +0800 by go version go1.8.3 linux/amd64



4,zookeepr安裝

tar -zxvf /root/zookeeper-3.4.10.tar.gz -C /usr/local


ln -s /usr/local/zookeeper-3.4.10 /usr/local/zookeeper


echo ‘/usr/local/zookeeper/bin/zkServer.sh start‘ >>/etc/rc.local

cat << EOF >> /usr/local/zookeeper/conf/zoo.cfg

tickTime=2000

initLimit=5

syncLimit=2

dataDir=/data/zookeeper/data

clientPort=2181

server.1=192.168.188.120:2888:3888

server.2=192.168.188.121:2888:3888

server.3=192.168.188.122:2888:3888


EOF


###myid

#註意:2888是主從的通信端口,3888是選舉端口,server後面的1,2,3是在data目錄下myid文件裏的數值


mkdir -p /data/zookeeper/data


echo ‘1‘ > /data/zookeeper/data/myid


/usr/local/zookeeper/bin/zkServer.sh start

/usr/local/zookeeper/bin/zkServer.sh status


5,其他節點直接打包/data/go/src/github.com/CodisLabs/codis.tar.gz復制過去即可




集群配置前需要了解架構,集群分片主要分三種:

客戶端分片:這個需要自己開發,對客戶端要求嚴格,集群很難擴容

代理端分片:如codis,對客戶端幾乎無要求,集群容易擴容

服務端分片:如redis集群,需要智能客戶端支持集群協議的,集群容易擴容


codis3.2集群架構

服務端: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備


由上可知一個大的codis集群可以分多個產品線,客戶端連接各個產品線的codis-proxy,業務線之間可以做到物理隔離,比如group1,group2,group3分給codis-product1業務線,group4,


group5,group6分給codis-product2業務線,codis-dashboard配置保存在zookeeper裏。

特別註意

同一個codis-server加入多個codis-dashboard的codis-group裏,但是在不同的codis-dashboard裏面主備的角色要一致,這代表邏輯隔離。

同一個codis-server只加入唯一的codis-dashboard的codis-group裏,這代表物理隔離。





五,集群配置


1,角色劃分

192.168.188.120 codis120 codis-server zookeeper

192.168.188.121 codis121 codis-server zookeeper

192.168.188.122 codis122 codis-server zookeeper

192.168.188.123 codis123 codis-server codis-proxy nginx-tcp lvs

192.168.188.124 codis124 codis-server codis-proxy nginx-tcp lvs

192.168.188.125 codis125 codis-server codis-dashboard codis-fe



以下操作的基本目錄

[[email protected] codis]# pwd -L

/usr/local/codis

[[email protected] codis]# pwd -P

/data/go/src/github.com/CodisLabs/codis



2,啟動codis-dashobard(codis125上操作)

1),修改dashboard.toml配置文件

[[email protected] codis]# cat config/dashboard.toml

主要修改這幾行

# Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem".

coordinator_name = "zookeeper"

coordinator_addr = "192.168.188.120:2181,192.168.188.121:2181,192.168.188.122:2181"


# Set Codis Product Name/Auth.

product_name = "codis-product1"

product_auth = ""


# Set bind address for admin(rpc), tcp only.

admin_addr = "0.0.0.0:18080"



2),啟動腳本

啟動前需要修改腳本zookeeper地址池與product名稱

[[email protected] codis]#cat ./admin/codis-dashboard-admin.sh

$CODIS_ADMIN_TOOL_BIN -v --remove-lock --product=codis-product1 --zookeeper=192.168.188.120:2181,192.168.188.121:2181,192.168.188.122:2181

[[email protected] codis]# ./admin/codis-dashboard-admin.sh start



3),檢查日誌與端口

[[email protected] codis]# cat log/codis-dashboard.log.2017-09-11

2017/09/11 17:42:08 main.go:78: [WARN] set ncpu = 8

2017/09/11 17:42:08 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 192.168.188.120:2181,192.168.188.121:2181,192.168.188.122:2181

2017/09/11 17:42:08 zkclient.go:23: [INFO] zookeeper - Connected to 192.168.188.121:2181

2017/09/11 17:42:08 topom.go:119: [WARN] create new topom:

{

"token": "a10e7a35209d1db8f21c8e89a78a6c9a",

"start_time": "2017-09-11 17:42:08.1058555 +0800 CST",

"admin_addr": "codis125:18080",

"product_name": "codis-product2",

"pid": 18029,

"pwd": "/usr/local/codis",

"sys": "Linux codis125 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux"

}

2017/09/11 17:42:08 main.go:103: [WARN] create topom with config

coordinator_name = "zookeeper"

coordinator_addr = "192.168.188.120:2181,192.168.188.121:2181,192.168.188.122:2181"

admin_addr = "0.0.0.0:18080"

product_name = "codis-product1"

product_auth = ""

migration_method = "semi-async"

migration_parallel_slots = 100

migration_async_maxbulks = 200

migration_async_maxbytes = "32mb"

migration_async_numkeys = 500

migration_timeout = "30s"

sentinel_quorum = 2

sentinel_parallel_syncs = 1

sentinel_down_after = "30s"

sentinel_failover_timeout = "5m"

sentinel_notification_script = ""

sentinel_client_reconfig_script = ""

2017/09/11 17:42:08 topom.go:424: [WARN] admin start service on [::]:18080

2017/09/11 17:42:08 main.go:116: [WARN] option --pidfile = /usr/local/codis/bin/codis-dashboard.pid

2017/09/11 17:42:08 zkclient.go:23: [INFO] zookeeper - Authenticated: id=170697207944249344, timeout=40000

2017/09/11 17:42:08 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect

2017/09/11 17:42:08 main.go:140: [WARN] [0xc42033e120] dashboard is working ...


[[email protected] codis]# netstat -tulpn |grep codis-dashboa

tcp6 0 0 :::18080 :::* LISTEN 32006/codis-dashboa



4),檢查服務

http://192.168.188.125:18080/topom



3,啟動codis-proxy(codis123與codis124上操作)

1),修改codis-proxy啟動腳本

[[email protected] codis]# cat admin/codis-proxy-admin.sh|grep DASH

CODIS_DASHBOARD_ADDR="192.168.188.125:18080"



2),修改proxy.toml配置

[[email protected] codis]# cat config/proxy.toml|grep -Ev "^#|^$"

product_name = "codis-product1"

product_auth = ""

session_auth = ""

admin_addr = "0.0.0.0:11080"

proto_type = "tcp4"

proxy_addr = "0.0.0.0:19000"



3),啟動codis-proxy腳本

[[email protected] codis]# ./admin/codis-proxy-admin.sh start



4),檢查日誌與端口

[[email protected] codis]# cat log/codis-proxy.log.2017-09-11


[[email protected] codis]# netstat -tulpn|grep codis-proxy

tcp 0 0 0.0.0.0:19000 0.0.0.0:* LISTEN 31971/codis-proxy

tcp6 0 0 :::11080 :::* LISTEN 31971/codis-proxy




4,啟動codis-server(需要在所有上操作)

1),修改啟動腳本

vim /usr/local/codis/admin/codis-server-admin-6379.sh start

vim /usr/local/codis/admin/codis-server-admin-6380.sh start

主要註意以下幾點

[[email protected] codis]# cat /usr/local/codis/admin/codis-server-admin-6379.sh |grep -Ev "^#|^$"|grep 6379

CODIS_SERVER_PID_FILE=/data/codis/6379/redis_6379.pid

CODIS_SERVER_LOG_FILE=/data/codis/6379/redis_6379.log

CODIS_SERVER_CONF_FILE=$CODIS_CONF_DIR/redis-6379.conf



2),修改服務配置

[[email protected] codis]# mkdir -p /data/redis/6379

[[email protected] codis]# mkdir -p /data/redis/6380

[[email protected] codis]# vim /usr/local/codis/config/redis-6379.conf

[[email protected] codis]# vim /usr/local/codis/config/redis-6380.conf

主要是註意以下幾點

[[email protected] codis]# cat /usr/local/codis/config/redis-6379.conf |grep -Ev "^#|^$"|grep 6379

port 6379

pidfile /data/redis/6379/redis_6379.pid

logfile "/data/redis/6379/redis_6379.log"

dir /data/redis/6379



3),啟動codis-server服務

[[email protected] codis]# ./admin/codis-server-admin-6379.sh start

/usr/local/codis/admin/../config/redis-6379.conf

starting codis-server ...

[[email protected] codis]# ./admin/codis-server-admin-6380.sh start

/usr/local/codis/admin/../config/redis-6380.conf

starting codis-server ...


4),檢測日誌與端口

[[email protected] codis]# netstat -tulpn |grep codis-server

tcp 0 0 192.168.188.120:6379 0.0.0.0:* LISTEN 22231/codis-server

tcp 0 0 192.168.188.120:6380 0.0.0.0:* LISTEN 22308/codis-server



5,啟動codis-fe(codis125上操作)


1),修改codis-fe啟動腳本

[[email protected] codis]# cat admin/codis-fe-admin.sh

主要修改這幾行

#!/usr/bin/env bash

#COORDINATOR_NAME="filesystem"

#COORDINATOR_ADDR="/tmp/codis"

COORDINATOR_NAME="zookeeper"

COORDINATOR_ADDR="192.168.188.120:2181,192.168.188.121:2181,192.168.188.122:2181"



2),啟動codis-fe腳本

[[email protected] codis]# ./admin/codis-fe-admin.sh start



3),檢查日誌與端口

[[email protected] codis]# cat log/codis-fe.log.2017-09-11

2017/09/11 19:24:32 main.go:101: [WARN] set ncpu = 8

2017/09/11 19:24:32 main.go:104: [WARN] set listen = 0.0.0.0:9090

2017/09/11 19:24:32 main.go:120: [WARN] set assets = /usr/local/codis/bin/assets

2017/09/11 19:24:32 main.go:155: [WARN] set --zookeeper = 192.168.188.120:2181,192.168.188.121:2181,192.168.188.122:2181

2017/09/11 19:24:32 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 192.168.188.120:2181,192.168.188.121:2181,192.168.188.122:2181

2017/09/11 19:24:32 main.go:209: [WARN] option --pidfile = /usr/local/codis/bin/codis-fe.pid

2017/09/11 19:24:32 zkclient.go:23: [INFO] zookeeper - Connected to 192.168.188.120:2181

2017/09/11 19:24:32 zkclient.go:23: [INFO] zookeeper - Authenticated: id=98639613905403907, timeout=40000

2017/09/11 19:24:32 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect


[[email protected] codis]# netstat -tupnl |grep codis-fe

tcp6 0 0 :::9090 :::* LISTEN 32141/codis-fe



4),訪問面板

http://192.168.188.125:9090/#codis-product1



六,codis-fe面板操作


1,通過codis-fe添加group

通過web瀏覽器訪問集群管理頁面(fe地址:http://192.168.188.125:9090/#codis-product1) 選擇我們剛搭建的集群 codis-product1,在 Proxy 欄可看到我們已經啟動的 Proxy, 但是


Group 欄為空,因為我們啟動的 codis-server 並未加入到集群 添加 NEW GROUP,NEW GROUP 行輸入 1,再點擊 NEW GROUP 即可 添加 Codis Server,Add Server 行輸入我們剛剛啟動的


codis-server 地址,添加到我們剛新建的 Group,然後再點擊 Add Server 按鈕即可。

如上依次添加6個group,12個codis-server,默認每組裏面第一個添加的為主,第二個添加的設置為從,同一個節點2個實例不能設置為同一group。


2,通過codis-fe初始化solt

新增的集群 slot 狀態是 offline,因此我們需要對它進行初始化(將 1024 個 slot 分配到各個 group),而初始化最快的方法可通過 fe 提供的 rebalance all slots 按鈕來做,如下圖


所示,點擊此按鈕,我們即快速完成了一個集群的搭建。

自動分配1024個solt到6個group,reblance all solts會自動分配完所以solt到6個group。




七,代理HA

1,在codis123與codis124上安裝lvs與nginx-tcp


2,配置好VIP+19000端口為第一個codis-dashboard業務線使用,其他類推

192.168.188.131:19000



本文出自 “jerrymin” 博客,請務必保留此出處http://jerrymin.blog.51cto.com/3002256/1964464

Codis 3.2 部署配置