Redis-codis與Zookeeper的叢集部署
- 所需檔案
-
- 1.安裝zookeeper
- 2.安裝配置Codis
- 3.安裝配置redis
所需檔案
1. zookeeper-3.4.6
2. redis-3.0.1
1.安裝zookeeper
#解壓檔案到指定目錄/usr/local/下
tar xvzf zookeeper-3.4.6.tar.gz -C /usr/local/
#建立自己的zookeeper目錄
mv /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper
#給指定賬戶授權(可以省略)
chown -R vjifen.vjifen /usr/local/zookeeper
#zookeeper基礎檔案操作
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
cd /usr/local/zookeeper/conf/
mkdir -p /data/zookeeper/data/
mkdir -p /data/zookeeper/logs/
echo "1" > /data/zookeeper/myid (與配置檔案zoo.cfg裡面server.1對應)
#配置環境變量(和jdk環境變量配置類似)
vi /etc/profile
ZOOKEEPER_HOME=/usr/local/zookeeper
PATH=$PATH:$ZOOKEEPER_HOME/bin
export ZOOKEEPER_HOME PATH
source /etc/profile
#zookeeper的zoo.cfg配置
vim zoo.cfg
tickTime=2000 //Zookeeper伺服器之間或用戶端與伺服器之間的心跳時間
initLimit=10 //zookeeper叢集中允許follower連接配接并同步到leader的初始化連接配接時間,tickTime的倍數來表示.當超過設定倍數的tickTime,則連接配接失敗
syncLimit=5 //leader與follower之間發送消息,請求和應答時間長度.如果follower在設定的時間内不能與leader進行通信那麼此follower将被丢棄
dataDir=/data/zookeeper1/data //儲存資料的目錄,預設情況下,Zookeeper将寫資料的日志檔案也儲存在這個目錄裡
dataLogDir=/data/zookeeper1/logs //存放日志目錄
clientPort=2181 //監聽用戶端連接配接的端口
maxClientCnxns=60 //最大用戶端并發連接配接數(通過IP來區分)
#autopurge.snapRetainCount=3 //垃圾清理頻率,機關小時,預設0,表示不開啟清理功能
#autopurge.purgeInterval=1 //垃圾清理需要保留的檔案數目,預設是保留3個
#server.1=IP::2888:3888
#server.2=slave-02:2888:3888
#server.3=slave-03:2888:3888
#啟動zookeeper
#修改zookeeper啟動記憶體:(可以不用)
vim /usr/local/zookeeper/bin/zkServer.sh
JVMPARAM="-Xms3072m -Xmx3072m" //在49行加入
-cp "$CLASSPATH" $JVMPARAM $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null & //110行加入$JVMPARAM
#啟動zookeeper:--/usr/local/zookeeper/bin/zkServer.sh
zkServer.sh start
zkServer.sh status
針對zoo.cfg多個server說明:
//server.A=B:C:D:
//其中 A 是一個數字,表示這個是第幾号伺服器;
//B 是這個伺服器的 ip 位址;
//C 表示的是這個伺服器與叢集中的Leader伺服器交換資訊的端口;
//D 表示的是萬一叢集中的Leader伺服器挂了,需要一個端口來重新進行選舉,選出一個新的Leader,
而這個端口就是用來執行選 舉時伺服器互相通信的端口。
//如果是僞叢集的配置方式,由于 B 都是一樣,是以不同的 Zookeeper 執行個體通信端口号不能一樣,
是以要給它們配置設定不同的端口号
//server.X=A:B:C 其中X是一個數字, 表示這是第幾号server. A是該server所在的IP位址. B配置該server和叢集中的leader交
換消息所使用的端口.
//C配置選舉leader時所使用的端口. 由于配置的是僞叢集模式, 是以各個server的B, C參數必須不同.
參照 zookeeper0/conf/zoo.cfg,
//配置zookeeper1/conf/zoo.cfg, 和 zookeeper2/conf/zoo.cfg檔案. 隻需更改dataDir, dataLogDir, clientPort參數即可.
//在之前設定的dataDir中建立myid檔案, 寫入一個數字, 該數字表示這是第幾号server. 該數字必須和zoo.cfg檔案中的server.X中的X一一對應.
//Users/apple/zookeeper0/data/myid檔案中寫入0, /Users/apple/zookeeper1/data/myid檔案中寫入1,
Users/apple/zookeeper2/data/myid檔案中寫入2.
//分别進入/Users/apple/zookeeper0/bin, /Users/apple/zookeeper1/bin, /Users/apple/zookeeper2/bin三個目錄, 啟動server.
任意選擇一個server目錄, 啟動用戶端:
注意:
dataDir,dataLogDir中的wwb是目前登入使用者名,data,logs目錄開始是不存在,需要使用mkdir指令建立相應的目錄。
并且在該目錄下建立檔案myid;serve1,server2,server3指定的myid内容分别為1,2,3.
針對伺服器server2,server3可以将server1複制到相應的目錄,
不過需要注意dataDir,dataLogDir目錄,并且檔案myid内容分别為2,3
zookeeper叢集時,zookeeper要求半數以上的機器可用,zookeeper才能提供服務
2.安裝配置Codis
Codis 并不太适合 key 少,但是 value 特别大的應用, 而且你的 key 越少, value 越大,最後就會退化成單個 redis 的
模型 (性能還不如 raw redis),是以 Codis 更适合海量 Key, value比較小 (<= 1 MB) 的應用。
codis-proxy 提供連接配接叢集redis服務的入口
codis-redis-group 實作redis讀寫的水準擴充,高性能
codis-redis 實作redis執行個體服務,通過codis-ha實作服務的高可用
#安裝go
su
tar -xvzf go1.4.1.linux-amd64.tar.gz -C /usr/local/
chown -R vjifen.vjifen /usr/local/go
mkdir /usr/local/codis
#配置環境變量
su vjifen
vi /etc/profile
GOROOT=/usr/local/go
GOPATH=/usr/local/codis
export PATH=$PATH:$GOROOT/bin GOROOT GOPATH
source /etc/profile
#安裝codis
su
yum install -y git make gcc gcc-c++
go get github.com/wandoulabs/codis
chown -R vjifen.vjifen /usr/local/codis/
cd /usr/local/codis/src/github.com/wandoulabs/codis
make MALLOC=libc //如果執行下一步報錯,需要執行這一步
sh bootstrap.sh
mkdir -p /usr/local/codis/{log,start}
#注意:在github.com/wandoulabs/codis上下載下傳的codis源碼沒有sample檔案,在codis-2.0.2.tar.gz解壓後發現sample存在,但bin不存在,互相中和使用下。(針對下面cp的指令)
cp -rf bin/ /usr/local/codis/
cp sample/config.ini /usr/local/codis/bin/
cp -rf sample/*.sh /usr/local/codis/start
cp -rf sample/config.ini /usr/local/codis/start
cp -rf sample/usage.md /usr/local/codis/start
cp sample/redis_conf/6381.conf /data/redis/7000/redis.conf
cp sample/redis_conf/6381.conf /data/redis/7001/redis.conf
#配置redis.conf (以7000端口為例)
vim /data/redis/7000/redis.conf
daemonize yes //開啟守護程序
#注意區分pidfile
pidfile /var/run/redis_7000.pid //當Redis以守護程序方式運作時,Redis預設會把pid寫入/var/run/redis.pid檔案,可以通過pidfile指定
port 7000 //redis監聽端口
tcp-backlog 511 //TCP監聽傳輸的最大隊列長度
bind 127.0.0.1 //綁定用戶端連接配接的網絡接口位址
timeout 0 //當用戶端閑置多長時間後關閉連接配接,如果指定為0,表示關閉該功能
tcp-keepalive 60 //TCP通信的探測頻率
loglevel notice //定義日志級别
#注意區分logfile
logfile /data/redis/logs/redis_7000.log //日志輸出格式及目錄
databases 16 //設定資料庫的數目.預設資料庫是 DB 0,你可以在每個連接配接上使用 select <dbid> 指令選擇一個不同的資料庫
save 900 1 //指定資料持久化政策,例如:900秒内至少有一個key值變化就寫入.也可關閉持久化
save 300 10
save 60 10000
stop-writes-on-bgsave-error no //預設情況下,如果redis最後一次的背景儲存失敗,redis将停止接受寫操作,這樣以一種強硬的方式讓使用者知道資料不能正确的持久化到磁盤,否則就會沒人注意到災難的發生。如果背景儲存程序重新啟動工作了,redis 也将自動的允許寫操作。然而你要是安裝了靠譜的監控,你可能不希望 redis 這樣做,那你就改成 no 好了.
rdbcompression yes //是否在dump.rdb資料庫的時候使用LZF壓縮字元串
rdbchecksum yes //是否校驗rdb檔案
#注意區分dbfilename
dbfilename dump_7000.rdb //指定資料庫快照存儲檔案名
dir /data/redis/data //指定dump.rdb存放位置
maxmemory 4096MB //最大使用記憶體
maxmemory-policy volatile-lru //使用LRU算法移除包含過期設定的key
appendonly no //預設不開啟AOF
配置codis-config和codis-proxy:
cd /usr/local/codis
vim config.ini
zk=localhost:2181 //zookeeper位址,如果是zookeeper叢集可以這麼寫:zk=hostname1:2181,hostname2:2181,hostname3:2181.如果是etcd,則寫成http://hostname1:port,http://hostname2:port,http://hostname3:port
product=vjifen //産品名稱,這個codis叢集的名字,可以認為是命名空間,不同命名空間的codis沒有交集
proxy_id=proxy_1 //proxy會讀取,用于标記proxy的名字,針對多個proxy的情況,可以使用不同的config.ini,隻需要更改proxy_id即可
net_timeout=5 //檢測狀态時間間隔
dashboard_addr=localhost:18087 //dashboard服務位址,CLI的所有指令都依賴于dashboard的RESTful API,是以必須啟動
coordinator=zookeeper //說明使用的分布式伺服器是zookeeper,如果用etcd則直接修改成etcd即可
#啟動codis-redis服務
/usr/local/codis/bin/codis-server /data/redis/7000/redis.conf
/usr/local/codis/bin/codis-server /data/redis/7001/redis.conf
cat usage.md //檢視啟動流程文檔
0. start zookeeper //啟動zookeeper服務
1. change config items in config.ini //修改codis配置檔案
2. ./start_dashboard.sh //啟動 dashboard
3. ./start_redis.sh //啟動redis執行個體
4. ./add_group.sh //添加redis組,一個redis組隻能有一個master
5. ./initslot.sh //初始化slot,會在zookeeper上建立slot相關資訊
6. ./start_proxy.sh //啟動proxy
7. ./set_proxy_online.sh //上線proxy項目
8. open browser to http://IP(123.57.211.100):18087/admin //通路web進入控制台
注意:有些順序不是必須的,但啟動dashboard前,必須啟動zookeeper服務,這是必須的,後面有很多操作,都可以在web頁面完成,例如添加/删除組,添加/删除redis執行個體等
除了web頁面可以操作外,也可以使用一下指令添加/删除組,添加/删除redis執行個體
首先進入:/usr/local/codis/bin
#檢視目前叢集中組,redis執行個體的清單
codis-config server list
#把一個執行個體添加到叢集的某個組中,并指明主從,一個組中隻能一個主
codis-config server add <group_id><redis_addr><role>
#把一個執行個體從叢集的某個組中删除
codis-config server remove <group_id><redis_addr>
#把某個執行個體在某個組中提升為主
codis-config server promote <group_id><redis_addr>
#建立組
codis-config server add-group <group_id>
#删除組
codis-config server remove-group <group_id>
#啟動dashboard.sh
cd /usr/local/codis/start
mv ../log/ start/ //log檔案夾可以放到非系統盤,做軟連接配接即可
./start_dashboard.sh
#看一下是否啟動成功
ps -ef | grep dashboard
注意:
1.在關閉start_dashboard.sh時需要使用kill pid文法,沒有-9指令,否則再次啟動時會出現無法啟動;
如果誤用了kill -9 的指令,解決方法是:進入zk的用戶端,ls /zk/codis/db_vjifen,
然後删除rmr /zk/codis/db_vjifen/dashboard即可;
如果緩存資料未使用情況下也可以把整個db_vjifen删除掉即可,啟動zookeeper後會自動再次建立。
2. ./initslot.sh //執行這一步時會提示找不到group,是因為還沒有配置redies
注意:如果初始化槽失敗(錯誤:500錯誤,多個代理需要停止清理),此時把配置檔案中的127.0.0.1或者localhost修改成本機的IP
./start_proxy.sh //啟動codis-proxy.可修改start_proxy.sh檔案,自定義啟動參數
./set_proxy_online.sh //讓proxy上線,或點選頁面上Proxy Status裡的Mark Online.可修改set_proxy_online.sh檔案,自定義啟動參數
注意:由于codis-config啟動的http server沒有驗證規則,是以如果從外網通路會很不安全,現有的方法是在伺服器配置iptales規則做限制
配置codis-ha服務,主從自動切換。( 此環境在安裝codis中的211.100機器上配置 )
[[email protected] ~]# go get github.com/ngaut/codis-ha
[[email protected] ~]# cd /usr/local/codis/src/github.com/ngaut
[[email protected] ~]# cp -r codis-ha /usr/local/
[[email protected] ~]# cd /usr/local/codis-ha
[[email protected] codis-ha ]# go build
建立啟動腳本,啟動codis-ha服務(有時候go build後可能沒有start_codis_ha.sh,
如果沒有則需要直接使用指令:./codis-ha --codis-config=123.57.211.100<此IP要寫對>:18087 -log-level="info" --productName=vjifen &> ./logs/codis-ha.log & 啟動即可)
[[email protected] ~]# vim /usr/local/codis-ha/start_codis_ha.sh
#!/bin/sh
./codis-ha --codis-config=123.57.211.100:18087 -log-level="info" --productName=vjifen &> ./logs/codis-ha.log &
建立日志目錄
[[email protected] ~]# mkdir /usr/local/codis-ha/logs
[[email protected] ~]# cd /usr/local/codis-ha/
[[email protected] codis-ha ]# sh start_codis_ha.sh
3.安裝配置redis
如果不安裝也可以使用codis中的codis-redis代替
其他伺服器上裝的redis,通過codis 的 dashboard 關聯主從來使用
su
pwd
/home/vjifen
tar xvzf redis-3.0.1.tar.gz -C /usr/local/
mv /usr/local/redis-3.0.1/ /usr/local/redis
chown -R vjifen.vjifen /usr/local/redis/
su vjifen
mkdir -p /data/redis/data ; mkdir /data/redis/logs
cd /usr/local/redis/
make
#make指令執行完成後,會在/usr/local/bin(bin下沒有去看/usr/local/redis/src下)目錄下生成本個可執行檔案,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof 、redis-check-dump,它們的作用如下:
redis-server:Redis伺服器的daemon啟動程式
redis-cli:Redis指令行操作工具.也可以用telnet根據其純文字協定來操作
redis-benchmark:Redis性能測試工具,測試Redis在目前系統下的讀寫性能
redis-check-aof:資料修複
redis-check-dump:檢查導出工具
cp -a /usr/local/redis/redis.conf /data/redis/7000/redis.conf
cp -a /usr/local/redis/redis.conf /data/redis/7001/redis.conf
#配置redis.conf (以7000端口為例)
vim /data/redis/7000/redis.conf
daemonize yes //開啟守護程序
pidfile /var/run/redis_7000.pid //當Redis以守護程序方式運作時,Redis預設會把pid寫入/var/run/redis.pid檔案,可以通過pidfile指定
port 7000 //redis監聽端口
tcp-backlog 511 //TCP監聽傳輸的最大隊列長度
bind 127.0.0.1 //綁定用戶端連接配接的網絡接口位址
timeout 0 //當用戶端閑置多長時間後關閉連接配接,如果指定為0,表示關閉該功能
tcp-keepalive 60 //TCP通信的探測頻率
loglevel notice //定義日志級别
logfile /data/redis/logs/redis.log //日志輸出格式及目錄
databases 16 //設定資料庫的數目.預設資料庫是 DB 0,你可以在每個連接配接上使用 select <dbid> 指令選擇一個不同的資料庫
save 900 1 //指定資料持久化政策,例如:900秒内至少有一個key值變化就寫入.也可關閉持久化
save 300 10
save 60 10000
stop-writes-on-bgsave-error no //預設情況下,如果redis最後一次的背景儲存失敗,redis将停止接受寫操作,這樣以一種強硬的方式讓使用者知道資料不能正确的持久化到磁盤,否則就會沒人注意到災難的發生。如果背景儲存程序重新啟動工作了,redis 也将自動的允許寫操作。然而你要是安裝了靠譜的監控,你可能不希望 redis 這樣做,那你就改成 no 好了.
rdbcompression yes //是否在dump.rdb資料庫的時候使用LZF壓縮字元串
rdbchecksum yes //是否校驗rdb檔案
dbfilename dump.rdb //指定資料庫快照存儲檔案名
dir /data/redis/data //指定dump.rdb存放位置
maxmemory 4096MB //最大使用記憶體
maxmemory-policy volatile-lru //使用LRU算法移除包含過期設定的key
appendonly no //預設不開啟AOF
#啟動redis
/usr/local/redis/src/redis-server /data/redis/7000/redis.conf
/usr/local/redis/src/redis-server /data/redis/7001/redis.conf
以上分享純屬個人觀點,歡迎大家來探讨!
如需轉載,請注明作者出處
作者:hanshimeng
出處:https://blog.csdn.net/hanshimeng