redis 主從搭建

主從服務器

使用redis 搭建一主多從環境.
redis 提供一種複製(replication)功能, 可以實現當一臺數據庫中的數據更新後,自動同更新同步到其他數據庫上. 這就是所謂的主從模式.

在這種主從模式中, 數據庫分兩類:
- 主數據庫: 可以進行讀寫操作;
- 從數據庫: 一般可以讀操作;

實戰

1. 環境準備

現在模擬在一臺電腦上,開啓三個redis 實例,監聽端口分別是6379(默認端口), 6380, 6381 . 使用redis 6379 端口作爲master; 安裝過程此處省略…

##### 啓動三個實例

###### 配置初始化腳本
在redis 解壓源碼目錄utils 文件夾有一個redis_init_script的初始化腳本文件. 將腳本文件複製到 /etc/init.d 目錄中 分別命名爲redis_6379, redis_6380, redis_6381; 並修改端口屬性REDISPORT 如下:

6380:

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

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

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

6381:

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

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

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

6379:

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

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"
...

腳本參數說明

  • redisport: 指定程序開啓的端口號
  • EXEC: redis程序安裝目錄(一般是默認路徑)
  • CLIEXEC: redis連接客戶端程序路徑(一般都是路徑)
  • PIDFILE: 當redis 做爲守護進程啓動時,進程pid 存儲位置
  • CONF : redis啓動時加載的配置文件路徑
創建配置管理文件夾

redis 默認會開啓RDB持久化,所以需要配置管理持久化文件的位置;
1. 創建 /etc/redis 文件夾; 作用:存放redis配置文件(redis_6379.conf redis_6380.conf redis_6381.conf), 爲什麼要在etc 下創建redis 文件夾, 如果想切換到其他文件夾,修改直接修改redis_* 腳本
2. 創建 /var/redis/6379, /var/redis/6380, /var/redis/6381 目錄; 作用: 用於存儲持久化文件目錄(配置路徑見redis_端口.conf)

配置文件

複製redis 源碼路徑下redis.conf 到etc/redis 文件夾zhong, 命名:redis_6379.conf redis_6380.conf redis_6381.conf

修改配置文件
1. 設置redis守護進程 daemonize yes
2. 配置redis Pid 位置 pidfile /var/run/redis_端口號.pid
3. 配置監聽端口號 port 端口號
4. 配置持久化文件位置 dir /var/redis/端口

分配權限,並啓動

sudo chmod +x /etc/init.d/redis_6379

etc/init.d/redis_6381 start

root@ubuntu:/# sudo chmod +x etc/init.d/redis_6381 
root@ubuntu:/# 
root@ubuntu:/# 
root@ubuntu:/# etc/init.d/redis_6381 start
Starting Redis server...
root@ubuntu:/# 
root@ubuntu:/# 
root@ubuntu:/# netstat -ano |grep 6381
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp6       0      0 :::6381                 :::*                    LISTEN      off (0.00/0/0)
root@ubuntu:/# redis-cli -p 6381
127.0.0.1:6381> auth ricisung
OK
127.0.0.1:6381> keys *
(empty list or set)
127.0.0.1:6381> 
127.0.0.1:6381> 
127.0.0.1:6381> 
127.0.0.1:6381> 
127.0.0.1:6381> 
127.0.0.1:6381> quit

….

2. 配置過程

目前爲止, 現在已經將三個redis實例啓動起來,三個獨立的redis實例,沒有任何關聯,目前他們都是master;
通過info replication 查看

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> 
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> 
127.0.0.1:6379> 

啓動主從的兩種方式
1. 通過命令啓動
啓動6379 端口後, 在啓動6380,和6381 時候指定6379爲master;

redis-server –port 6380 –slaveof 127.0.0.1 6379
redis-server –port 6381 –slaveof 127.0.0.1 6379

不加建議使用因爲沒有作爲守護進程啓動,這種啓動方式根據客戶端進程創建的;
2. 通過修改配置啓動
修改配置文件 端口.config
slaveof 選項默認是禁止的 :

# slaveof <masterip> <masterport>

slaveof 127.0.0.1 6379
3. 運行中配置
直接使用slaveof 命令; 語法 slaveof masterip masterport

修改完配置重啓redis_6380 和redis_6381 ,然後使用info replication 查看

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1468133220
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> 
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.0.223,port=6381,state=online,offset=85,lag=1
master_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84

此時要小心了,如果master 有密碼保護, slave 主機顯示已經連接上了master, 而master顯示沒有客戶端連接;

修改slave的配置 masterauth masterpassword

3. 測試

在master主機上添加刪除修改內容,分別從slave 獲取判斷是否正確;

測試master info replication 信息如下:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.223,port=6381,state=online,offset=617,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=617,lag=0
master_repl_offset:617
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:616
127.0.0.1:6379> 
創建測試

master:

127.0.0.1:6379> 
127.0.0.1:6379> hmset l2 l2_a1 asdf l2_a2 sjdiw
OK
127.0.0.1:6379> hgetall l2
1) "l2_a1"
2) "asdf"
3) "l2_a2"
4) "sjdiw"
127.0.0.1:6379>

6380:

127.0.0.1:6380> hgetall l2
1) "l2_a1"
2) "asdf"
3) "l2_a2"
4) "sjdiw"
127.0.0.1:6380> 

6381:

root@ubuntu:/# redis-cli -p 6381
127.0.0.1:6381> auth ricisung
OK
127.0.0.1:6381> hgetall l2
1) "l2_a1"
2) "asdf"
3) "l2_a2"
4) "sjdiw"
127.0.0.1:6381> 

到此redis 一主多從已經搭建完畢.

發佈了49 篇原創文章 · 獲贊 13 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章