Codis的配置與搭建

本文基於網絡上其他作者的文章,和官網的codis搭建文檔,並結合自己的搭建過程和測試,若轉載請註明出處!

什麼是CODIS

Codis 是一個分佈式 Redis 解決方案, 對於上層的應用來說, 連接到 Codis Proxy 和連接原生的 Redis Server 沒有明顯的區別 (不支持的命令列表), 上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工作, 所有後邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認爲後邊連接的是一個內存無限大的 Redis 服務。
CODIS百度百科

codis特點:
圖形化操作和管理員工具
支持大部分redis命令,完全兼容Twemproxy
代理數據在zookeeper中,可以實現高可用。redis cluster也可以通過主從實現高可用。
中文使用文檔:https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md
在這裏插入圖片描述

Codis組件

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

  • Codis FE:集羣管理界面
    • 多個集羣實例共享可以共享同一個前端展示頁面;
    • 通過配置文件管理後端 codis-dashboard 列表,配置文件可自動更新。
  • Codis Dashboard:集羣管理工具,支持 codis-proxy、codis-server 的添加、刪除,以及據遷移等操作。在集羣狀態發生改變時,codis-dashboard 維護集羣下所有 codis-proxy 的狀態的一致性。
    • 對於同一個業務集羣而言,同一個時刻 codis-dashboard 只能有 0個或者1個;
    • 所有對集羣的修改都必須通過 codis-dashboard 完成。
  • redis-sentinel:redis類似的高可用機制支持自動主從切換(HA)
  • Storage: 外部存儲(註冊中心)例如FileSystem、ETCD、Zookeeper
  • Codis Proxy:客戶端連接的 Redis 代理服務, 實現了 Redis 協議。 除部分命令不支持以外,表現的和原生的 Redis 沒有區別(就像 Twemproxy)。
    • 對於同一個業務集羣而言,可以同時部署多個 codis-proxy 實例;
    • 不同 codis-proxy 之間由 codis-dashboard 保證狀態同步。
  • Codis-Group: 沒有對應的組件,而是一個虛擬的節點機制通過槽位映射機制實現proxy與server的映射
  • Codis Server(Codis Redis):基於 redis-3.2.8 分支開發。增加了額外的數據結構,以支持 slot 有關的操作以及數據遷移指令。
  • Codis Admin:集羣管理的命令行工具。
    • 可用於控制 codis-proxy、codis-dashboard 狀態以及訪問外部存儲。

安裝環境

**安裝目錄: **
go:/usr/local/go
codis:/usr/local/codis
jdk:/usr/local/jdk
zk:/usr/local/zookeeper-3.4.14

安裝步驟

1.安裝go

wget https://dl.google.com/go/go1.12.13.linux-amd64.tar.gz
注:官方地址需要外網環境

[root@codis-master ~]# wget https://dl.google.com/go/go1.12.13.linux-amd64.tar.gz
--2019-11-22 16:37:00--  https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz
Resolving storage.googleapis.com (storage.googleapis.com)... 216.58.200.48, 2404:6800:4008:801::2010
Connecting to storage.googleapis.com (storage.googleapis.com)|216.58.200.48|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 84840658 (81M) [application/x-gzip]
Saving to: ‘go1.6.2.linux-amd64.tar.gz’

100%[===========================================================================================>] 84,840,658   340KB/s   in 3m 22s 

2019-11-22 16:40:33 (410 KB/s) - ‘go1.6.2.linux-amd64.tar.gz’ saved [84840658/84840658]

# 解壓到/usr/local/目錄下
[root@codis-master ~]# tar -zxf go1.12.13.linux-amd64.tar.gz -C /usr/local/

# 配置go環境,在/etc/profile文件中加入下面三行
[root@codis-master ~]# vim /etc/profile
export GOROOT=/usr/local/go			#go的安裝路徑
export GOPATH=/usr/local/gopath			#默認安裝包的路徑
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

# 重新加載環境變量,查看go能否全局調用
[root@codis-master ~]# source /etc/profile
[root@codis-master ~]# go version
go version go1.12.13 linux/amd64
# 測試go語言能否成功執行(體驗go語言使用)
[root@codis-master ~]# vim hello.go
package main
    import "fmt"

    func main(){
        fmt.Printf("hello,world\n")
}

[root@codis-master ~]# go run hello.go 
hello,world

2.安裝jdk

# 下載jdk包到本機中,方法不限,此處採用手動安裝:
# 將jdk包發送到Linux環境中
[root@codis-master ~]# rz
rz waiting to receive.
Starting zmodem transfer.  Press Ctrl+C to cancel.
Transferring jdk-8u191-linux-x64.tar.gz...
  100%  187259 KB    15604 KB/sec    00:00:12       0 Errors  
[root@codis-master ~]# ll
total 312236
-rw-r--r--. 1 root root 127968473 Nov  1 08:13 go1.12.13.linux-amd64.tar.gz
-rw-r--r--. 1 root root 191753373 Nov 22 18:55 jdk-8u191-linux-x64.tar.gz
[root@codis-master ~]# tar zxf jdk-8u191-linux-x64.tar.gz -C /usr/local/jdk
[root@codis-master ~]# cd /usr/local/jdk/jdk1.8.0_191/
[root@codis-master jdk1.8.0_191]# ll
total 25976
drwxr-xr-x. 2 10 143     4096 Oct  6  2018 bin
-r--r--r--. 1 10 143     3244 Oct  6  2018 COPYRIGHT
drwxr-xr-x. 3 10 143      132 Oct  6  2018 include
-rw-r--r--. 1 10 143  5207154 Sep 12  2018 javafx-src.zip
drwxr-xr-x. 5 10 143      185 Oct  6  2018 jre
drwxr-xr-x. 5 10 143      245 Oct  6  2018 lib
-r--r--r--. 1 10 143       40 Oct  6  2018 LICENSE
drwxr-xr-x. 4 10 143       47 Oct  6  2018 man
-r--r--r--. 1 10 143      159 Oct  6  2018 README.html
-rw-r--r--. 1 10 143      424 Oct  6  2018 release
-rw-r--r--. 1 10 143 21101479 Oct  6  2018 src.zip
-rw-r--r--. 1 10 143   108062 Sep 12  2018 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r--. 1 10 143   155003 Oct  6  2018 THIRDPARTYLICENSEREADME.txt

#添加環境變量,添加如下三行
[root@codis-master jdk1.8.0_191]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_191/
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

# 測試java環境
[root@codis-master jdk1.8.0_191]# source /etc/profile
[root@codis-master jdk1.8.0_191]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

3.ZooKeeper

3.1下載安裝

下載zookeeper安裝包,並解壓至/usr/local目錄下

[root@codis-master ~]# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
[root@codis-master ~]# tar zxf zookeeper-3.4.14 -C /usr/local/

修改配置文件,創建/tmp/zookeeper目錄並新建一個myid文件,寫入1

[root@codis-master ~]# cd /usr/local/zookeeper-3.4.14/conf/
[root@codis-master conf]# mv zoo_sample.cfg zoo.cfg
[root@codis-master conf]# vim zoo.cfg 
# 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.14/data			# 這裏自己設置一個路徑
# 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=192.168.6.151:2888:3888
server.2=192.168.6.152:2888:3888
server.3=192.168.6.153:2888:3888

# 創建配置文件中的目錄,並新建一個myid文件,向其中寫入1,其他兩臺服務器按上面的配置文件,寫入server後的數字
[root@codis-master apache-zookeeper-3.5.6]# mkdir /usr/local/zookeeper-3.4.14/data
[root@codis-master apache-zookeeper-3.5.6]# echo 1 > /usr/local/zookeeper-3.4.14/data/myid
1

3.2啓動

配置防火牆,打開對應端口

[root@codis-master bin]# firewall-cmd --zone=public --add-port=2181/tcp
success
[root@codis-master bin]# firewall-cmd --zone=public --add-port=2888/tcp
success
[root@codis-master bin]# firewall-cmd --zone=public --add-port=3888/tcp
success
[root@codis-master bin]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 2181 -j ACCEPT
[root@codis-master bin]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 2888 -j ACCEPT     
[root@codis-master bin]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 3888 -j ACCEPT 

啓動zookeeper

[root@codis-master ~]# cd /usr/local/zookeeper-3.4.14/bin/
[root@codis-master bin]# ./zkServer.sh start 
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED			#啓動成功

爲了方便啓動zookeeper,我們可以添加環境變量

[root@codis-master bin]# vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14/
export PATH=$PATH:$ZOOKEEPER_HOME/bin

4.Codis

4.1安裝

新建目錄與下載,使用git命令下載,沒有git命令時使用yum install -y git安裝:

[root@codis-slave01 ~]# mkdir -p $GOPATH/src/github.com/CodisLabs			# 目錄結構一定要和官網一樣,若不同則會報錯
[root@codis-slave01 ~]# cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2		#進入剛剛創建的目錄並下載release

進入codis目錄,編譯安裝:

[root@codis-master CodisLabs]# cd codis/
[root@codis-master codis]# make MALLOC=libc			#此處添加了“MALLOC=libc”參數,原因如下圖

如果編譯報錯:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
在這裏插入圖片描述
原因是jemalloc重載了Linux下的ANSI C的malloc和free函數。解決辦法:make時添加參數:make MALLOC=libc

添加了參數後又發現報錯:
在這裏插入圖片描述
此時安裝autoconf即可解決
yum install -y autoconf

安裝後繼續使用make MALLOC=libc編譯,這次編譯完成
在這裏插入圖片描述

4.2啓動

4.2.1啓動codis-dashboard

修改配置文件中admin_addr一項,改爲自己的ip

[root@codis-master codis]# vim config/dashboard.toml
# Set bind address for admin(rpc), tcp only.
admin_addr = "192.168.6.151:18080"

在這裏插入圖片描述

使用codis-dashboard-admin.sh start啓動dashboard

[root@codis-master codis]# ./admin/codis-dashboard-admin.sh start
/usr/local/gopath/src/github.com/CodisLabs/codis/admin/../config/dashboard.toml
starting codis-dashboard ... 

查看dashboard日誌確認啓動是否有異常

[root@codis-master codis]# tail -100 ./log/codis-dashboard.log.2019-11-23 		# 太多,我只保留了最後幾行,後面步驟同理
/usr/local/gopath/src/github.com/CodisLabs/codis/bin/codis-dashboard.pid
2019/11/23 15:09:03 fsclient.go:195: [INFO] fsclient - create /codis3/codis-demo/topom OK
2019/11/23 15:09:03 topom_sentinel.go:169: [WARN] rewatch sentinels = []
2019/11/23 15:09:03 main.go:179: [WARN] [0xc000095320] dashboard is working ...
2019/11/23 15:09:03 topom.go:429: [WARN] admin start service on [::]:18080
4.2.2啓動codis-proxy

使用codis-proxy-admin.sh start啓動codis-proxy,並查看proxy日誌是否有異常

[root@codis-master codis]# ./admin/codis-proxy-admin.sh start
/usr/local/gopath/src/github.com/CodisLabs/codis/admin/../config/proxy.toml
starting codis-proxy ...
[root@codis-master codis]# tail -100 ./log/codis-proxy.log.2019-11-23
2019/11/23 15:46:04 proxy.go:293: [WARN] [0xc0000a0b00] set sentinels = []
2019/11/23 15:46:04 main.go:343: [WARN] rpc online proxy seems OK
2019/11/23 15:46:05 main.go:233: [WARN] [0xc0000a0b00] proxy is working ...
4.2.3啓動codis-server

使用codis-server-admin.sh start啓動 codis-server,並查看redis日誌是否有異常

[root@codis-master codis]# ./admin/codis-server-admin.sh start
/usr/local/gopath/src/github.com/CodisLabs/codis/admin/../config/redis.conf
starting codis-server ... 
[root@codis-master codis]# tail -100 /tmp/redis_6379.log 
53996:M 23 Nov 15:30:53.514 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.11 (de1ad026/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 53996
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

53996:M 23 Nov 15:30:53.517 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
53996:M 23 Nov 15:30:53.517 # Server started, Redis version 3.2.11
53996:M 23 Nov 15:30:53.517 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
53996:M 23 Nov 15:30:53.518 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
53996:M 23 Nov 15:30:53.518 * The server is now ready to accept connections on port 6379

redis.conf 配置中 pidfile、logfile 默認保存在 /tmp 目錄,若啓動失敗,請檢查當前用戶是否有該目錄的讀寫權限。

4.2.3啓動codis-fe

使用codis-fe-admin.sh start啓動 codis-fe,並查看fe日誌是否有異常

[root@codis-master codis]# ./admin/codis-fe-admin.sh start

starting codis-fe ... 
[root@codis-master codis]# tail -100 ./log/codis-fe.log.2019-11-23 
2019/11/23 15:31:28 main.go:101: [WARN] set ncpu = 1
2019/11/23 15:31:28 main.go:104: [WARN] set listen = 0.0.0.0:9090
2019/11/23 15:31:28 main.go:120: [WARN] set assets = /usr/local/gopath/src/github.com/CodisLabs/codis/bin/assets
2019/11/23 15:31:28 main.go:162: [WARN] set --filesystem = /tmp/codis
2019/11/23 15:31:28 main.go:216: [WARN] option --pidfile = /usr/local/gopath/src/github.com/CodisLabs/codis/bin/codis-fe.pid

訪問頁面測試
在這裏插入圖片描述

防火牆

打開iptables端口,關閉防火牆

[root@codis-master codis]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT     
[root@codis-master codis]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 18080 -j ACCEPT    
[root@codis-master codis]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 18087 -j ACCEPT  
[root@codis-master codis]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 11080 -j ACCEPT
[root@codis-master codis]# systemctl stop firewalld.service   

其餘兩臺機器同理,按上方步驟操作即可

測試集羣

通過fe添加group

通過web瀏覽器訪問集羣管理頁面(fe地址:192.168.6.151:9090) 選擇我們剛搭建的集羣 codis-demo,在 Proxy 欄可看到我們已經啓動的 Proxy, 但是 Group 欄爲空,因爲我們啓動的 codis-server 並未加入到集羣 添加 NEW GROUP,NEW GROUP 行輸入 1,再點擊 NEW GROUP 即可 添加 Codis Server,Add Server 行輸入我們剛剛啓動的 codis-server 地址,添加到我們剛新建的 Group,然後再點擊 Add Server 按鈕即可,如下圖所示
在這裏插入圖片描述

通過fe初始化slot

新增的集羣 slot 狀態是 offline,因此我們需要對它進行初始化(將 1024 個 slot 分配到各個 group),而初始化最快的方法可通過 fe 提供的 rebalance all slots 按鈕來做,如下圖所示,點擊此按鈕,我們即快速完成了一個集羣的搭建。
在這裏插入圖片描述
搭建完成
在這裏插入圖片描述

在Group中輸入1,點擊New Group創建組
在這裏插入圖片描述
創建完成後在下方添加新的Server
在這裏插入圖片描述

主從測試

當master server服務掛掉後,會發現slave自動升級爲主庫
在這裏插入圖片描述
再關掉從庫的服務,出現問題
在這裏插入圖片描述
點擊PROMOTE後,此時發現主服務變爲master,再啓動152的server服務後,集羣又重新服務
在這裏插入圖片描述
在這裏插入圖片描述

性能測試

選項 描述 默認值
-h 指定服務器主機名 127.0.0.1
-p 指定服務器端口 6379
-s 指定服務器 socket
-c 指定併發連接數 50
-n 指定請求數 10000
-d 以字節的形式指定 SET/GET 值的數據大小 2
-k 1=keep alive 0=reconnect 1
-r SET/GET/INCR 使用隨機 key, SADD 使用隨機值
-P 通過管道傳輸 請求 1
-q 強制退出 redis。僅顯示 query/sec 值
–csv 以 CSV 格式輸出
-l 生成循環,永久執行測試
-t 僅運行以逗號分隔的測試命令列表。
-I Idle 模式。僅打開 N 個 idle 連接並等待。

我們使用redis-benchmark工具,用50個線程發送100000個請求

[root@codis-master bin]# ./redis-benchmark -h 192.168.6.151 -p 6379 -c 50 -n 100000 -t get
====== GET ======
  100000 requests completed in 1.35 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

97.91% <= 1 milliseconds
99.90% <= 2 milliseconds
99.95% <= 11 milliseconds
99.99% <= 12 milliseconds
100.00% <= 12 milliseconds
74019.25 requests per second


[root@codis-master bin]# ./redis-benchmark -h 192.168.6.151 -p 6379 -c 50 -n 100000 -t set 
====== SET ======
  100000 requests completed in 1.99 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

89.11% <= 1 milliseconds
99.88% <= 2 milliseconds
100.00% <= 2 milliseconds
50352.47 requests per second
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章