มีนส์บล็อก

สีที่ใช้

#84e309

#0984e3

#e30984

Redis บน Debian AWS EC2

Redis บน Debian AWS EC2

ติดตั้ง Redis แบบ Manual บน ระบบปฏิบัติการ Debian ที่อยู่บน EC2 ของ AWS Cloud จะช่วยให้การปรับแต่ง Redis เช่น การเพิ่มพอร์ต ทำได้ง่ายขึ้น

สิ่งที่ต้องเตรียม

ก่อนจะติดตั้ง Redis เราต้องเตรียมเซิร์ฟเวอร์ก่อนครับ ดูการติดตั้ง Debian บน AWS EC2

ติดตั้ง Redis

เป็นการติดตั้ง Redis แบบ compiling จาก source โดยตรงนะครับ ตามคำแนะนำของ redis.io

wget

ถ้าเราอยากดาวน์โหลดอะไรก็ตามจากลิงค์บนเว็บไซต์มาไว้ที่โฟลเดอร์บน Linux ให้ไปที่โฟลเดอร์ที่เราต้องการดาวน์โหลดไฟล์ แล้วใช้คำสั่ง

wget url/file-name

คลิ๊กขวาตรงลิงค์บนเว็บไซต์ แล้วเลือก Copy Link จะได้ url/file-name

ในที่นี้เราจะดาวน์โหลด redis source code จาก

http://download.redis.io/redis-stable.tar.gz

มาไว้ที่ Home คำสั่งทั้งหมดจึงเป็น

cd ~
wget http://download.redis.io/redis-stable.tar.gz
❯ wget http://download.redis.io/redis-stable.tar.gz
--2021-08-31 14:55:27--  http://download.redis.io/redis-stable.tar.gz
Resolving download.redis.io (download.redis.io)... 45.60.125.1
Connecting to download.redis.io (download.redis.io)|45.60.125.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2517349 (2.4M) [application/octet-stream]
Saving to: ‘redis-stable.tar.gz’

redis-stable.tar.gz           100%[=================================================>]   2.40M  1.05MB/s    in 2.3s

2021-08-31 14:55:30 (1.05 MB/s) - ‘redis-stable.tar.gz’ saved [2517349/2517349]


~                                                                                                                    4s
❯

Unzip file

บน Linux จะ Unzip file ด้วยคำสั่ง tar [options] ให้ Unzip file ที่เราเพิ่งดาวน์โหลดมาครับ

tar xvzf redis-stable.tar.gz
❯ tar xvzf redis-stable.tar.gz
redis-stable/
redis-stable/CONTRIBUTING
redis-stable/src/
redis-stable/src/geohash.h
redis-stable/src/redis-trib.rb
redis-stable/src/t_string.c
redis-stable/src/scripting.c
redis-stable/src/siphash.c
redis-stable/src/setcpuaffinity.c
redis-stable/src/ziplist.c
redis-stable/src/t_hash.c
redis-stable/src/mt19937-64.c
...
...
...
redis-stable/TLS.md
redis-stable/INSTALL
redis-stable/redis.conf
redis-stable/Makefile
redis-stable/runtest-sentinel
redis-stable/runtest-cluster
redis-stable/runtest
redis-stable/MANIFESTO
redis-stable/sentinel.conf
redis-stable/runtest-moduleapi

~
❯

โดยคำสั่ง tar มี options xvzf หมายถึง

-x: Extract คำสั่งแตกไฟล์

-v: Verbose คำสั่งแสดงล็อกการทำงานบน Terminal

-z: zip ไฟล์ถูก zip ด้วย gzip

-f: file สร้างโฟลเดอร์ชื่อเดียวกับไฟล์ zip

***เนื่องจากเราต้องจ่ายเงินตามจำนวนกิ๊กกะไบต์–GB ของ ฮาร์ดดิสก์ บน AWS ดังนั้นไฟล์ไหนไม่จำเป็นก็ควรลบทิ้งครับ ในที่นี้ไฟล์ redis-stable.tar.gz ไม่มีความจำเป็นต้องเก็บไว้ ให้ลบทิ้งด้วยคำสั่ง

cd ~
rm redis-stable.tar.gz

Compile

เข้าไปที่โฟลเดอร์ redis-stable แล้วสั่ง compile

cd ~
cd redis-stable
make
❯ cd redis-stable
❯ make
cd src && make all
make[1]: Entering directory '/home/manotlj/redis-stable/src'
/bin/sh: 1: pkg-config: not found
    CC Makefile.dep
/bin/sh: 1: pkg-config: not found
rm -rf redis-server redis-sentinel redis-cli redis-benchmark redis-check-rdb redis-check-aof *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep
rm -f adlist.d quicklist.d ae.d anet.d dict.d server.d sds.d zmalloc.d lzf_c.d lzf_d.d pqsort.d zipmap.d sha1.d ziplist.d release.d networking.d util.d object.d db.d replication.d rdb.d t_string.d t_list.d t_set.d t_zset.d t_hash.d config.d aof.d pubsub.d multi.d debug.d sort.d intset.d syncio.d cluster.d crc16.d endianconv.d slowlog.d scripting.d bio.d rio.d rand.d memtest.d crcspeed.d crc64.d bitops.d sentinel.d notify.d setproctitle.d blocked.d hyperloglog.d latency.d sparkline.d redis-check-rdb.d redis-check-aof.d geo.d lazyfree.d module.d evict.d expire.d geohash.d geohash_helper.d childinfo.d defrag.d siphash.d rax.d t_stream.d listpack.d localtime.d lolwut.d lolwut5.d lolwut6.d acl.d gopher.d tracking.d connection.d tls.d sha256.d timeout.d setcpuaffinity.d monotonic.d mt19937-64.d anet.d adlist.d dict.d redis-cli.d zmalloc.d release.d ae.d crcspeed.d crc64.d siphash.d crc16.d monotonic.d cli_common.d mt19937-64.d ae.d anet.d redis-benchmark.d adlist.d dict.d zmalloc.d release.d crcspeed.d crc64.d siphash.d crc16.d monotonic.d cli_common.d mt19937-64.d
(cd ../deps && make distclean)
...
...
...
    CC connection.o
    CC tls.o
    CC sha256.o
    CC timeout.o
    CC setcpuaffinity.o
    CC monotonic.o
    CC mt19937-64.o
    LINK redis-server
    INSTALL redis-sentinel
    CC redis-cli.o
    CC cli_common.o
    LINK redis-cli
    CC redis-benchmark.o
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory '/home/manotlj/redis-stable/src'

~/redis-stable                                                                                                   1m 56s
❯

ตรง Hint: เขาแนะนำให้ใช้คำสั่ง make test ลองดูครับ

❯ make test
cd src && make test
make[1]: Entering directory '/home/manotlj/redis-stable/src'
/bin/sh: 1: pkg-config: not found
    CC Makefile.dep
/bin/sh: 1: pkg-config: not found
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [Makefile:385: test] Error 1
make[1]: Leaving directory '/home/manotlj/redis-stable/src'
make: *** [Makefile:6: test] Error 2

~/redis-stable
❯

ผมพบปัญหา ไม่มี tcl ติดตั้งบนเครื่อง มันจะฟ้อง You need tcl 8.5 or newer in order to run the Redis test ไม่เป็นไรครับ เมื่อไม่มีก็ติดตั้ง ด้วยคำสั่ง

sudo apt update && sudo apt upgrade -y
sudo apt install tcl
❯ sudo apt update && sudo apt upgrade -y
[sudo] password for manotlj:
Hit:1 http://deb.debian.org/debian buster InRelease
Get:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Hit:3 http://deb.debian.org/debian buster-updates InRelease
Get:4 http://ftp.debian.org/debian buster-backports InRelease [46.7 kB]
...
...
...

❯ sudo apt install tcl
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libtcl8.6 tcl8.6
...
...
...

คราวนี้ลองใช้คำสั่ง make test อีกครั้งครับ

❯ make test
cd src && make test
make[1]: Entering directory '/home/manotlj/redis-stable/src'
/bin/sh: 1: pkg-config: not found
Cleanup: may take some time... OK
Starting test server at port 21079
[ready]: 5155
Testing unit/printver
[ready]: 5156
Testing unit/dump
[ready]: 5157
Testing unit/auth
[ready]: 5159
Testing unit/protocol
[ready]: 5160
Testing unit/keyspace
[ready]: 5158
Testing unit/scan
[ready]: 5161
Testing unit/info
[ready]: 5164
Testing unit/type/string
[ready]: 5162
Testing unit/type/incr
[ready]: 5165
Testing unit/type/list
[ready]: 5167
Testing unit/type/list-2
[ready]: 5163
Testing unit/type/list-3
[ready]: 5170
Testing unit/type/set
[ready]: 5166
Testing unit/type/zset
[ready]: 5168
Testing unit/type/hash
[ready]: 5169
Testing unit/type/stream
[ok]: DUMP / RESTORE are able to serialize / unserialize a simple key
[ok]: RESTORE can set an arbitrary expire to the materialized key
[ok]: RESTORE can set an expire that overflows a 32 bit integer
...
...
...
  1 seconds - unit/networking
  4 seconds - unit/tracking
  47 seconds - integration/psync2
  11 seconds - unit/pendingquerybuf
  95 seconds - unit/type/stream
  78 seconds - integration/replication-4
  34 seconds - unit/obuf-limits
  86 seconds - integration/replication-3
  104 seconds - unit/aofrw
  41 seconds - unit/hyperloglog
  65 seconds - unit/maxmemory
  58 seconds - north
  173 seconds - integration/replication-psync
  235 seconds - integration/replication
  70 seconds - defrag

\o/ All tests passed without errors!

Cleanup: may take some time... OK
make[1]: Leaving directory '/home/manotlj/redis-stable/src'

~/redis-stable                                                                                                   5m 19s
❯

ครั้งนี้สำเร็จครับ เครื่องมันบอกว่า All tests passed without errors! หลังจาก make test เสร็จแล้ว ตอนนี้ command line ของ Redis เช่น

  • redis-server
  • redis-cli

อยู่บนเครื่องคอมพิวเตอร์ของเราเรียบร้อยแล้ว เพื่อให้ command line ของ Redis ทำงานร่วมกับ Terminal ได้ เราต้องส่งคำสั่งนี้ไปเก็บไว้ที่โฟลเดอร์ “/usr/local/bin/” ด้วยคำสั่ง

sudo cp src/redis-server /usr/local/bin/
sudo cp src/redis-cli /usr/local/bin/
// or
sudo make install
❯ sudo cp src/redis-server /usr/local/bin/
[sudo] password for manotlj:
❯ sudo cp src/redis-cli /usr/local/bin/
❯ sudo make install
cd src && make install
make[1]: Entering directory '/home/manotlj/redis-stable/src'
/bin/sh: 1: pkg-config: not found

Hint: It's a good idea to run 'make test' ;)

    INSTALL redis-server
    INSTALL redis-benchmark
    INSTALL redis-cli
make[1]: Leaving directory '/home/manotlj/redis-stable/src'

~/redis-stable
❯

ทดสอบ Redis

เมื่อติดตั้งเสร็จแล้วลองทดสอบว่ามันทำงานมั๊ย ให้เปิด Terminal ขึ้นมา 2 แท็บ แท็บแรกพิมพ์คำสั่ง

redis-server

แล้วกด Enter

❯ redis-server
16147:C 31 Aug 2021 15:26:06.400 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16147:C 31 Aug 2021 15:26:06.400 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=16147, just started
16147:C 31 Aug 2021 15:26:06.400 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
16147:M 31 Aug 2021 15:26:06.401 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
16147:M 31 Aug 2021 15:26:06.401 # Server can't set maximum open files to 10032 because of OS error: Operation not permitted.
16147:M 31 Aug 2021 15:26:06.401 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 5.0.3 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 16147
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

16147:M 31 Aug 2021 15:26:06.425 # Server initialized
16147:M 31 Aug 2021 15:26:06.425 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
16147:M 31 Aug 2021 15:26:06.425 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
16147:M 31 Aug 2021 15:26:06.425 * Ready to accept connections

ถ้า เชื่อมต่อ AWS ผ่าน SSH บน VSCode เปิดแท็บที่ 2 ด้วยการกดปุ่ม

control + shift + `

***ทั้งเครื่อง Mac และ Windows

แล้วพิมพ์คำสั่ง

redis-cli

กดปุ่ม Enter

❯ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> ping manot
"manot"
127.0.0.1:6379> ping Programmer
"Programmer"
127.0.0.1:6379> set mykey love
OK
127.0.0.1:6379> get mykey
"love"
127.0.0.1:6379>

ถ้าเครื่องตอบมาแบบนี้ก็แสดงว่าติดตั้ง Redis เรียบร้อยแล้วครับ แต่อย่างไรก็ตามทุกๆครั้งที่เรา รีสตาร์ทคอมพิวเตอร์ เราต้องใช้คำสั่ง redis-server เพื่อรีสตาร์ท Redis เราสามารถทำแบบนั้นได้ถ้าเรากำลังพัฒนาโปรแกรมอยู่ หรือเรียกว่าขั้นตอน Development แต่เมื่อเราพัฒนาโปรแกรมจนสามารถใช้งานได้จริง และนำไปวางบน Server แล้ว หรือเรียกว่าขั้นตอน Production เราคงไม่สามารถมานั่งรีสตาร์ท Redis ได้ เราต้องยกหน้าที่นี้ให้ Server ด้วยการเขียนไฟล์ Configuration

ปุ่ม ` ใช้มากในการเขียนโค้ด

คนที่กำหนดปุ่มลัดในการเปลี่ยนภาษาระหว่างภาษาไทย และอังกฤษ เป็นปุ่ม ` ควรเปลี่ยนเป็นปุ่มอื่น เช่นเปลี่ยนไปใช้ control + shift หรือ control + space bar


ปรับแต่ง Redis สำหรับ ERPNext

ERPNext ต้องการใช้งาน Redis บนพอร์ต 11000, 12000 และ 13000 ตามลำดับ แต่ค่า Default ของ Redis เป็นพอร์ต 6379 เราจึงต้องสร้างพอร์ต เพิ่มขึ้นมา 3 พอร์ตดังกล่าวข้างต้น วิธีการก็ง่ายนิดเดียวครับ เราไปคัดลอกไฟล์ของพอร์ต 6379 แล้วเปลี่ยนเป็นพอร์ตที่เราต้องการ ดังนี้

สร้าง 2 โฟลเดอร์หลัก

  • /etc/redis/
  • /var/redis/

เนื่องจากเป็นการติดตั้งแบบ Manual เราจึงต้องสร้างโฟลเดอร์ และไฟล์ Configuration ขึ้นมาเอง เบื้องต้นสร้างโฟลเดอร์ขึ้นมา 2 โฟลเดอร์ เพื่อเป็นที่ทำงานของ Redis

sudo mkdir /etc/redis
sudo mkdir /var/redis

ตรวจดูสิทธิ์การใช้งานโฟลเดอร์

❯ ls -ald /etc/redis/
drwxr-xr-x 2 root root 4096 Aug 26 00:19 /etc/redis/
❯ ls -ald /var/redis/
drwxr-xr-x 6 root root 4096 Aug 24 23:20 /var/redis/

จากข้อมูลนี้บอกเราว่า สิทธิ์การใช้งานของทั้ง 2 โฟลเดอร์ที่เราเพิ่งสร้างขึ้น เป็นของ root นะครับ

คัดลอกไฟล์ 2 ชุด

ไฟล์ต้นฉบับทั้งหมด ที่เราจะคัดลอก จะวางไว้ที่โฟลเดอร์ redis-stable ซึ่งโฟลเดอร์นี้เราได้ unzip จากไฟล์

redis-stable.tar.gz

ทั้งนี้ผมได้แนะนำให้ unzip ไว้ที่ Home นะครับ ลองใช้คำสั่ง

cd ~
ls
❯ cd ~
❯ ls
anaconda3  frappe-bench  redis-stable

จะเห็นโฟลเดอร์ redis-stable ให้เข้าไปที่โฟลเดอร์นี้ครับ

❯ cd redis-stable
❯ ls
00-RELEASENOTES  CONTRIBUTING  dump.rdb  MANIFESTO   runtest            runtest-sentinel  tests
BUGS             COPYING       INSTALL   README.md   runtest-cluster    sentinel.conf     TLS.md
CONDUCT          deps          Makefile  redis.conf  runtest-moduleapi  src               utils

 ~/redis-stable                                                                 base [email protected]

ให้มองหาโฟลเดอร์ utils และเข้าไปครับ

utils folder
utils folder
❯ cd utils
❯ ls
build-static-symbols.tcl  graphs             redis_init_script      [email protected]
cluster_fail_time.tcl     hashtable          redis_init_script.tpl  systemd-redis_server.service
corrupt_rdb.c             hyperloglog        redis-sha1.rb          tracking_collisions.c
create-cluster            install_server.sh  releasetools           whatisdoing.sh
generate-command-help.rb  lru                speed-regression.tcl
gen-test-certs.sh         redis-copy.rb      srandmember

 ~/redis-stable/utils                                                           base [email protected]

redis_init_script

จะเห็นไฟล์ redis_init_script ซึ่งเป็นไฟล์ต้นฉบับที่เรา compile มาจาก source ให้คัดลอกไฟล์นี้ไปไว้ที่โฟลเดอร์ “/etc/init.d/” โดยตั้งชื่อใหม่ตามพอร์ตที่เราต้องการใช้งานคือ 11000, 12000 และ13000 ซึ่งรวมทั้งพอร์ตปกติของ Redis ด้วยครับคือพอร์ต 6379 ทั้งหมดก็ 4 พอร์ต

sudo cp redis_init_script /etc/init.d/redis_6379
sudo cp redis_init_script /etc/init.d/redis_11000
sudo cp redis_init_script /etc/init.d/redis_12000
sudo cp redis_init_script /etc/init.d/redis_13000

เข้าไปที่โฟลเดอร์ “/etc/init.d/” จะเห็นไฟล์เรียงกันประมาณนี้

❯ cd /etc/init.d/
❯ ls
apparmor      cloud-init-local  kmod        redis_11000        redis13000-server  screen-cleanup  unattended-upgrades
chrony        cron              mysql       redis11000-server  redis_6379         ssh             uuidd
cloud-config  dbus              networking  redis_12000        redis-server       sudo            x11-common
cloud-final   dnsmasq           postfix     redis12000-server  rsync              udev
cloud-init    hwclock.sh        procps      redis_13000        rsyslog            ufw

  /etc/init.d                                                                  base [email protected]
Folder /etc/init.d/
Folder /etc/init.d/

ตรวจสอบสิทธิ์การเข้าถึงโฟลเดอร์ และไฟล์ครับ

❯ ls -ald /etc/init.d/
drwxr-xr-x 2 root root 4096 Aug 24 23:50 /etc/init.d/
❯ ls -ald /etc/init.d/redis_6379
-rwxr-xr-x 1 root root 1352 Aug 24 22:48 /etc/init.d/redis_6379
❯ ls -ald /etc/init.d/redis_11000
-rwxr-xr-x 1 root root 1350 Aug 24 23:16 /etc/init.d/redis_11000
❯ ls -ald /etc/init.d/redis_12000
-rwxr-xr-x 1 root root 1356 Aug 24 23:17 /etc/init.d/redis_12000
❯ ls -ald /etc/init.d/redis_13000
-rwxr-xr-x 1 root root 1350 Aug 24 23:19 /etc/init.d/redis_13000

  /etc/init.d                                                                  base [email protected]

ซึ่งเป็นของ root ทั้งหมด

แก้ไขพอร์ต

ไฟล์ redis_init_script มีหน้าตาแบบนี้ครับ

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO

REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"

case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac

จุดสังเกต:

ให้ดู 5 บรรทัดนี้ครับ

REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"

โค้ด 5 บรรทัดนี้บอกเราว่า สิ่งที่เราต้องแก้มีแค่จุดเดียวครับคือ “เลขพอร์ต” ในบรรทัดที่ 1 ซึ่งไฟล์ต้นฉบับเขาใช้พอร์ต 6379 ให้แก้ไขไฟล์ตามลำดับ ดังนี้ครับ

  • redis_6379 ไม่ต้องแก้เลขพอร์ต
  • redis_11000 แก้เลข 6379 เป็น 11000
  • redis_12000 แก้เลข 6379 เป็น 12000
  • redis_13000 แก้เลข 6379 เป็น 13000

สำหรับโค้ดบรรทัดที่ 2 และ 3 เป็นการอ้างที่อยู่ของ Redis command line 2 คำสั่งคือ redis-server และ redis-cli ซึ่งทั้ง 2 คำสั่งเก็บไว้ที่โฟลเดอร์ “/usr/local/bin/” จำได้มั๊ยครับ ที่เราคัดลอกไปด้วยคำสั่ง sudo make install

ในบรรทัดที่ 4 และ 5 เป็นการกำหนดที่อยู่ของ PIDFILE และ CONF ซึ่งนำ “เลขพอร์ต” มาเป็นชื่อไฟล์โดยอัตโนมัติ


redis_11000
redis_12000
redis_13000

หมายเหตุ: สำหรับหัวไฟล์ตรง ### BEGIN INIT INFO สามารถแก้ตรง # Provides: ให้เป็น redis_11000, redis_12000 และ redis_13000 ตามลำดับ ส่วนของ # Short-Description: และ # Description: แก้ไขได้ตามใจชอบครับ


redis.conf

ขั้นตอนนี้เสร็จแล้วครับ กลับไปที่โฟลเดอร์ redis-stable ลองหาชื่อไฟล์ redis.conf

cd ~/redis-stable
ls

ให้คัดลอกไฟล์ redis.conf ไปวางไว้ที่โฟลเดอร์ที่เราสร้างไว้ “/etc/redis/” ให้ใช้พอร์ตเป็นชื่อไฟล์ปลายทางครับ

❯ sudo cp redis.conf /etc/redis/6379.conf
❯ sudo cp redis.conf /etc/redis/11000.conf
❯ sudo cp redis.conf /etc/redis/12000.conf
❯ sudo cp redis.conf /etc/redis/13000.conf

ทำไมจึงใช้ชื่อพอร์ตเป็นชื่อไฟล์ ลองกลับไปดูไฟล์ redis_11000 ซักตัวอย่างหนึ่ง จะเห็นโค้ดนี้

CONF="/etc/redis/${REDISPORT}.conf"

เขาอ้างไฟล์ Configuration เป็น “/etc/redis/${ชื่อพอร์ต}.conf” เราจึงต้องตั้งชื่อตามครับ

สร้างโฟลเดอร์ย่อย

โฟลเดอร์ย่อยที่เราจะสร้าง จะใช้เป็นห้องทำงานส่วนตัวของ Redis แต่ละพอร์ตครับ โดยโฟลเดอร์ย่อยนี้จะนำไปใส่ในไฟล์ redis.conf ตรงบรรทัด dir ซึ่งเราจะเจอตอนแก้ไขไฟล์ “${ชื่อพอร์ต}.conf” ให้สร้างโฟลเดอร์ด้วยคำสั่ง

❯ sudo mkdir /var/redis/6379
❯ sudo mkdir /var/redis/11000
❯ sudo mkdir /var/redis/12000
❯ sudo mkdir /var/redis/13000

โดยใช้ชื่อพอร์ตเป็นชื่อโฟลเดอร์นะครับ สร้างเสร็จแล้วลองตรวจสอบสิทธิ์

❯ ls -ald /var/redis/
drwxr-xr-x 6 root root 4096 Aug 24 23:20 /var/redis/
❯ ls -ald /var/redis/6379
drwxr-xr-x 2 root root 4096 Aug 30 10:49 /var/redis/6379
❯ ls -ald /var/redis/11000
drwxr-xr-x 2 root root 4096 Aug 30 10:49 /var/redis/11000
❯ ls -ald /var/redis/12000
drwxr-xr-x 2 root root 4096 Aug 30 10:49 /var/redis/12000
❯ ls -ald /var/redis/13000
drwxr-xr-x 2 root root 4096 Aug 24 23:20 /var/redis/13000

 ~/redis-stable                                                                      base [email protected]

สิทธิ์เป็นของ root อีกตามเคยครับ


แก้ไขไฟล์ <port>.conf

ทีนี้ก็ถึงเวลาแก้ไขไฟล์ <port>.conf ทีละไฟล์

เปิดไฟล์ Configuration ทีละไฟล์ ด้วยคำสั่ง

sudo nano /etc/redis/6379.conf
sudo nano /etc/redis/11000.conf
sudo nano /etc/redis/12000.conf
sudo nano /etc/redis/13000.conf

แล้วแก้ไขไฟล์ ตามรายละเอียดด้านล่างนี้ครับ

port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel debug # change to notice once production
logfile /var/log/redis_6379.log
save 3600 1
save 300 100
save 60 10000
dbfilename dump.rdb
dir /var/redis/6379
port 11000
daemonize yes
pidfile /var/run/redis_11000.pid
loglevel debug # change to notice once production
logfile /var/log/redis_11000.log
save 3600 1
save 300 100
save 60 10000
dbfilename dump.rdb
dir /var/redis/11000
port 12000
daemonize yes
pidfile /var/run/redis_12000.pid
loglevel debug # change to notice once production
logfile /var/log/redis_12000.log
save 3600 1
save 300 100
save 60 10000
dbfilename dump.rdb
dir /var/redis/12000
port 13000
daemonize yes
pidfile /var/run/redis_13000.pid
loglevel debug # change to notice once production
logfile /var/log/redis_13000.log
save ""
dbfilename dump.rdb
dir /var/redis/13000
maxmemory 819mb
maxmemory-policy allkeys-lru

หมายเหตุ: เปลี่ยน loglevel เป็น notice สำหรับ Production


Default run levels

บรรจุไฟล์ในโฟลเดอร์ “/etc/init.d/” เข้าไปใน default run levels ของ Server

sudo update-rc.d redis_6379 defaults
sudo update-rc.d redis_11000 defaults
sudo update-rc.d redis_12000 defaults
sudo update-rc.d redis_13000 defaults

เริ่มใช้งาน Redis ทุกพอร์ต

โดยสั่งแต่ละพอร์ตให้เริ่มทำงานด้วยคำสั่ง start

sudo /etc/init.d/redis_6379 start
sudo /etc/init.d/redis_11000 start
sudo /etc/init.d/redis_12000 start
sudo /etc/init.d/redis_13000 start

ตัวอย่างจากพอร์ต 11000

❯ sudo /etc/init.d/redis_11000 start
Starting Redis server...

*** ถ้าเกิด Error ขึ้นในขั้นตอนนี้ เช่นลืมสร้างโฟลเดอร์ “/var/redis/<port>” มันจะฟ้อง

❯ redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> exit

เมื่อเรากลับไปแก้ไข โดยการสร้างโฟลเดอร์ “/var/redis/<port>” เสร็จแล้วให้ stop Redis Server ด้วยคำสั่ง

sudo /etc/init.d/redis_<port> stop

และอัพเดท Scripts อีกครั้ง ด้วยคำสั่ง

sudo update-rc.d redis_<port> defaults

สั่ง start Redis Server ใหม่ครับ

sudo /etc/init.d/redis_<port> start

*** อย่าลืมแทน <port> ด้วยเลขพอร์ตครับ

ตอนนี้ Redis ของเราน่าจะกลับมาทำงานปกติครับ ลองใช้คำสั่ง

sudo lsof -n -P -i TCP -s TCP:LISTEN
❯ sudo /etc/init.d/redis_6379 start
Starting Redis server...
❯ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
❯ sudo /etc/init.d/redis_11000 start
Starting Redis server...
❯ redis-cli -p 11000
127.0.0.1:11000> ping
PONG
127.0.0.1:11000> exit
❯ sudo /etc/init.d/redis_12000 start
Starting Redis server...
❯ redis-cli -p 12000
127.0.0.1:12000> ping
PONG
127.0.0.1:12000> exit
❯ sudo /etc/init.d/redis_13000 start
Starting Redis server...
❯ redis-cli -p 13000
127.0.0.1:13000> ping
PONG
127.0.0.1:13000> exit
❯ cd ~
❯ sudo lsof -n -P -i TCP -s TCP:LISTEN
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 4407 root    6u  IPv4  21244      0t0  TCP 127.0.0.1:6379 (LISTEN)
redis-ser 4407 root    7u  IPv6  21245      0t0  TCP [::1]:6379 (LISTEN)
redis-ser 4464 root    6u  IPv4  24624      0t0  TCP 127.0.0.1:11000 (LISTEN)
redis-ser 4464 root    7u  IPv6  24625      0t0  TCP [::1]:11000 (LISTEN)
redis-ser 4499 root    6u  IPv4  24629      0t0  TCP 127.0.0.1:12000 (LISTEN)
redis-ser 4499 root    7u  IPv6  24630      0t0  TCP [::1]:12000 (LISTEN)
redis-ser 4542 root    6u  IPv4  23396      0t0  TCP 127.0.0.1:13000 (LISTEN)
redis-ser 4542 root    7u  IPv6  23397      0t0  TCP [::1]:13000 (LISTEN)
Redis listening ports
Redis listening ports

เก็บงาน

เมื่อมาถึงตรงนี้ Redis น่าจะ start เรียบร้อยแล้ว ให้ลองทดสอบดูครับ ลองใช้คำสั่ง save ดูบ้าง

❯ redis-cli -p 11000
127.0.0.1:11000> ping
PONG
127.0.0.1:11000> save
OK
127.0.0.1:11000> exit

หลังใช้คำสั่ง save ให้เข้าไปดูว่าในโฟลเดอร์ “/var/redis/<พอร์ต>/” มีไฟล์ dump.rdb อยู่มั๊ย และในโฟลเดอร์ “/var/log/” มีไฟล์ redis_พอร์ต.log อยู่มั๊ย

❯ cd /var/redis/11000/
❯ ls
dump.rdb
❯ cd /var/log/
❯ ls
alternatives.log  cloud-init.log         faillog         mail.info  private          redis13000      unattended-upgrades
apt               cloud-init-output.log  fontconfig.log  mail.log   redis            redis_6379.log  user.log
auth.log          daemon.log             kern.log        mail.warn  redis11000       syslog          wtmp
btmp              debug                  lastlog         messages   redis_11000.log  syslog.1
chrony            dpkg.log               mail.err        mysql      redis12000       syslog.2.gz

อย่างในกรณีตัวอย่างสำหรับพอร์ต 11000 จะมีไฟล์ dump.rdb อยู่ในโฟลเดอร์ “/var/redis/11000/” และมี ไฟล์ redis_11000.log อยู่ในโฟลเดอร์ “/var/log/” ตามที่คาดหวังครับ


สรุป

สำหรับการติดตั้ง Redis บน Debian ภายใต้สภาพแวดล้อม AWS EC2 จะมีขั้นตอนทำงานดังนี้

ติดตั้ง Redis

wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make

สร้าง 2 โฟลเดอร์ ให้ Redis ไว้ทำงาน

  • /etc/redis/
  • /var/redis/

สร้างห้องส่วนตัวให้ Redis แต่ละพอร์ต

  • /var/redis/6379
  • /var/redis/11000
  • /var/redis/12000
  • /var/redis/13000

แก้ไขไฟล์ 2 ชุด

  • ชุดแรก redis_init_script คัดลอกและเปลี่ยนชื่อไฟล์เป็น redis_6379, redis_11000, redis_12000 และ redis_13000 ตามลำดับ แล้วเปลี่ยนเลขพอร์ตในแต่ละไฟล์
  • ชุดที่สอง redis.conf คัดลอกและเปลี่ยนชื่อไฟล์เป็น 6379.conf, 11000.conf, 12000.conf และ 13000.conf ตามลำดับ แล้วแก้ไขไฟล์แต่ละไฟล์ ดังนี้
redis 6379 configuration
redis 11000 configuration
redis 12000 configuration
redis 13000 configuration

เอกสารอ้างอิง

สมัครรับบทความ

ท่านจะได้รับบทความเกี่ยวกับเทคนิคในการเขียนโค้ด การสร้างเว็บไซต์ ความรู้ด้านบัญชี ภาษีอากร และอื่นๆ

0 0 votes
ให้คะแนนบทความ
Notify of
guest
0 ความเห็นทั้งหมด
Inline Feedbacks
ดูความเห็นทั้งหมด

บทความแนะนำ

Flask Python framework โดย สรุป

Flask Python framework + Emmet

สรุป วิธีสร้างเว็บไซต์ด้วยภาษา Python โดยใช้ Flask framework และ การตั้งค่า VSCode เพื่อให้สามารถใช้ Emmet ร่วมกับ Flask framework ได้

Colorize VIM

Developer Playground: Colorize VIM

ตกแต่ง VIM Editor ให้ดู Colorize ด้วย VIM Plug และมันยังมีประโยชน์ต่อการเขียนโค้ดด้วย เพราะมันจะแสดงข้อมูลที่สำคัญบริเวณขอบล่างของหน้าจอ

Debian บน AWS EC2

Debian บน AWS EC2

วิธีติดตั้งระบบปฏิบัติการ Debian บน AWS EC2 วิธีการเชื่อมต่อผ่าน SSH บน VSCode การเพิ่ม Super User เข้าไปในกลุ่ม sudo และตกแต่งด้วย Oh-My-Zsh

0
แสดงความเห็นได้นะx
()
x
Scroll to Top
Share on facebook
Share on twitter
Share on linkedin