codis3.2實現(xiàn)redis3.2.8集群的管理

  1. Redis常見集群技術(shù)

長期以來,Redis本身僅支持單實例,內(nèi)存一般最多10到20GB。這無法支撐大型線上業(yè)務系統(tǒng)的需求。而且也造成資源的利用率過低——畢竟現(xiàn)在服務器內(nèi)存動輒100~200GB。

為解決單機承載能力不足的問題,各大互聯(lián)網(wǎng)企業(yè)紛紛出手,“自助式”地實現(xiàn)了集群機制。在這些非官方集群解決方案中,物理上把數(shù)據(jù)“分片”(sharding)存儲在多個Redis實例,一般情況下,每一“片”是一個Redis實例。

包括官方近期推出的Redis Cluster,Redis集群有三種實現(xiàn)機制,分別介紹如下,希望對大家選型有所幫助。

1.1 客戶端分片

這種方案將分片工作放在業(yè)務程序端,程序代碼根據(jù)預先設置的路由規(guī)則,直接對多個Redis實例進行分布式訪問。這樣的好處是,不依賴于第三方分布式中間件,實現(xiàn)方法和代碼都自己掌控,可隨時調(diào)整,不用擔心踩到坑。

這實際上是一種靜態(tài)分片技術(shù)。Redis實例的增減,都得手工調(diào)整分片程序?;诖朔制瑱C制的開源產(chǎn)品,現(xiàn)在仍不多見。

這種分片機制的性能比代理式更好(少了一個中間分發(fā)環(huán)節(jié))。但缺點是升級麻煩,對研發(fā)人員的個人依賴性強——需要有較強的程序開發(fā)能力做后盾。如果主力程序員離職,可能新的負責人,會選擇重寫一遍。

所以,這種方式下,可運維性較差。出現(xiàn)故障,定位和解決都得研發(fā)和運維配合著解決,故障時間變長。

這種方案,難以進行標準化運維,不太適合中小公司(除非有足夠的DevOPS)。

1.2 代理分片

這種方案,將分片工作交給專門的代理程序來做。代理程序接收到來自業(yè)務程序的數(shù)據(jù)請求,根據(jù)路由規(guī)則,將這些請求分發(fā)給正確的Redis實例并返回給業(yè)務程序。
這種機制下,一般會選用第三方代理程序(而不是自己研發(fā)),因為后端有多個Redis實例,所以這類程序又稱為分布式中間件。

這樣的好處是,業(yè)務程序不用關(guān)心后端Redis實例,運維起來也方便。雖然會因此帶來些性能損耗,但對于Redis這種內(nèi)存讀寫型應用,相對而言是能容忍的。

這是我們推薦的集群實現(xiàn)方案。像基于該機制的開源產(chǎn)品Twemproxy,便是其中代表之一,應用非常廣泛。

1.3 Redis Cluster

在這種機制下,沒有中心節(jié)點(和代理模式的重要不同之處)。所以,一切開心和不開心的事情,都將基于此而展開。

Redis Cluster將所有Key映射到16384個Slot中,集群中每個Redis實例負責一部分,業(yè)務程序通過集成的Redis Cluster客戶端進行操作。客戶端可以向任一實例發(fā)出請求,如果所需數(shù)據(jù)不在該實例中,則該實例引導客戶端自動去對應實例讀寫數(shù)據(jù)。

Redis Cluster的成員管理(節(jié)點名稱、IP、端口、狀態(tài)、角色)等,都通過節(jié)點之間兩兩通訊,定期交換并更新。

由此可見,這是一種非?!爸亍钡姆桨?。已經(jīng)不是Redis單實例的“簡單、可依賴”了??赡苓@也是延期多年之后,才近期發(fā)布的原因之一。

這令人想起一段歷史。因為Memcache不支持持久化,所以有人寫了一個Membase,后來改名叫Couchbase,說是支持Auto Rebalance,好幾年了,至今都沒多少家公司在使用。

這是個令人憂心忡忡的方案。為解決仲裁等集群管理的問題,Oracle RAC還會使用存儲設備的一塊空間。而Redis Cluster,是一種完全的去中心化……

  1. Codis實踐

Codis由豌豆莢于2014年11月開源,基于Go和C開發(fā),是近期涌現(xiàn)的、國人開發(fā)的優(yōu)秀開源軟件之一?,F(xiàn)已廣泛用于豌豆莢的各種Redis業(yè)務場景(已得到豌豆莢@劉奇同學的確認,呵呵)。

從3個月的各種壓力測試來看,穩(wěn)定性符合高效運維的要求。性能更是改善很多,最初比Twemproxy慢20%;現(xiàn)在比Twemproxy快近100%(條件:多實例,一般Value長度)。

3.1 體系架構(gòu)

Codis引入了Group的概念,每個Group包括1個Redis Master及至少1個Redis Slave,這是和Twemproxy的區(qū)別之一。這樣做的好處是,如果當前Master有問題,則運維人員可通過Dashboard“自助式”切換到Slave,而不需要小心翼翼地修改程序配置文件。

為支持數(shù)據(jù)熱遷移(Auto Rebalance),出品方修改了Redis Server源碼,并稱之為Codis Server。

Codis采用預先分片(Pre-Sharding)機制,事先規(guī)定好了,分成1024個slots(也就是說,最多能支持后端1024個Codis Server),這些路由信息保存在ZooKeeper中。ZooKeeper還維護Codis Server Group信息,并提供分布式鎖等服務。

Codis 由四部分組成:

Codis Proxy (codis-proxy)
codis-proxy 是客戶端連接的 Redis 代理服務, codis-proxy 本身實現(xiàn)了 Redis 協(xié)議, 表現(xiàn)得和一個原生的 Redis 沒什么區(qū)別 (就像 Twemproxy), 對于一個業(yè)務來說, 可以部署多個 codis-proxy, codis-proxy 本身是無狀態(tài)的.
Codis Manager (codis-config)
codis-config 是 Codis 的管理工具, 支持包括, 添加/刪除 Redis 節(jié)點, 添加/刪除 Proxy 節(jié)點, 發(fā)起數(shù)據(jù)遷移等操作. codis-config 本身還自帶了一個 http server, 會啟動一個 dashboard, 用戶可以直接在瀏覽器上觀察 Codis 集群的運行狀態(tài).
Codis Redis (codis-server)
codis-server 是 Codis 項目維護的一個 Redis 分支, 基于 2.8.13 開發(fā), 加入了 slot 的支持和原子的數(shù)據(jù)遷移指令. Codis 上層的 codis-proxy 和 codis-config 只能和這個版本的 Redis 交互才能正常運行.
ZooKeeper
Codis 依賴 ZooKeeper 來存放數(shù)據(jù)路由表和 codis-proxy 節(jié)點的元信息, codis-config 發(fā)起的命令都會通過 ZooKeeper 同步到各個存活的 codis-proxy.
如果希望有更簡單的訪問方式和更高的穩(wěn)定性:可以使用搭建HAProxy,但是會進一步增加延遲。


實驗環(huán)境:
centos7.3 主機一臺
軟件:go1.7rc3.linux-amd64.tar codis-release3.2 zookeeper-3.4.6.tar jdk-8u131-linux-x64.tar
步驟1:安裝golang ,codis是基于golang語言開發(fā)。
codis-proxy相當于redis,即連接codis-proxy和連接redis是沒有任何區(qū)別的,codis-proxy無狀態(tài),不負責記錄是否在哪保存,數(shù)據(jù)在zookeeper記錄,即codis proxy向zookeeper查詢key的記錄位置,proxy 將請求轉(zhuǎn)發(fā)到一個組進行處理,一個組里面有一個master和一個或者多個slave組成,默認有1024個槽位,redis cluster 默認有16384個槽位,其把不同的槽位的內(nèi)容放在不通的group。
部署環(huán)境:3臺服務器

[root@localhost ~]#yum install -y gcc glibc gcc-c++ make git #安裝需要的依賴包
[root@localhost ~]#tar xvf go1.7rc3.linux-amd64.tar 
[root@localhost ~]#mv  go1.7rc3.linux-amd64.tar.gz /root/
[root@localhost ~]#mv go/ /usr/local/
[root@localhost ~]#mkdir /usr/local/go/work
[root@localhost ~]#vim /etc/profile.d/env.sh
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=/usr/local/go/work
path=$PATH:$HOME/bin:$GOROOT/bin:$GOPATH/bin
[root@localhost ~]#. /etc/profile.d/env.sh #生效環(huán)境變量
[root@localhost ~]# echo $GOPATH
/usr/local/go/work
[root@localhost ~]# go version
go version go1.7rc3 linux/amd64

codis的環(huán)境已搭建好
每臺服務器安裝java環(huán)境和zookeeper,zookeeper集群最少需要3臺服務器,推薦5臺,因為zookeeper是基于java開發(fā)的:

[root@localhost ~]#tar zxf jdk-8u131-linux-x64.tar.gz
[root@localhost ~]#mv jdk1.8.0_131/ /usr/local/
[root@localhost ~]#vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
[root@localhost ~]#./etc/profile.d/jdk.sh
[root@localhost ~]# java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
[root@localhost ~]# echo $JAVA_HOME
/usr/local/jdk1.8.0_131
[root@localhost ~]# tar zxf zookeeper-3.4.6.tar.gz 
[root@localhost ~]# mv zookeeper-3.4.6 /usr/local/
[root@localhost ~]#ln -sv /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper
‘/usr/local/zookeeper’ -> ‘/usr/local/zookeeper-3.4.6/’

[root@localhost ~]#cp /opt/
[root@localhost ~]#mkdir zk1 zk2 zk3 
#準備zookeeper 服務ID,每個服務器的ID是不同的
[root@localhost opt]# ll
total 20
drwxr-xr-x. 3 root root    78 Sep 17 22:21 zk1
drwxr-xr-x. 3 root root    78 Sep 17 22:23 zk2
drwxr-xr-x. 3 root root    78 Sep 17 22:24 zk3
[root@localhost opt]#echo 1 > zk1/myid
[root@localhost opt]#echo 2 > zk2/myid
[root@localhost opt]#echo 3 > zk3/myid
[root@localhost opt]#cp /usr/local/zookeeper-3.4.6/conf/zoo_sample.cfg /opt/zk1/zk1.cfg

步驟二:
配置三個zookeeper節(jié)點的配置文件,一下為節(jié)點1

[root@localhost opt]#cat /opt/zk1/zk1.cfg
# The number of milliseconds of each tick
tickTime=6000
# 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=10
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/opt/zk1
# 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
server.1=192.168.100.201:2887:3887
server.2=192.168.100.201:2888:3888
server.3=192.168.100.201:2889:3889
#
# 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

節(jié)點2:

[root@localhost opt]#cat /opt/zk2/zk2.cfg
# The number of milliseconds of each tick
tickTime=6000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=20
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=10
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/opt/zk2
# the port at which the clients will connect
clientPort=2182
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
server.1=192.168.100.201:2887:3887
server.2=192.168.100.201:2888:3888
server.3=192.168.100.201:2889:3889
#
# 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

節(jié)點3

[root@localhost opt]#cat /opt/zk3/zk3.cfg
# The number of milliseconds of each tick
tickTime=6000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=20
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=10
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/opt/zk3
# the port at which the clients will connect
clientPort=2183
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
server.1=192.168.100.201:2887:3887
server.2=192.168.100.201:2888:3888
server.3=192.168.100.201:2889:3889
#
# 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

參數(shù)解析

tickTime:這個時間是作為 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發(fā)送一個心跳。

dataDir:顧名思義就是 Zookeeper 保存數(shù)據(jù)的目錄,默認情況下,Zookeeper 將寫數(shù)據(jù)的日志文件也保存在這個目錄里。

clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監(jiān)聽這個端口,接受客戶端的訪問請求。

initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這里所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集群中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數(shù)。當已經(jīng)超過 5個心跳的時間(也就是 tickTime)長度后 Zookeeper 服務器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗。總的時間長度就是 10*6000=60 秒

syncLimit:這個配置項標識 Leader 與 Follower 之間發(fā)送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 5*6000=30 秒

server.A=B:C:D:其中 A 是一個數(shù)字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集群中的 Leader 服務器交換信息的端口;D 表示的是萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執(zhí)行選舉時服務器相互通信的端口。如果是偽集群的配置方式,由于 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。

[root@localhost ~]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk1/zk1.cfg
/usr/local/zookeeper/bin/zkServer.sh start /opt/zk2/zk2.cfg
/usr/local/zookeeper/bin/zkServer.sh start /opt/zk3/zk3.cfg
[root@localhost opt]# ss -tnlp|grep 218*
LISTEN     0      128         :::18080                   :::*                   users:(("codis-dashboard",pid=9721,fd=6))
LISTEN     0      50          :::2181                    :::*                   users:(("java",pid=2267,fd=23))
LISTEN     0      50          :::2182                    :::*                   users:(("java",pid=2552,fd=23))
LISTEN     0      50          :::2183                    :::*                   users:(("java",pid=2594,fd=23))

查看各節(jié)點的zookeeper的狀態(tài)信息

[root@localhost ~]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk1/zk1.cfg
JMX enabled by default
Using config: /opt/zk1/zk1.cfg
Mode: follower
[root@localhost ~]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk2/zk2.cfg
JMX enabled by default
Using config: /opt/zk2/zk2.cfg
Mode: leader
[root@localhost ~]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk3/zk3.cfg 
JMX enabled by default
Using config: /opt/zk3/zk3.cfg
Mode: follower

步驟三:
安裝codis3.2

[root@localhost ~]# mkdir -p $GOPATH/src/github.com/CodisLabs
[root@localhost ~]#cd /usr/local/go/work/src/github.com/CodisLabs
[root@localhost codis]#  yum install autoconf automake libtool -y #安裝編譯過程中依賴的包,否則會編譯失敗。
[root@localhost CodisLabs]# unzip codis-release3.2.zip 
[root@localhost CodisLabs]#mv unzip codis-release3.2.zip  codis
[root@localhost CodisLabs]#cd codis
[root@localhost codis]#make 
[root@localhost codis]#make gotest # 測試是否成功
go test ./cmd/... ./pkg/...
? github.com/CodisLabs/codis/cmd/admin    [no test files]
? github.com/CodisLabs/codis/cmd/dashboard    [no test files]
? github.com/CodisLabs/codis/cmd/fe    [no test files]
? github.com/CodisLabs/codis/cmd/proxy    [no test files]
? github.com/CodisLabs/codis/pkg/models    [no test files]
? github.com/CodisLabs/codis/pkg/models/etcd    [no test files]
? github.com/CodisLabs/codis/pkg/models/fs    [no test files]
? github.com/CodisLabs/codis/pkg/models/zk    [no test files]
ok github.com/CodisLabs/codis/pkg/proxy    2.525s
ok github.com/CodisLabs/codis/pkg/proxy/redis    0.530s
ok github.com/CodisLabs/codis/pkg/topom    6.560s
ok github.com/CodisLabs/codis/pkg/utils    0.009s
? github.com/CodisLabs/codis/pkg/utils/assert    [no test files]
ok github.com/CodisLabs/codis/pkg/utils/bufio2    0.006s
ok github.com/CodisLabs/codis/pkg/utils/bytesize    0.004s
? github.com/CodisLabs/codis/pkg/utils/errors    [no test files]
? github.com/CodisLabs/codis/pkg/utils/log    [no test files]
ok github.com/CodisLabs/codis/pkg/utils/math2    0.002s
? github.com/CodisLabs/codis/pkg/utils/redis    [no test files]
? github.com/CodisLabs/codis/pkg/utils/rpc    [no test files]
? github.com/CodisLabs/codis/pkg/utils/sync2    [no test files]
? github.com/CodisLabs/codis/pkg/utils/sync2/atomic2    [no test files]
ok github.com/CodisLabs/codis/pkg/utils/timesize    0.009s
? github.com/CodisLabs/codis/pkg/utils/trace    [no test files]
ok github.com/CodisLabs/codis/pkg/utils/unsafe2    0.003s

默認啟動的會讀取config目錄的dashboard.toml文件,編輯如下:vim /usr/local/go/work/src/github.com/CodisLabs/codis/config/dashboard.toml

[root@localhost config]#vim dashboard.toml 

##################################################
#                                                #
#                  Codis-Dashboard               #
#                                                #
##################################################

# Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem".
# Quick Start
coordinator_name = "zookeeper"
coordinator_addr = "192.168.100.201:2181,192.168.100.201:2182,192.168.100.201:2183"
#coordinator_name = "zookeeper"
#coordinator_addr = "127.0.0.1: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"

# Set arguments for data migration (only accept 'sync' & 'semi-async').
migration_method = "semi-async"
migration_parallel_slots = 100
migration_async_maxbulks = 200
migration_async_maxbytes = "32mb"
migration_async_numkeys = 500
migration_timeout = "30s"

# Set configs for redis sentinel.
sentinel_client_timeout = "10s"
sentinel_quorum = 2
sentinel_parallel_syncs = 1
sentinel_down_after = "30s"
sentinel_failover_timeout = "5m"
sentinel_notification_script = ""
sentinel_client_reconfig_script = ""

啟動dashboard:

[root@localhost codis]# nohup ./bin/codis-dashboard --ncpu=1 --config=config/dashboard.toml --log=dashboard.log --log-level=WARN >> /var/log/codis_dashboard.log &

默認配置文件獲取方式:./bin/codis-dashboard --default-config | tee dashboard.toml

啟動代理

[root@localhost codis]#nohup ./bin/codis-proxy --ncpu=1 --config=config/proxy.toml --log=proxy.log --log-level=WARN >> /var/log/codis_proxy.log &
[root@localhost config]# vim proxy.toml 

##################################################
#                                                #
#                  Codis-Proxy                   #
#                                                #
##################################################

# Set Codis Product Name/Auth.
product_name = "codis-demo" #管理界面的名稱
product_auth = "123456" #認證密碼

# Set auth for client session
#   1. product_auth is used for auth validation among codis-dashboard,
#      codis-proxy and codis-server.
#   2. session_auth is different from product_auth, it requires clients
#      to issue AUTH <PASSWORD> before processing any other commands.
session_auth = ""

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

# Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
proto_type = "tcp4"
proxy_addr = "0.0.0.0:19000"

# Set jodis address & session timeout
#   1. jodis_name is short for jodis_coordinator_name, only accept "zookeeper" & "etcd".
#   2. jodis_addr is short for jodis_coordinator_addr
#   3. proxy will be registered as node:
#        if jodis_compatible = true (not suggested):
#          /zk/codis/db_{PRODUCT_NAME}/proxy-{HASHID} (compatible with Codis2.0)
#        or else
#          /jodis/{PRODUCT_NAME}/proxy-{HASHID}
jodis_name = "zookeeper"
jodis_addr = "192.168.100.201:2181,192.168.100.201:2182,192.168.100.201:2183" #zookeeper的地址
jodis_timeout = "20s"
jodis_compatible = true #false改成trun

# Set datacenter of proxy.
proxy_datacenter = ""

# Set max number of alive sessions.
proxy_max_clients = 1000

# Set max offheap memory size. (0 to disable)
proxy_max_offheap_size = "1024mb"

# Set heap placeholder to reduce GC frequency.
proxy_heap_placeholder = "256mb"

# Proxy will ping backend redis (and clear 'MASTERDOWN' state) in a predefined interval. (0 to disable)
backend_ping_period = "5s"

# Set backend recv buffer size & timeout.
backend_recv_bufsize = "128kb"
backend_recv_timeout = "30s"

# Set backend send buffer & timeout.
backend_send_bufsize = "128kb"
backend_send_timeout = "30s"

# Set backend pipeline buffer size.
backend_max_pipeline = 20480

# Set backend never read replica groups, default is false
backend_primary_only = false

# Set backend parallel connections per server
backend_primary_parallel = 1
backend_replica_parallel = 1

# Set backend tcp keepalive period. (0 to disable)
backend_keepalive_period = "75s"

# Set number of databases of backend.
backend_number_databases = 16

# If there is no request from client for a long time, the connection will be closed. (0 to disable)
# Set session recv buffer size & timeout.
session_recv_bufsize = "128kb"
session_recv_timeout = "30m"

# Set session send buffer size & timeout.
session_send_bufsize = "64kb"
session_send_timeout = "30s"

# Make sure this is higher than the max number of requests for each pipeline request, or your client may be blocked.
# Set session pipeline buffer size.
session_max_pipeline = 10000

# Set session tcp keepalive period. (0 to disable)
session_keepalive_period = "75s"

# Set session to be sensitive to failures. Default is false, instead of closing socket, proxy will send an error response to client.
session_break_on_failure = false

# Set metrics server (such as http://localhost:28000), proxy will report json formatted metrics to specified server in a predefined period.
metrics_report_server = ""
metrics_report_period = "1s"

# Set influxdb server (such as http://localhost:8086), proxy will report metrics to influxdb.
metrics_report_influxdb_server = ""
metrics_report_influxdb_period = "1s"
metrics_report_influxdb_username = ""
metrics_report_influxdb_password = ""
metrics_report_influxdb_database = ""

# Set statsd server (such as localhost:8125), proxy will report metrics to statsd.
metrics_report_statsd_server = ""
metrics_report_statsd_period = "1s"
metrics_report_statsd_prefix = ""
添加管理接口:
./bin/codis-admin --dashboard=192.168.100.201:18080 --create-proxy -x 192.168.100.201:11080

步驟四:啟動codis-server,即創(chuàng)建redis實例(此處我們創(chuàng)建4個redis實例,給予codis修改過的redis-3.2.8非原生redis)

[root@localhost~]#  mkdir -pv /var/lib/redis_638{1..4}
mkdir: created directory ‘/var/lib/redis_6381’
mkdir: created directory ‘/var/lib/redis_6382’
mkdir: created directory ‘/var/lib/redis_6383’
mkdir: created directory ‘/var/lib/redis_6384’
[root@localhost ~]# pwd
/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.8
[root@localhost ~ redis-3.2.8]# cp redis.conf /usr/local/go/work/src/github.com/CodisLabs/codis/
[root@localhost ~ redis-3.2.8]## cd /usr/local/go/work/src/github.com/CodisLabs/codis/

修改redis.conf

pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump_6381.rdb
dir /var/lib/redis_6381
logfile "/tmp/redis_6381.log"
maxmemory 1g #一定要設置最大內(nèi)存,否則后面的codis無法使用
[root@node1 codis]# cp redis.conf redis_6381.conf
[root@localhost codis]# cp redis_6381.conf redis_6382.conf 
[root@localhost codis]# cp redis_6381.conf redis_6383.conf 
[root@localhost codis]# cp redis_6381.conf redis_6384.conf
[root@localhost codis]# sed -i 's/6381/6382/g' redis_6382.conf
[root@localhost codis]# sed -i 's/6381/6383/g' redis_6383.conf
[root@localhost codis]# sed -i 's/6381/6384/g' redis_6384.conf

通過codis-server指定redis.conf文件啟動redis服務,不能通過redis命令啟動redis服務,通過redis啟動的redis 服務加到codis集群無法正常使用:


[root@localhost codis]# ./bin/codis-server ./redis_6381.conf 
[root@localhost codis]# ./bin/codis-server ./redis_6382.conf 
[root@localhost codis]# ./bin/codis-server ./redis_6383.conf 
[root@localhost codis]# ./bin/codis-server ./redis_6384.conf

驗證是否成功

[root@localhost codis]# ss -tnlp|grep 638*
LISTEN     0      128          *:6381                     *:*                   users:(("codis-server",pid=9850,fd=4))
LISTEN     0      128          *:6382                     *:*                   users:(("codis-server",pid=9855,fd=4))
LISTEN     0      128          *:6383                     *:*                   users:(("codis-server",pid=9861,fd=4))
LISTEN     0      128          *:6384                     *:*                   users:(("codis-server",pid=9866,fd=4))

啟動codis-fe,Listen監(jiān)聽端口不要為8080,指定8090

[root@localhost codis]#nohup ./bin/codis-fe --ncpu=1 --log=fe.log --log-level=WARN --zookeeper=192.168.3.198:2181 --listen=192.168.3.198:8090 &

通過網(wǎng)頁訪問:http://192.168.100.201:8090 可以看到codis的管理頁面

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Codis 3.2 部署配置匯總 概念總結(jié) 集群配置前需要了解架構(gòu),集群分片主要分三種: 客戶端分片:這個需要自己...
    三杯水Plus閱讀 6,316評論 0 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 由于Redis出眾的性能,其在眾多的移動互聯(lián)網(wǎng)企業(yè)中得到廣泛的應用。Redis在3.0版本前只支持單實例模式,雖然...
    andyjoe閱讀 59,316評論 3 7
  • 本文針對Redis以及redis的幾種集群方案的調(diào)研日期在2016年8月,后續(xù)如果各框架有更新與本文不符,請自行甄...
    范安林閱讀 76,492評論 0 35
  • Codis 是一個分布式 Redis 解決方案, 對于上層的應用來說, 連接到 Codis Proxy 和連接原生...
    柏樹_Jeff閱讀 843評論 0 2

友情鏈接更多精彩內(nèi)容