Codis+redis 集羣測試

 

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

 

組件說明:java

Codis 3.x 由如下組件組成:linux

 

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

 

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

 

對於同一個業務集羣而言,能夠同時部署多個 codis-proxy 實例;github

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

Codis Dashboard:集羣管理工具,支持 codis-proxycodis-server 的添加、刪除,以及據遷移等操做。在集羣狀態發生改變時,codis-dashboard 維護集羣下全部 codis-proxy 的狀態的一致性。redis

 

redis-sentinel:能夠實現對Redis的監控、通知、自動故障轉移。若是Master不能工做,則會自動啓動故障轉移進程,將其中的一個Slave提高爲Master,其餘的Slave從新設置新的Master服務。Sentinel的配置由 codis-dashboard和zookeeper一塊兒控制,不須要手工填寫.apache

codis-fe:集羣web管理界面。vim

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

全部對集羣的修改都必須經過 codis-dashboard 完成。

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

 

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

Codis FE:集羣管理界面。

 

多個集羣實例共享能夠共享同一個前端展現頁面;

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

Storage:爲集羣狀態提供外部存儲。

 

提供 Namespace 概念,不一樣集羣的會按照不一樣 product name 進行組織;

目前僅提供了 ZookeeperEtcdFs 三種實現,可是提供了抽象的 interface 可自行擴展。

 總體架構 以下

一、測試環境以下
zookeeper-3.4.10 第一臺部署兩個 zookeeper,第二臺部署一臺
Codis-3.2
Centos6.8

二、安裝go運行環境

yum install -y gcc glibc gcc-c++ make git mercurial

wget https://dl.google.com/go/go1.9.2.linux-amd64.tar.gz  

三、設置編譯環境

tar xf go1.9.2.linux-amd64.tar.gz

mv go /usr/local/

[root@open-falcon-server tools]# mv go /usr/local/

[root@open-falcon-server tools]#  mkdir /usr/local/go/work

[root@open-falcon-server tools]# vim /root/.bash_profile

PATH=$PATH:$HOME/bin

 

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@open-falcon-server tools]# source /root/.bash_profile

[root@open-falcon-server tools]# echo $GOPATH

/usr/local/go/work

[root@open-falcon-server tools]# go version

go version go1.9.4 linux/amd64

 四、設置java環境變量

[root@open-falcon-server tools]# tar xf jdk-8u171-linux-x64.tar.gz

[root@open-falcon-server tools]# mv jdk1.8.0_171/  /usr/local/

 

[root@open-falcon-server appadmin]# source /etc/profile

[root@open-falcon-server appadmin]# tail -2 /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_171

export PATH=$JAVA_HOME/bin:$PATH

[root@open-falcon-server appadmin]# java -version

java version "1.8.0_171"

Java(TM) SE Runtime Environment (build 1.8.0_171-b11)

Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

 

五、部署zookeeper


[root@open-falcon-server tools]# wget  http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz 
[root@open-falcon-server tools]# tar xf zookeeper-3.4.10.tar.gz 
[root@open-falcon-server tools]# mv zookeeper-3.4.10 /usr/local/
[root@open-falcon-server tools]# ln -s /usr/local/zookeeper-3.4.10/ /usr/local/zookeeper

[root@open-falcon-server data]# cd /data/
[root@open-falcon-server data]# mkdir zk1 zk2 
[root@open-falcon-server data]# echo 1 >zk1/myid
[root@open-falcon-server data]# echo 2>zk2/myid
cp /usr/local/zookeeper-3.4.10/conf/zoo_sample.cfg /data/zk1/zk1.cfg
[root@open-falcon-server zk1]# grep "^[a-z]" zk1.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zk1
clientPort=2181
server.1=10.8.18.120:2887:3887
server.2=10.8.18.120:2888:3888
server.3=10.8.18.121:2889:3889

[root@open-falcon-server zk1]# grep "^[a-z]" ../zk2/zk2.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zk2
clientPort=2182
server.1=10.8.18.120:2887:3887
server.2=10.8.18.120:2888:3888
server.3=10.8.18.121:2889:3889


#第二臺
[root@Yeahka-6 tools]# cd /data/
[root@Yeahka-6 data]# ll
總用量 0
[root@Yeahka-6 data]# mkdir zk3
[root@Yeahka-6 data]# echo 3 > zk3/myid
[root@codis-2 data]# cp /usr/local/zookeeper/conf/zoo_sample.cfg /data/zk3/zk3.cfg
[root@codis-2 data]# grep "^[a-z]" zk3/zk3.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zk3
clientPort=2183
server.1=10.8.18.120:2887:3887
server.2=10.8.18.120:2888:3888
server.3=10.8.18.121:2889:3889

 

六、啓動兩臺機器的zookeeper

[root@open-falcon-server zk1]# /usr/local/zookeeper/bin/zkServer.sh start /data/zk1/zk1.cfg

ZooKeeper JMX enabled by default

Using config: /data/zk1/zk1.cfg

Starting zookeeper ... STARTED

[root@open-falcon-server zk1]#

[root@open-falcon-server zk1]# /usr/local/zookeeper/bin/zkServer.sh start /data/zk2/zk2.cfg

[root@codis-2 data]# /usr/local/zookeeper/bin/zkServer.sh start /data/zk3/

 
 

3.2查看狀態

[root@codis-2 data]# /usr/local/zookeeper/bin/zkServer.sh status /data/zk3/zk3.cfg

 
 

ZooKeeper JMX enabled by default

 
 

Using config: /data/zk3/zk3.cfg

 
 

Mode: leader

 
 

[root@open-falcon-server appadmin]# /usr/local/zookeeper/bin/zkServer.sh status /data/zk1/zk1.cfg

 
 

ZooKeeper JMX enabled by default

 
 

Using config: /data/zk1/zk1.cfg

 
 

Mode: follower

 
 

[root@open-falcon-server appadmin]# /usr/local/zookeeper/bin/zkServer.sh status /data/zk2/zk2.cfg

 
 

ZooKeeper JMX enabled by default

 
 

Using config: /data/zk2/zk2.cfg

 
 

Mode: follower

 

 

七、測試鏈接到zookeeper節點

[root@open-falcon-server appadmin]# /usr/local/zookeeper/bin/zkCli.sh -server 10.8.18.121:2183

 

八、部署codis3.2

 


[root@open-falcon-server appadmin]# mkdir -p $GOPATH/src/github.com/CodisLabs
[root@open-falcon-server appadmin]# cd  /usr/local/go/work/src/github.com/CodisLabs
[root@open-falcon-server CodisLabs]# git clone https://github.com/CodisLabs/codis.git -b release3.2
[root@open-falcon-server CodisLabs]# cd $GOPATH/src/github.com/CodisLabs/codis
[root@open-falcon-server codis]# pwd
/usr/local/go/work/src/github.com/CodisLabs/codis

[root@open-falcon-server codis]#yum install autoconf automake libtool -y
[root@open-falcon-server codis]# make
[root@open-falcon-server codis]# make
make -j4 -C extern/redis-3.2.11/
make[1]: Entering directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11'
cd src && make all
make[2]: Entering directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11/src'

Hint: It's a good idea to run 'make test' ;)

make[2]: Leaving directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11/src'
make[1]: Leaving directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11'
go build -i -o bin/codis-dashboard ./cmd/dashboard
go build -i -tags "cgo_jemalloc" -o bin/codis-proxy ./cmd/proxy
go build -i -o bin/codis-admin ./cmd/admin
go build -i -o bin/codis-ha ./cmd/ha
go build -i -o bin/codis-fe ./cmd/fe

九、配置dashboard

 


[root@codis-2 codis]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/config/
[root@codis-2 config]# cp dashboard.toml dashboard.toml.ori
[root@codis-2 config]# vim dashboard.toml
coordinator_name = "zookeeper"
coordinator_addr = "10.8.18.120:2181,10.8.18.120:2182,10.8.18.121:2183"
product_auth = "hello123"

啓動dashboard
./admin/codis-dashboard-admin.sh start

啓動proxy
[root@codis-2 codis]# ./admin/codis-proxy-admin.sh start

Proxy
product_name = "codis-fengkong"
product_auth = "hello123"

jodis_name = "zookeeper"
jodis_addr = "192.168.11.225:2181,192.168.11.225:2182,192.168.11.226:2183"
jodis_timeout = "20s"
jodis_compatible = true
42 部署redis
[root@open-falcon-server codis]#  mkdir -pv /var/lib/redis_638{1..2}
[root@codis-2 codis]#  mkdir -pv /var/lib/redis_638{3..4}

[root@open-falcon-server codis]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11/
[root@open-falcon-server redis-3.2.11]# cp redis.conf /usr/local/go/work/src/github.com/CodisLabs/codis/
[root@open-falcon-server redis-3.2.11]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/

修改redis.conf
pidfile /var/run/redis_6381.pid
port 6381
bind 10.8.18.120
requirepass hello123
dbfilename dump_6381.rdb
dir /var/lib/redis_6381
logfile "/tmp/redis_6381.log"
maxmemory 256M
[root@open-falcon-server codis]# cp redis.conf redis_6381.conf
[root@open-falcon-server codis]# cp redis_6381.conf redis_6382.conf 
[root@open-falcon-server codis]# vim redis_6382.conf 
[root@open-falcon-server codis]# sed -i 's/6381/6382/g' redis_6382.conf


[root@open-falcon-server codis]# ./bin/codis-server ./redis_6381.conf 
[root@open-falcon-server codis]# ./bin/codis-server ./redis_6382.conf 

 

[root@codis-2 codis]# cp redis_6381.conf redis_6383.conf 
[root@codis-2 codis]# cp redis_6381.conf redis_6384.conf 
[root@codis-2 codis]# sed -i 's/6381/6383/g' redis_6383.conf
[root@codis-2 codis]#  sed -i 's/6381/6384/g' redis_6384.conf

[root@codis-2 codis]# ./bin/codis-server ./redis_6383.conf 
[root@codis-2 codis]# ./bin/codis-server ./redis_6384.conf 

啓動codis-fe,Listen監聽端口不要爲8080,指定8090
[root@codis-2 codis]# nohup ./bin/codis-fe --ncpu=1 --log=fe.log --log-level=WARN --zookeeper=10.8.18.121:2183 --listen=10.8.18.121:8090 &
經過網頁訪問:http://10.8.18.121:8090 能夠看到codis的管理頁面

 

 

經過fe添加group

經過web瀏覽器訪問集羣管理頁面(fe地址:10.8.18.121:8090) 選擇咱們剛搭建的集羣 codis-demo,在 Proxy 欄可看到咱們已經啓動的 Proxy, 可是 Group 欄爲空,由於咱們啓動的 codis-server 並未加入到集羣 添加 NEW GROUPNEW GROUP 行輸入 1,再點擊 NEW GROUP 便可 添加 Codis Server

slots進行分組

 

以下圖所示,輸入所要分組的slots的起和止的範圍,而後輸入組ID,點擊後面按鈕便可。

經過proxy 鏈接redis測試

Web界面查看key是否添加成功

生產環境下,爲了使總體架構更加完整  咱們在codis-proxy前面 加個 haproxy+keepalived  ,codis-server(即redis)  咱們採用 redis-sentinel  來進行組內的主備切換

 

十、haproxy+keepalived

###haproxy  配置  主上面配置
global
     log 127.0.0.1     local0
     maxconn 40960 
     #chroot /usr/share/haproxy
     user haproxy
     group haproxy
     nbproc 4
     daemon
     pidfile /var/run/haproxy.pid
     #debug
     #quiet

defaults
     log     global
     mode     tcp
     option     tcplog
     retries    3
     #maxconn     2000
     timeout connect 10s
     timeout client 20s
     timeout server 30s
     timeout check 5s
#martin add 20180831
listen channel_posp_socket_1 0.0.0.0:10000
    balance roundrobin
    server codis_proxy_server_1 192.168.11.225:19000 weight 50 check
    server codis_proxy_server_2 192.168.11.226:19000 weight 50 check

###keepalived 配置

[root@ config]# cat /etc/keepalived/keepalived.conf
global_defs {
notification_email {
martin@qq.com
}
notification_email_from keepalived@domain.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}

#LAN virtual IP
vrrp_instance VI_12 {
state MASTER
interface bond0
virtual_router_id 111
mcast_src_ip 192.168.11.226
priority 101
advert_int 5
authentication {
auth_type PASS
auth_pass 1210
}
virtual_ipaddress {
192.168.11.8/24 dev bond0 scope global
}
}

 

從上面配置

global
log 127.0.0.1 local0
maxconn 40960
#chroot /usr/share/haproxy
user haproxy
group haproxy
nbproc 4
daemon
pidfile /var/run/haproxy.pid
#debug
#quiet

defaults
log global
mode tcp
option tcplog
retries 3
#maxconn 2000
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s


#martin add 20180831
listen channel_posp_socket_1 0.0.0.0:10000
balance roundrobin
server codis_proxy_server_1 192.168.11.225:19000 weight 50 check
server codis_proxy_server_2 192.168.11.226:19000 weight 50 check

 

 

#keepalived

global_defs {
notification_email {
martin@qq.com
}
notification_email_from keepalived@domain.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}

#LAN virtual IP
vrrp_instance VI_12 {
state BACKUP
interface bond0
virtual_router_id 111
mcast_src_ip 192.168.11.225
priority 110
advert_int 5
authentication {
auth_type PASS
auth_pass 1210
}
virtual_ipaddress {
192.168.11.8/24 dev bond0 scope global
}
}

 

 

 

十一、redis-sentinel 配置以下

正確來講,redis-sentinel是要配置主從架構才能生效,可是在codis集羣中並不同,由於他的配置由zookeeper來維護,因此,這裏codis使用的redis-sentinel只須要配置一些基本配置就能夠了.

bind 0.0.0.0
protected-mode no
port 26379
dir "/var/lib/redis_sentinel"

pidfile "/var/run/redis_sentinel_26379.pid"
logfile "/tmp/redis_sentinel_26379.log"
daemonize yes


#而後就能夠啓動了
/usr/local/codis/redis-sentinel sentinel.conf
#驗證一下
redis-cli -p 26379 -c info Sentinel

# Sentinel
sentinel_masters:8
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=codis-fengkong-8,status=ok,address=192.168.11.226:6370,slaves=1,sentinels=2
master1:name=codis-fengkong-3,status=ok,address=192.168.11.225:6385,slaves=1,sentinels=2
master2:name=codis-fengkong-5,status=ok,address=192.168.11.226:6387,slaves=1,sentinels=2
master3:name=codis-fengkong-4,status=ok,address=192.168.11.226:6386,slaves=1,sentinels=2
master4:name=codis-fengkong-2,status=ok,address=192.168.11.226:6384,slaves=1,sentinels=2
master5:name=codis-fengkong-7,status=ok,address=192.168.11.226:6389,slaves=1,sentinels=2
master6:name=codis-fengkong-6,status=ok,address=192.168.11.226:6388,slaves=1,sentinels=2
master7:name=codis-fengkong-1,status=ok,address=192.168.11.225:6383,slaves=1,sentinels=2

 

 

相關文章
相關標籤/搜索