主從服務器
使用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 一主多從已經搭建完畢.