codis 使用


1:Jedis與Redisson對比

2.1. 概況對比

Jedis是Redis的Java實現的客戶端,其API提供了比較全面的Redis命令的支持;Redisson實現了分布式和可擴展的Java數據結構,和Jedis相比,功能較為簡單。
Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。可以認為是jedis的補充,不能替換jedis。

2.2.可伸縮性

Jedis中的方法調用是比較底層的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟練的使用Jedis。
而Redisson中的方法則是進行比較高的抽象,每個方法調用可能進行了一個或多個Redis方法調用。
2.3. 編程模型

Jedis使用阻塞的I/O,且其方法調用都是同步的,程序流需要等到sockets處理完I/O才能執行,不支持異步。Jedis客戶端實例不是線程安全的,所以需要通過連接池來使用Jedis。

Redisson使用非阻塞的I/O和基於Netty框架的事件驅動的通信層,其方法調用是異步的。Redisson的API是線程安全的,所以可以操作單個Redisson連接來完成各種操作。

2.4. 數據結構

Jedis僅支持基本的數據類型如:String、Hash、List、Set、Sorted Set。

Redisson不僅提供了一系列的分布式Java常用對象,不支持字符串存儲,Redisson的實現類中只支持集合操作,不能對普通字符做操作。
不支持很多redis特性,比如排序,事務,管道,集群等
還提供了許多分布式服務,其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch)。
並且是線程安全的,在分布式開發中,Redisson可提供更便捷的方法。

 

2:代碼實例

jedis單機使用方式
public static void main(String[] args) {
// 開啟Jedis連接池
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxTotal(50);
jpc.setMinIdle(10);
JedisPool jp = new JedisPool(jpc,"192.168.1.18",19000);

// 開啟Jedis客戶端
Jedis jedis = jp.getResource();

jedis.set("k1","v1");
System.out.println(jedis.get("k1"));

jedis.close();
}
jedis集群使用方式
public class JedisClusterTest {

public static void main(String[] args) throws IOException {

Set<HostAndPort> nodes = new HashSet<>();
HostAndPort hap = new HostAndPort("192.168.1.18",6379);
nodes.add(hap);

JedisCluster jedisCluster =
new JedisCluster(
nodes, 1000,
1000, 1,
new GenericObjectPoolConfig());


jedisCluster.set("k1","v1");
jedisCluster.get("k1");

jedisCluster.close();

}

}
Redisson使用方式
public class RedissonTest {

public static void main(String[] args) {

Config config = new Config();
config.setCodec(new org.redisson.client.codec.StringCodec());
config. useSingleServer().setAddress("192.168.1.18:19000");

RedissonClient redisson = Redisson.create(config);
RBucket<String> keyObject = redisson.getBucket("k2");

keyObject.set("v2");

System.out.println(keyObject.get());

redisson.shutdown();
}
}
3:codis能做什么

Codis介紹

  • Codis開發是專門解決分布式方案才誕生的
  • Codis是豌豆莢開發的分布式redis解決方案
  • 線上動態配置實現無限擴容,插槽分配和漂移
  • 單節點和集群操作對客戶端透明
  • 線上可以在一定程序上達到一個資源漂移的效果

codis的強大之處服務端透明化,不需要關心多少集群,只需要關心第三方的proxy。

Codis的組成部分

命令 命令作用
Codis Dashboard Codis集群管理工具
Codis Proxy 集群代理,代理多個Codis
Codis Server 代替了窗台的redis-Server
Codis Group 組的概念,可以讓集群出現更多的用法
Codis Admin 集群管理的命令行工具
Codis FE 圖形界面處理

 

4:Codis集群的部署

1.環境的准備

yum install -y gcc glibc gcc-c++ make git git clone https://github.com/CodisLabs/codis.git -b release3.2(去GIT上下載) yum -y install glibc-2.17 wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz 

2.需要的包

3.開始部署

安裝go語言環境

1.常規操作 tar -xf go1.7.3.linux-amd64.tar.gz cd go 2.添加環境變量 vim /etc/profile export GOROOT=/root/codis/go export GOPATH=/root/codis/go_path/codis export PATH=PATH:JAVA_HOME/bin:$GOROOT/bin source /etc/profile 
 

安裝zookeeper

tar -xf zookeeper-3.4.10.tar.gz cd /root/codis/zookeeper-3.4.10/conf/ mv zoo_sample.cfg zoo.cnf #配置文件有需要可以自己修改 
 
/root/codis/zookeeper-3.4.10/bin/zkServer.sh start 

安裝codis

tar -xf codis3.2.2-go1.8.5-linux.tar.gz cd codis3.2.2-go1.8.5-linux mkdir conf/redis/{redis_6381,reids_6382} 拷貝redis的配置文件到以上目錄下 cp redis.cnf conf/redis/redis_6381/ #修改配置文件 vim redis.cnf #bind 127.0.0.1 #綁定注釋 protected-mode no #安全模塊不開啟 daemonize yes #開啟后台啟動 pidfile /var/run/redis_6381.pid #設置進程號,不能相同 port 6381 #設置端口號,不能一樣
分別執行
codis-server redis.cnf

開啟兩個服務

netstat -lnput |grep codis #查看是否6381和6382端口開啟 ps -ef |grep codis-server #查看進程是否使用 

配置集群的管理工具dashboard

./codis-dashboard --default-config |tee conf/dashboard.toml #開啟dashboadb生成配置文件 

修改配置文件

vim conf/dashboard.toml
        coordinator_name = "zookeeper"
        coordinator_addr = "192.168.4.56:2181"      #不建議寫IP地址,最好使用主機名稱
        product_name = "codis-demo"
        admin_addr = "192.168.4.56:18080"
 
 

啟動dashboard

mkdri ./logs nohup ./codis-dashboard --config=conf/dashboard.toml --log=logs/dashboard.log --log-level=WARN --ncpu 2 & #指定配置文件位置,指定日志路徑,指定日志級別,指定可以提供資源數 #nohup指定后台啟動 tail -f /log/日志文件 
 

關於如何優雅的關閉dashboard

常規的情況下我們總是使用(Kill -9 進程號)強制結束,但是這樣會導致整個node節點崩潰,
為了保障其他節點的正常運行我們需要的是優雅的關閉dashboard。

./codis-admin --dashboard="192.168.4.56:18080" --shutdown 

開啟proxy

./codis-proxy --default-config |tee conf/proxy.toml product_name = "codis-demo" #必須和我們的dashboard相同 vim conf/proxy.toml admin_addr = "192.168.4.56:11080" proxy_addr = "192.168.4.56:19000" jodis_name = "zookeeper" jodis_addr = "192.168.4.56:2181" 
 

啟動但是沒有啟用

nohup ./codis-proxy --config=conf/proxy.toml --log=logs/proxy.log --log-level=WARN --ncpu 2 & 

啟用相互之間關聯

./codis-admin --dashboard=192.168.4.56:18080 --create-proxy -x192.168.4.56:11080 cat logs/proxy.log #查看日志是否成功 

啟動codis-fe圖形界面管理

生成配置文件

./codis-admin --dashboard-list --zookeeper=192.168.4.56:2181 |tee conf/codis.json 

開啟codis-fe

nohup ./codis-fe --ncpu=2 --log=logs/fe.log --log-level=WARN --dashboard-list=conf/codis.json --listen=192.168.4.56:10011 & cat log/codis-fe 

訪問網站

 

 

 

 

5:替換成代理的地址即可訪問操作redis

 

本文主要的目標是幫助大家完成Codis的集群搭建,讓大家對Codis有一個相對直觀的認知,話不多說,咱們開始把。

環境准備

codis3.2.2-go1.8.5-linux.tar.gz
glibc-2.17.tar.gz
go1.10.linux-amd64.tar.gz
zookeeper-3.4.11.tar.gz


go環境配置安裝

由於Codis是使用GO語言編寫的,所以想使用Codis需要先安裝GO語言環境,安裝過程如下:
將go1.10.linux-amd64.tar.gz解壓至預期安裝目錄下,筆者習慣將內容放置在/opt/install下,截圖如下:
圖片描述
go的默認環境要求必須在/usr/local下,所以更改目錄需要配置GOROOT環境變量
圖片描述
圖片描述
GOPATH的目錄是用來標識GO的所有第三方軟件放置位置,當然了,我們現在只有一個Codis


Zookeeper環境配置安裝

Codis是一款強依賴於Zookeeper的軟件,所以我們需要安裝它。

  1. 首先我們將Zookeeper解壓至預期目錄,依照習慣,筆者將內容解壓至/opt/install目錄下
    圖片描述
  2. 將Zookeeper的conf目錄下zoo.sample.cfg修改為zoo.cfg文件
    圖片描述
  3. 啟動Zookeeper即可,啟動命令在Zookeeper的bin目錄下的zkServer.sh
    圖片描述

Codis環境配置安裝

將codis3.2.2-go1.8.5-linux.tar.gz解壓至剛剛配置的GOPATH目錄下,然后依次配置即可,以下都使用%codis_path%來表示codis的解壓根目錄哈

  1. Codis-server配置啟動
    首先我們要明確,codis-server其實就相當於redis-server,也就是codis-server可以啟動很多個redis實例
    • 創建配置文件存儲目錄[因為要創建兩個Redis實例]
      mkdir -p %codis_path%/conf/redis/redis_6379
      mkdir -p %codis_path%/conf/redis/redis_6380
      圖片描述
    • 拷貝redis的配置文件至相應目錄下【ps:如果沒有文件的話,可以去下載一個Redis,然后將配置文件拷貝出來,這里就不贅述了】
      圖片描述
    • 修改Redis配置文件【PS:兩個配置文件修改的內容基本一致,所以合並一起說】
      圖片描述
      圖片描述
      圖片描述<p>
    • 啟動codis-server
      %codis_path%/codis-server %codis_path%/conf/redis/redis_6379/redis.conf
      %codis_path%/codis-server %codis_path%/conf/redis/redis_6380/redis.conf<p>
      圖片描述
  2. Codis-dashboard配置啟動
    • 創建配置文件
      %codis_path%/codis-dashboard --default-config | tee %codis_path%/config/codis/dashboard.toml<p>
    • 修改配置文件
      圖片描述
    • 啟動dashboard命令:【注意替換自己的codis路徑】
      nohup /opt/install/codis3.2.2-go1.8.5-linux/codis-dashboard \
      --ncpu=4 \
      --config=/opt/install/codis3.2.2-go1.8.5-linux/config/codis/dashboard.toml \
      --log=/opt/install/codis3.2.2-go1.8.5-linux/logs/dashboard.log \
      --log-level=WARN &<p>
      圖片描述
      -- 關閉dashboard命令:
      /opt/install/codis3.2.2-go1.8.5-linux/codis-admin --dashboard=192.168.4.130:18080 --shutdown<p>
      圖片描述<p>
  3. Codis-Proxy配置啟動
    • 生成proxy配置文件【注意替換自己的codis路徑】
      /opt/install/codis3.2.2-go1.8.5-linux/codis-proxy --default-config | tee /opt/install/codis3.2.2-go1.8.5-linux/config/codis/proxy.toml<p>
    • 修改proxy配置文件
      圖片描述
      圖片描述
    • 啟動proxy
      nohup /opt/install/codis3.2.2-go1.8.5-linux/codis-proxy --ncpu=4 --config=/opt/install/codis3.2.2-go1.8.5-linux/config/codis/proxy.toml --log=/opt/install/codis3.2.2-go1.8.5-linux/logs/proxy.log --log-level=WARN &<p>
      圖片描述
    • 關聯proxy與dashboard
      /opt/install/codis3.2.2-go1.8.5-linux/codis-admin --dashboard=192.168.4.130:18080 --create-proxy -x192.168.4.130:11080<p>
      圖片描述
  4. Codis-FE配置啟動
    • 配置codis-fe
      /opt/install/codis3.2.2-go1.8.5-linux/codis-admin --dashboard-list --zookeeper=192.168.4.130:2181 | tee /opt/install/codis3.2.2-go1.8.5-linux/config/codis/codis.json<p>
      圖片描述
    • 啟動codis-fe
      nohup ./codis-fe --ncpu=2 --log=logs/fe.log --log-level=WARN --dashboard-list=config/codis/codis.json --listen=192.168.4.130:8080 & <p>
      圖片描述
  5. Codis配置演示

至此整個Codis集群環境就已經搭建完成了,大家可以盡情使用頁面簡單的操作和查看Redis集群狀態了。

最后還是要大家說以下,如果希望使用Java客戶端連接Codis集群,只要連接proxy即可,我們之前配置的proxy地址為:192.168.4.130:19000.

 

Codis分片原理

現在我們已經知道了Codis會將指定key的Redis命令轉發給下層的Redis。那么Codis如何知道某個key在哪個Redis上呢。

Codis采用Pre-sharding的技術來實現數據分片,默認分為1024個slot(0-1023)。Codis在接收到命令時,先對key進行crc32運算,然后再對1024取余,得到的結果就是對應的slot。然后就可以將命令轉發給slot對應的Redis實例進行處理了。

擴容操作

Codis的動態擴容/縮容能力是它的一大亮點之一。它可以對Redis客戶端透明。在擴容時,Codis提供了SLOTSSCAN指令,這個指令可以掃描指定的slot上的所有key,然后對每個key進行遷移。在擴容過程中,如果有新的key需要轉發到正在遷移的slot上,那么codis會判斷這個key是否需要遷移,如果需要,則對指定的key進行強制遷移,遷移完成后,再將命令轉發到新的Redis上。

看了上面的介紹是不是覺得擴容是一件很麻煩的事情,Codis已經為我們考慮到這點了,它提供了自動均衡的功能,只需要在界面上點一下"Auto Rebalance"按鈕,就可以自動實現slot遷移(可以說非常貼心了)。縮容也比較簡單,只需要將需要下線的實例的slot遷移到其他實例上,然后刪除group就可以了。

  1. 添加group

剛剛我們啟動了兩個codis-server,因此,我們可以new兩個group,然后分別將codis-server加入到兩個group中

 

codis-group

 

  1. 初始化slot

一開始所有的slot都是offline狀態。

 

codis-slot-init

 

點擊下方的Rebalance All Slots按鈕,codis會自動把1024個slot分配給兩個group(每個分512個)。

 

codis-slot

 

當然,也可以手動分配slot,比如,我們將group-1的10個slot分配給group-2,只需要點擊Migrate Some按鈕即可。

 

codis-slot-manual

 

小結




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM