Trong bài viết này, tôi sẽ chỉ cho bạn cách cấu hình cụm cơ sở dữ liệu MySQL với ba nút trong bản sao đa chủ. Bản sao đa chủ cho phép ghi các bản ghi trong mỗi nút, vì vậy nếu một nút bị lỗi, chúng ta có thể làm việc trên nút còn lại như thể không có gì xảy ra.
Bạn có thể tìm thấy tài liệu chính thức của Percona trên trang web chính thứchttps://www.percona.com/https://www.percona.com/?utm_source=diendancongnghe.com
Trước hết, tại sao chúng ta chọn ba nút chứ không chỉ hai nút? Trong bất kỳ cụm nào, số lượng nút phải là số lẻ, vì vậy trong trường hợp ngắt kết nối cực dương, chúng ta cho rằng nhóm máy chủ cao nhất có dữ liệu mới và phải được sao chép sang nút bị ngắt để tránh mất dữ liệu. Điều này chỉ liên quan đến việc giải quyết xung đột trong quá trình sao chép dữ liệu, chúng ta sẽ không mất dữ liệu chỉ được ghi vào nút bị ngắt kết nối.
Điều này được sử dụng để tránh một trường hợp được gọi là split brain, trong đó chúng ta không thể tự động chọn nút nào có dữ liệu chính xác. Hãy nghĩ ví dụ về cụm 2 nút trong đó cả hai nút đều bị ngắt kết nối với nhau và cùng một bản ghi được ghi vào cả hai nút: nút nào thắng khi chúng trực tuyến trở lại? Chúng ta không biết, vì vậy split brain xảy ra và chúng ta phải tự quyết định bản ghi nào là đúng.
Số lượng nút cần thiết để xác định phần nào của cụm có dữ liệu đúng được gọi là QUORUM, trong trường hợp của chúng ta, số lượng sẽ là 2. Vì vậy, chúng ta cần 2 máy chủ luôn được kết nối với nhau. Trong trường hợp cả ba nút đều ngừng hoạt động, chúng ta có bộ não asplit và chúng ta phải quyết định máy chủ nào sẽ chuyển sang chế độ khởi động theo cách thủ công, đây là quy trình để xác định máy chủ nào sẽ là máy chủ chính để tiếp tục từ bộ não split.
Rõ ràng là, hãy nhập mật khẩu mysql mà bạn muốn chọn.
Sau khi các gói đã được cài đặt, mysqld sẽ tự động khởi động. Dừng mysqld trên cả ba nút bằng cách sử dụng /etc/init.d/mysql stop.
Lưu ý
Tài khoản root MySQL cũng có thể được sử dụng để thực hiện SST, nhưng sẽ an toàn hơn nếu sử dụng một người dùng khác (không phải root) cho việc này.
Bước 3. Cấu hình nút thứ hai
Trong ví dụ này, mọi thứ diễn ra tốt đẹp và bạn có thể thấy Chuyển trạng thái đang diễn ra, nghĩa là dữ liệu sẽ được chuyển đến nút.
Bạn có thể tìm thấy tài liệu chính thức của Percona trên trang web chính thứchttps://www.percona.com/https://www.percona.com/?utm_source=diendancongnghe.com
Trước hết, tại sao chúng ta chọn ba nút chứ không chỉ hai nút? Trong bất kỳ cụm nào, số lượng nút phải là số lẻ, vì vậy trong trường hợp ngắt kết nối cực dương, chúng ta cho rằng nhóm máy chủ cao nhất có dữ liệu mới và phải được sao chép sang nút bị ngắt để tránh mất dữ liệu. Điều này chỉ liên quan đến việc giải quyết xung đột trong quá trình sao chép dữ liệu, chúng ta sẽ không mất dữ liệu chỉ được ghi vào nút bị ngắt kết nối.
Điều này được sử dụng để tránh một trường hợp được gọi là split brain, trong đó chúng ta không thể tự động chọn nút nào có dữ liệu chính xác. Hãy nghĩ ví dụ về cụm 2 nút trong đó cả hai nút đều bị ngắt kết nối với nhau và cùng một bản ghi được ghi vào cả hai nút: nút nào thắng khi chúng trực tuyến trở lại? Chúng ta không biết, vì vậy split brain xảy ra và chúng ta phải tự quyết định bản ghi nào là đúng.
Số lượng nút cần thiết để xác định phần nào của cụm có dữ liệu đúng được gọi là QUORUM, trong trường hợp của chúng ta, số lượng sẽ là 2. Vì vậy, chúng ta cần 2 máy chủ luôn được kết nối với nhau. Trong trường hợp cả ba nút đều ngừng hoạt động, chúng ta có bộ não asplit và chúng ta phải quyết định máy chủ nào sẽ chuyển sang chế độ khởi động theo cách thủ công, đây là quy trình để xác định máy chủ nào sẽ là máy chủ chính để tiếp tục từ bộ não split.
Cấu hình Percona XtraDB Cluster trên Debian 8
Hướng dẫn này mô tả cách cài đặt và cấu hình ba nút Percona XtraDB Cluster trên máy chủ Debian 8, chúng ta sẽ sử dụng các gói từ kho lưu trữ Percona.- máy chủ 1
Tên máy chủ: mysql1.local.vm - Địa chỉ IP: 192.168.152.100
- Tên máy chủ: mysql2.local.vm
- Địa chỉ IP: 192.168.152.110
- Tên máy chủ: mysql3.local.vm
- Địa chỉ IP: 192.168.152.120
Mã:
127.0.0.1 localhost
192.168.152.100 mysql1.local.vm mysql1
192.168.152.110 mysql2.local.vm mysql2
192.168.152.120 mysql3.local.vm mysql3
# Các dòng sau đây là mong muốn đối với các máy chủ có khả năng IPv6
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Điều kiện tiên quyết
Quy trình được mô tả trong hướng dẫn này yêu cầu thiết lập máy chủ tối thiểu sau:- Cả ba nút đều có Debian 8, tôi khuyên bạn nên làm theo hướng dẫn nàyhttps://www.howtoforge.com/tutorial/debian-8-jessie-minimal-server/
Bước 1. Cài đặt Percona Xtradb Cluster
Trên tất cả các nút, hãy thực hiện các lệnh sau với tư cách là root:
Mã:
wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
apt-get update
apt-get -y install percona-xtradb-cluster-57
Sau khi các gói đã được cài đặt, mysqld sẽ tự động khởi động. Dừng mysqld trên cả ba nút bằng cách sử dụng /etc/init.d/mysql stop.
Bước 2. Cấu hình nút đầu tiên
Cần cấu hình từng nút riêng lẻ để có thể khởi động cụm. Để biết thêm thông tin về việc khởi động cụm, hãy xem Khởi động cụm.-
Đảm bảo thêm các dòng này vào tệp cấu hình /etc/mysql/my.cnf cho nút đầu tiên (mysql1.local.vm) ở cuối phần [mysqld]:
Mã:[mysqld] ...# Đường dẫn đến thư viện Galera wsrep_provider=/usr/lib/libgalera_smm.so # URL kết nối cụm chứa IP của nút số 1, nút số 2 và nút số 3 wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120 # Để Galera hoạt động đúng định dạng binlog phải là ROW binlog_format=ROW # Công cụ lưu trữ MyISAM chỉ hỗ trợ thử nghiệm default_storage_engine=InnoDB # Chế độ khóa tự động tăng dần của InnoDB này là yêu cầu đối với Galera innodb_autoinc_lock_mode=2 # Địa chỉ nút #1 wsrep_node_address=192.168.152.100 # Phương pháp SST wsrep_sst_method=xtrabackup-v2 # Tên cụm wsrep_cluster_name=my_ubuntu_cluster # Xác thực cho phương pháp SST wsrep_sst_auth="sstuser:PASSW0RD"
-
Khởi động nút đầu tiên bằng lệnh sau:
Mã:root@mysql1:~# /etc/init.d/mysql bootstrap-pxc
Mã:root@mysql1:~# /etc/init.d/mysql bootstrap-pxc [ ok ] Khởi động máy chủ cơ sở dữ liệu cụm Percona XtraDB: mysqld .. root@mysql1:~#
-
Sau khi nút đầu tiên đã được khởi động, hãy kết nối với mysql bằng lệnh mysql -p cổ điển, sau đó có thể kiểm tra trạng thái cụm bằng cách thực thi lệnh queryshow status như 'wsrep%';như trong ví dụ bên dưới:
-
Mã:
mysql> hiển thị trạng thái thích 'wsrep%';+----------------------------+--------------------------------------+| Tên_biến | Giá trị |+----------------------------+--------------------------------------+| wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |...| wsrep_local_state | 4 || wsrep_local_state_comment | Đã đồng bộ |...| wsrep_cluster_size | 1 || wsrep_cluster_status | Chính || wsrep_connected | BẬT |...| wsrep_ready | BẬT | BẬT |+----------------------------+--------------------------------------+59 hàng trong tập hợp (0,00 giây)
Để thực hiện Chuyển ảnh chụp nhanh trạng thái bằng XtraBackup, thiết lập người dùng mới với quyền phù hợp:Đầu ra này cho thấy cụm đã được khởi động thành công.
Mã:
mysql> TẠO NGƯỜI DÙNG 'sstuser'@'localhost' ĐÃ XÁC ĐỊNH BỞI 'MẬT KHẨU';mysql> CẤP QUY TRÌNH, TẢI LẠI, KHÓA BẢNG, SAO CHÉP CLIENT ON *.* ĐẾN 'sstuser'@'localhost';mysql> FLUSH CÁC QUYỀN;
Tài khoản root MySQL cũng có thể được sử dụng để thực hiện SST, nhưng sẽ an toàn hơn nếu sử dụng một người dùng khác (không phải root) cho việc này.
Bước 3. Cấu hình nút thứ hai
-
Thêm các dòng sau vào tệp cấu hình /etc/mysql/my.cnf trên nút thứ hai (mysql2.local.vm), để nó chứa dữ liệu sau:
Mã:
[mysqld]
...# Đường dẫn đến thư viện Galera
wsrep_provider=/usr/lib/libgalera_smm.so
# URL kết nối cụm chứa IP của nút#1, nút#2 và nút#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# Để Galera hoạt động chính xác, định dạng binlog phải là ROW
binlog_format=ROW
# Công cụ lưu trữ MyISAM chỉ hỗ trợ thử nghiệm
default_storage_engine=InnoDB
# Chế độ khóa tự động tăng dần của InnoDB này là yêu cầu đối với Galera
innodb_autoinc_lock_mode=2
# Địa chỉ nút #2
wsrep_node_address=192.168.152.110
# Phương pháp SST
wsrep_sst_method=xtrabackup-v2
# Tên cụm
wsrep_cluster_name=my_ubuntu_cluster
# Xác thực cho phương pháp SST
wsrep_sst_auth="sstuser:PASSW0RD"
-
Khởi động nút thứ hai bằng lệnh sau (lưu ý lần này vì bạn có thể thấy là không có trong boostrap mode!!):
Mã:
root@mysql2:~# /etc/init.d/mysql start
-
Sau khi máy chủ được khởi động, nó sẽ tự động nhận được SST. Trạng thái cụm hiện có thể được kiểm tra trên cả hai nút. Sau đây là một ví dụ về trạng thái từ nút thứ hai (mysql2.local.vm):
-
Mã:
mysql> show status like 'wsrep%';+----------------------------+--------------------------------------+| Variable_name | Giá trị |+----------------------------+--------------------------------------+| wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |...| wsrep_local_state | 4 || wsrep_local_state_comment | Đã đồng bộ |...| [I][B]wsrep_cluster_size | 2[/b][/I] || wsrep_cluster_status | Chính || wsrep_connected | BẬT |...| wsrep_ready | BẬT | BẬT |+----------------------------+--------------------------------------+40 hàng trong set (0.01 sec)
Đầu ra này cho thấy nút mới đã được thêm thành công vào cụm. Lưu ý biến wsrep_cluster_size đã trở thành 2, thay vì một trong những truy vấn đầu tiên chúng ta đã thực hiện.
Bước 4. Cấu hình nút thứ ba
Thêm các dòng sau vào tệp cấu hình /etc/mysql/my.cnf trên nút thứ hai (mysql2.local.vm), để nó chứa dữ liệu sau:
Mã:
[mysqld]
...# Đường dẫn đến thư viện Galera
wsrep_provider=/usr/lib/libgalera_smm.so
# URL kết nối cụm chứa IP của nút#1, nút#2 và nút#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# Để Galera hoạt động chính xác, định dạng binlog phải là ROW
binlog_format=ROW
# Công cụ lưu trữ MyISAM chỉ hỗ trợ thử nghiệm
default_storage_engine=InnoDB
# Chế độ khóa tự động tăng dần của InnoDB này là yêu cầu đối với Galera
innodb_autoinc_lock_mode=2
# Địa chỉ nút #2
wsrep_node_address=192.168.152.110
# Phương pháp SST
wsrep_sst_method=xtrabackup-v2
# Tên cụm
wsrep_cluster_name=my_ubuntu_cluster
# Xác thực cho phương pháp SST
wsrep_sst_auth="sstuser:PASSW0RD"
Khởi động nút thứ hai bằng lệnh sau (lưu ý lần này vì bạn có thể thấy là không có trong boostrap mode!!):
Mã:
root@mysql2:~# /etc/init.d/mysql start
Sau khi máy chủ được khởi động, nó sẽ tự động nhận được SST. Trạng thái cụm hiện có thể được kiểm tra trên cả hai nút. Sau đây là một ví dụ về trạng thái từ nút thứ hai (mysql2.local.vm):
Mã:
mysql> show status like 'wsrep%';+----------------------------+--------------------------------------+| Variable_name | Giá trị |+----------------------------+--------------------------------------+| wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |...| wsrep_local_state | 4 || wsrep_local_state_comment | Đã đồng bộ |...| [I][B]wsrep_cluster_size | 2[/b][/I] || wsrep_cluster_status | Chính || wsrep_connected | BẬT |...| wsrep_ready | BẬT | BẬT |+----------------------------+--------------------------------------+40 hàng trong set (0.01 sec)
-
Thêm các dòng sau vào tệp cấu hình /etc/mysql/my.cnf trên nút thứ hai (mysql3.local.vm), để nó chứa cấu hình sau:
Mã:[mysqld] ...# Đường dẫn đến thư viện Galera wsrep_provider=/usr/lib/libgalera_smm.so # URL kết nối cụm chứa IP của nút#1, nút#2 và nút#3 wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120 # Để Galera hoạt động chính xác, định dạng binlog phải là ROW binlog_format=ROW # Công cụ lưu trữ MyISAM chỉ hỗ trợ thử nghiệm default_storage_engine=InnoDB # Chế độ khóa tự động tăng dần của InnoDB này là yêu cầu đối với Galera innodb_autoinc_lock_mode=2 # Địa chỉ nút #2 wsrep_node_address=192.168.152.120 # Phương pháp SST wsrep_sst_method=xtrabackup-v2 # Tên cụm wsrep_cluster_name=my_ubuntu_cluster # Xác thực cho phương pháp SST wsrep_sst_auth="sstuser:PASSW0RD"
-
Khởi động nút thứ ba bằng lệnh sau:
Mã:root@mysql3:~# /etc/init.d/mysql start
-
Sau khi máy chủ được khởi động, nó sẽ tự động nhận được SST. Trạng thái cụm có thể được kiểm tra trên tất cả các nút. Sau đây là một ví dụ về trạng thái từ nút thứ ba (mysql3.local.vm):
Mã:mysql> show status like 'wsrep%';+----------------------------+--------------------------------------+| Variable_name | Giá trị |+----------------------------+--------------------------------------+| wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |...| wsrep_local_state | 4 || wsrep_local_state_comment | Đã đồng bộ |...| [I][B]wsrep_cluster_size | 3[/b][/I] || wsrep_cluster_status | Chính || wsrep_connected | BẬT |...| wsrep_ready | BẬT | BẬT |+----------------------------+--------------------------------------+40 hàng trong set (0.01 sec)
Mã:
4 tháng 10 12:16:13 mysql3 mysql[2767]: Đang khởi động máy chủ cơ sở dữ liệu MySQL (Percona XtraDB Cluster): mysqld . . . Đang chuyển trạng thái, thiết lập chế độ ngủ cao hơn: mysqld . ..
4 tháng 10 12:16:13 mysql3 systemd[1]: Đã bắt đầu LSB: Khởi động và dừng daemon mysql (Percona XtraDB Cluster).
4 tháng 10 12:17:01 mysql3 CRON[3731]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Kiểm tra sao chép
Để kiểm tra sao chép, hãy tạo cơ sở dữ liệu mới trên nút thứ hai, tạo bảng cho cơ sở dữ liệu đó trên nút thứ ba và thêm một số bản ghi vào bảng trên nút đầu tiên.-
Tạo cơ sở dữ liệu mới trên nút thứ hai:
Mã:mysql@mysql2> CREATE DATABASE percona;Query OK, 1 row affected (0.01 sec)
-
Tạo bảng trên nút thứ ba nút:
Mã:mysql@mysql3> SỬ DỤNG percona;Cơ sở dữ liệu đã thay đổimysql@pxc3> TẠO BẢNG ví dụ (node_id INT CHÍNH KHÓA, tên_node VARCHAR(30));Truy vấn OK, 0 hàng bị ảnh hưởng (0.05 giây)
-
Chèn bản ghi vào nút đầu tiên:
Mã:mysql@mysql1> INSERT INTO percona.ví dụ GIÁ TRỊ (1, 'percona1');Truy vấn OK, 1 hàng bị ảnh hưởng (0.02 giây)
-
Lấy tất cả các hàng từ bảng đó trên nút thứ hai:
Mã:mysql@mysql2> CHỌN * TỪ percona.ví dụ;+---------+-----------+| node_id | node_name |+---------+-----------+| 1 | percona1 |+---------+-----------+1 hàng trong đặt (0.00 giây)