Bài đăng nổi bật

Redo log, undo log và binary log

Đây là ba loại log mà bạn đã từng nghe khi tiếp cận mysql. Trong các cơ sở dữ liệu quan hệ (RDBMS) khác, cũng sẽ có các thành phần có vai tr...

Thứ Bảy, 27 tháng 2, 2016

Q&A MySQL and Galera cluster

Các câu hỏi thường gặp trong mysql, galera cluster và các câu trả lời ngắn gọn.

1. Một user có full quyền sau khi được grant all on *.* hay không ?

Nếu chỉ grant all on *.* thì chưa. Vì user đó vẫn chưa có khả năng được trao những quyền mà user đó có cho một user khác cũng như tước những quyền này khỏi một user khác.

Tham khảo: https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_grant-option

2. Làm cách nào để ép một node buộc phải SST trong MariaDB galera cluster ?

Bạn chỉ cần xóa grastate.dat trên node, sau đó restart node đó.

3. Để thực hiện SST hay IST dùng xtrabackup-v2, các node trong galera cần đáp ứng các yêu cầu gì ?

Tất cả các node đều phải cài đặt percona-xtrabackup, socat
Các node đều phải khai báo cấu hình sau:
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=<user>:<pass>

<user> và <pass> là thông tin về account mà các node sẽ dùng để thực hiện đồng bộ data.

Trên tất cả các node, bạn cần đảm bảo có tài khoản:
grant all on *.* to <user>@'localhost' identified by <pass>
grant all on *.* to <user>@'<ip node1>' identified by <pass>
grant all on *.* to <user>@'<ip node2>' identified by <pass>
grant all on *.* to <user>@'<ip node3>' identified by <pass>

Thực tế, bạn chỉ cần tạo các user này trên node gốc (node mà bạn sẽ khởi động với --wsrep-new-cluster), thông tin sẽ có mặt trên các node còn lại qua quá trình đồng bộ.

4.  Trong MariaDB galera cluster, để ép một node SST từ một node được chỉ định thì làm như thế nào ?

Trong cấu hình của joiner, bạn sẽ xác định donor node cho joiner node này qua khai báo:
wsrep_sst_donor=<node name of donor node>

Khi SST, donor node sẽ có thể bị full bandwidth, tốt nhất nên gỡ bỏ donor node khỏi haproxy của cum galera trong thời gian này.

5. Alter table trong galera cluster có được cho phép không ?

Câu trả lời là Được nhưng cần thận trọng. Mặc định galera cluster sử dụng TOI  để đảm bảo các alter được đồng bộ trên toàn bộ cluster nhưng cách thức alter vẫn theo kiểu cũ nghĩa là, đóng băng table được alter, tạo một table tạm có cấu trúc mới, di chuyển data từ table cũ sang table tạm, sau khi hoàn tất thì xóa table cũ, rename table tạm thành tên table cũ nhưng khi đó đã có cấu trúc mới. Với cách làm này, nếu table quá lớn, quá trình alter sẽ lâu, kéo theo thời gian đóng băng table cũng lâu.

Một điểm nữa, alter là một DDL statement, nó là non-transactional statement, alter table sẽ được replicate từ orignial node đến các node còn lại theo dạng statement chứ không phải transaction. Vì non-transactional nên nếu có sự cố, bạn không thể rollback được.

Để có thể khắc phục hạn chế của alter table trong galera, bạn có thể dùng pt-online-schema-change cho phép alter table online. Write request sẽ tiếp tục đổ vào table được sửa sau đó qua một trigger sẽ được copy sang table tạm.

Tham khảo: http://severalnines.com/blog/online-schema-upgrade-mysql-galera-cluster-using-toi-method

6. Thay đổi data trong myisam table không được đồng bộ trong galera cluster ?

Đúng vì galera cluster chỉ hỗ trợ innodb do đó nếu bạn sửa data của system table mysql.* thì sửa đổi đó sẽ không đươc replicate nhưng các DDL statement như create, drop, revoke, grant trên mysql.* lại được replicate.

7. Kiểm tra user database có chứa myisam table không bằng cách nào ?

select table_schema, table_name, engine from information_schema.tables where engine != 'InnoDB' and table_schema not in ('mysql', 'performance_schema', 'information_schema');

8. Thay đổi engine table từ myisam sang innodb ?

alter table <table_name> engine=innodb;

9. Lấy tổng dung lượng các database đang có ?

select table_schema "DB Name", Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" from information_schema.tables group by table_schema;

10. Tạo lại system db trong mysql ?

Dùng mysql_install_db. Nhưng chỉ dùng khi database có lỗi về system table trong giai đoạn deploy

11. Reset passwd root trong mysql ?

service mysql stop
mysqld_safe --skip-grant-tables &
mysql> update mysql.user set password=password('<newpass>') where user='root';
mysql> flush privileges;

12. Số lượng running thread trên mysql hiện đang là bao nhiêu ?

mysql> show global status like '%wsrep_thread_connect%'

13. read_only variables là bắt buộc với mysql slave ?

Đúng, đây cũng là biến hay bị bỏ quên khi cấu hình mysql replication. Mục đích của read_only là chỉ cho phép mysql slave nhận thay đổi từ master, và loại bỏ mọi thay đổi từ các user mà không có quyền super. Nhưng biến read_only là dynamic nghĩa là bạn có thể thay đổi nó mà không cần restart service. Ngay cả khi read_only được enable thì một số thao tác như:

- cập nhật từ master
- analyze table hay optimize table
- thao tác trên temporary table
- insert vào log table như mysql.general_log hay mysql.slow_log

vẫn được thực hiện

Không có nhận xét nào:

Đăng nhận xét