Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tự động hóa quá trình di chuyển từ MySQL độc lập sang Galera Cluster bằng Ansible

Di chuyển cơ sở dữ liệu không mở rộng quy mô tốt. Thông thường, bạn cần thực hiện rất nhiều thử nghiệm trước khi có thể kích hoạt và chuyển từ cũ sang mới. Việc di chuyển thường được thực hiện thủ công, vì hầu hết quá trình này không tự động hóa. Nhưng điều đó không có nghĩa là không có chỗ cho tự động hóa trong quá trình di chuyển. Hãy tưởng tượng việc thiết lập một số nút bằng phần mềm mới, cung cấp dữ liệu cho chúng và định cấu hình sao chép bằng tay giữa các môi trường cũ và mới. Điều này mất nhiều ngày. Tự động hóa có thể rất hữu ích khi thiết lập một môi trường mới và cung cấp dữ liệu cho nó. Trong bài đăng trên blog này, chúng ta sẽ xem xét quá trình di chuyển rất đơn giản - từ Percona Server 5.7 độc lập sang Percona XtraDB Cluster 5.7 3 nút. Chúng tôi sẽ sử dụng Ansible để thực hiện điều đó.

Mô tả Môi trường

Trước hết, một tuyên bố từ chối trách nhiệm quan trọng - những gì chúng tôi sẽ trình bày ở đây chỉ là bản nháp về những gì bạn có thể muốn chạy trong sản xuất. Nó hoạt động trên môi trường thử nghiệm của chúng tôi nhưng nó có thể yêu cầu sửa đổi để làm cho nó phù hợp với môi trường của bạn. Trong các thử nghiệm của mình, chúng tôi đã sử dụng bốn máy ảo Ubuntu 16.04 được triển khai bằng Vagrant. Một chứa Percona Server 5.7 độc lập, ba phần còn lại sẽ được sử dụng cho các nút Percona XtraDB Cluster. Chúng tôi cũng sử dụng một nút riêng biệt để chạy các sách phát không thể trả được, mặc dù đây không phải là một yêu cầu và sách phát cũng có thể được thực thi từ một trong các nút. Ngoài ra, kết nối SSH có sẵn giữa tất cả các nút. Bạn phải có kết nối từ máy chủ lưu trữ nơi bạn chạy ansible, nhưng khả năng ssh giữa các nút rất hữu ích (đặc biệt là giữa chính và nô lệ mới - chúng tôi dựa vào điều này trong playbook).

Cấu trúc Playbook

Các vở kịch Ansible thường chia sẻ cấu trúc chung - bạn tạo các vai trò, có thể được gán cho các máy chủ khác nhau. Mỗi vai trò sẽ chứa các tác vụ được thực thi trên đó, các mẫu sẽ được sử dụng, các tệp sẽ được tải lên, các biến được xác định cho sách chơi cụ thể này. Trong trường hợp của chúng tôi, playbook rất đơn giản.

.
├── inventory
├── playbook.yml
├── roles
│   ├── first_node
│   │   ├── my.cnf.j2
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       └── my.cnf.j2
│   ├── galera
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       └── my.cnf.j2
│   ├── master
│   │   └── tasks
│   │       └── main.yml
│   └── slave
│       └── tasks
│           └── main.yml
└── vars
    └── default.yml

Chúng tôi đã xác định một số vai trò - chúng tôi có một vai trò chính, nhằm thực hiện một số kiểm tra sự tỉnh táo trên nút độc lập. Có nút phụ, sẽ được thực thi trên một trong các nút Galera để định cấu hình nó cho việc nhân bản và thiết lập bản sao không đồng bộ. Sau đó, chúng ta có một vai trò cho tất cả các nút Galera và một vai trò cho nút Galera đầu tiên để khởi động cụm từ nó. Đối với các vai trò của Galera, chúng tôi có một số mẫu mà chúng tôi sẽ sử dụng để tạo tệp my.cnf. Chúng tôi cũng sẽ sử dụng .my.cnf cục bộ để xác định tên người dùng và mật khẩu. Chúng tôi có một tệp chứa một số biến mà chúng tôi có thể muốn tùy chỉnh, giống như mật khẩu. Cuối cùng, chúng tôi có một tệp hàng tồn kho, xác định các máy chủ lưu trữ mà chúng tôi sẽ chạy playbook, chúng tôi cũng có tệp playbook với thông tin về cách mọi thứ nên được thực thi chính xác. Hãy cùng xem xét từng bit.

Tệp Kiểm kê

Đây là một tệp rất đơn giản.

[galera]
10.0.0.142
10.0.0.143
10.0.0.144

[first_node]
10.0.0.142

[master]
10.0.0.141

Chúng tôi có ba nhóm, ‘galera’, chứa tất cả các nút Galera, ‘first_node’, mà chúng tôi sẽ sử dụng cho bootstrap và cuối cùng là ‘master’, chứa nút Máy chủ Percona độc lập của chúng tôi.

Playbook.yml

Tệp playbook.yml chứa các nguyên tắc chung về cách thực thi playbook.

-   hosts: master
    gather_facts: yes
    become: true
    pre_tasks:
    -   name: Install Python2
        raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
    vars_files:
        -   vars/default.yml
    roles:
    -   { role: master }

Như bạn có thể thấy, chúng tôi bắt đầu với nút độc lập và chúng tôi áp dụng các tác vụ liên quan đến vai trò 'chủ' (chúng tôi sẽ thảo luận chi tiết hơn về vấn đề này trong bài đăng này).

-   hosts: first_node
    gather_facts: yes
    become: true
    pre_tasks:
    -   name: Install Python2
        raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
    vars_files:
        -   vars/default.yml
    roles:
    -   { role: first_node }
    -   { role: slave }

Thứ hai, chúng tôi đi đến nút được xác định trong nhóm ‘first_node’ và chúng tôi áp dụng hai vai trò:‘first_node’ và ‘slave’. Cái trước nhằm mục đích triển khai một cụm PXC nút duy nhất, cái sau sẽ định cấu hình nó hoạt động như một nô lệ và thiết lập bản sao.

-   hosts: galera
    gather_facts: yes
    become: true
    pre_tasks:
    -   name: Install Python2
        raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
    vars_files:
        -   vars/default.yml
    roles:
    -   { role: galera }

Cuối cùng, chúng tôi đi qua tất cả các nút Galera và áp dụng vai trò 'galera' cho tất cả chúng.

Somenines DevOps Guide to Management DatabaseTìm hiểu về những điều bạn cần biết để tự động hóa và quản lý cơ sở dữ liệu nguồn mở của mìnhTải xuống miễn phí

Các biến

Trước khi bắt đầu xem xét các vai trò, chúng tôi muốn đề cập đến các biến mặc định mà chúng tôi đã xác định cho playbook này.

sst_user: "sstuser"
sst_password: "pa55w0rd"
root_password: "pass"
repl_user: "repl_user"
repl_password: "repl1cati0n"

Như chúng tôi đã nói, đây là một playbook rất đơn giản không có nhiều tùy chọn để tùy chỉnh. Bạn có thể cấu hình người dùng và mật khẩu và về cơ bản đây là nó. Một gotcha - vui lòng đảm bảo rằng mật khẩu gốc của nút độc lập khớp với ‘root_password’ ở đây, nếu không playbook sẽ không thể kết nối ở đó (có thể mở rộng playbook để xử lý nhưng chúng tôi đã không đề cập đến điều đó).

Tệp này không có nhiều giá trị nhưng theo nguyên tắc chung, bạn muốn mã hóa bất kỳ tệp nào có chứa thông tin đăng nhập. Rõ ràng, điều này là vì lý do bảo mật. Ansible đi kèm với ansible-vault, có thể được sử dụng để mã hóa và giải mã các tệp. Chúng tôi sẽ không đề cập chi tiết ở đây, tất cả những gì bạn cần biết đều có trong tài liệu. Tóm lại, bạn có thể dễ dàng mã hóa tệp bằng mật khẩu và định cấu hình môi trường của mình để sách vở có thể được giải mã tự động bằng mật khẩu từ tệp hoặc chuyển bằng tay.

Vai trò

Trong phần này, chúng ta sẽ xem xét các vai trò được xác định trong playbook, tóm tắt những gì chúng dự định thực hiện.

Vai trò chính

Như chúng tôi đã nêu, vai trò này nhằm chạy kiểm tra sự tỉnh táo về cấu hình của MySQL độc lập. Nó sẽ cài đặt các gói bắt buộc như percona-xtrabackup-24. Nó cũng tạo ra người dùng nhân rộng trên nút chính. Một cấu hình được xem xét để đảm bảo rằng server_id và các cài đặt liên quan đến bản ghi nhị phân và sao chép khác được đặt. GTID cũng được kích hoạt vì chúng tôi sẽ dựa vào nó để nhân rộng.

Vai trò First_node

Tại đây, nút Galera đầu tiên đã được cài đặt. Kho lưu trữ Percona sẽ được cấu hình, my.cnf sẽ được tạo từ mẫu. PXC sẽ được cài đặt. Chúng tôi cũng chạy một số hoạt động dọn dẹp để xóa những người dùng không cần thiết và để tạo những người dùng đó, sẽ được yêu cầu (người dùng root với mật khẩu do chúng tôi chọn, người dùng bắt buộc đối với SST). Cuối cùng, cụm được khởi động bằng cách sử dụng nút này. Chúng tôi dựa vào ‘wsrep_cluster_address’ trống như một cách để khởi tạo cụm. Đây là lý do tại sao sau này chúng ta vẫn thực thi vai trò ‘galera’ trên nút đầu tiên - để hoán đổi my.cnf ban đầu với nút cuối cùng, chứa ‘wsrep_cluster_address’ với tất cả các thành viên của cụm. Một điều đáng nhớ - khi bạn tạo người dùng root với mật khẩu, bạn phải cẩn thận để không bị khóa khỏi MySQL để Ansible có thể thực thi các bước khác của playbook. Một cách để làm điều đó là cung cấp cho .my.cnf người dùng và mật khẩu chính xác. Một điều khác cần nhớ là luôn đặt đúng login_user và login_password trong mô-đun ‘mysql_user’.

Vai trò nô lệ

Vai trò này là tất cả về cấu hình sao chép giữa nút độc lập và cụm PXC nút đơn. Chúng tôi sử dụng xtrabackup để lấy dữ liệu, chúng tôi cũng kiểm tra gtid đã thực thi trong xtrabackup_binlog_info để đảm bảo sao lưu sẽ được khôi phục đúng cách và có thể định cấu hình bản sao. Chúng tôi cũng thực hiện một chút cấu hình, đảm bảo rằng nút phụ có thể sử dụng bản sao GTID. Có một số vấn đề cần giải quyết ở đây - không thể chạy ‘RESET MASTER’ bằng mô-đun ‘mysql_replication’ kể từ Ansible 2.7.10, bạn có thể thực hiện điều đó trong 2.8, bất cứ khi nào nó xuất hiện. Chúng tôi đã phải sử dụng mô-đun ‘shell’ để chạy các lệnh MySQL CLI. Khi xây dựng lại nút Galera từ nguồn bên ngoài, bạn phải nhớ tạo lại mọi người dùng được yêu cầu (ít nhất là người dùng được sử dụng cho SST). Nếu không, các nút còn lại sẽ không thể tham gia vào cụm.

Vai trò của Galera

Cuối cùng, đây là vai trò mà chúng ta cài đặt PXC trên hai nút còn lại. Chúng tôi chạy nó trên tất cả các nút, nút ban đầu sẽ nhận được my.cnf “production” thay vì phiên bản “bootstrap” của nó. Hai nút còn lại sẽ được cài đặt PXC và chúng sẽ nhận được SST từ nút đầu tiên trong cụm.

Tóm tắt

Như bạn có thể thấy, bạn có thể dễ dàng tạo một playbook Ansible đơn giản, có thể tái sử dụng, có thể được sử dụng để triển khai Percona XtraDB Cluster và định cấu hình nó trở thành nô lệ của nút MySQL độc lập. Thành thật mà nói, đối với việc di chuyển một máy chủ duy nhất, điều này có thể không có ích lợi gì vì thực hiện cùng một cách thủ công sẽ nhanh hơn. Tuy nhiên, nếu bạn mong đợi bạn sẽ phải thực hiện lại quá trình này một vài lần, thì việc tự động hóa nó và làm cho nó hiệu quả hơn sẽ rất hợp lý. Như chúng tôi đã nói ở phần đầu, đây hoàn toàn không phải là sách chơi sẵn sàng cho sản xuất. Nó giống như một bằng chứng về khái niệm, một cái gì đó bạn có thể mở rộng để làm cho nó phù hợp với môi trường của bạn. Bạn có thể tìm thấy kho lưu trữ với playbook tại đây:http://severalnines.com/sites/default/files/ansible.tar.gz

Chúng tôi hy vọng bạn thấy bài đăng trên blog này thú vị và có giá trị, đừng ngần ngại chia sẻ suy nghĩ của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để CHỌN các hàng có MAX (Giá trị cột), PHẦN CỦA một cột khác trong MYSQL?

  2. Làm thế nào để Kiểm tra xem Nút Radio được Kiểm tra hoặc Chọn trong jQuery?

  3. PDO MySQL:Sử dụng PDO ::ATTR_EMULATE_PREPARES hay không?

  4. Khắc phục sự cố sao chép MySQL:Phần thứ hai

  5. Sử dụng Cơ sở dữ liệu quan hệ MySQL trên Ubuntu 10.04 LTS (Lucid)