# redis 的復制與 nginx 的 tcp 負載均衡的結合
#### 1. redis的復制
[redis的復制](http://redisdoc.com/topic/replication.html)除去源碼級的代碼不說,要操作起來實在太簡單,我們這里就不介紹它的定義了。
它具體的內容都可以在官方文檔查到。
這一節只是來介紹它的實踐和與nginx的結合。
首先,已經有了一臺主服務器,監聽在6379端口。
它的配置文件位于`/usr/local/etc/redis.conf`。
現在我們要制造一個從服務器。
那很簡單,只要監聽在別的端口就可以了。
我們把配置文件復制一份,改成`/usr/local/etc/redis-slave.conf`
找到類似下面的內容改一下:
```
pidfile /usr/local/var/run/redis-slave.pid
port 6380
```
我們把從服務器監聽在6380端口。
再把它啟動起來。
```
$ redis-server /usr/local/etc/redis-slave.conf
```
現在我們需要開啟一個客戶端,連接上從服務器,再去同步主服務器的數據。
我們使用redis-cli客戶端。
```
$ redis-cli -p 6380
```
接著執行以下命令表示設置為從服務器。
```
slaveof 127.0.0.1 6379
```
現在已接完成了redis的復制了,至于效果,可以在主服務器上添加一些內容,再到從服務器上看是否有一樣的結果。
如果要查看復制的情況,可以用下面的命令:
```
$ info replication
```
輸出:
```
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=753,lag=1
master_repl_offset:753
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:752
```
#### 2. nginx的tcp負載均衡
nginx自從1.9之后,就有tcp負載均衡了。
它使用的是[ngx\_stream\_core\_module](http://nginx.org/en/docs/stream/ngx_stream_core_module.html)這個模塊,默認是沒有編譯的,你要重新編譯一下。重新編譯的時候使用`--with-stream`這個選項即可。
在nginx配置文件中,添加類似這樣的內容:
```
stream {
upstream backend {
server 127.0.0.1:6379 max_fails=3 fail_timeout=30s;
server 127.0.0.1:6380 max_fails=3 fail_timeout=30s;
}
server {
listen 6378;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass backend;
}
}
```
**注意:stream是和http同級的**
這樣,用`redis-cli`連接上6378端口。就可以進行嘗試了。
#### 3. 總結
**上面的例子只是一個案例,只是為了演示,在生產環境中你可能需要改造一下。**
一般來說,主服務器只有寫的功能,從服務器就只有讀的功能。
在程序里控制一下,寫的功能指定為主服務器,從服務器那邊做負載均衡就可以了。
有時候主服務器會掛掉,這個時候可以就需要`redis sentinel`的功能了。
本篇完結。