1. 程式人生 > >13、高效能web架構之用Codis實現Redis分散式叢集

13、高效能web架構之用Codis實現Redis分散式叢集

通過codis實現redis叢集

Codis 是一個分散式 Redis 解決方案, 對於上層的應用來說, 連線到 Codis Proxy 和連線原生的 Redis Server 沒有明顯的區別 (不支援的命令列表https://github.com/CodisLabs/codis/blob/release3.1/doc/unsupported_cmds.md), 上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的資料遷移等工作, 所有後邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認為後邊連線的是一個記憶體無限大的 Redis 服務:

Codis是豌豆莢的開源方案,目前在redis叢集實現方式對比,codis叢集比較穩定的方案,並且客戶端不需要做任何修改,相對redis cluster相容性更強,可節約大量開發成本並減少大量後期維護成本,豌豆莢gitlab地址https://github.com/pingcap,豌豆莢codis專案官方github地址https://github.com/CodisLabs/codis,codis 主要由以下特點:

可以無縫遷移到codis,自帶遷移工具,並且案例較多

可以動態擴容和縮容

多業務完全透明,業務不知道執行的是codis

支援多核心CPU,twemproxy只能單核

codis是中心基於proxy的設計,是客戶端像連線單機一樣操作proxy

有部分命令不能支援,比如keys *等

支援group劃分,組內可以設定一個主多個從,通過sentinel 監控redis主從,當主down了自動將從切換為主

設定的程序要最大等於CPU的核心,不能超過CPU的核心數

其依賴於zookeeper,裡面儲存的是key儲存的redis主機位置,因此zookeeper要做高可用

監控可以使用介面和dashboard

架構環境:
codis-proxy相當於redis,即連線codis-proxy和連線redis是沒有任何區別的,codis-proxy無狀態,不負責記錄是否在哪儲存,資料在zookeeper記錄,即codis proxy向zookeeper查詢key的記錄位置,proxy 將請求轉發到一個組進行處理,一個組裡面有一個master和一個或者多個slave組成,預設有1024個槽位,redis cluster 預設有16384個槽位,其把不同的槽位的內容放在不通的group。
部署環境:1臺伺服器(生產環境不能這麼做)

結合上一章的redis

  • 安裝依賴包和go環境:

[[email protected] ~]# yum -y install gcc glibc gcc-c++ make git autoconf automake libtool

1、下載安裝包:(貌似海外伺服器才能下載,如果不能下載,從其他途徑下載  連結:https://pan.baidu.com/s/1zPukemlqp2zHPN4okys_EA 密碼:up74)下載後加壓就可以使用了:

[[email protected] ~]# tar -zxf go1.8.1.linux-amd64.tar.gz -C /usr/local/

2、安裝JDK,自己在官網下載一個安裝即可,版本要求不嚴格,後面的zookeeper會用到jdk:

[[email protected] ~]#wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz

[[email protected] ~]# tar zxf jdk-8u181-linux-x64.tar.gz   

[[email protected] ~]# mv jdk1.8.0_181/ /usr/local/

[[email protected] ~]# ln -s /usr/local/jdk1.8.0_181/ /usr/local/jdk

二、zookeeper部署:

1、安裝zookeeper:

[[email protected] ~]# tar -zxf zookeeper-3.4.13.tar.gz -C /usr/local/

[[email protected] ~]# ln -s /usr/local/zookeeper-3.4.13/ /usr/local/zookeeper

[[email protected] ~]# mv /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg

a、Zookeeper配置檔案修改


下面就是zoo.cfg配置檔案的修改了。那麼我們首先要熟悉下zookeeper配置檔案。
[[email protected] ~]# cat/usr/local/zookeeper/conf/zoo.cfg
tickTime=2000    #伺服器和客戶端的心跳維持間隔,間隔多久傳送心跳 ,2000微秒等於2毫秒

initLimit=10    #選舉的時候的時間間隔是10次,10次 * 6000微秒 即60秒

syncLimit=5    # Leader 與 Follower 之間傳送訊息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度

dataDir=/opt/zk1 # 資料儲存目錄

clientPort=2181 # 客戶端連線的埠

# 叢集埠和ID配置

server.1=192.168.91.133:3181:4181

server.2=192.168.91.133:3182:4182

server.3=192.168.91.133:3183:4183

b、zookeeper配置檔案詳解:

tickTime:這個時間是作為 Zookeeper 伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。

dataDir:顧名思義就是 Zookeeper 儲存資料的目錄,預設情況下,Zookeeper 將寫資料的日誌檔案也儲存在這個目錄裡。

clientPort:這個埠就是客戶端連線 Zookeeper 伺服器的埠,Zookeeper 會監聽這個埠,接受客戶端的訪問請求。

initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裡所說的客戶端不是使用者連線 Zookeeper 伺服器的客戶端,而是 Zookeeper 伺服器叢集中連線到 Leader 的 Follower 伺服器)初始化連線時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是 tickTime)長度後 Zookeeper 伺服器還沒有收到客戶端的返回資訊,那麼表明這個客戶端連線失敗。總的時間長度就是 10*6000=60 秒

syncLimit:這個配置項標識 Leader 與 Follower 之間傳送訊息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 5*6000=30 秒

server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號伺服器;B 是這個伺服器的 ip 地址;C 表示的是這個伺服器與叢集中的 Leader 伺服器交換資訊的埠;D 表示的是萬一叢集中的 Leader 伺服器掛了,需要一個埠來重新進行選舉,選出一個新的 Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠。如果是偽叢集的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 例項通訊埠號不能一樣,所以要給它們分配不同的埠號。

c、建立三個目錄用來存放zookeeper資料:

[[email protected] ~]# mkdir -p /data/zk1 /data/zk2 /data/zk3

[[email protected] ~]# echo "1" > /data/zk1/myid

[[email protected] ~]# echo "2" > /data/zk2/myid

[[email protected] ~]# echo "3" > /data/zk3/myid

d、生成三分zookeeper配置檔案:

[[email protected] ~]# cp /usr/local/zookeeper/conf/zoo.cfg /usr/local/zookeeper/conf/zk1.cfg

[[email protected] ~]# cp /usr/local/zookeeper/conf/zoo.cfg /usr/local/zookeeper/conf/zk2.cfg

[[email protected] ~]# cp /usr/local/zookeeper/conf/zoo.cfg /usr/local/zookeeper/conf/zk3.cfg

e、修改zk2和zk3的配置檔案,使用對應的資料目錄和埠:

[[email protected] ~]# sed -i 's/zk1/zk2/g' /usr/local/zookeeper/conf/zk2.cfg

[[email protected] ~]# sed -i 's/2181/2182/g' /usr/local/zookeeper/conf/zk2.cfg

[[email protected] ~]# sed -i 's/zk1/zk3/g' /usr/local/zookeeper/conf/zk3.cfg

[[email protected] ~]# sed -i 's/2181/2183/g' /usr/local/zookeeper/conf/zk3.cfg

f、啟動zookeeper:

[[email protected] ~]# /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk1.cfg

[[email protected] ~]# /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk2.cfg  

[[email protected] ~]# /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk3.cfg

g、檢視zookeeper啟動狀態:

[[email protected] ~]# /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk1.cfg

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/conf/zk1.cfg

Mode: follower #備用節點

[[email protected] ~]# /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk2.cfg

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/conf/zk2.cfg

Mode: leader #主節點

[[email protected] ~]# /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk3.cfg

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/conf/zk3.cfg

Mode: follower #備用節點

h、連線測試zookeeper:

[[email protected] ~]# /usr/local/zookeeper/bin/zkCli.sh -server 192.168.91.133:2181

查詢埠:

注意:通過上面的例子可以看到,目前zk3是leader,其它兩個節點是follower。本文由於實驗環境侷限使用的是偽分散式,注意生產環境不建議使用。

2、修改環境變數/etc/profile下新增以下內容:

export GOROOT=/usr/local/go

export GOPATH=/usr/local/codis

JAVA_HOME=/usr/local/jdk

CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export ZOOKEEPER_HOME=/usr/local/zookeeper

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

然後執行 source /etc/profile

[[email protected] ~]# source /etc/profile

3、測試一下go是否可以正常使用:

[[email protected] ~]# go version

go version go1.8.1 linux/amd64

[[email protected] ~]# go run hello.go

hello,world

[[email protected] ~]# cat hello.go

        package main

    import "fmt"

    func main(){

        fmt.Printf("hello,world\n")

 }

[[email protected] ~]# go run hello.go

hello,world

注:可以看到,正常列印hello,world了,在命令直接輸入java,如果出現一大堆使用說明,就意味java安裝成功了。

三、部署codis:

1、下載codis原始碼:

注意:Codis 原始碼需要下載到 $GOPATH/src/github.com/CodisLabs/codis:

[[email protected] ~]# mkdir -p $GOPATH/src/github.com/CodisLabs

[[email protected] ~]# ll /usr/local/codis/src/github.com/CodisLabs/

total 0

[[email protected] ~]# cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2

2、編譯codis原始碼:

[[email protected] CodisLabs]# cd /usr/local/codis/src/github.com/CodisLabs/codis/

[[email protected] codis]# ls

admin    config  Dockerfile  Godeps      MIT-LICENSE.txt  scripts  wandoujia_license.txt

ansible  deploy  example     kubernetes  pkg              vendor

cmd      doc     extern      Makefile    README.md        version

[[email protected] codis]# make

[[email protected] codis]# ll bin/

drwxr-xr-x 4 root root      117 Aug 30 08:53 assets

-rwxr-xr-x 1 root root 15230672 Aug 30 08:53 codis-admin

-rwxr-xr-x 1 root root 16812040 Aug 30 08:52 codis-dashboard

-rwxr-xr-x 1 root root 14955256 Aug 30 08:53 codis-fe

-rwxr-xr-x 1 root root 13345144 Aug 30 08:53 codis-ha

-rwxr-xr-x 1 root root 18863320 Aug 30 08:53 codis-proxy

-rwxr-xr-x 1 root root  5366816 Aug 30 08:51 codis-server

-rwxr-xr-x 1 root root  2433008 Aug 30 08:51 redis-benchmark

-rwxr-xr-x 1 root root  2587080 Aug 30 08:51 redis-cli

-rwxr-xr-x 1 root root  5366816 Aug 30 08:51 redis-sentinel

-rw-r--r-- 1 root root      166 Aug 30 08:51 version

[[email protected] codis]# cat bin/version

version = 2018-07-29 20:03:04 +0800 @7191a280026cefd50a09db6ba82fe180249d78b0 @3.2.2-9-g7191a28

compile = 2018-08-30 08:51:58 -0400 by go version go1.8.1 linux/amd64

3、修改dashboard和proxy的配置檔案:

a、預設啟動的會讀取config目錄的dashboard.toml和proxy.toml檔案,編輯如下:

[[email protected] ~]# vi /usr/local/codis/src/github.com/CodisLabs/codis/config/dashboard.toml

coordinator_name = "zookeeper"

coordinator_addr = "192.168.91.133:2181,192.168.91.133:2182,192.168.91.133:2183"

product_name = "codis-chinasoft"

[[email protected] ~]# grep '^[a-z]' /usr/local/codis/src/github.com/CodisLabs/codis/config/proxy.toml

product_name = "codis-chinasoft"

product_auth = "123456"

jodis_addr = "192.168.91.133:2181,192.168.91.133:2182,192.168.91.133:2183"

jodis_timeout = "20s"

jodis_compatible = true

4、啟動dashboard:

[[email protected] ~]# nohup /usr/local/codis/src/github.com/CodisLabs/codis/bin/codis-dashboard --ncpu=1 --config=/usr/local/codis/src/github.com/CodisLabs/codis/config/dashboard.toml --log=dashboard.log --log-level=WARN >> /var/log/codis_dashboard.log &

5、啟動代理:

[[email protected] ~]# nohup /usr/local/codis/src/github.com/CodisLabs/codis/bin/codis-proxy --ncpu=1 --config=/usr/local/codis/src/github.com/CodisLabs/codis/config/proxy.toml --log=proxy.log --log-level=WARN >> /var/log/codis_proxy.log &

6、啟動codis-admin,我們需要將admin與proxy、dashboard關聯起來:

[[email protected] ~]# /usr/local/codis/src/github.com/CodisLabs/codis/bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.0.0.1:11080

[[email protected] ~]# /usr/local/codis/src/github.com/CodisLabs/codis/bin/codis-admin --dashboard=192.168.91.133:18080 --create-proxy -x 192.168.91.133:11080

注:其中 127.0.0.1:18080 以及 127.0.0.1:11080 分別為 dashboard 和 proxy 的 admin_addr 地址;

報錯:

33:18080 --create-proxy -x 192.168.91.133:11080

2018/08/31 03:16:23 dashboard.go:369: [PANIC] call rpc create-proxy to dashboard 192.168.91.133:18080 failed

[error]: [Remote Error] proxy-[2ec31af158d15f17887955d85f801110] already exists

    2   /usr/local/codis/src/github.com/CodisLabs/codis/pkg/topom/topom_proxy.go:32

            github.com/CodisLabs/codis/pkg/topom.(*Topom).CreateProxy

    1   /usr/local/codis/src/github.com/CodisLabs/codis/pkg/topom/topom_api.go:244

            github.com/CodisLabs/codis/pkg/topom.(*apiServer).CreateProxy

    0   /usr/local/codis/src/github.com/CodisLabs/codis/pkg/topom/topom_api.go:81

            github.com/CodisLabs/codis/pkg/topom.(*apiServer).CreateProxy-fm

        ... ...

[stack]:

    2   /usr/local/codis/src/github.com/CodisLabs/codis/cmd/admin/dashboard.go:369

            main.(*cmdDashboard).handleProxyCommand

    1   /usr/local/codis/src/github.com/CodisLabs/codis/cmd/admin/dashboard.go:52

            main.(*cmdDashboard).Main

    0   /usr/local/codis/src/github.com/CodisLabs/codis/cmd/admin/main.go:82

            main.main

解決方法(檢視ID,再刪除ID,最後重新執行

/usr/local/codis/src/github.com/CodisLabs/codis/bin/codis-admin --dashboard=192.168.91.133:18080 --create-proxy -x 192.168.91.133:11080

):

[[email protected] ~]# /usr/local/codis/src/github.com/CodisLabs/codis/bin/codis-admin --dashboard=192.168.91.133:18080 --proxy-status

[ ] proxy-1 [T] 2ec31af158d15f17887955d85f801110 [A] 192.168.91.133:11080 [P] 192.168.91.133:19000

[[email protected] ~]# ./bin/codis-admin --dashboard=192.168.91.133:18080 --remove-proxy --token=2ec31af158d15f17887955d85f801110 --force

[[email protected] ~]# /usr/local/codis/src/github.com/CodisLabs/codis/bin/codis-admin --dashboard=192.168.91.133:18080 --create-proxy -x 192.168.91.133:11080

7、啟動codis-server,並建立redis例項(此處我們建立4個redis例項,給予codis修改過的redis-3.2.8非原生redis)

[[email protected] ~]# cd /usr/local/codis/src/github.com/CodisLabs/codis/

[[email protected] codis]# mkdir -pv /var/lib/redis_638{1..4}

mkdir: created directory ‘/var/lib/redis_6381’

mkdir: created directory ‘/var/lib/redis_6382’

mkdir: created directory ‘/var/lib/redis_6383’

mkdir: created directory ‘/var/lib/redis_6384’

[[email protected] codis]#

[[email protected] codis]# cp config/redis.conf .

  1. 修改redis.conf配置檔案:

[[email protected] codis]# pwd

/usr/local/codis/src/github.com/CodisLabs/codis

[[email protected] codis]# vi redis.conf

pidfile /var/run/redis_6381.pid

port 6381

dbfilename dump_6381.rdb

dir /var/lib/redis_6381

logfile "/tmp/redis_6381.log"

maxmemory 1g #一定要設定最大記憶體,否則後面的codis無法使用

[[email protected] codis]# cp redis.conf redis_6381.conf

[[email protected] codis]# cp redis_6381.conf redis_6382.conf

[[email protected] codis]# cp redis_6381.conf redis_6383.conf

[[email protected] codis]# cp redis_6381.conf redis_6384.conf

[[email protected] codis]# sed -i 's/6381/6382/g' redis_6382.conf

[[email protected] codis]# sed -i 's/6381/6383/g' redis_6383.conf

[[email protected] codis]# sed -i 's/6381/6384/g' redis_6384.conf

9、通過codis-server指定redis.conf檔案啟動redis服務,不能通過redis命令啟動redis服務,通過redis啟動的redis 服務加到codis叢集無法正常使用:

[[email protected] codis]# ./bin/codis-server ./redis_6381.conf

[[email protected] codis]# ./bin/codis-server ./redis_6382.conf

[[email protected] codis]# ./bin/codis-server ./redis_6383.conf

[[email protected] codis]# ./bin/codis-server ./redis_6384.conf

遇到一個報錯:

[[email protected] codis]# ./bin/codis-server ./redis_6381.conf

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 194
'always-show-logo yes'
Bad directive or wrong number of arguments

edis.conf 第194行
always-show-logo yes
發現我下載了兩個版本的redis:3.2 和 4.0.11(使用/usr/local/redis/redis.conf 不行)
我用codis3.2程式啟動4.0.8 的redis.conf配置,所以會起不來經過兩份配置檔案對比發現很多配置有區別(codis3.2就要用redis3.2的配置檔案)
[[email protected] codis]# diff /usr/local/redis/redis.conf /usr/local/codis/src/github.com/CodisLabs/codis/config/redis.conf

解決方法:

因為codis是3.2版本的,所以我直接複製

/usr/local/codis/src/github.com/CodisLabs/codis/config/redis.conf作redis_638[1-4].conf ,具體看上面的第8點步驟:

10、驗證通過codis啟動redis 服務是否成功:

[[email protected] codis]# netstat -tunlp | grep 638*

tcp        0      0 127.0.0.1:6381          0.0.0.0:*               LISTEN      2459/./bin/codis-se

tcp        0      0 127.0.0.1:6382          0.0.0.0:*               LISTEN      2467/./bin/codis-se

tcp        0      0 127.0.0.1:6383          0.0.0.0:*               LISTEN      2472/./bin/codis-se

tcp        0      0 127.0.0.1:6384          0.0.0.0:*               LISTEN      2477/./bin/codis-se

  1. 啟動codis-fe,埠8080比較常用,為了避免衝突指定8090:

[[email protected] ~]# nohup /usr/local/codis/src/github.com/CodisLabs/codis/bin/codis-fe --ncpu=1 --log=fe.log --log-level=WARN --zookeeper=192.168.91.133:2181 --listen=192.168.91.133:8090 &

[[email protected] ~]# netstat -tnlp | grep 8090

tcp        0      0 192.168.91.133:8090     0.0.0.0:*               LISTEN      2488/codis-fe

12、通過網頁訪問:http://192.168.91.133:8090 可以看到codis的管理頁面

13、管理介面的配置實用:
通過fe新增group
通過web瀏覽器訪問叢集管理頁面(fe地址:192.168.91.133:8090) 選擇我們剛搭建的叢集 codis-chinasoft,在 Proxy 欄可看到我們已經啟動的 Proxy, 但是 Group 欄為空,因為我們啟動的 codis-server 並未加入到叢集 新增 NEW GROUP,NEW GROUP 行輸入 1,再點選 NEW GROUP 即可 新增 Codis Server,

新增例項(即新增後端的redis伺服器)
Add Server 行輸入我們剛剛啟動的 codis-server 地址,新增到我們剛新建的 Group,然後再點選 Add Server 按鈕即可,如下圖所示

14、對slots進行分組

如下圖所示,輸入所要分組的slots的起和止的範圍,然後輸入組ID,點選後面按鈕即可。

15、通過codis-proxy連線redis進行測試:

[[email protected] ~]# cd /usr/local/codis/src/github.com/CodisLabs/codis/bin/

[[email protected] bin]# ./redis-cli -h 192.168.91.133 -p 19000

192.168.91.133:19000> info

# Server

redis_version:3.2.11

redis_git_sha1:7191a280

redis_git_dirty:0

redis_build_id:17caf190cc129951

redis_mode:standalone

os:Linux 3.10.0-514.el7.x86_64 x86_64

arch_bits:64

multiplexing_api:epoll

gcc_version:4.8.5

process_id:2472

run_id:5211d2f66bdfd90ff571c62cc63eeaa8bdb56622

tcp_port:6383

uptime_in_seconds:8429

uptime_in_days:0

hz:10

lru_clock:8972301

executable:/usr/local/codis/src/github.com/CodisLabs/codis/./bin/codis-server

config_file:/usr/local/codis/src/github.com/CodisLabs/codis/./redis_6383.conf

# Clients

connected_clients:17

client_longest_output_list:0

client_biggest_input_buf:0

blocked_clients:0

# Memory

used_memory:4057888

used_memory_human:3.87M

used_memory_rss:1085440

used_memory_rss_human:1.04M

used_memory_peak:4672152

used_memory_peak_human:4.46M

total_system_memory:342376448

total_system_memory_human:326.52M

used_memory_lua:37888

used_memory_lua_human:37.00K

maxmemory:1000000000

maxmemory_human:953.67M

maxmemory_policy:noeviction

mem_fragmentation_ratio:0.27

mem_allocator:jemalloc-4.0.3

# Persistence

loading:0

rdb_changes_since_last_save:0

rdb_bgsave_in_progress:0

rdb_last_save_time:1535691937

rdb_last_bgsave_status:ok

rdb_last_bgsave_time_sec:0

rdb_current_bgsave_time_sec:-1

aof_enabled:0

aof_rewrite_in_progress:0

aof_rewrite_scheduled:0

aof_last_rewrite_time_sec:-1

aof_current_rewrite_time_sec:-1

aof_last_bgrewrite_status:ok

aof_last_write_status:ok

# Stats

total_connections_received:36

total_commands_processed:28660

instantaneous_ops_per_sec:3

total_net_input_bytes:745632

total_net_output_bytes:16939702

instantaneous_input_kbps:0.11

instantaneous_output_kbps:2.85

rejected_connections:0

sync_full:1

sync_partial_ok:0

sync_partial_err:0

expired_keys:0

evicted_keys:0

keyspace_hits:0

keyspace_misses:0

pubsub_channels:0

pubsub_patterns:0

latest_fork_usec:1017

migrate_cached_sockets:0

# Replication

role:master

connected_slaves:1

slave0:ip=127.0.0.1,port=6384,state=online,offset=9661,lag=1

master_repl_offset:9661

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:9660

# CPU

used_cpu_sys:25.38

used_cpu_user:17.20

used_cpu_sys_children:0.00

used_cpu_user_children:0.00

# Cluster

cluster_enabled:0

# Keyspace

192.168.91.133:19000>

192.168.91.133:19000> set name yanyb

OK

192.168.91.133:19000> get name

"yanyb"

192.168.91.133:19000> set work IT

OK

192.168.91.133:19000> get work

"IT"

192.168.91.133:19000> set name zengmei

OK

192.168.91.133:19000> set name chenshaoping

OK

192.168.91.133:19000> get name

"chenshaoping"

16、檢視:

17、連線zookeeper,可以看到codis的group,slots,proxy等資訊都記錄在zook中

/usr/local/zookeeper/bin/zkCli.sh -server

[[email protected] ~]# /usr/local/zookeeper/bin/zkCli.sh -server 192.168.91.133:2181

OK到這裡codis實現redis分散式叢集就此結束!

相關推薦

13高效能web架構Codis實現Redis分散式叢集

通過codis實現redis叢集 Codis 是一個分散式 Redis 解決方案, 對於上層的應用來說, 連線到 Codis Proxy 和連線原生的 Redis Server 沒有明顯的區別 (不支援的命令列表https://github.com/CodisLabs/

Codis實現Redis分散式叢集

一、Redis叢集概述Redis官方近期推出的Redis Cluster,Redis叢集有三種實現機制,分別介紹如下,(1)客戶端分片,(2)代理分片,(3)Redis Cluster1.1 客戶端分片這種方案將分片工作放在業務程式端,程式程式碼根據預先設定的路由規則,直接對

2高效能web架構DNS負載均衡(LVS-DR+keepalived實現DNS和web輪詢)

LVS-DR+keepalived+DNS實現DNS高可用性: 一、介紹: 結合上一章的DNS主從複製,按現在大多數公司的需求是滿足不了的。DNS配置雖然簡單易用,但是它在網路中起到了主導作用。 如果客戶端設定的這臺首選DNS伺服器剛好宕機,即使客戶端還設定了備用DNS

6高效能web架構Apche虛擬主機配置

構建web虛擬主機: 一、前言: 虛擬web主機指的是在同一臺伺服器中執行多個web站點,其中的每一個站點實際上並不獨立佔用整個伺服器。因此被稱為“虛擬的”web主機,通過虛擬web主機服務可以充分利用伺服器的硬體資源,從而大大降低了網站構建及執行成本。 使用htt

9高效能web架構壓力測試

使用ab進行對web伺服器壓力測試: 前言: 當我們部署完一臺web伺服器之後,想要知道的這臺伺服器的效能。就要知道他的吞吐率和響應時間分別是多少,怎麼看呢?那就需要對它進行壓力測試。 1)吞吐率/響應時間:requests/sec; 2)壓力測試:使用ab工具進行

12高效能web架構redis介紹與使用

Redis 簡介 Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。 Redis 與其他 key - value 快取產品有以下三個特點: Redis支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。

7高效能web架構Apche使用虛擬主機實現反向代理

Apache反向代理: 前言介紹:    反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個

11高效能web架構tomcat安全管理規範

Tomcat的常用安全管理規範: 如何修改tomcat的預設路徑: 1、主配置檔案是server.xml ,如何修改tomcat預設訪問路徑: a、建立jsp目錄和index.jsp頁面: [[email protected] ~]# mkdir

高效能web 架構redis 快取叢集

redis 叢集 介紹 redis是一個key-value記憶體資料庫。它支援儲存的value型別包括字串、list(連結串列)、set(集合)、有序集合和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove, redis支援各種不同方式的排序

高效能web 架構 mysql 讀寫分離

高效能web架構主要保證程式的高可用性和高併發性. 高可用就是 保證程式在99.99%的情況下可以使用,不會因為單機節點故障整體崩潰.  高併發說到底也是為了高可用服務.保證在大量併發的時候服務不會宕機. 高效能web架構主要體現在以下方面 資料庫讀寫分離,因為大

13CentOS7 安裝Docker擴充套件(容器掛載主機目錄)

容器掛載主機目錄   容器最強大的功能是它在遷移時能保持系統環境一致性。 不過有時候你不想把所有的檔案放進容器中。你可能想在容器之間共享一些大的檔案,或者單獨管理這些檔案。典型的例子是你希望容器訪問大型集中式資料庫,但是還希望其它客戶端也能與容器一起訪問。 解決方法是volumes

企業架構研究總結(13)——聯邦企業架構FEA及參考模型(下)

      資料參考模型DRM       資料參考模型的目標是通過標準的資料描述、通用資料的發現以及統一的資料管理實踐的推廣使得聯邦政府實現跨機構的資訊共享和重用。資料參考模型的適用範圍很廣,它可以用在一個機構內部,也可以用在某一個利益共同體(COI,Community

高效能網站架構快取篇—Redis叢集搭建

         看過高效能網站架構之快取篇--Redis安裝配置和高效能網站架構之快取篇--Redis使用配置埠轉發這兩篇文章的,相信你已經對redis有一定的瞭解,並能夠安裝上,進行簡單的使用了,但是在咱們的實際應用中,使用redis肯定不會使用單機版,不光是redis

淺談web架構演化過程

前言 最近在開發過程中,遇到很多緩解配置的問題,工程很難啟動,也不知道為什麼環境需要這麼多配置的意義。就在這個時候,一本好書《大型網站技術:核心原理與案例分析》給我帶來全新視角,必須強勢安利一把。連結地址 本文先淺談書中所提到的web架構演化過程。如果經歷的專案足夠多

Web開發canvas2image.js將canvas儲存為圖片(實現頁面截圖下載功能)

var canvas, ctx, bMouseIsDown = false, iLastX, iLastY, $save, $imgs, $convert, $imgW, $imgH, $sel; function init () {

淺談web架構架構設計(總結)

架構模式 先來說說模式: 每一個模式描述了一個在我們周圍不斷重複發生的問題及該問題解決方案的核心。這樣,你就能一次又一次地用該方案而不必做重複工作 。 先來說說常見的網站架構模式。這裡沒有涉及具體實現過程,只是簡單介紹其思想和原理,方便日後有用到再深入瞭解。 分層 分層是企業應用系統中最常見的一種

Web架構Nginx基礎配置

[TOC] # 1、Nginx 虛擬主機 所謂的虛擬主機,在Web服務裡就是一個獨立的網站站點,這個站點對應獨立的域名(也可能是IP或埠),具有獨立的程式及資源目錄,可以獨立地對外提供服務供使用者訪問。 在Nginx中則使用一個server{} 標籤來標識一個虛擬主機,一個Web服務裡可以有多個虛擬主機標

Java實現隊列

ring idt style enqueue 元素 java 出隊 入隊 span 隊列是一種典型的先進先出數據結構,隊列的實現方式有很多種,比如數組,比如鏈表等,隊列也可以用兩個棧來實現,下面就用兩個棧實現一個隊列。 原理   兩個棧中,一個棧用來入隊,叫他入隊棧,另

21-城裏人套路深python實現邏輯回歸算法

rom 成功 基礎知識 壓力 dvp ilb nbsp html 感覺 如果和一個人交流時,他的思想像彈幕一樣飄散在空中,將是怎樣的一種景象?我想大概會毫不猶豫的點關閉的。生活為啥不能簡單明了?因為太直白了令人乏味。保留一些不確定性反而撲朔迷離,引人入勝。我們學習了線性回歸

Web前端】CSS3實現彈幕

font ram hover 字符 才會 命令 .sh left window 初版 用css3來實現彈幕確實比較簡單,只需要設置動畫讓彈幕從屏幕右側移動到屏幕左側即可,一開始是這樣實現的 .danmu { position: fixed; left: 100%