環境介紹:前端
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的各個服務