ติดตั้ง redis-cluster

ติดตั้ง redis-cluster

ตัวอย่างผมจะทำการติดตั้ง redis-cluster ที่เครื่องตัวเอง แต่ start คนละ port เพื่อทำเป็น redis server หลายตัวครับ ซึ่ง redis-cluster นี้จะทำได้ก็ต่อเมื่อใช้งาน redis version 3.0 ขึ้นไปนะครับ
ขั้นตอนแรกให้ทำการ download และติดตั้งก่อน

[shell]
wget https://github.com/antirez/redis/archive/3.0.0-beta8.tar.gz
tar xzf 3.0.0-beta8.tar.gz && cd redis-3.0.0-beta8/
make
make install
cp src/redis-trib.rb /usr/local/bin/[/shell]

ทำการสร้าง config ของ redis-cluster

mkdir /etc/redis/

ทำการสร้าง redis-server มาจำนวน 3 port ให้ทำการสร้างไฟล์ config redis-server 3 ไฟล์ โดยมีเนื้อไฟล์ดังนี้

[shell]for i in {6379..6381}
do
mkdir /etc/redis/redis-$i/
cat >> /etc/redis/redis-$i/redis.conf <<END
port $i
cluster-enabled yes
cluster-config-file /etc/redis/redis-$i/nodes.conf
cluster-node-timeout 5000
appendonly yes
END
done
[/shell]

 

ทำการ start redis-server ทัั้ง 3 ตัว

[shell]for i in {6379..6381}
do
redis-server /etc/redis/redis-$i/redis.conf &
done[/shell]

 

ทำการสร้าง cluster

[shell]
gem install redis
redis-trib.rb create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381
[/shell]

จะได้ output ดังนี้

[text]>>> Creating cluster
Connecting to node 127.0.0.1:6379: OK
Connecting to node 127.0.0.1:6380: OK
Connecting to node 127.0.0.1:6381: OK
>>> Performing hash slots allocation on 3 nodes…
Using 3 masters:
127.0.0.1:6379
127.0.0.1:6380
127.0.0.1:6381
M: 4de3a5b52e8804a278a9670734b7c7e4221610dc 127.0.0.1:6379
slots:0-5460 (5461 slots) master
M: 746b17433de60274834e996dc162c7e38cb634be 127.0.0.1:6380
slots:5461-10922 (5462 slots) master
M: 488a3ec3e0bc78d6709cb9293803cbf1491dbb92 127.0.0.1:6381
slots:10923-16383 (5461 slots) master
Can I set the above configuration? (type ‘yes’ to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
4533:M 21 Aug 15:56:34.786 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
4534:M 21 Aug 15:56:34.787 # configEpoch set to 2 via CLUSTER SET-CONFIG-EPOCH
4535:M 21 Aug 15:56:34.787 # configEpoch set to 3 via CLUSTER SET-CONFIG-EPOCH
>>> Sending CLUSTER MEET messages to join the cluster
4533:M 21 Aug 15:56:34.856 # IP address for this node updated to 127.0.0.1
4533:M 21 Aug 15:56:35.766 # Cluster state changed: ok
Waiting for the cluster to join.4534:M 21 Aug 15:56:35.867 # IP address for this node updated to 127.0.0.1
4535:M 21 Aug 15:56:35.967 # Cluster state changed: ok
.4534:M 21 Aug 15:56:37.789 # Cluster state changed: ok

>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: 4de3a5b52e8804a278a9670734b7c7e4221610dc 127.0.0.1:6379
slots:0-5460 (5461 slots) master
M: 746b17433de60274834e996dc162c7e38cb634be 127.0.0.1:6380
slots:5461-10922 (5462 slots) master
M: 488a3ec3e0bc78d6709cb9293803cbf1491dbb92 127.0.0.1:6381
slots:10923-16383 (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots…
>>> Check slots coverage…
[OK] All 16384 slots covered.
[/text]

ทำการสร้าง redis-cluster เสร็จเรียบร้อย มาทดสอบกัน

[shell]redis-cli -p 6379
127.0.0.1:6379> set foo bar
(error) MOVED 12182 127.0.0.1:6381
127.0.0.1:6379>
[/shell]

จะเห็นว่าเกิดการ Error ในการ move ไปยัง cluster อื่น

เพิ่ม option -c เพื่อ Enable Cluster mode

[shell] redis-cli -p 6379 -c
127.0.0.1:6379> set foo bar
> Redirected to slot [12182] located at 127.0.0.1:6381
OK
127.0.0.1:6381> get foo
"bar"
[/shell]

ใช้งานได้แล้ว!!! คราวนี้มาลองยัด data ใส่กัน ผมได้นำ code ตัวอย่างจากนี้

[shell] cd /usr/local/src/
git clone https://github.com/antirez/redis-rb-cluster
cd redis-rb-cluster/
[/shell]

 

แก้ไฟล์ example.rb เป็น

[ruby]
require ‘./cluster’

if ARGV.length != 2
startup_nodes = [
{:host => "127.0.0.1", :port => 6379},
{:host => "127.0.0.1", :port => 6380},
{:host => "127.0.0.1", :port => 6381}
]
else
startup_nodes = [
{:host => ARGV[0], :port => ARGV[1].to_i}
]
end

rc = RedisCluster.new(startup_nodes,32,:timeout => 0.1)

last = false

while not last
begin
last = rc.get("__last__")
last = 0 if !last
rescue => e
puts "error #{e.to_s}"
sleep 1
end
end

((last.to_i+1)..1000000000).each{|x|
begin
rc.set("foo#{x}",x)
puts rc.get("foo#{x}")
rc.set("__last__",x)
rescue => e
puts "error #{e.to_s}"
end
sleep 0.1
}
[/ruby]

ลองรัน

[shell] ruby example.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
^Cexample.rb:37:in `sleep’: Interrupt
from example.rb:37:in `block in <main>’
from example.rb:29:in `each’
from example.rb:29:in `<main>’

[/shell]

ลองเข้าไป get value

[shell]
redis-cli -p 6379 -c
127.0.0.1:6379> get foo10
> Redirected to slot [11976] located at 127.0.0.1:6381
"10"
127.0.0.1:6381> get foo15
"15"
127.0.0.1:6381>
[/shell]

 

ได้ value จาก node อื่นๆ ที่ได้จากการ sharding ถูกต้อง

 

ball Written by:

Teerapat Khunpech Live, Tech, Beers, Bike, Cafe Racer, Docker, Devops, Eco-System