# Bài 12: Redis Replication

#### **Giới thiệu về Redis Replication:**

* **Redis Replication là gì?**
    
    * Redis Replication là quá trình sao chép dữ liệu từ một máy chủ Redis chính (master) sang một hoặc nhiều máy chủ phụ (slaves). Điều này giúp tăng tính sẵn sàng và khả năng mở rộng của hệ thống, đồng thời cải thiện hiệu suất truy xuất dữ liệu bằng cách phân tải các yêu cầu đọc (read) từ máy chủ chính sang các máy chủ phụ.
        
* **Lợi ích của Redis Replication:**
    
    * **Tăng tính sẵn sàng (High Availability):** Nếu máy chủ chính gặp sự cố, các máy chủ phụ có thể được sử dụng để thay thế, đảm bảo dịch vụ không bị gián đoạn.
        
    * **Cải thiện hiệu suất (Performance):** Phân tải các yêu cầu đọc từ máy chủ chính sang các máy chủ phụ, giúp giảm tải và cải thiện hiệu suất tổng thể.
        
    * **Sao lưu dữ liệu (Data Backup):** Các máy chủ phụ có thể được sử dụng như các bản sao lưu của máy chủ chính, đảm bảo dữ liệu được bảo vệ.
        

#### **Cấu hình master-slave replication:**

**Bước 1: Thiết lập máy chủ chính (master):**

* **Cấu hình máy chủ chính:**
    
    * Đảm bảo máy chủ chính Redis đã được cài đặt và chạy. Không cần cấu hình đặc biệt cho máy chủ chính, vì mặc định Redis hoạt động ở chế độ master.
        
    * File cấu hình của Redis thường nằm ở `redis.conf`. Đảm bảo các thiết lập cơ bản đã được cấu hình đúng.
        

**Bước 2: Thiết lập máy chủ phụ (slave):**

* **Cấu hình máy chủ phụ:**
    
    * Cài đặt Redis trên máy chủ phụ và chỉnh sửa file cấu hình `redis.conf` để chỉ định máy chủ chính mà nó sẽ sao chép dữ liệu.
        
    * Thêm dòng sau vào file `redis.conf` trên máy chủ phụ:
        
        ```plaintext
        replicaof <master-ip> <master-port>
        ```
        
        * Ví dụ:
            
            ```plaintext
            replicaof 192.168.1.100 6379
            ```
            
* **Khởi động máy chủ phụ:**
    
    * Khởi động Redis trên máy chủ phụ để bắt đầu quá trình sao chép dữ liệu từ máy chủ chính.
        
    * Kiểm tra trạng thái của máy chủ phụ để đảm bảo nó đang sao chép dữ liệu:
        
        ```bash
        redis-cli INFO replication
        ```
        

**Bước 3: Quản lý replication:**

* **Kiểm tra trạng thái replication:**
    
    * Sử dụng lệnh `INFO replication` để kiểm tra trạng thái replication trên cả máy chủ chính và máy chủ phụ.
        
        ```bash
        redis-cli INFO replication
        ```
        
* **Chuyển đổi từ slave sang master:**
    
    * Nếu máy chủ chính gặp sự cố, bạn có thể chuyển đổi một trong các máy chủ phụ thành máy chủ chính bằng cách sử dụng lệnh `SLAVEOF NO ONE`:
        
        ```bash
        redis-cli SLAVEOF NO ONE
        ```
        
* **Chuyển đổi từ master sang slave:**
    
    * Để chuyển đổi một máy chủ chính thành máy chủ phụ, sử dụng lệnh `SLAVEOF`:
        
        ```bash
        redis-cli SLAVEOF <master-ip> <master-port>
        ```
        

#### **Ví dụ thực tiễn:**

**Tạo một hệ thống Redis có khả năng sao lưu:**

**Scenario:** Bạn cần thiết lập một hệ thống Redis với một máy chủ chính và hai máy chủ phụ để đảm bảo tính sẵn sàng cao và khả năng sao lưu dữ liệu.

**Bước 1: Thiết lập máy chủ chính:**

* **Cấu hình máy chủ chính:**
    
    * Đảm bảo máy chủ chính Redis đã được cài đặt và chạy trên `192.168.1.100` với cổng `6379`.
        
    * Kiểm tra cấu hình cơ bản trong file `redis.conf`:
        
        ```plaintext
        bind 192.168.1.100
        port 6379
        ```
        

**Bước 2: Thiết lập các máy chủ phụ:**

* **Máy chủ phụ 1:**
    
    * **Cấu hình máy chủ phụ 1:** Cài đặt Redis trên máy chủ phụ 1 và chỉnh sửa file `redis.conf`:
        
        ```plaintext
        bind 192.168.1.101
        port 6379
        replicaof 192.168.1.100 6379
        ```
        
    * **Khởi động máy chủ phụ 1:**
        
        ```bash
        sudo systemctl start redis
        ```
        
* **Máy chủ phụ 2:**
    
    * **Cấu hình máy chủ phụ 2:** Cài đặt Redis trên máy chủ phụ 2 và chỉnh sửa file `redis.conf`:
        
        ```plaintext
        bind 192.168.1.102
        port 6379
        replicaof 192.168.1.100 6379
        ```
        
    * **Khởi động máy chủ phụ 2:**
        
        ```bash
        sudo systemctl start redis
        ```
        

**Bước 3: Kiểm tra trạng thái replication:**

* **Trên máy chủ chính:**
    
    ```bash
    redis-cli INFO replication
    ```
    
    * Đảm bảo rằng `connected_slaves` hiển thị số lượng máy chủ phụ đã kết nối.
        
* **Trên các máy chủ phụ:**
    
    ```bash
    redis-cli INFO replication
    ```
    
    * Đảm bảo rằng trạng thái `role` là `slave` và `master_link_status` là `up`.
        

**Bước 4: Chuyển đổi từ slave sang master khi máy chủ chính gặp sự cố:**

* **Trên máy chủ phụ 1:**
    
    ```bash
    redis-cli SLAVEOF NO ONE
    ```
    
* **Cập nhật cấu hình trên các máy chủ phụ khác để chỉ định máy chủ phụ mới làm máy chủ chính:**
    
    * Trên máy chủ phụ 2:
        
        ```bash
        redis-cli SLAVEOF 192.168.1.101 6379
        ```
        

#### **Các tính năng bổ sung của Redis Replication:**

**1\. Read-Only Slaves:**

* **Mô tả:**
    
    * Theo mặc định, các máy chủ phụ chỉ xử lý các yêu cầu đọc (read) và từ chối các yêu cầu ghi (write).
        
    * Bạn có thể cho phép máy chủ phụ chấp nhận các yêu cầu ghi bằng cách chỉnh sửa cấu hình:
        
        ```plaintext
        replica-read-only no
        ```
        

**2\. Chaining Replication:**

* **Mô tả:**
    
    * Redis hỗ trợ chaining replication, nơi mà các máy chủ phụ có thể đóng vai trò là máy chủ chính cho các máy chủ phụ khác.
        
    * Điều này cho phép tạo ra các cây replication phức tạp và mở rộng khả năng sao lưu và phục hồi dữ liệu.
        

**3\. Partial Resynchronization:**

* **Mô tả:**
    
    * Redis hỗ trợ partial resynchronization, cho phép các máy chủ phụ chỉ nhận các thay đổi mới nhất từ máy chủ chính mà không cần phải sao chép toàn bộ dữ liệu lại từ đầu.
        

#### **Câu hỏi củng cố kiến thức:**

1. **Redis Replication là gì và nó có lợi ích gì?**
    
    * Redis Replication là quá trình sao chép dữ liệu từ máy chủ chính sang máy chủ phụ, tăng tính sẵn sàng và hiệu suất.
        
2. **Lệnh nào dùng để thiết lập một máy chủ Redis làm máy chủ phụ?**
    
    * `replicaof <master-ip> <master-port>`.
        
3. **Làm thế nào để kiểm tra trạng thái replication trong Redis?**
    
    * Sử dụng lệnh `INFO replication`.
        
4. **Làm thế nào để chuyển một máy chủ phụ thành máy chủ chính khi máy chủ chính gặp sự cố?**
    
    * Sử dụng lệnh `SLAVEOF NO ONE` trên máy chủ phụ.
        
5. **Cấu hình nào trong Redis cho phép máy chủ phụ chấp nhận các yêu cầu ghi?**
    
    * `replica-read-only no`.
        

### Kết luận:

* Redis Replication cung cấp một phương pháp mạnh mẽ để tăng cường tính sẵn sàng và khả năng mở rộng của hệ thống Redis. Bằng cách sao chép dữ liệu từ máy chủ chính sang các máy chủ phụ, bạn có thể đảm bảo rằng dữ liệu của mình luôn được bảo vệ và hệ thống có thể phục hồi nhanh chóng khi gặp sự cố. Việc cấu hình và quản lý replication trong Redis khá đơn giản nhưng rất hiệu quả, giúp bạn dễ dàng triển khai trong môi trường sản xuất.
