1. 程式人生 > >使用codis-admin搭建codis叢集 Redis Codis 部署安裝 Redis Codis 部署安裝 Redis Codis 部署安裝

使用codis-admin搭建codis叢集 Redis Codis 部署安裝 Redis Codis 部署安裝 Redis Codis 部署安裝

目的

Redis Codis 部署安裝的文章中,介紹了通過fe在web上搭建codis的基本步驟和方法,也介紹了codis-admin的相關說明,為了更好的熟悉codis-admin的使用,本文將使用codis-admin直接搭建codis叢集(和fe進行相關的對比)。這樣做的另一個目的是為實現自動化指令碼部署的時候做相關的準備。

環境

Redis Codis 部署安裝中的環境一樣,包括各個服務的IP和埠,以及安裝方法。

機器

服務

埠說明

依賴

192.168.163.131/132/133(Ubuntu 16.04)

Codis

7021/7022

server埠:主/從(三臺)

GO

11080

proxy管理埠(三臺)

18080

dashboard管理埠(一臺)

10890

fe管理埠(一臺)

10086

sentinel(三臺)

192.168.163.131/132/133(Ubuntu 16.04)

zookeeper

2181

zk客戶端監聽埠(三臺)

JDK

2888

zk內部通訊埠(三臺)

3888

zk選舉埠(三臺)

開始

首先要保證ZooKeeper、Dashboard、Proxy、Server、Sentine、fe等都已經開啟。根據Redis Codis 部署安裝文章的安裝和配置,進行codis相關元件的開啟、關閉(ZK通過上篇文文章說明):

開啟關閉程序

1)codis-server

開啟(三臺)

codis-server /etc/codis/codis-server/redis7021.conf
codis
-server /etc/codis/codis-server/redis7022.conf

關閉(三臺)

進入到redis裡面進行shutdown或則kill。

2)dashboard

開啟(一臺)

codis-dashboard --ncpu=1 --config=/etc/codis/codis-dashboard/dashboard.toml --log=/usr/local/codis/logs/dashboard.log --log-level=warn &

關閉(一臺)

codis-admin --dashboard=192.168.163.131:18080 --shutdown

3)codis-fe

開啟(一臺)

cd /etc/codis/codis-fe/

codis-admin --dashboard-list --zookeeper=192.168.163.131:2181 | tee codis.json

codis-fe --ncpu=1 --dashboard-list=/etc/codis/codis-fe/codis.json --listen=192.168.163.131:18090 --log=/usr/local/codis/logs/fe.log --log-level=warn --assets-dir=/usr/local/codis/bin/assets/ &

關閉(一臺)

ps -ef|grep codis-fe|grep -v grep|awk '{print $2}'|xargs kill

4)Proxy

開啟(三臺)

codis-proxy --ncpu=1 --config=/etc/codis/codis-proxy/proxy.toml --log=/usr/local/codis/logs/proxy.log --log-level=warn &

關閉(三臺)

codis-admin --proxy=192.168.163.131:11080 --shutdown
codis-admin --proxy=192.168.163.132:11080 --shutdown
codis-admin --proxy=192.168.163.133:11080 --shutdown

codis-admin應用

1)Proxy

① 新增Proxy到Dashboard,並且設定成Online(3個)。

Proxy程序起來之後一直處於proxy waiting online ...狀態,不會接受請求(該狀態不會註冊到zk的codis3和jodis裡)。先加入到Dashboard、註冊到zk(jodis、codis3)並設定成online:

codis-admin --dashboard=192.168.163.131:18080 --create-proxy --addr=192.168.163.131:11080
codis-admin --dashboard=192.168.163.132:18080 --create-proxy --addr=192.168.163.131:11080
codis-admin --dashboard=192.168.163.133:18080 --create-proxy --addr=192.168.163.131:11080

等於codis-fe的操作:

執行完畢之後,api會呼叫:

[WARN] [0xc4202bf440] API call /api/topom/proxy/create/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.133:11080 from 192.168.163.131:44504 [192.168.163.1]
[WARN] create proxy-[cfa02d4002da74e6b1f3b51f1416aa1d]

可以在日誌裡看到 proxy is working ...

②:從Dashboard上刪除掉Proxy。 

codis-admin --dashboard=192.168.163.131:18080 --remove-proxy --addr=192.168.163.133:11080

等於codis-fe的操作:

執行完畢之後,api會呼叫:

[WARN] [0xc4202bf440] API call /api/topom/proxy/remove/4c0ca749efb5aad2b20b8d84b1bb6905/cfa02d4002da74e6b1f3b51f1416aa1d/0 from 192.168.163.132:42134 []
[WARN] remove proxy-[cfa02d4002da74e6b1f3b51f1416aa1d]

需要注意的是,執行該操作之後,不僅從DashBoard退出,而且也會把程序退出掉,後續要開啟才能加入。

③:重新同步所有的slots,當Proxy的slots出現異常的時候執行。

codis-admin --dashboard=192.168.163.131:18080 --reinit-proxy --addr=192.168.163.131:11080

等於codis-fe的操作:

執行完畢之後,api會呼叫:

[WARN] [0xc4202bf440] API call /api/topom/proxy/reinit/4c0ca749efb5aad2b20b8d84b1bb6905/4f07158ae347d67b1af825fd8e84b2f9 from 192.168.163.131:44612 [192.168.163.1]
[WARN] proxy-[4f07158ae347d67b1af825fd8e84b2f9] reinit:

2)Group

① 新增Group到Dashboard(3個) 

codis-admin --dashboard=192.168.163.131:18080 --create-group --gid=1
codis-admin --dashboard=192.168.163.131:18080 --create-group --gid=2
codis-admin --dashboard=192.168.163.131:18080 --create-group --gid=3

等於codis-fe的操作:

執行完畢之後,api會呼叫:

[WARN] [0xc4202bf440] API call /api/topom/group/create/4c0ca749efb5aad2b20b8d84b1bb6905/1 from 192.168.163.132:42138 []
[WARN] create group-[1]:
{
    "id": 1,
    "servers": [],
    "promoting": {},
    "out_of_sync": false
}
...

② 刪除Group

codis-admin --dashboard=192.168.163.131:18080 --remove-group --gid=4

等於codis-fe的操作:

執行完畢之後,api會呼叫:

[WARN] [0xc4202bf440] API call /api/topom/group/remove/4c0ca749efb5aad2b20b8d84b1bb6905/4 from 192.168.163.132:42146 []
[WARN] remove group-[4]:
{
    "id": 4,
    "servers": [],
    "promoting": {},
    "out_of_sync": false
}

③ 新增Server到Group

#group1
codis-admin --dashboard=192.168.163.131:18080 --group-add --gid=1 --addr=192.168.163.131:7021
codis-admin --dashboard=192.168.163.131:18080 --group-add --gid=1 --addr=192.168.163.132:7022

#group2
...
#group3
...

等於codis-fe的操作:

執行完之後,api會呼叫:

[WARN] [0xc4202bf440] API call /api/topom/group/add/4c0ca749efb5aad2b20b8d84b1bb6905/1/192.168.163.132:7022 from 192.168.163.132:42156 []
[WARN] update group-[1]:
{
    "id": 1,
    "servers": [
        {
            "server": "192.168.163.131:7021",
            "datacenter": "",
            "action": {},
            "replica_group": false
        },
        {
            "server": "192.168.163.132:7022",
            "datacenter": "",
            "action": {},
            "replica_group": false
        }
    ],
    "promoting": {},
    "out_of_sync": false
}
...

 ③ 移除Group中的Server

codis-admin --dashboard=192.168.163.131:18080 --group-del --gid=1 --addr=192.168.163.132:7022

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/group/del/4c0ca749efb5aad2b20b8d84b1bb6905/1/192.168.163.132:7022 from 192.168.163.132:42158 []
 [WARN] update group-[1]:
{
    "id": 1,
    "servers": [
        {
            "server": "192.168.163.131:7021",
            "datacenter": "",
            "action": {},
            "replica_group": false
        }
    ],
    "promoting": {},
    "out_of_sync": false
}

④ 給Group新增Server

需要注意,做高可用的話每個Group裡需要至少2個Server,一主一從。預設第2個Server是從。

codis-admin --dashboard=192.168.163.131:18080 --sync-action --create --addr=192.168.163.132:7022 --第2個server

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/group/action/create/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.132:7022 from 192.168.163.132:42172 []
[WARN] update group-[1]
...
[WARN] server-[192.168.163.132:7022] action prepare
[WARN] update group-[1]
...
[WARN] sync-[192.168.163.132:7022] process action
[WARN] server-[192.168.163.132:7022] action failed = false
 [WARN] update group-[1]:
{
    "id": 1,
    "servers": [
        {
            "server": "192.168.163.131:7021",
            "datacenter": "",
            "action": {},
            "replica_group": false
        },
        {
            "server": "192.168.163.132:7022",
            "datacenter": "",
            "action": {
                "state": "synced"
            },
            "replica_group": false
        }
    ],
    "promoting": {},
    "out_of_sync": false
}

⑤ 提升Group的一個Slave為Master

codis-admin --dashboard=192.168.163.131:18080 --promote-server --gid=3 --addr=192.168.163.133:7021

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/group/promote/4c0ca749efb5aad2b20b8d84b1bb6905/3/192.168.163.133:7021 from 192.168.163.132:42190 []
[WARN] group-[3] will promote index = 1
[WARN] update group-[3]
"state": "preparing"
...
[WARN] group-[3] resync to prepared
[WARN] update group-[3]:
"state": "prepared"
...
[WARN] update group-[3]:
"state": "finished"
...
[WARN] group-[3] resync to finished
[WARN] update group-[3]:
{
    "id": 3,
    "servers": [
        {
            "server": "192.168.163.133:7021",
            "datacenter": "",
            "action": {},
            "replica_group": false
        },
        {
            "server": "192.168.163.131:7022",
            "datacenter": "",
            "action": {},
            "replica_group": false
        }
    ],
    "promoting": {},
    "out_of_sync": false
}

這裡還要注意,Slave提升成Master之後,老Master還需要執行slaveof才能進行新的複製。

codis-admin --dashboard=192.168.163.131:18080 --sync-action --create --addr=192.168.163.131:7022

3)Slots

注意:此時,所有的slots都處在offline狀態,需要進行分配slots。否則客戶端會報錯:

ERR handle request, slot is not ready, may be offline

① 分配slots,離開offline狀態。遷移某一段範圍的slots到指定的group,分配所有的slots到Group中。

codis-admin --dashboard=192.168.163.131:18080 --slot-action --create-range --beg=1 --end=100 --gid=1

codis-admin --dashboard=192.168.163.131:18080 --slot-action --create-range --beg=101 --end=1000 --gid=2

codis-admin --dashboard=192.168.163.131:18080 --slot-action --create-range --beg=1001 --end=1023 --gid=3

等於codis-fe的操作:

 

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/slots/action/create-range/4c0ca749efb5aad2b20b8d84b1bb6905/0/0/1 from 192.168.163.131:45936 [192.168.163.1]
 [WARN] update slot-[0]:
"state": "pending",
...
[WARN] slot-[0] action prepare:
"state": "pending",
 [WARN] update slot-[0]:
"state": "preparing",
...
[WARN] slot-[0] resync to prepared
 "state": "prepared",
...
[WARN] slot-[0] resync to migrating
"state": "migrating",
...
[WARN] slot-[0] process action
[WARN] slot-[0] action complete
"state": "migrating",
...
[WARN] slot-[0] resync to finished
"state": "finished",
...

注意:正在遷移的slots中的key被訪問,該key會被立馬遷移到新的group,才能被訪問。遷移好之後的slots通過--slots-status檢視,發生了變化:

{
        "id": 0,
        "backend_addr": "192.168.163.131:7021",   --遷移後新增
        "backend_addr_group_id": 1,               --遷移後新增
        "forward_method": 1
    },

 ② 遷移slots,遷移指定數量的slots從一個Group到另一個Group。

從Group2中遷移100個slots到Group3中:

codis-admin --dashboard=192.168.163.131:18080 --slot-action --create-some --gid-from=2 --gid-to=3 --num-slots=100

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/slots/action/create-some/4c0ca749efb5aad2b20b8d84b1bb6905/2/3/100 from 192.168.163.132:42498 []
"state": "pending",
...
[WARN] slot-[104] action prepare:
 "state": "pending",
...
 "state": "preparing",
 [WARN] slot-[104] resync to prepared
"state": "prepared",
[WARN] slot-[104] resync to migrating
"state": "migrating",
 [WARN] slot-[104] resync to finished
 "state": "finished",
... 

 注意,勾選Action Status可以檢視遷移的進度。

③ 停止、開啟Slots遷移。

停止:

 codis-admin --dashboard=192.168.163.131:18080 --slot-action --disabled=1

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/slots/action/disabled/4c0ca749efb5aad2b20b8d84b1bb6905/1 from 192.168.163.132:42524 []
[WARN] set action disabled = true

開啟:

codis-admin --dashboard=192.168.163.131:18080 --slot-action --disabled=0

等於codis-fe的操作:

執行完後,呼叫的api: 

[WARN] [0xc4202bf440] API call /api/topom/slots/action/disabled/4c0ca749efb5aad2b20b8d84b1bb6905/0 from 192.168.163.132:42526 []
[WARN] set action disabled = false

④ 平均分配slots,各個Group平均分配1024個slots。

codis-admin --dashboard=192.168.163.131:18080 --rebalance --confirm

--confirm 表示執行rebalance,不加表示檢視(不執行)

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/slots/rebalance/4c0ca749efb5aad2b20b8d84b1bb6905/1 from 192.168.163.132:42534 []
...
[WARN] slot-[882] resync to finished
...

⑤ slots遷移的時間間隔

codis-admin --dashboard=192.168.163.131:18080 --slot-action  --interval=1000

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/slots/action/interval/4c0ca749efb5aad2b20b8d84b1bb6905/1000 from 192.168.163.132:42540 []
[WARN] set action interval = 1000

4)Sentinel 高可用

① 新增Sentinel(3個)

codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.131:10086
codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.132:10086
codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.133:10086

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/sentinels/add/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.131:10086 from 192.168.163.132:42544 []
[WARN] update sentinel:
{
    "servers": [
        "192.168.163.131:10086"
    ],
    "out_of_sync": true
}
...

為了保證Sentinel服務的正常,需要再resync下sentinel:

codis-admin --dashboard=192.168.163.131:18080 --sentinel-resync

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/sentinels/resync-all/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.163.132:42550 []
[WARN] rewatch sentinels = [192.168.163.131:10086 192.168.163.132:10086 192.168.163.133:10086]

② 移除Sentinel

codis-admin --dashboard=192.168.163.131:18080 --sentinel-del --addr=192.168.163.133:10086

等於codis-fe的操作:

執行完後,呼叫的api:

[WARN] [0xc4202bf440] API call /api/topom/sentinels/del/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.133:10086/0 from 192.168.163.132:42598 []

到此,通過codis-admin已經完成了Codis的搭建。

總結

通過本文的說明,進一步理順了codis-admin的各個命令。可以不依賴fe的web介面進行Codis叢集的搭建,可以為自動化的一些指令碼做好更好的支援工作。