Codis 分佈式緩存部署

環境介紹:前端

1:機器三臺 ,IP/hostname 以下,   hostname的設置很重要zookeeper / codis的通訊都會用到,因此要配置好三臺機器的hosts文件.java

10.221.8.220 機器的hostname爲 Redis1linux

10.221.8.221 機器的hostname爲 Redis2c++

10.221.8.222 機器的hostname爲 Redis3git

三臺機器的/etc/hosts 文件添加以下解析github

10.221.8.220    Redis1golang

10.221.8.1.221    Redis2web

10.221.8.1.222    Redis3redis


2: 三臺機器的系統都是centos 6.5 已經安裝基本服務.bootstrap

yum -y install gcc gcc-c++ make glibc glibc-devel glib2 glib2-devel patch autoconf automake(安裝基本編譯工具)

yum -y install ntp wget unzip vixie-cron ntsysv openssh-clients sysstat irqbalance subversion(安裝經常使用系統軟件,按需)

yum update -y (更新軟件包)


3:使用三臺機器作codis集羣的服務部署如圖:

服務的部署

第一步: zookeeper的安裝

zookeeper的安裝請參考 http://my.oschina.net/denglz/blog/503912

注意: 三臺機器上的zookeeper都已啓動


第二步:golang環境的部署

1: 下載golang 

wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz

2: 解壓go1.4.1.linux-amd64.tar.gz移動go目錄到/usr/local/ 目錄下.

3:進入 /usr/local/go/src 目錄執行下面的命令

bash all.bash

4:配置golang的環境變量, 修改/etc/profile  (個人jdk與golang的環境變量以下)

ZOOKEEPER_HOME=/usr/local/zookeeper-3.3.6

GOROOT=/usr/local/go

JAVA_HOME=/usr/local/jdk1.8

CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export GOPATH=/usr/local/codis

export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ZOOKEEPER_HOME/bin:$GOROOT/bin

5:下載codis 

   go get github.com/wandoulabs/codis

    若是報錯: go: missing Git command. See http://golang.org/s/gogetcmd

    安裝git便可解決:  yum install git


第三步:codis的部署域服務的啓動

1:codis的安裝與配置

cd /usr/local/codis/src/github.com/wandoulabs/codis

執行 bootstrap.sh腳本進行codis的安裝 (須要等一下)

sh bootstrap.sh

安裝結束後會在 codis/bin 文件夾生成 codis-config, codis-proxy 兩個可執行文件, (另外, bin/assets 文件夾是 codis-config 的 dashboard http 服務須要的前端資源, 須要和 codis-config 放置在同一文件夾下)

 mkdir -p /usr/local/codis/{logs,conf,scripts}   #log目錄存放日誌,conf 目錄存放codis-server的配置文件與config.ini配置文件,scripts目錄存放codis服務的啓動腳本.

cp -rf bin /usr/local/codis/    #bin目錄裏面是一些可執行文件與dashboard http 服務須要的前端資源.

cp config.ini /usr/local/codis/conf/    #config.ini  是codis的配置文件

cp ./extern/redis-test/conf/6379.conf /usr/local/codis/conf/  #6379.conf  是codis-server的配置文件

修改config.ini文件,修改好的config.ini文件內容以下

[root@Redis1 codis]# cat bin/config.ini | grep -v "^#" | grep -v "^$"

coordinator=zookeeper

zk=10.221.8.220:2181,10.221.8.221:2181,10.221.8.222:2181        #三臺機器的zookeeper的ip域端口

product=codis

dashboard_addr=10.221.8.220:18087        #codis 架構中提供web操做界面服務的機器的ip與端口,(Redis1中的redis-config服務提供的web操做界面)因此是Redis1機器的ip

password=

backend_ping_period=5

session_max_timeout=1800

session_max_bufsize=131072

session_max_pipeline=1024

zk_session_timeout=30

proxy_id=Redis1_proxy    #codis啓動代理服務的代理ID,這個代理id不能與其餘機器的代理id同樣.

net_timeout=5

2:建立腳本啓動codis服務的啓動

建立 codis  web操做界面的啓動腳本(只須要在Redis1 機器上建立這個腳本,由於dashboard http 服務只在這個機器上啓動)

[root@Redis1 codis]# vi /usr/local/codis/scripts/start_dashboard.sh

#!/bin/sh

CODIS_HOME=/usr/local/codis

nohup $CODIS_HOME/bin/codis-config -c $CODIS_HOME/conf/config.ini -L $CODIS_HOME/logs/dashboard.log dashboard --addr=:18087 --http-log=$CODIS_HOME/logs/requests.log &>/dev/null &

建立slots的初始化腳本(只須要在Redis1 機器上建立這個腳本,由於codis的slot只須要初始化一次)

[root@RedisA codis]# vi /usr/local/codis/scripts/initslot.sh

#!/bin/sh

CODIS_HOME=/usr/local/codis

echo "slots initializing..."

$CODIS_HOME/bin/codis-config -c $CODIS_HOME/conf/config.ini slot init -f

echo "done"

建立codis-proxy的啓動腳本 (只需在Redis2和Redis3上面建立這個腳本,由於codis-proxy服務只在這兩個機器上啓動)

注意:  在Redis3上把下面腳本里面的Redis2所有改爲Redis3.這個代理id是在各個機器codis的config.ini文件裏面配置的

注意:運行服務以前先建立proxy的日誌文件,否則會報錯.  touch /usr/local/codis/logs/Redis2_proxy.log

vi /usr/local/codis/scripts/start_proxy.sh

#!/bin/sh

CODIS_HOME=/usr/local/codis

echo "shut down Redis2_proxy..."

$CODIS_HOME/bin/codis-config -c $CODIS_HOME/conf/config.ini proxy offline Redis2_proxy

echo "done"

echo "start new Redis2_proxy..."

nohup $CODIS_HOME/bin/codis-proxy --log-level error -c $CODIS_HOME/conf/config.ini -L $CODIS_HOME/logs/Redis2_proxy.log  --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &

echo "done"

echo "sleep 3s"

sleep 3

tail -n 30 $CODIS_HOME/logs/Redis2_proxy.log


修改Redis2和Redis3的codis-server的配置文件 /usr/local/codis/conf/6379.conf   (我修改了三個地方,能夠安裝本身的須要修改)

logfile "/usr/local/codis/logs/codis_server.log"

dir /usr/local/codis/data

maxmemory 1G


按照上面的服務部署如圖來啓動機器上啓動

Redis1 上須要運行的服務:

sh /usr/local/codis/scripts/start_dashboard.sh

sh /usr/local/codis/scripts/initslot.sh   (這個初始化slot的腳本在哪臺機器執行均可以我就放到Redis1上執行了,)

Redis1 上面須要啓動一個codis-server的HA服務,用來自動切換codis-server的主從.這一步放到後面這裏先不實現.

Redis2 上須要運行的服務:

sh /usr/local/codis/scripts/start_proxy.sh

/usr/local/codis/bin/codis-server /usr/local/codis/conf/6379.conf &

Redis3 上須要運行的服務:

sh /usr/local/codis/scripts/start_proxy.sh

/usr/local/codis/bin/codis-server /usr/local/codis/conf/6379.conf &


codis 的 HA (codisHA只須要在Redis1上部署)

codis的HA 分爲 codis-prosy層的 HA  和  codis-server成的 HA

codis-server 層的HA的實現:

獲取codis-server HA .

go get github.com/ngaut/codis-ha

編譯codis-server HA

cd  /data/go/src/github.com/ngaut/codis-ha

go build

移動編譯後的codis-ha文件到 /usr/local/codis/bin

cp   codis-ha  /usr/local/codis/bin

codis-server HA 的啓動方法

codis-ha --codis-config=dashboard地址:18087 --productName=集羣項目名稱

codis-ha 啓動之後 ,任何一個組裏面的codis-server master 掛掉之後,都會自動切換一個slave爲master.


codis-proxy 層的HA的實現:

proxy自己是無狀態的,因此proxy自己的HA是比較好作的,由於鏈接到任何一個活着的proxy上都是同樣的,咱們可使用LVS和HA Proxy來作負載均衡.

豌豆莢針對java客戶端開發了一個jodis, jodis是jedis的一個鏈接池,很簡單,就是監聽zk上面的存活proxy列表,挨個返回jedis對象,達到負載均衡和HA的效果.

使用joids須要從zookeeper獲取存活的proxy列表,因此須要配置zookeeper的IP與端口.  zookeeper的ip:端口是能夠配置多個的,使用逗號隔開就能夠了..這樣整個架構就沒有單點問題了...

具體的連接代碼:

 JedisResourcePool jedisPool = new RoundRobinJedisPool("Redis1:2181,Redis2:2181,Redis3:2181", 30000, "/zk/codis/db_codis/proxy", new JedisPoolConfig());

        try (Jedis jedis = jedisPool.getResource()) {

            jedis.set("foo", "bar");

            String value = jedis.get("foo");

            System.out.println(value);

        }

    }

註釋:

"Redis1:2181,Redis2:2181,Redis3:2181"    #zookeeper主機的hostname與zookeeper服務開啓的客戶端連接端口,多個zookeeper主機之間用逗號分割,這樣就解決了單點問題。

30000    #超時時間的設定

 "/zk/codis/db_codis/proxy"    #zookeeper中存儲 codis代理的位置。



Codis做者黃東旭細說分佈式Redis架構設計和踩過的那些坑

http://database.51cto.com/art/201507/483314_all.htm



codis 與 zookeeper 所在服務器重啓須要作的一些事情?

刪除fence節點下的全部內容

delete  /zk/codis/db_redis/fence

刪除 dashboard 節點

delete /zk/codis/db_redis/dashboard

而後在啓動codis的各個服務

相關文章
相關標籤/搜索