您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Centos系統中怎么部署Codis集群服務”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Centos系統中怎么部署Codis集群服務”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
Codis 是 Wandoujia Infrastructure Team 開發的一個分布式 Redis 服務, 用戶可以看成是一個無限內存的 Redis 服務, 有動態擴/縮容的能力. 對偏存儲型的業務更實用, 如果你需要 SUBPUB 之類的指令, Codis 是不支持的. 時刻記住 Codis 是一個分布式存儲的項目. 對于海量的 key, value不太大(
1、組件說明
Codis 由四部分組成:
Codis Proxy (codis-proxy)
Codis Dashboard (codis-config)
Codis Redis (codis-server)
ZooKeeper/Etcd
codis-proxy:是客戶端連接的Redis代理服務,codis-proxy 本身實現了Redis協議,表現得和一個原生的Redis沒什么區別(就像Twemproxy),對于一個業務來說,可以部署多個codis-proxy,codis-proxy本身是沒狀態的。
codis-config:是Codis的管理工具,支持包括,添加/刪除Redis節點,添加/刪除Proxy節點,發起數據遷移等操作,codis-config本身還自帶了一個http server,會啟動一個dashboard,用戶可以直接在瀏覽器上觀察Codis集群的狀態。
codis-server:是Codis項目維護的一個Redis分支,基于2.8.13開發,加入了slot的支持和原子的數據遷移指令,Codis上層的codis-proxy和codis-config只能和這個版本的Redis交互才能正常運行。
ZooKeeper:用來存放數據路由表和codis-proxy節點的元信息,codis-config發起的命令都會通過ZooKeeper同步到各個存活的codis-proxy
注:Codis支持按照Namespace區分不同的產品,擁有不同的product name 的產品,各項配置都不會沖突。
2、實驗環境
主機名 | IP地址 | 角色 |
---|---|---|
linux-node1 | 10.1.1.148 | Zookeeper、redis_master,redis_slave |
linux-node2 | 10.1.1.149 | Zookeeper、redis_master,redis_slave |
linux-node3 | 10.1.1.150 | zookeeper,codis-proxy、redis_master,redis_slave |
注:生產環境建議redis放到單獨的服務器上面
3、安裝配置
注:部署單個codis-proxy節點的環境,建議相關的安裝包本地下載完上傳到服務器上面。
#在codis-proxy(linux-node3)服務器上面操作
yum install -y git gcc make g++ gcc-c++ automake openssl-devel zlib-devel
3.1、安裝GO
cd /usr/local/src/ tar zxvf go1.7.linux-amd64.tar.gz -C /opt
注意:Zookeeper已搭建完成的下面安裝JDK和zookeeper的步驟可以跳過。
3.2、安裝JDK
rpm -ivh jdk-8u65-linux-x64.rpm
3.3、安裝zookeeper
wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz tar zxvf zookeeper-3.4.8.tar.gz -C /opt/
3.4、環境變量設置
修改環境變量:vim /etc/profile 在最后添加以下內容
#codis pathexport GOROOT=/opt/goexport GOPATH=/opt/codis JAVA_HOME=/usr/java/jdk1.8.0_101 CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PATH=$PATH:$GOROOT/bin:$JAVA_HOME/bin:
#測試環境變量設置
#執行source /etc/profile是環境變量生效,測試go是否正常安裝:
cat hello.go package main import "fmt"func main(){ fmt.Printf("hello,world\n") } [root@linux-node-2 ~]# go run hello.gohello,world!
[root@linux-node-3 ~]# yum -y install git[root@linux-node-3 opt]# go get -u -d github.com/CodisLabs/codis
可以看到no buildable Go source files in /opt/codis/src/github.com/wandoulabs/codis,我們在上面環境就是設置GOAPTH=/opt/codis,所以只要執行上面的獲取命令,就會下載在/opt/codis下:
我們進到提示的路徑進行安裝,安裝過程比較久,耐心等待:
[root@linux-node-3 ~]# cd /opt/codis/src/github.com/CodisLabs/codis
目錄執行make命令編譯代碼,并執行make gotest來跑測試
make
make gotest
建議只通過go get命令來下載codis,除非你非常熟悉go語言的目錄引用形式從而不會導致代碼放錯地方。該命令會下載master分支的最新版,我們會確保master分支的穩定。
執行全部指令后,會在 bin 文件夾內生成 codis-config、codis-proxy、codis-server三個可執行文件。另外, bin/assets 文件夾是 codis-config 的 dashboard http 服務需要的前端資源, 需要和 codis-config 放置在同一文件夾下)
通過git方式安裝codis
git clone https://github.com/CodisLabs/codis.git
git倉庫下載完畢后,我們接下來進行如下的操作。如下:
mkdir -p /opt/codis /src/github.com/CodisLabs/ cp -r codis /opt/codis/src/github.com/CodisLabs/cd /opt/codis/src/github.com/CodisLabs/codis/
#以上操作完畢后,就和通過go下載安裝方式一樣,執行make命令進行編譯,然后執行make gotest命令進行測試
通過源碼包安裝
wget https://github.com/CodisLabs/codis/archive/3.0.3.tar.gz -P /usr/local/src tar zxvf 3.0.3.tar.gz && cd codis-3.0.3 && make && make gotest
codis相關配置文件詳解
#codis安裝完成之后codis-config主要的使用方法
# ./bin/codis-config -h (master)usage: codis-config [-c ] [-L ] [--log-level=] [...] options: -c 配置文件地址 -L 日志輸出文件地址 --log-level= 輸出日志級別 (debug # ./bin/codis-proxy -h usage: codis-proxy [-c ] [-L ] [--log-level=] [--cpu=] [--addr=] [--http-addr=] options: -c 配置文件地址 -L 日志輸出文件地址 --log-level= 輸出日志級別 (debug
codis安裝完畢后,我們現在來配置codis集群,在正式配置集群之前,先創建相關的目錄,然后復制相關文件到新的目錄下。
1、codis集群配置
使用如下命令:
cd /opt/codis/src/github.com/CodisLabs/codis/ mkdir -p /opt/codis/{log,redis_conf} cp -rf bin/ /opt/codis/ cp config.ini /opt/codis/ cp extern/redis-test/conf/6379.conf /opt/codis/redis_conf/ cp extern/redis-test/conf/6380.conf /opt/codis/redis_conf/
2、編輯codis配置文件
[root@linux-node3 codis]# egrep -v "^#|^$" config.inicoordinator=zookeeper zk=192.168.1.148:2181,192.168.1.149:2181,192.168.1.150:2181 product=testdashboard_addr=192.168.1.150:18087 password= backend_ping_period=5 session_max_timeout=1800 session_max_bufsize=131072 session_max_pipeline=1024 zk_session_timeout=30000 proxy_id=proxy_3
該配置文件中,我們需要注意三個參數:zk、dashboard_addr、proxy_id。
其中zk是表示zookeeper集群的服務器IP地址,dashboard_addr表示codis web管理的IP地址及端口,proxy_id表示codis的id,注意每臺codis服務器該值要唯一。
#linux-node1
#linux-node2
#linux-node3
3、編輯redis配置文件
每臺codis服務器上,啟動兩個redis實例(也可以啟動多個redis實例),配置兩個redis,如下:
daemonize no pidfile /var/run/redis.pid port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 0 loglevel notice logfile /var/log/redis/6379.log databases 16 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump6379.rdb dir /opt/codis/ slave-serve-stale-data yes slave-read-only yes repl-disable-tcp-nodelay no slave-priority 100 appendonly no appendfilename "appendonly.aof"appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
#注意紅線標注的一個參數,配置第二個redis實例
\cp /opt/codis/redis_conf/6379.conf 6380.conf sed -i 's/6379/6380/g' /opt/codis/redis_conf/6380.conf mkdir -p /var/log/redis/
#上面操作需要在每臺codis服務上面都執行。
echo 512 > /proc/sys/net/core/somaxconn sysctl vm.overcommit_memory=1
注:優化系統的參數
4、 初始化 slots
執行 bin/codis-config slot init,該命令會在zookeeper上創建slot相關信息
/opt/codis/bin/codis-config -c /opt/codis/config.ini slot init
#linux-node3、linux-node1、linux-node2
/opt/codis/bin/codis-server /opt/codis/redis_conf/6379.conf & /opt/codis/bin/codis-server /opt/codis/redis_conf/6380.conf & ps -ef | grep codis-server
#在三臺codis-proxy上面分別啟動redis實例
5、啟動codis dashboard
#盡量在redis安裝目錄或者讓redi的log目錄下啟動dashboard,這樣方便查看啟動產生的日志,nohup.out
nohup /opt/codis/bin/codis-config -c /opt/codis/config.ini dashboard &
#從圖中可以看出dashboard已經啟動完成,然后去web頁面訪問,codis dashboard訪問端口是18087
#查看codis dashboard,瀏覽器訪問http://192.168.1.150:18087/,如下:
#codis dashboard啟動完成之后默認頁面如上圖所示,我們可以通過web頁面新建redis_group,把剛剛啟動好的redis實例加到不同的組當中、也可以通過命令行執行創建redis_group的操作。
6、添加 Redis Server Group
# 每一個 Server Group 作為一個Redis服務器組存在, 只允許有一個master, 可以有多個slave, group id僅支持大于等于1的整數
#在codis dashboard上使用命令新建server group
[root@linux-node3 ~]# cd /opt/codis/[root@linux-node3 codis]# ./bin/codis-config server -husage: codis-config server list codis-config server add codis-config server remove codis-config server promote codis-config server add-group codis-config server remove-group
#如: 添加三個 server group, 每個 group 有兩個 redis 實例,group的id分別為1和2, redis實例為一主一從。
#注:這里我把linux-node3,linux-node2,linux-node1上面的兩個redis實例分別加到不同的server group當中,詳細如下:
group_1: linux-node3 redis_6379 linux-node2 redis_6380 group_2: linux-node2 redis_6379 linux-node1 redis_6380 group_3: linux-node1 redis_5379 linux-node3 redis_6380
其中redis的6379端口作為redis master,6380作為slave
#添加一個group,group的id為1, 并添加一個redis master(192.168.1.150:6379)到該group
./bin/codis-config server add 1 192.168.1.150:6379 master
#添加一個redis slave(192.168.1.149:6380)到該group
./bin/codis-config server add 1 192.168.1.149:6380 slave
#添加一個group,group的id為2, 并添加一個redis master(192.168.1.149:6379)到該group
./bin/codis-config server add 2 192.168.1.149:6379 master
#添加一個redis slave(192.168.1.148:6380)到該group
./bin/codis-config server add 2 192.168.1.148:6380 slave
#添加一個group,group的id為3, 并添加一個redis master(192.168.1.148:6379)到該group
./bin/codis-config server add 3 192.168.1.148:6379 master
#添加一個redis slave(192.168.1.150:6380)到該group
./bin/codis-config server add 3 192.168.1.150:6380 slave
注意:每組添加的第一個redis實例不能被刪除,因為codis默認把該redis實例設置為master。
#從圖中我們可以看出server group 已經創建成功,到codis dashboard上面查看:
7、設置 server group 服務的 slot 范圍,
https://github.com/CodisLabs/codis/blob/master/doc/FAQ_zh.md
Codis 采用 Pre-sharding 的技術來實現數據的分片, 默認分成 1024 個 slots (0-1023), 對于每個key來說, 通過以下公式確定所屬的 Slot Id : SlotId = crc32(key) % 1024 每一個 slot 都會有一個且必須有一個特定的 server group id 來表示這個 slot 的數據由哪個 server group 來提供.
[root@linux-node3 codis]# ./bin/codis-config slot -husage: codis-config slot init [-f] codis-config slot info codis-config slot setcodis-config slot range-set codis-config slot migrate [--delay=] codis-config slot rebalance [--delay=]
#設置編號為[0, 340]的 slot 由 server group 1 提供服務, 編號 [341, 682] 的 slot 由 server group 2 提供服務,編號[683, 1023] 的 slot 由 server group 3 提供服務
./bin/codis-config slot range-set 0 340 1 online ./bin/codis-config slot range-set 341 682 2 online ./bin/codis-config slot range-set 683 1023 3 online
#查看slot的信息
/opt/codis/bin/codis-config -c /opt/codis/config.ini slot info 1 /opt/codis/bin/codis-config -c /opt/codis/config.ini slot info 2 /opt/codis/bin/codis-config -c /opt/codis/config.ini slot info 3
#slot操作完成可以到codis dashboard查看狀態。如下:
8、啟動 codis-proxy
./bin/codis-proxy -c config.ini -L ./log/proxy.log --cpu=1 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000
nohup /opt/codis/bin/codis-proxy -c /opt/codis/config.ini –log-level=error -L /opt/codis/log/proxy.log –cpu=1 –addr=0.0.0.0:19000 –http-addr=0.0.0.0:11000 &
#下面對以上命令中的參數進行解釋:
-c 配置文件地址。 -L 日志輸出文件地址。 –log-level= 輸出日志級別(debug –cpu= proxy占用的cpu核數,默認1,最好設置為機器的物理cpu數的一半到2/3左右。 –addr= proxy的redis server監聽的地址, 格式:, 如: localhost:9000, :9001。 –http-addr= proxy的調試信息啟動的http server,可以訪問 http://debug_http_server_addr/debug/vars。
#codis-proxy啟動后,我們可以在dashboard上進行查看,如下:
#到此codis集群搭建完畢,為了性能需求,建議redis實例和codis-proxy放到不同的服務器上面。
9、連接codis集群
codis集群搭建完畢后,測試連接codis集群。要連接codis集群,我們只需要連接codis-proxy即可。codis-proxy服務器地址:192.168.1.150,然后加19000端口。使用redis-cli命令連接,如下:
#在某臺已安裝redis實例的服務器上面測試:
通過上圖,我們可以很明顯的看到連接codis集群是ok的。
10、codis集群壓測
我們現在對codis集群做一些壓力測試,同時在dashboard上觀察鍵值對的情況。如下:
./redis-benchmark -h 192.168.1.150 -p 19000 -c 1000 -d 1000 -t set -n 100000 -r 100000
上述命令的意思是,使用redis-benchmark壓力測試命令連接codis集群,同時并發10000個(-c),測試set操作(-t),每個測試數據集是100字節(-d),請求數是100000(-n),使用使用隨機數插入數值(-r)
11、數據遷移
安全和透明的數據遷移是 Codis 提供的一個重要的功能, 也是 Codis 區別于 Twemproxy 等靜態的分布式 Redis 解決方案的地方
數據遷移的最小單位是 key, 我們在 codis redis 中添加了一些指令, 實現基于key的遷移, 如 SLOTSMGRT等 (命令列表), 每次會將特定 slot 一個隨機的 key 發送給另外一個 codis redis 實例, 這個命令會確認對方已經接收, 同時刪除本地的這個 k-v 鍵值, 返回這個 slot 的剩余 key 的數量, 整個操作是原子的.
在 codis-config 管理工具中, 每次遷移任務的最小單位是 slot
如: 將slot id 為 [0-340] 的slot的數據, 遷移到 server group 2上, –delay 參數表示每遷移一個 key 后 sleep 的毫秒數, 默認是 0, 用于限速.
#codis dashboard上面查看每個組中的數據狀態,
#可以看出剛剛我們做過壓測之后,每個redis組處理的key基本一致,然后我們把group_1中slot上的數據遷移到group_2上,–delay 參數表示每遷移一個 key 后 sleep 的毫秒數, 默認是 0, 用于限速.
$ bin/codis-config slot migrate 0 511 2 --delay=10
/opt/codis/bin/codis-config -c /opt/codis/config.ini slot migrate 0 340 2 --delay=10
#查看codis dashboard上,group狀態:
#再次刷新,3s后
#對比group中兩次的key變化,我們可以看出group_1中的slot數據正在向group_2遷移。
遷移的過程對于上層業務來說是安全且透明的, 數據不會丟失, 上層不會中止服務.
注意, 遷移的過程中打斷是可以的, 但是如果中斷了一個正在遷移某個slot的任務, 下次需要先遷移掉正處于遷移狀態的 slot, 否則無法繼續 (即遷移程序會檢查同一時刻只能有一個 slot 處于遷移狀態).
Auto Rebalance
Codis 支持動態的根據實例內存, 自動對slot進行遷移, 以均衡數據分布.
$ bin/codis-config slot rebalance
要求:
所有的codis-server都必須設置了maxmemory參數 所有的 slots 都應該處于 online 狀態, 即沒有遷移任務正在執行 所有 server group 都必須有 Master
Server group實現主從切換,當同一個組中的某一臺redis實例停止的時候,組中的其它redis實例自動切換為master角色,提供服務。
需要安裝codis-ha插件,codis-ha可以安裝在任意節點即可,只需要在一個節點上面安裝。(本實驗安裝在linux-node2上)
go get github.com/ngaut/codis-ha [root@linux-node2 ~]# cd /opt/codis/src/github.com/ngaut/[root@linux-node2 ngaut]# cp -r codis-ha /opt/[root@linux-node2 ngaut]# cd /opt/codis-ha/[root@linux-node2 codis-ha]# go build
1、啟動codis-ha服務
nohup $codis_ha_home/codis-ha -codis-config=192.168.1.150:18087 -log-level=info -productName=test &> /opt/codis-ha/codis-ha.log
注:-codis-config后跟dashboard所在服務器ip
重新啟動codis-proxy服務
注:(以150機器配置為例,其余codis-proxy只需要修改下名稱即可)
先停掉codis-proxy
[root@linux-node3 ~]# /opt/codis/bin/codis-config -c /opt/codis/config.ini proxy offline codis_proxy_3
#不同的機器只需要更改codis_proxy即可(本實驗之重啟了一臺codis-proxy,且codis-ha服務已生效)
重新啟動codis-proxy
nohup /opt/codis/bin/codis-proxy -c /opt/codis/config.ini --log-level=error -L /opt/codis/log/proxy.log --cpu=1 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
設置codis-proxy狀態為online
[root@linux-node3 ~]# /opt/codis/bin/codis-config -c /opt/codis/config.ini proxy online codis_proxy_3
注:如果重啟一臺codis-proxy之后codis-ha服務沒生效,需要重啟三臺codis-proxy
停止任意節點的zookeeper,檢查codis-proxy,dashboard是否正常>
以zookeeper狀態為leader那臺服務器測試(linux-node2)
查看zookeeper狀態確認是否為leader
[root@linux-node2 ~]# /opt/zookeeper/bin/zkServer.sh status
停止linux-node2上面的zookeeper節點,讓其他zookeeper節點自動選擇leader節點并提供服務
[root@linux-node2 ~]# /opt/zookeeper/bin/zkServer.sh stop
#隨機檢測其他節點的zookeeper狀態,檢測到linux-node2的zookeeper節點已經被選為leader,開始提供服務
#重啟刷新codis dashboard可以看到dashboard是正常的。
檢測redis客戶端是否能正常訪問codis-proxy
以linux-node3為例:
[root@linux-node3 ~]# cd /opt/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src/
#新建scripts目錄,存放redis常用命令
[root@linux-node3 src]# mkdir -p /opt/codis/scripts/[root@linux-node3 src]# cp redis-cli redis-server redis-benchmark redis-check-dump /opt/codis/scripts/
從上面可以看出我之前set的兩個key都能正常get到
停止任意group中的redis master實例,檢查redis slave是否自動切換為master模擬linux-node1(192.168.1.148)上面的redis-master 6379端口掛掉
登錄到codis-ha所在的節點(linux-node2)查看codis-ha日志,打印如下
打開dashboard界面,可以看到如下:
從圖中可以看到group_3的salve節點已經自動切換到master狀態
客戶端寫入數據,檢查切換后的redis master實例是否有新key增加
#linux-nod3新增key
重新刷新dashboard界面,查看key變化
#恢復linux-node1上的redis實例的6379端口
[root@linux-node1 ~]# /opt/codis/bin/codis-server /opt/codis/redis_conf/6379.conf &[root@linux-node1 ~]# ps -ef | grep -v grep | grep codis-serverroot 16620 13759 0 Aug27 pts/0 00:04:52 /opt/codis/bin/codis-server *:6380 root 27574 13759 2 19:40 pts/0 00:00:00 /opt/codis/bin/codis-server *:6379
刷新dashboard界面查看group中redis實例狀態變化
可以看到linux-node1上面的端口為6379的redis實例已經啟動并自動成為group_3中的slave
備注:假如當maste掛掉是,redis-ha檢測自動將slave切換為master,但是master恢復后,如果狀態仍為offline,可以把這個redis節點從group中移出,再重新添加。
2、報錯解決:
/opt /bin/zkCli.sh delete /zk/codis/db_test/dashboard
#重啟codis dashboard
nohup /usr/local/codis/bin/codis-config -c /usr/local/codis/config.ini dashbo ard &
讀到這里,這篇“Centos系統中怎么部署Codis集群服務”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。