Codis 分布式缓存部署
為什么80%的碼農都做不了架構師?>>> ??
環境介紹:
1:機器三臺 ,IP/hostname 如下, ??hostname的設置很重要zookeeper / codis的通信都會用到,所以要配置好三臺機器的hosts文件.
10.221.8.220 機器的hostname為?Redis1
10.221.8.221?機器的hostname為?Redis2
10.221.8.222?機器的hostname為?Redis3
三臺機器的/etc/hosts 文件添加如下解析
10.221.8.220 ? ?Redis1
10.221.8.1.221 ? ?Redis2
10.221.8.1.222 ? ?Redis3
2: 三臺機器的系統都是centos 6.5 已經安裝基本服務.
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的各個服務
轉載于:https://my.oschina.net/denglz/blog/505442
總結
以上是生活随笔為你收集整理的Codis 分布式缓存部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Eclipse-Maven-git做
- 下一篇: C#使用七牛云存储上传下载文件、自定义回