Thứ sáu, 11/11/2016 | 00:00 GMT+7

Cách cấu hình Redis Replication trên Ubuntu 16.04

Redis là một repository dữ liệu key-value open-souce , sử dụng mô hình lưu trữ trong bộ nhớ với chức năng ghi đĩa tùy chọn để duy trì sự bền bỉ. Nó có các giao dịch, kiểu nhắn tin pub / sub và chuyển đổi dự phòng tự động trong số các chức năng khác. Redis có khách hàng được viết bằng hầu hết các ngôn ngữ với những ngôn ngữ được đề xuất được giới thiệu trên trang web của họ .

Đối với môi trường production , sao chép dữ liệu qua ít nhất hai nút được coi là phương pháp hay nhất. Điều này cho phép khôi phục trong trường hợp môi trường bị lỗi, điều này đặc biệt quan trọng khi cơ sở user ứng dụng của bạn phát triển. Nó cũng cho phép bạn tương tác một cách an toàn với dữ liệu production mà không cần sửa đổi hoặc ảnh hưởng đến hiệu suất.

Trong hướng dẫn này, ta sẽ cấu hình sao chép giữa hai server , cả hai đều chạy Ubuntu 16.04. Quá trình này có thể dễ dàng điều chỉnh cho nhiều server hơn nếu cần.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần truy cập vào hai server Ubuntu 16.04. Phù hợp với các thuật ngữ mà Redis sử dụng, ta sẽ giới thiệu đến các server chính chịu trách nhiệm về việc chấp nhận ghi các yêu cầu như server chủ và server chỉ đọc thứ như server slaver .

Bạn nên có một user không phải root với các quyền sudo cấu hình trên mỗi server này. Ngoài ra, hướng dẫn này sẽ giả định bạn đã có sẵn firewall cơ bản. Bạn có thể làm theo hướng dẫn cài đặt server ban đầu Ubuntu 16.04 của ta để đáp ứng các yêu cầu này.

Khi đã sẵn sàng để bắt đầu, hãy tiếp tục với hướng dẫn này.

Bước 1: Cài đặt Redis

Để bắt đầu, ta sẽ cài đặt Redis trên cả máy chủ chính và server slaver .

Ta sẽ cài đặt gói Server Redis cập nhật bằng cách sử dụng PPA Redis của Chris Lea . Luôn thận trọng khi kích hoạt repository của bên thứ ba. Trong trường hợp này, Chris Lea là một nhà đóng gói có kinh nghiệm, người duy trì nhiều gói hàng chất lượng cao.

Đầu tiên, thêm PPA vào cả hai server của bạn:

  • sudo apt-add-repository ppa:chris-lea/redis-server

Nhấn ENTER để chấp nhận repository .

Tiếp theo, cập nhật index gói local của server và cài đặt gói server Redis bằng lệnh :

  • sudo apt-get update
  • sudo apt-get install redis-server

Thao tác này sẽ cài đặt server Redis và khởi động dịch vụ.

Kiểm tra xem Redis có đang hoạt động hay không bằng lệnh :

  • redis-cli ping

Bạn sẽ nhận được phản hồi sau:

Output
PONG

Điều này cho thấy rằng Redis đang chạy và có thể truy cập được đối với ứng dụng client local .

Bước 2: Lưu lượng an toàn giữa hai server

Trước khi cài đặt nhân rộng, điều quan trọng là phải hiểu ý nghĩa của mô hình bảo mật của Redis. Redis không cung cấp tùy chọn mã hóa root và giả định nó đã được triển khai cho một mạng riêng gồm các đồng nghiệp tin cậy .

Nếu Redis được triển khai vào một mạng cô lập…

Nếu server của bạn đang hoạt động trong một mạng bị cô lập, bạn có thể chỉ cần điều chỉnh file cấu hình của Redis để liên kết với địa chỉ IP mạng bị cô lập của bạn .

Mở file cấu hình Redis trên mỗi máy tính:

  • sudo nano /etc/redis/redis.conf

Tìm đường bind và nối thêm địa chỉ IP mạng riêng biệt của server :

/etc/redis/redis.conf
bind 127.0.0.1 isolated_IP_address 

Lưu và đóng file . Khởi động lại dịch vụ bằng lệnh :

  • sudo systemctl restart redis-server.service

Mở quyền truy cập vào cổng Redis:

  • sudo ufw allow 6379

Bây giờ, bạn có thể truy cập một server từ server kia bằng cách cung cấp địa chỉ IP của server thay thế cho lệnh redis-cli với cờ -h :

  • redis-cli -h isolated_IP_address ping
Output
PONG

Redis hiện có thể chấp nhận các kết nối từ mạng bị cô lập của bạn.

Nếu Redis không được triển khai vào một mạng bị cô lập…

Đối với các mạng không bị cô lập hoặc bạn không kiểm soát, bắt buộc lưu lượng phải được bảo mật thông qua các phương tiện khác. Có nhiều tùy chọn đảm bảo lưu lượng truy cập giữa các server Redis, bao gồm:

  • Tạo tunnel với tunnel : Bạn cần một tunnel đến và đi cho mỗi server . Ví dụ có sẵn ở cuối hướng dẫn.
  • Tạo tunnel với spiped : Bạn cần tạo hai file đơn vị systemd cho mỗi server , một file để giao tiếp với server từ xa và một file để chuyển tiếp kết nối đến quy trình Redis của chính nó. Chi tiết được bao gồm ở cuối hướng dẫn.
  • Cài đặt VPN với PeerVPN : Cả hai server cần có thể truy cập được trên VPN.

Sử dụng một trong các phương pháp trên, cài đặt phương thức giao tiếp an toàn giữa server Redis và server slaver của bạn. Bạn nên biết địa chỉ IP và cổng mà mỗi máy cần để kết nối an toàn với dịch vụ Redis trên máy ngang hàng của nó.

Bước 3: Cấu hình Redis Master

Bây giờ Redis đã được cài đặt và chạy trên mỗi server và một kênh giao tiếp an toàn đã được cài đặt , ta phải chỉnh sửa các file cấu hình của chúng. Hãy bắt đầu với server sẽ hoạt động như chính .

Mở /etc/redis/redis.conf bằng editor yêu thích của bạn:

  • sudo nano /etc/redis/redis.conf

Bắt đầu bằng cách tìm cài đặt tcp-keepalive và đặt nó thành 60 giây như các comment đề xuất. Điều này sẽ giúp Redis phát hiện các vấn đề về mạng hoặc dịch vụ:

/etc/redis/redis.conf
. . . tcp-keepalive 60 . . . 

Tìm các requirepass chỉ thị và đặt nó vào cụm từ password mạnh. Mặc dù lưu lượng truy cập Redis của bạn phải được bảo mật khỏi các bên bên ngoài, điều này cung cấp xác thực cho chính Redis. Vì Redis nhanh và không giới hạn tỷ lệ các lần nhập password , hãy chọn một passphrase (password bảo vệ) mạnh, phức tạp để bảo vệ khỏi các nỗ lực vũ phu:

/etc/redis/redis.conf
requirepass your_redis_master_password 

Cuối cùng, có một số cài đặt tùy chọn mà bạn có thể cần điều chỉnh tùy thuộc vào tình huống sử dụng của bạn .

Nếu bạn không muốn Redis tự động cắt bỏ các phím cũ hơn và ít sử dụng hơn khi nó đầy, bạn có thể tắt loại bỏ phím tự động:

/etc/redis/redis.conf
maxmemory-policy noeviction 

Để đảm bảo độ bền được cải thiện, bạn có thể bật tính năng duy trì file chỉ thêm vào. Điều này sẽ giúp giảm thiểu việc mất dữ liệu trong trường hợp hệ thống bị lỗi với chi phí là các file lớn hơn và hiệu suất hơi chậm hơn:

/etc/redis/redis.conf
appendonly yes appendfilename "redis-staging-ao.aof" 

Khi bạn hoàn tất, hãy lưu file .

Khởi động lại dịch vụ Redis để reload các thay đổi cấu hình của ta :

  • sudo systemctl restart redis-server.service

Bây giờ server chính đã được cấu hình, hãy dành một chút thời gian để kiểm tra nó.

Bước 4: Kiểm tra Redis Master

Kiểm tra đảm bảo rằng bạn có thể xác thực bằng password bạn đã đặt bằng cách khởi động ứng dụng Redis:

  • redis-cli

Trước tiên, hãy thử một lệnh mà không cần xác thực:

  • info replication

Bạn sẽ nhận được phản hồi sau:

Redis master output
NOAUTH Authentication required.

Điều này được mong đợi và cho biết server Redis của ta đang từ chối chính xác các yêu cầu chưa được xác thực.

Tiếp theo, sử dụng lệnh auth để xác thực:

  • auth your_redis_master_password

Bạn sẽ nhận được xác nhận thông tin đăng nhập của bạn đã được chấp nhận:

Redis master output
OK

Nếu bạn thử lại lệnh, lần này lệnh sẽ thành công:

  • info replication
Redis master output
# 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

Trong khi bạn được xác thực, hãy đặt khóa kiểm tra để ta có thể kiểm tra bản sao sau:

  • set test 'this key was defined on the master server'

Thoát trở lại vỏ hệ điều hành khi bạn hoàn tất:

  • exit

Bây giờ ta đã có server chính, hãy chuyển sang server của ta .

Bước 5: Cấu hình Redis Slave

Tiếp theo, ta cần thực hiện một số thay đổi để cho phép server slaver của ta kết nối với version chính của ta .

Mở /etc/redis/redis.conf trên server slaver :

  • sudo nano /etc/redis/redis.conf

Đầu tiên, tìm và bỏ comment slaveof . Lệnh này lấy địa chỉ IP và cổng mà bạn sử dụng để liên hệ an toàn với server Redis chính, được phân tách bằng dấu cách. Theo mặc định, server Redis lắng nghe trên 6379 trên giao diện local , nhưng mỗi phương pháp bảo mật mạng sẽ sửa đổi mặc định theo một số cách cho các bên bên ngoài.

Các giá trị bạn sử dụng sẽ phụ thuộc vào phương pháp bạn đã sử dụng để bảo mật lưu lượng mạng của bạn :

  • cô lập mạng: sử dụng cô lập địa chỉ IP mạng và cổng Redis (6379) của server tổng thể (ví dụ slaveof isolated_IP_address 6379 ).
  • stunnel hoặc spiped : sử dụng giao diện local (127.0.0.1) và cổng được cấu hình cho lưu lượng tunnel (đây sẽ là slaveof 127.0.0.1 8000 nếu bạn làm theo hướng dẫn).
  • PeerVPN : Sử dụng địa chỉ IP VPN của server chính và cổng Redis thông thường (đây sẽ là slaveof 10.8.0. 1 6379 nếu bạn làm theo hướng dẫn).

Hình thức chung là:

/etc/redis/redis.conf
slaveof ip_to_contact_master port_to_contact_master 

Tiếp theo, bỏ ghi chú và điền vào dòng masterauth với password được đặt cho server chính Redis:

/etc/redis/redis.conf
masterauth your_redis_master_password 

Đặt password cho server slaver của bạn để ngăn truy cập trái phép. Các cảnh báo tương tự về độ phức tạp của password cũng được áp dụng tại đây:

/etc/redis/redis.conf
requirepass your_redis_slave_password 

Lưu file khi bạn hoàn tất.

Bước 6: Kiểm tra Redis Slave và áp dụng các thay đổi

Trước khi ta khởi động lại dịch vụ để áp dụng các thay đổi của bạn , hãy kết nối với version Redis local trên máy phụ và xác minh khóa test được đặt:

  • redis-cli

Truy vấn khóa bằng lệnh :

  • get test

Bạn sẽ nhận được phản hồi sau:

Redis slave output
(nil)

Điều này cho biết version Redis local không có khóa được đặt tên là test . Thoát trở lại shell bằng lệnh :

  • exit

Khởi động lại dịch vụ Redis trên slaver để thực hiện những thay đổi này:

  • sudo systemctl restart redis-server.service

Điều này sẽ áp dụng tất cả các thay đổi mà ta đã thực hiện đối với file cấu hình slaver Redis.

Kết nối lại với version Redis local :

  • redis-cli

Giống như với server Redis, các hoạt động sẽ không thành công nếu không được phép:

  • get test
Redis slave output
(error) NOAUTH Authentication required.

Bây giờ, hãy xác thực bằng password của slaver Redis mà bạn đã đặt trong phần trước:

  • auth your_redis_slave_password
Redis slave output
OK

Nếu ta cố gắng truy cập vào khóa lần này, ta sẽ thấy rằng nó có sẵn:

  • get test
Redis slave output
"this key was defined on the master server"

Khi ta khởi động lại dịch vụ Redis của bạn trên slaver , quá trình sao chép bắt đầu ngay lập tức.

Bạn có thể xác minh điều này bằng lệnh info của Redis, lệnh này báo cáo thông tin về việc sao chép. Giá trị của master_hostmaster_port phải trùng với các đối số bạn đã sử dụng cho tùy chọn slaveof :

  • info replication
Redis slave output
# Replication role:slave master_host:10.8.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:5 master_sync_in_progress:0 slave_repl_offset:1387 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

Nếu bạn tình cờ xem cùng một thông tin trên server chính của Redis, bạn sẽ thấy thông tin như sau:

  • info replication
Redis master output
# Replication role:master connected_slaves:1 slave0:ip=10.8.0.2,port=6379,state=online,offset=1737,lag=1 master_repl_offset:1737 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:1736

Như bạn thấy , server chủ và server slaver xác định chính xác lẫn nhau trong mối quan hệ đã xác định của chúng.

Bước 7: Thăng cấp Redis Slave lên Master

Lý do chính để cài đặt sao chép là để xử lý các lỗi với việc mất dữ liệu và thời gian ngừng hoạt động tối thiểu. Các slaver của Redis có thể được thăng cấp lên trạng thái chính để xử lý lưu lượng ghi trong trường hợp lỗi chính của Redis.

Quảng cáo Redis Slave theo cách thủ công

Ta có thể thực hiện việc này theo cách thủ công từ server slaver Redis. Đăng nhập bằng ứng dụng Redis:

  • redis-cli

Xác thực bằng password slaver Redis:

  • auth your_redis_slave_password

Trước khi quảng cáo slaver Redis, hãy thử overrides khóa kiểm tra:

  • set test 'this key was overwritten on the slave server'

Điều này sẽ không thành công vì theo mặc định, các slaver Redis được cấu hình ở chế độ chỉ slave-read-only yes tùy chọn slave-read-only yes :

Redis slave output
(error) READONLY You can't write against a read only slave.

Để vô hiệu hóa sao chép và đẩy server hiện tại lên trạng thái chính, hãy sử dụng lệnh slaveof với giá trị no one :

  • slaveof no one
Redis slave output
OK

Kiểm tra lại thông tin sao chép:

  • info replication
Redis slave output
# Replication role:master connected_slaves:0 master_repl_offset:6749 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0

Như bạn thấy , slaver bây giờ được chỉ định là một chủ nhân của Redis.

Hãy thử overrides lại khóa và lần này nó sẽ thành công:

  • set test 'this key was overwritten on the slave server'
Redis slave output
OK

Lưu ý vì file cấu hình vẫn chỉ định nút này làm slaver Redis, nếu dịch vụ được khởi động lại mà không sửa đổi cấu hình, nó sẽ tiếp tục sao chép. Cũng lưu ý cài đặt nào bạn đã sử dụng cho Redis master có thể cần được áp dụng lại tại đây (ví dụ: bật file chỉ bổ sung hoặc sửa đổi policy trục xuất).

Nếu có bất kỳ slaver nào khác, hãy trỏ họ đến chủ nhân mới được thăng cấp để tiếp tục sao chép các thay đổi. Điều này có thể được thực hiện bằng cách sử dụng lệnh slaveof và thông tin kết nối của chủ mới.

Để tiếp tục sao chép thủ công tới bản root ban đầu, hãy trỏ bản root tạm thời và các slaver trở lại bản root ban đầu bằng cách sử dụng lệnh slaveof với các giá trị được sử dụng trong file cấu hình:

  • slaveof ip_to_contact_master port_to_contact_master
Redis slave output
OK

Nếu bạn kiểm tra lại khóa trên slaver , bạn sẽ thấy rằng giá trị ban đầu đã được khôi phục bởi Redis master:

  • get test
Redis slave output
"this key was defined on the master server"

Vì lý do nhất quán, tất cả dữ liệu trên server sẽ bị xóa khi nó được đồng bộ hóa lại với server chính.

Tự động quảng cáo Redis Slave

Tự động thúc đẩy Redis slave yêu cầu phối hợp với lớp ứng dụng. Điều này nghĩa là việc triển khai phụ thuộc nhiều vào môi trường ứng dụng nên rất khó để đề xuất các hành động cụ thể.

Tuy nhiên, ta có thể xem qua các bước chung cần thiết để thực hiện chuyển đổi dự phòng tự động. Các bước dưới đây giả định tất cả các server Redis đã được cấu hình để truy cập lẫn nhau:

  • Từ ứng dụng, phát hiện rằng server chính không còn khả dụng.
  • Trên một slaver , thực hiện lệnh của slaver slaveof no one . Điều này sẽ ngừng sao chép và thúc đẩy nó lên trạng thái chính.
  • Điều chỉnh cài đặt nào trên trang cái mới để căn chỉnh với cài đặt chính trước đó. Điều này có thể được thực hiện trước trong file cấu hình cho hầu hết các tùy chọn.
  • Hướng lưu lượng truy cập từ ứng dụng của bạn đến Redis master mới được thăng cấp.
  • Trên mọi slaver còn lại, hãy chạy slaveof new_master_ip new_master_port . Điều này sẽ làm cho các slaver ngừng sao chép từ bản chính cũ, loại bỏ hoàn toàn dữ liệu (hiện không dùng nữa) của chúng và bắt đầu sao chép từ bản chính mới.

Sau khi bạn đã khôi phục dịch vụ về server chính ban đầu, bạn có thể cho phép nó tham gia lại với quyền slaver trỏ đến server mới được thăng cấp hoặc cho phép nó tiếp tục nhiệm vụ như server nếu được yêu cầu.

Kết luận

Ta đã cài đặt một môi trường bao gồm hai server , một server đóng role là server Redis và server còn lại sao chép dữ liệu như một server . Điều này cung cấp khả năng dự phòng trong trường hợp hệ thống hoặc mạng bị lỗi và có thể giúp phân phối các hoạt động đọc giữa nhiều server vì lý do hiệu suất. Đây là điểm khởi đầu tốt để thiết kế cấu hình Redis phù hợp với nhu cầu cơ sở hạ tầng và ứng dụng production của bạn, nhưng không phải là hướng dẫn đầy đủ về chủ đề này. Để tìm hiểu thêm về cách sử dụng Redis cho nhu cầu ứng dụng của bạn, hãy xem các hướng dẫn Redis khác của ta .


Tags:

Các tin liên quan

Cách mã hóa lưu lượng truy cập vào Redis với Spiped trên Ubuntu 16.04
2016-11-09
Cách mã hóa lưu lượng truy cập vào Redis với Stunnel trên Ubuntu 16.04
2016-11-08
Cách mã hóa lưu lượng truy cập vào Redis với PeerVPN trên Ubuntu 16.04
2016-11-08
Cách cài đặt và cấu hình Redis trên Ubuntu 16.04
2016-05-11
Cách di chuyển dữ liệu Redis với Master-Slave Replication trên Ubuntu 14.04
2016-05-05
Cách tìm log Redis trên Ubuntu
2016-03-01
Cách bảo mật cài đặt Redis của bạn trên Ubuntu 14.04
2015-09-25
Cách backup và khôi phục dữ liệu Redis của bạn trên Ubuntu 14.04
2015-09-14
Cách thiết lập server Redis làm Trình xử lý phiên cho PHP trên Ubuntu 14.04
2015-08-21
Cách cấu hình một cụm Redis trên CentOS 7
2015-07-30