架構圖:
一.環境信息:
1)服務器配置
操作系統: centos 6.5 內核版本:2.6.32-431.el6.x86_64 CPU: i3-3240 4核 內存: 8G
2)相關軟件包
codis版本:3.1 go版本:1.7.4 java版本: 1.8.0_101 zookeeper版本:3.4.6godep
二.安裝:
1.epel源:
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
2.依賴包:
yum install -y gcc make gcc-c++ automake lrzsz openssl-devel zlib-* bzip2-* readline* zlib-* bzip2-* git nmap unzip wget lsof xz net-tools mer curial vim
3.golang:
yum install golang -y yum install java-1.8.0-openjdk* -y
4.zookeeper:
4.1 下載安裝
wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gztar -xvf zookeeper-3.4.6.tar.gz -C /usr/local/ cd /usr/local ln -s zookeeper-3.4.6 zookeeper
4.2 生成配置文件
cd /usr/local/zookeeper cp conf/zoo_sample.cfg conf/zoo.cfg
4.3 修改zookeeper配置文件
vim /usr/local/zookeeper/conf/zoo.cfg maxClientCnxns=60tickTime=2000initLimit=10syncLimit=5dataDir=/usr/local/zookeeper/data dataLogDir=/data/logs/zookeeper clientPort=2181server.1=192.168.2.5:2888:3888server.2=xxx.xx.xxx.xx:2888:3888server.3=xxx.xx.xxx.xx:2888:38882888表示zookeeper程序監聽端, 3888表示zookeeper選舉通信端 (server可以加多個,xxx.xx.xxx.xx代表IP地址,這裏用一個)
4.4 創建所需文件夾
mkdir -p /usr/local/zookeeper/datamkdir /var/log/zookeeper
4.5 生成myid
echo "1" >/usr/local/zookeeper/data/myid ##成ID,這裏需要注意, myid對應的zoo.cfg的server.ID,假如第2臺zookeeper主機對應的myid應該是2
4.6 啓動zookeeper
cd /usr/local/zookeeper/bin ./zkServer.sh start
4.7 關閉zookeeper
cd /usr/local/zookeeper/bin ./zkServer.sh stop
4.8 查看zk狀態
cd /usr/local/zookeeper/bin ./zkServer.sh status
4.9 查看相關信息
/usr/local/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
5.修改內核參數
vim /etc/sysctl.conf vm.overcommit_memory = 1sysctl vm.overcommit_memory=1參數說明:取值爲0,系統在爲應用進程分配虛擬地址空間時,會判斷當前申請的虛擬地址空間大小是否超過剩餘內存大小,如果超過,則虛擬地址空間分配失敗。因此,也就是如果進程本身佔用的虛擬地址空間比較大或者剩餘內存比較小時,fork、malloc等調用可能會失敗。 取值爲1,系統在爲應用進程分配虛擬地址空間時,完全不進行限制,這種情況下,避免了fork可能產生的失敗,但由於malloc是先分配虛擬地址空間,而後通過異常陷入內核分配真正的物理內存,在內存不足的情況下,這相當於完全屏蔽了應用進程對系統內存狀態的感知,即malloc總是能成功,一旦內存不足,會引起系統OOM殺進程,應用程序對於這種後果是無法預測的 取值爲2,則是根據系統內存狀態確定了虛擬地址空間的上限,由於很多情況下,進程的虛擬地址空間佔用遠大小其實際佔用的物理內存,這樣一旦內存使用量上去以後,對於一些動態產生的進程(需要複製父進程地址空間)則很容易創建失敗,如果業務過程沒有過多的這種動態申請內存或者創建子進程,則影響不大,否則會產生比較大的影響 手工執行: echo never > /sys/kernel/mm/transparent_hugepage/enabled 並加到/etc/rc.local中 參數說明:取消對透明巨頁內存(transparent huge pages)的支持,因爲這會造成 redis 使用過程產生延時和內存訪問問題。
6.安裝godep
wget https://github.com/kr/heroku-buildpack-go/raw/master/linux-amd64/bin/godepcp godep /usr/local/bin/
7.安裝codis
7.1 下載codis
mkdir -p /usr/local/gopkg/src/github.com/CodisLabs/ cd /usr/local/gopkg/src/github.com/CodisLabs/ git clone https://github.com/CodisLabs/codis.git -b release3.1
7.2 編譯codis
cd /usr/local/gopkg/src/github.com/CodisLabs/codis make
7.3 查看bin
ll bin 總量 82728drwxr-xr-x 4 root root 111 12 18 21:54 assets -rwxr-xr-x 1 root root 18261200 12 18 21:54 codis-admin -rwxr-xr-x 1 root root 19101304 12 18 21:54 codis-dashboard -rwxr-xr-x 1 root root 17655424 12 18 21:54 codis-fe -rwxr-xr-x 1 root root 10032096 12 18 21:54 codis-ha -rwxr-xr-x 1 root root 11202080 12 18 21:54 codis-proxy -rwxr-xr-x 1 root root 4167892 12 18 21:54 codis-server -rwxr-xr-x 1 root root 2073794 12 18 21:54 redis-benchmark -rwxr-xr-x 1 root root 2197701 12 18 21:54 redis-cli -rw-r--r-- 1 root root 148 12 18 21:54 version 注意:yum安裝的go還是需要指定GOROOT和GOPATH(在/etc/profile裏),我直接ln -s /usr/lib/golang /usr/local/go,make成功後,會在 bin 文件夾內生成 codis-admin、codis-dashboard、codis-fe、codis-ha、codis-proxy、codis-server 六個可執行文件。另外,bin/assets文件夾是 codis-dashboard http服務需要的前端資源,需要和codisdashboard 放置在同一文件夾下 vim /etc/profileexport GOROOT=/usr/local/goexport GOPATH=/usr/local/gopkgexport ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$GOPATH/bin
7.4 創建codis所需目錄
mkdir -p /usr/local/codis mkdir -p /data/logs/codis mkdir -p /data/codis/redis_conf mkdir -p /data/components/redis
7.5 拷貝codis的bin目錄
cp -r /usr/local/gopkg/src/github.com/CodisLabs/codis/bin /usr/local/c odis/
由於codis 本身只有codis-server ,沒有Redis-cli,需要把redis 2.8.21 安裝包裏面的 redis-cli copy到/usr/local/codis/bin 下面:
cd /usr/local/gopkg/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src cp redis-cli /usr/local/codis/bin
7.6 配置和啓動各組件
配置和啓動 Codis的Redis 配置文件 : /usr/local/codis/redis_conf/redis6379.conf 設置密碼: xxxxx 考慮性能,主庫關閉aof和rdp,從庫只開啓aof:
cd /usr/local/gopkg/src/github.com/CodisLabs/codis/extern/redis-2.8.21/ cp redis.conf /usr/local/codis/conf/redis6379.confcp redis.conf /usr/local/codis/conf/redis6380.conf
將redis6379.conf更改以下參數(主庫):
daemonize yes pidfile /usr/locai/codis/run/redis6379.pid port 6379 timeout 86400 tcp-keepalive 60 loglevel notice logfile /data/logs/codis/redis6379.log databases 16 save "" #save 900 1 ----關閉aof#save 300 10 #save 60 10000stop-writes-on-bgsave-error nordbcompression yes dbfilename dump6379.rdb dir /data/codis/redis_data_6379 masterauth "xxxxx"slave-serve-stale-data yes repl-disable-tcp-nodelay noslave-priority 100requirepass "xxxxx"maxmemory 10gb maxmemory-policy allkeys-lru appendonly noappendfsync everysecno-appendfsync-on-rewrite yesauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb lua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64client-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 0 0 0client-output-buffer-limit pubsub 0 0 0hz 10aof-rewrite-incremental-fsync yesrepl-backlog-size 33554432
將redis6380.conf更改以下參數(從庫):
daemonize yes pidfile /usr/local/codis/run/redis6380.pid port 6380 timeout 86400 tcp-keepalive 60 loglevel notice logfile /data/logs/codis/redis6380.log databases 16 save "" #save 900 1 ----關閉aof#save 300 10 #save 60 10000stop-writes-on-bgsave-error nordbcompression yes dbfilename dump6379.rdb dir /data/codis/redis_data_6380 masterauth "xxxxx"slave-serve-stale-data yes repl-disable-tcp-nodelay noslave-priority 100requirepass "xxxxx"maxmemory 10gb maxmemory-policy allkeys-lru appendonly noappendfsync everysecno-appendfsync-on-rewrite yesauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb lua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64client-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 0 0 0client-output-buffer-limit pubsub 0 0 0hz 10aof-rewrite-incremental-fsync yes repl-backlog-size 33554432
7.7 啓動redis
/usr/local/codis/bin/codis-server /usr/local/codis/redis_conf/redis6379.conf/usr/local/codis/bin/codis-server /usr/local/codis/redis_conf/redis6380.conf
三.配置codis
1.Codis Dashboard
Coddis3.0的dashboard與codis 2.0有所不同,作爲集羣管理工具,它支持codisproxy,codis-server的添加、刪除以及數據遷移等操作。在集羣狀態發生改變時, codisdashboard 維護集羣下所有 codis-proxy 的狀態一致性。有以下兩點注意事項:
對於同一個業務集羣而言,同一個時刻codis-dashboard只能有0個或者1個;
所有對集羣的修改都必須通過codis-dashboard完成。
1.1 配置Codis Dashboard
默認配置文件dashboard.toml可由codis-dashboard生成。
#/usr/local/codis/bin/codis-dashboard --default-config | tee dashboard.toml(就是dashboard.conf)
生成dashboard.toml文件,可自行配置。
# Set Coordinator, only accept"zookeeper"&"etcd"coordinator_name = "zookeeper"coordinator_addr = "192.168.2.5:2181,xxx.xx.xxx.xx:2181,xxx.xx.xxx.xx :2181" #zookeeper是集羣的話就寫多個ip和端口,逗號隔開 # Set Codis Product {Name/Auth} product_name = "codis-demo"product_auth = ""# Set bind address for admin(rpc), tcp only. admin_addr = "0.0.0.0:18080"
參數說明:
coordinator_name 外部存儲類型,接受 zookeeper/etcd coordinator_addr 外部存儲地址 product_name 集羣名稱,滿足正則 \w[\w\.\-]* product_auth 集羣密碼,默認爲空 admin_addr RESTful API 端口
1.2 啓動codis dashboard
nohup /usr/local/codis/bin/codis-dashboard --ncpu=4 --config=das hboard.toml(這裏指定dashboard.conf也可以) --log=dashboard.log --log-level=WARN &
參數說明:
#bin/codis-dashboard -hUsage: codis-dashboard [--ncpu=N][--config=CONF] [--log=FILE] [--log-level=LEV EL] [--host-admin=ADDR] codis-dashboard --default-config codis-dashboard --version--ncpu=N 最使 CPU 個數 -c CONF, --config=CONF 指定啓動配置文件 -l FILE, --log=FILE 設置 log 輸出件 --log-level=LEVEL 設置log輸出等級: INFO,WARN,DEBUG,ERROR;默認INFO,推薦WARN 正常關閉dashboard命令: bin/codis-admin --dashboard=192.168.2.5:18 080 --shutdown
2.Codis Proxy
對於同一個業務集羣而言,可以同時部署多個codis-proxy 實例; 不同 codis-proxy 之間由 codis-dashboard 保證狀態同步
2.1 配置Proxy
默認配置文件proxy.toml由codis-proxy生成
/usr/local/codis/bin/codis-proxy --default-config | tee proxy.toml( prox y.conf)
生成proxy.toml可自行配置
# Set Codis Product {Name/Auth}. product_name = "codis-demo"product_auth = ""# Set bind address for admin(rpc), tcp only. admin_addr = "0.0.0.0:11080"# Set bind address for proxy, proto_type can be "tcp","tcp4", "tcp6", " unix" or "unixpacket". proto_type = "tcp4"proxy_addr = "0.0.0.0:19000"# Set jodis address & session timeout. jodis_addr = ""jodis_timeout = 10# Proxy will ping-pong backend redis periodly to keep-alive backend_ping_period = 5# If there is no request from client for a long time, the connectionwill be droped. Set 0 to disable. session_max_timeout = 1800# Buffer size for each client connection. session_max_bufsize = 131072# Number of buffered requests for each client connection. # Make sure this is higher than the max number of requests for eachpipe line request, or your client may be blocked. session_max_pipeline = 1024# Set period between keep alives. Set 0 to disable. session_keepalive_period = 60
參數說明:
product_name 集羣名稱,參考dashboard參數說明 product_auth 集羣密碼,默認爲空 admin_addr RESTfulAPI 端 proto_type Redis 端類型,接受tcp/tcp4/tcp6/unix/unixpacket proxy_addr Redis 端地址或者路徑 jodis_addr Jodis註冊zookeeper地址 jodis_timeout Jodis註冊sessiontimeout時間,單位second jodis_compatible Jodis註冊 zookeeper 的路徑 backend_ping_period 與codis-server 探活週期,單位second, 0表示禁 session_max_timeout 與client 連接最讀超時,單位second, 0表示禁 session_max_bufsize 與client 連接讀寫緩衝區,單位bytesession_max_pipeline 與client 連接最的pipeline session_keepalive_period 與client 的 tcp keepalive週期,僅tcp有效, 0表示禁
2.2 啓動proxy
nohup /usr/local/codis/bin/codis-proxy --ncpu=4 --config=proxy.toml \ --log=proxy.log --log-level=WARN &
codis-proxy啓動後,處於 waiting 狀態,監聽proxy_addr 地址,但是不會accept連接。 添加到集羣並完成集羣狀態的同步,才能改變狀態爲online。添加的方法有以下兩 種:
通過codis-fe添加:通過Add Proxy按鈕,將admin_addr加入到集羣中; 通過codis-admin命令行工具添加,方法如下:
/usr/local/codis/bin/codis-admin --dashboard=192.168.2.5:18080 --crea te-proxy -x 192.168.2.5:11080
其中192.168.2.5:18080 以及192.168.2.5:11080 分別爲dashboard和proxy的 admin_addr 地址。 添加過程中, dashboard會完成如下一系列動作: ① 獲取 proxy 信息,對集羣name以及auth進行驗證,並將其信息寫入到外部存儲 中; ② 同步slots狀態; ③ 標記proxy狀態爲online,此後proxy開始accept連接並開始提供服務。 正常關閉proxy操作
/usr/local/codis/bin/codis-admin --proxy=192.168.2.5:11080 --auth="xx xxx"(有就加,沒有就不加) --shutdown /usr/local/codis/bin/codis-proxy -hUsage: codis-proxy [--ncpu=N][--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR] [--host-proxy=ADDR] [--ulimit=NLIMIT] codis-proxy --default-config codis-proxy --versionOptions: --ncpu=N 最使 CPU 個數 -c CONF, --config=CONF 指定啓動配置件 -l FILE, --log=FILE 設置 log 輸出件 --log-level=LEVEL 設置 log 輸出等級: INFO,WARN,DEBUG,ERROR;默認INFO, 推薦WARN --ulimit=NLIMIT 檢查ulimit -n的結果,確保運行時最大文件描述不少於NLIMIT
3.Codis FE
3.1 集羣管理界面
多個集羣實例可以共享同一個前端展示頁面; 通過配置文件管理後端codis-dashboard列表,配置文件可自動更新
3.2 配置codis-fe
配置文件codis.json( fe.conf)可以手動編輯,也可以通過codis-admin從外部存儲中拉 取。
/usr/local/codis/bin/codis-admin --dashboard-list --zookeeper=192.168.2.5:2181 | tee codis.json [ {"name": "codis-demo","dashboard": "127.0.0.1:18080"} ]
3.3 啓動codis-fe
nohup /usr/local/codis/bin/codis-fe --ncpu=4 --log=fe.log --log-level=WARN \ --dashboard-list=codis.json --listen=0.0.0.0:18090 &#(這指定端號爲1809 0是爲了防和codis-dashboard的端號18080衝突) /usr/local/codis/bin/codis-fe -hUsage: codis-fe [--ncpu=N][--log=FILE] [--log-level=LEVEL] --dashboard-list=LIST --listen=ADDR codis-fe --versionOptions: --ncpu=N 最使 CPU 個數 -d LIST,--dashboard-list=LIST 配置件,能夠動刷新 -l FILE, --log=FILE 設置 log 輸出件 --log-level=LEVEL 設置 log 輸出等級: INFO,WARN,DEBUG,ERROR;默認INFO,推薦WA RN --listen=ADDR HTTP 服務端
打開瀏覽器,在地址欄裏輸入http://192.168.2.5:18090,通過管理界面操作Codis 至此,我們的codis集羣就搭建完畢,