redis的分布式解決方式--codis

codis是豌豆莢開源的分布式server。眼下處于穩定階段。

原文地址:https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md

Codis 是一個分布式 Redis 解決方式, 對于上層的應用來說, 連接到 Codis Proxy 和連接原生的 Redis Server 沒有明顯的差別 (不支持的命令列表), 上層應用能夠像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工作, 全部后邊的一切事情, 對于前面的client來說是透明的, 能夠簡單的覺得后邊連接的是一個內存無限大的 Redis 服務.

基本框架例如以下:

Codis 由四部分組成:

Codis Proxy (codis-proxy)
Codis Manager (codis-config)
Codis Redis (codis-server)
ZooKeeper

codis-proxy 是client連接的 Redis 代理服務, codis-proxy 本身實現了 Redis 協議, 表現得和一個原生的 Redis 沒什么差別 (就像 Twemproxy), 對于一個業務來說, 能夠部署多個 codis-proxy, codis-proxy 本身是無狀態的.

codis-config 是 Codis 的管理工具, 支持包含, 加入/刪除 Redis 節點, 加入/刪除 Proxy 節點, 發起數據遷移等操作. codis-config 本身還自帶了一個 http server, 會啟動一個 dashboard, 用戶能夠直接在瀏覽器上觀察 Codis 集群的執行狀態.

codis-server 是 Codis 項目維護的一個 Redis 分支, 基于 2.8.13 開發, 增加了 slot 的支持和原子的數據遷移指令. Codis 上層的 codis-proxy 和 codis-config 僅僅能和這個版本號的 Redis 交互才干正常執行.

ZooKeeper(下面簡稱ZK)是一個分布式協調服務框架。能夠做到各節點之間的數據強一致性。簡單的理解就是在一個節點改動某個變量的值后。在其它節點能夠最新的變化。這樣的變化是事務性的。

通過在ZK節點上注冊監聽器,就能夠獲得數據的變化。

Codis 依賴 ZooKeeper 來存放數據路由表和 codis-proxy 節點的元信息, codis-config 發起的命令都會通過 ZooKeeper 同步到各個存活的 codis-proxy.

注:1.codis新版本號支持redis到2.8.21

2.codis-group實現redis的水平擴展

以下我們來部署環境:

10.80.80.124 ? ? ? zookeeper_1 codis-configcodis-server-master,slave codis_proxy_1

10.80.80.126 ? ? ? zookeeper_2 codis-server-master,slavecodis?_proxy_2

10.80.80.123 ? ? ? zookeeper_3 codis-serve-master,slavecodis?_proxy_3

說明:

1.為了確保zookeeper的穩定性與可靠性。我們在124、126、123上搭建zookeeper集群來對外提供服務;

2.codis-cofig作為分布式redis的管理工具。在整個分布式server中僅僅須要一個就能夠完畢管理任務。

3.codis-server和codis-proxy在3臺服務器提供redis和代理服務。


一.部署zookeeper集群

1.配置hosts(在3臺server上)

10.80.80.124 codis1
10.80.80.126 codis2
10.80.80.123 codis3

2.配置java環境(在3臺server上)

vim /etc/profile
##JAVA###
export JAVA_HOME=/usr/local/jdk1.7.0_71
export JRE_HOME=/usr/local/jdk1.7.0_71/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarsource /etc/profile
3.安裝zookeeper(在3臺server上)

cd /usr/local/src
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local
4.配置環境變量(在3臺server上)

vim /etc/profile
#zookeeper
ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/binsource /etc/profile
5.改動zookeeper配置文件(在3臺server上)

#創建zookeeper的數據文件夾和日志文件夾
mkdir -p /data/zookeeper/zk1/{data,log}
cd /usr/local/zookeeper-3.4.6/conf
cp zoo_sample.cfg zoo.cfg
vim /etc/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/zk1/data
dataLogDir=/data/zookeeper/zk1/log
clientPort=2181
server.1=codis1:2888:3888
server.2=codis2:2888:3888
server.3=codis3:2888:3888
6.在dataDir下創建myid文件。相應節點id(在3臺服務器上)

#在124上 
cd /data/zookeeper/zk1/data
echo 1 > myid
#在126上 
cd /data/zookeeper/zk1/data
echo 2 > myid
#在123上 
cd /data/zookeeper/zk1/data
echo 3 > myid
7.啟動zookeeper服務(在3臺server上)

/usr/local/zookeeper-3.4.6/bin/zkServer.sh start
注:在你所在的當前文件夾下會生成一個zookeeper.out的日志文件,里面記錄了啟動過程中的具體信息;因為集群沒有所有信息,會報“myid 2或myid 3 未啟動”的信息,當集群所有啟動后就會正常,我們能夠忽略。

8.查看zookeeper全部節點的狀態(在3臺server上)

#124
/usr/local/zookeeper-3.4.6/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
#126
/usr/local/zookeeper-3.4.6/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
#123
/usr/local/zookeeper-3.4.6/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower


二.部署codis集群

1.安裝go語言(在3臺server上)

tar -zxvf go1.4.2.linux-amd64.tar.gz -C /usr/local/
2.加入go環境變量(在3臺server上)

vim /etc/profile
#go
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/usr/local/codissource /etc/profile
3.安裝codis(在3臺server上)

go get github.com/wandoulabs/codis
cd $GOPATH/src/github.com/wandoulabs/codis
#運行編譯測試腳本,編譯go和reids。

./bootstrap.sh make gotest #將編譯好后,把bin文件夾和一些腳本復制過去/usr/local/codis文件夾下 mkdir -p /usr/local/codis/{conf,redis_conf,scripts} cp -rf bin /usr/local/codis/ cp sample/config.ini /usr/local/codis/conf/ cp -rf sample/redis_conf /usr/local/codis cp -rf sample/* /usr/local/codis/scripts

4.配置codis-proxy(在3臺server上。在此以124為例)

#124
cd /usr/local/codis/conf
vim config.ini
zk=codis1:2181,codis2:2181,codis3:2181
product=codis
#此處配置圖形化界面的dashboard。注意codis集群僅僅要一個就可以,因此所有指向10.80.80.124:18087
dashboard_addr=192.168.3.124:18087
coordinator=zookeeper
backend_ping_period=5
session_max_timeout=1800
session_max_bufsize=131072
session_max_pipeline=128
proxy_id=codis_proxy_1
#126
cd /usr/local/codis/conf
vim config.ini
zk=codis1:2181,codis2:2181,codis3:2181
product=codis
#此處配置圖形化界面的dashboard,注意codis集群僅僅要一個就可以,因此所有指向10.80.80.124:18087
dashboard_addr=192.168.3.124:18087
coordinator=zookeeper
backend_ping_period=5
session_max_timeout=1800
session_max_bufsize=131072
session_max_pipeline=128
proxy_id=codis_proxy_2
#123
cd /usr/local/codis/conf
vim config.ini
zk=codis1:2181,codis2:2181,codis3:2181
product=codis
#此處配置圖形化界面的dashboard,注意codis集群僅僅要一個就可以,因此所有指向10.80.80.124:18087
dashboard_addr=192.168.3.124:18087
coordinator=zookeeper
backend_ping_period=5
session_max_timeout=1800
session_max_bufsize=131072
session_max_pipeline=128
proxy_id=codis_proxy_3
5.改動codis-server的配置文件(在3臺服務器上)

#創建codis-server的數據文件夾和日志文件夾
mkdir -p /data/codis/codis-server/{data,logs}
cd /usr/local/codis/redis_conf
#主庫
vim 6380.conf
daemonize yes
pidfile /var/run/redis_6380.pid
port 6379
logfile "/data/codis_server/logs/codis_6380.log"
save 900 1
save 300 10
save 60 10000
dbfilename 6380.rdb
dir /data/codis_server/data
#從庫
cp 6380.conf 6381.conf
sed -i 's/6380/6381/g' 6381.conf
6.加入內核參數

echo "vm.overcommit_memory = 1" >>  /etc/sysctl.conf
sysctl -p
7.依照啟動流程啟動

cat /usr/loca/codis/scripts/usage.md
0. start zookeeper 
1. change config items in config.ini 
2. ./start_dashboard.sh 
3. ./start_redis.sh 
4. ./add_group.sh 
5. ./initslot.sh 
6. ./start_proxy.sh 
7. ./set_proxy_online.sh 
8. open browser to http://localhost:18087/admin
盡管scripts文件夾以下有對應啟動腳本,也能夠用startall.sh所有啟動。但剛開始建議手動啟動,以熟悉codis啟動過程。

因為之前zookeeper已經啟動,以下我們來啟動其它項目。

注:1.在啟動過程中須要指定相關日志文件夾或配置文件文件夾,為便于統一管理。我們都放在/data/codis下;

2.dashboard在codis集群中僅僅須要在一臺server上啟動就可以,此處在124上啟動;凡是用codis_config的命令都是在124上操作,其它啟動項須要在3臺server上操作。

相關命令例如以下:

/usr/local/codis/bin/codis-config -h
usage: codis-config  [-c <config_file>] [-L <log_file>] [--log-level=<loglevel>]<command> [<args>...]
options:-c	set config file-L	set output log file, default is stdout--log-level=<loglevel>	set log level: info, warn, error, debug [default: info]commands:serverslotdashboardactionproxy


(1)啟動dashboard(在124上啟動)

#dashboard的日志文件夾和訪問文件夾
mkdir -p /data/codis/codis_dashboard/logs
codis_home=/usr/local/codis
log_path=/data/codis/codis_dashboard/logs
nohup $codis_home/bin/codis-config -c $codis_home/conf/config.ini -L $log_path/dashboard.log dashboard --addr=:18087 --http-log=$log_path/requests.log &>/dev/null &

通過10.80.80.124:18087就可以訪問圖形管理界面


(2)啟動codis-server(在3臺服務器上)

/usr/local/codis/bin/codis-server /data/codis_server/conf/6380.conf
/usr/local/codis/bin/codis-server /data/codis_server/conf/6381.conf
(3)加入 Redis Server Group(124上)

注意:每個 Server Group 作為一個 Redis server組存在, 僅僅同意有一個 master, 能夠有多個 slave, group id 僅支持大于等于1的整數

眼下我們在3臺server上分了3組,因此我們須要加入3組。每組由一主一從構成

#相關命令	
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server
usage:codis-config server listcodis-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>
#group 1
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 1 10.80.80.124:6380 master
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 1 10.80.80.124:6381 slave
#group 2
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 2 10.80.80.126:6380 master
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 2 10.80.80.126:6381 slave
#group 3
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 3 10.80.80.123:6380 master
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 3 10.80.80.123:6381 slave

注意:1.點擊“Promote to Master”就會將slave的redis提升為master,而原來的master會自己主動下線。

? ? 2./usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 能夠加入機器到對應組中。也能夠更新redis的主/從角色。

? ? 3.若為新機器,此處的keys應該為空

(4)?設置 server group 服務的 slot 范圍(124上)

#相關命令
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini slot
usage:codis-config slot init [-f]codis-config slot info <slot_id>codis-config slot set <slot_id> <group_id> <status>codis-config slot range-set <slot_from> <slot_to> <group_id> <status>codis-config slot migrate <slot_from> <slot_to> <group_id> [--delay=<delay_time_in_ms>]codis-config slot rebalance [--delay=<delay_time_in_ms>]#Codis 採用 Pre-sharding 的技術來實現數據的分片, 默認分成 1024 個 slots (0-1023), 對于每個key來說, 通過下面公式確定所屬的 Slot Id : SlotId = crc32(key) % 1024 每個 slot 都會有一個特定的 server group id 來表示這個 slot 的數據由哪個 server group 來提供。

我們在此將1024個slot分為三段,分配例如以下: /usr/local/codis/bin/codis-config -c conf/config.ini slot range-set 0 340 1 online /usr/local/codis/bin/codis-config -c conf/config.ini slot range-set 341 681 2 online /usr/local/codis/bin/codis-config -c conf/config.ini slot range-set 682 1023 3 online

(5)啟動codis-proxy(在3臺服務器上)

#codis_proxy的日志文件夾
mkdir -p /data/codis/codis_proxy/logs
codis_home=/usr/local/codis
log_path=/data/codis/codis_proxy/logs
nohup $codis_home/bin/codis-proxy --log-level warn -c $codis_home/conf/config.ini -L $log_path/codis_proxy_1.log  --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 > $log_path/nohup.out 2>&1 &

黑線處:codis讀取server的主機名。

注意:若client相關訪問proxy,須要在client加入hosts

(6)上線codis-proxy

codis_home=/usr/local/codis
log_path=/data/codis/codis_proxy/logs
nohup $codis_home/bin/codis-proxy --log-level warn -c $codis_home/conf/config.ini -L $log_path/codis_proxy_1.log  --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 > $log_path/nohup.out 2>&1 &

注:啟動codis_proxy后。proxy此時處于offline狀態。無法對外提供服務,必須將其上線后才干對外提供服務。


ok,至此codis已經能夠對外提供服務了。


三.HA

codis的ha分為前端proxy的ha以及后端codis-server的ha,在此簡單說下proxy的ha。

對于上層proxy來說,尤其是javaclient來,codis提供jodis(改動過的jedis)來實現proxy的ha。

它會通過監控zk上的注冊信息來實時獲得當前可用的proxy列表,既能夠保證高可用性。也能夠通過輪流請求全部的proxy實現負載均衡;支持proxy的自己主動上線和下線。



轉載于:https://www.cnblogs.com/yxwkf/p/5199019.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272348.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32F103ZET6 蜂鳴器、按鍵

蜂鳴器的硬件電路&#xff1a; 蜂鳴器實驗步驟&#xff1a; 實驗步驟基本和跑馬燈一樣&#xff0c;代碼和跑馬燈也基本一樣&#xff0c;只是用的GPIO不同。 幾種輸入輸出模式&#xff1a; beep.c部分代碼&#xff1a; #include "beep.h" #include "stm32f1…

MDK寄存器地址映射分析

在51單片機中&#xff1a; 首先我們看看 51 中是怎么做的。51 單片機開發中經常會引用一個 reg51.h 的頭文件&#xff0c;下面我們看看他是怎么把名字和寄存器聯系起來的&#xff1a; sfr P0 0x80;sfr 也是一種擴充數據類型&#xff0c;點用一個內存單元&#xff0c;值域為 0&…

Mysql多表查詢(兩張獨立表,一張關系表)

一、數據庫設計1、三個數據表長這樣其中user表記錄用戶信息&#xff0c;cat主要記錄男女性別&#xff0c;mete表是用戶id和性別id的對應關系2、具體數據如下二、查詢目標查詢出所有性別為“男”的用戶的“姓名”&#xff0c;如下記錄兩種不同形式的查詢1、單純的條件查詢SQL&am…

STM32 時鐘系統

STM32時鐘系統的基本概念 概念及意義 &#xff08;1&#xff09;概念&#xff1a;時鐘系統是由振蕩器&#xff08;信號源&#xff09;、定時喚醒器、分頻器等組成的電路。常用的信號源有晶體振蕩器和RC振蕩器。 &#xff08;2&#xff09;意義&#xff1a;時鐘對數字電路而言非…

【轉載】性能測試淺談

本文主要針對WEB系統的性能測試。不涉及具體的執行操作&#xff0c;只是本人對性能測試的一點理解和認識。 性能測試的目的&#xff0c;簡單說其實就是為了獲取待測系統的響應時間、吞吐量、穩定性、容量等信息。而發現一些具體的性能相關的缺陷&#xff08;如內存溢出、并發處…

SystemInit時鐘系統初始化函數剖析

SystemInit&#xff08;&#xff09;函數&#xff1a; void SystemInit (void) {/* Set HSION bit */RCC->CR | (uint32_t)0x00000001;//把內部的HSI RC&#xff08;高速時鐘&#xff09;打開#ifndef STM32F10X_CLRCC->CFGR & (uint32_t)0xF8FF0000;//這一句不會執行…

火狐表格錯亂兼容性問題

對于某一單元行需要顯示時&#xff0c;使用CSS display:block屬性&#xff0c;不需要顯示時使用display:none屬性&#xff0c;在IE瀏覽器中顯示正常&#xff0c;沒有任何問題&#xff0c;但是當用Firefox瀏覽時卻出現了布局錯亂的問題&#xff0c;這是為什么呢&#xff1f; 本文…

docker ps命令詳解 列出運行中的容器

docker ps命令詳解 列出運行中的容器 使用docker ps命令即可列出運行中的容器&#xff0c;執行該命令后&#xff0c;會出現如下7列表格 CONTAINER_ID 表示容器ID IMAGE 表示鏡像名稱 COMMAND 表示啟動容器時運行的命令 CREATED …

Lattice 的 Framebuffer IP核使用調試筆記之datasheet筆記

本文由遠航路上ing 原創&#xff0c;轉載請標明出處。 學習使用以及調試Framebuffer IP 核已經有一段時間了&#xff0c;調試的時候總想記錄些東西&#xff0c;可是忙的時候就沒有時間來寫&#xff0c;只有先找個地方記錄下&#xff0c;以后再總結。所以找這個時間好好的記錄學…

Systick滴答定時器寄存器、delay()延時函數、SysTick_Config函數

SysTick定時器 SysTick定時器&#xff0c;是一個簡單的定時器&#xff0c;對于CM3、CM4內核的芯片都有SysTick定時器。SysTick 是一個 24 位的倒計數定時器&#xff0c;當計數到 0 時&#xff0c;將從RELOAD 寄存器中自動重裝載定時初值&#xff0c;開始新一輪計數。只要不把它…

查看docker容器日志

1&#xff1a;實時查看docker容器id為 02c5ac132ee5 的最后10行日志 docker logs -f -t --tail 10 02c5ac132ee5 2:查看指定時間后的日志&#xff0c;只顯示最后100行&#xff1a; docker logs -f -t --since"2020-02-14" --tail100 d7db22166a0a 3:查看最近20分鐘的…

Web UI 自動化測試環境搭建 (轉載自51測試天地第三十九期上)

1. 安裝 Python 2.7 并設置系統環境變量 2. 下載并安裝 python setuptools Easily download, build, install, upgrade, and uninstall Python packages https://pypi.python.org/pypi/setuptools#installation-instructions 2.1 找到ez_setup.py&#xff0c;點擊右鍵--目標另存…

STM32F1 端口復用、端口(部分和完全)重映射

端口復用功能 STM32 有很多的內置外設&#xff08;比如&#xff1a;串口、ADC、DAC等是獨立的模塊和內核連接在一起&#xff09;&#xff0c;這些外設的外部引腳都是與 GPIO 復用的。也就是說&#xff0c;一個 GPIO如果可以復用為內置外設的功能引腳&#xff0c;那么當…

docker啟動容器后容器狀態為Exited (137) 5 seconds ago

1&#xff1a;因為容器里的運行的代碼報錯了&#xff0c;然后容器 Exited (1) 3 seconds ago 了&#xff0c;通過 docker logs -f container_id 能看到哪里錯了 容器樁體為exited&#xff0c;說明容器已經退出停止 先查看查看鏡像id ps images 在后臺運行一個容器 為了保證提…

ReflectionClass與Closure

<?php /*** Class A*/ class A{}$obj new ReflectionClass(A); var_export($obj.PHP_EOL); 類后面加上PHP_EOL會把當前類的詳細接口文檔打印出來。 ReflectionClass 可以利用這個動態創建類&#xff0c;動態使用類方法參數。 try{ //如果存在控制器名字的類 if(class_exis…

STM32中斷優先級的管理(NVIC)

STM32 NVIC 中斷優先級管理 CM3 內核支持 256 個中斷&#xff0c;其中包含了 16 個內核中斷和 240 個外部中斷&#xff0c;并且具有 256級的可編程中斷設置。STM32 并沒有使用 CM3 內核的全部東西&#xff0c;而是只用了它的一部分。STM32 有 84 個中斷&#xff0c;包括 16 個…

docker修改容器名字

查看一下容器的名字 這個laughing_elion是下載es時候默認的名字 修改容器名字 docker rename 容器原來名 要改為的名字 最后可以看到容器名已經修改成功

STM32 串行通信原理

處理器與外部設備通信的兩種方式&#xff1a; 并行通信 傳輸原理&#xff1a;數據各個位同時傳輸。優點&#xff1a;速度快缺點&#xff1a;占用引腳資源多 串行通信 傳輸原理&#xff1a;數據按位順序傳輸。優點&#xff1a;占用引腳資源少缺點&#xff1a;速度相對較慢 …

linus下centos7防火墻設置

CentOS7 默認使用firewalld防火墻&#xff0c;如果想換回iptables防火墻&#xff0c;可關閉firewalld并安裝iptables。 1:安裝firewalld服務 yum install firewalld 2、firewalld的基本使用 啟動&#xff1a; systemctl start firewalld &#xff08;關閉后顯示notrunning&a…

串口通信寄存器/庫函數配置、實例編寫

常用的串口相關寄存器 USART_SR狀態寄存器USART_DR數據寄存器USART_BRR波特率寄存器 串口操作相關庫函數&#xff08;省略入口參數&#xff09;&#xff1a; void USART_Init(); //串口初始化&#xff1a;波特率&#xff0c;數據字長&#xff0c;奇偶校驗&#xff0c;硬件流…