Поиск по сайту:

Как установить Percona XtraDB Cluster для MySQL на Debian 8


На этой странице

  1. Настройка кластера Percona XtraDB в Debian 8
  2. Предпосылки
  3. Шаг 1. Установка Percona Xtradb Cluster
  4. Шаг 2. Настройка первого узла
  5. Шаг 3. Настройка второго узла
  6. Шаг 4. Настройка третьего узла
  7. Тестирование репликации

В этой статье я покажу вам, как настроить кластер базы данных MySQL с тремя узлами в репликации с несколькими мастерами. Репликация с несколькими мастерами позволяет записывать записи на каждом узле, поэтому, если один узел выйдет из строя, мы можем работать на другом, как будто ничего не произошло.

Официальную документацию Percona можно найти на официальном сайте.

Прежде всего, почему мы выбираем три узла, а не только два? В любом кластере количество узлов должно быть нечетным, поэтому в случае отключения узла мы предполагаем, что самая высокая группа серверов имеет свежие данные и должна быть реплицирована на нижний узел, чтобы избежать потери данных. Это касается только разрешения конфликтов при репликации данных, мы не потеряем данные, записанные только на отключенный узел.

Это используется, чтобы избежать ситуации, называемой split brain, когда мы не можем автоматически выбирать, какой узел имеет правильные данные. Подумайте, например, о кластере из 2 узлов, где оба узла отключены друг от друга, и одна и та же запись записывается на оба узла: кто выигрывает, когда они снова подключаются к сети? Мы не знаем, поэтому происходит разделение мозга, и нам приходится вручную решать, какая запись правильная.

Количество узлов, необходимое для определения того, какая часть кластера имеет правильные данные, называется КВОРУМ, в нашем случае кворум будет равен 2. Таким образом, нам нужно, чтобы 2 сервера всегда были подключены друг к другу. В случае, если все три узла выйдут из строя, у нас есть разделенный мозг, и мы должны вручную решить, какой сервер должен перейти в режим начальной загрузки, это процедура, чтобы определить, какой из серверов будет основным для возобновления работы из разделенного мозга.

Настройка кластера Percona XtraDB в Debian 8

В этом руководстве описывается, как установить и настроить три узла кластера Percona XtraDB на серверах Debian 8. Мы будем использовать пакеты из репозиториев Percona.

  • сервер 1
    • Имя хоста: mysql1.local.vm
    • IP-адрес: 192.168.152.100

    • Имя хоста: mysql2.local.vm
    • IP-адрес: 192.168.152.110

    • Имя хоста: mysql3.local.vm
    • IP-адрес: 192.168.152.120

    На каждом хосте измените файл /etc/hosts следующим образом, чтобы обеспечить правильную работу DNS.

    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

    # The following lines are desirable for IPv6 capable hosts
    ::1 localhost ip6-localhost ip6-loopback
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters

    Предпосылки

    Процедура, описанная в этом руководстве, требует следующей минимальной настройки сервера:

    • На всех трех узлах установлен Debian 8. Не рекомендуется следовать этому руководству https://linux-console.net/tutorial/debian-8-jessie-minimal-server/

    Шаг 1. Установка кластера Percona Xtradb

    На всех узлах выполните следующие команды от имени root:

    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

    Очевидно, введите пароль mysql, который вы хотите выбрать.

    После установки пакетов mysqld запустится автоматически. Остановите mysqld на всех трех узлах, используя /etc/init.d/mysql stop.

    Шаг 2. Настройка первого узла

    Отдельные узлы должны быть настроены так, чтобы иметь возможность запускать кластер. Дополнительные сведения о начальной загрузке кластера см. в разделе Загрузка кластера.

    1. Make sure to add these lines to configuration file /etc/mysql/my.cnf for the first node (mysql1.local.vm) at the end of [mysqld] section:

      [mysqld]

      ... # Path to Galera library
      wsrep_provider=/usr/lib/libgalera_smm.so

      # Cluster connection URL contains the IPs of node#1, node#2 and node#3
      wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120

      # In order for Galera to work correctly binlog format should be ROW
      binlog_format=ROW

      # MyISAM storage engine has only experimental support
      default_storage_engine=InnoDB

      # This InnoDB autoincrement locking mode is a requirement for Galera
      innodb_autoinc_lock_mode=2

      # Node #1 address
      wsrep_node_address=192.168.152.100

      # SST method
      wsrep_sst_method=xtrabackup-v2

      # Cluster name
      wsrep_cluster_name=my_ubuntu_cluster

      # Authentication for SST method
      wsrep_sst_auth="sstuser:PASSW0RD"

      Pay attention to the password you setup there in my case "PASSW0RD".

    2. Start the first node with the following command:

      :~# /etc/init.d/mysql bootstrap-pxc
      

      This command will start the first node and bootstrap the cluster, you will see something like this if all is ok:

      :~#
    3. After the first node has been started, connect to mysql with classic mysql -p command, then cluster status can be checked executing the query show status like 'wsrep%';as in the example below:

    4. mysql> show status like 'wsrep%';
      +----------------------------+--------------------------------------+
      | Variable_name              | Value                                |
      +----------------------------+--------------------------------------+
      | wsrep_local_state_uuid     | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |
      ...
      | wsrep_local_state          | 4                                    |
      | wsrep_local_state_comment  | Synced                               |
      ...
      | wsrep_cluster_size         | 1                                    |
      | wsrep_cluster_status       | Primary                              |
      | wsrep_connected            | ON                                   |
      ...
      | wsrep_ready                | ON                                   |
      +----------------------------+--------------------------------------+
      59 rows in set (0.00 sec)
      

    Эти выходные данные показывают, что кластер был успешно загружен.

    Для выполнения привилегий:

    mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'PASSW0RD';
    mysql> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
    mysql> FLUSH PRIVILEGES;
    

    Шаг 3. Настройка второго узла

    1. Append the following lines to the configuration file /etc/mysql/my.cnf on the second node (mysql2.local.vm), so that it contains the following data:

      [mysqld]

      ... # Path to Galera library
      wsrep_provider=/usr/lib/libgalera_smm.so

      # Cluster connection URL contains the IPs of node#1, node#2 and node#3
      wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120

      # In order for Galera to work correctly binlog format should be ROW
      binlog_format=ROW

      # MyISAM storage engine has only experimental support
      default_storage_engine=InnoDB

      # This InnoDB autoincrement locking mode is a requirement for Galera
      innodb_autoinc_lock_mode=2

      # Node #2 address
      wsrep_node_address=192.168.152.110

      # SST method
      wsrep_sst_method=xtrabackup-v2

      # Cluster name
      wsrep_cluster_name=my_ubuntu_cluster

      # Authentication for SST method
      wsrep_sst_auth="sstuser:PASSW0RD"
    2. Start the second node with the following command (attention this time as you can see is not in boostrap mode!!):

      :~# /etc/init.d/mysql start
      
    3. After the server has been started, it should receive SST automatically. Cluster status can now be checked on both nodes. The following is an example of the status from the second node (mysql2.local.vm):

    4. mysql> show status like 'wsrep%';
      +----------------------------+--------------------------------------+
      | Variable_name              | Value                                |
      +----------------------------+--------------------------------------+
      | wsrep_local_state_uuid     | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |
      ...
      | wsrep_local_state          | 4                                    |
      | wsrep_local_state_comment  | Synced                               |
      ...
      | wsrep_cluster_size         | 2                                    |
      | wsrep_cluster_status       | Primary                              |
      | wsrep_connected            | ON                                   |
      ...
      | wsrep_ready                | ON                                   |
      +----------------------------+--------------------------------------+
      40 rows in set (0.01 sec)
      

      This output shows that the new node has been successfully added to the cluster. Note the variable wsrep_cluster_size wich has become 2, instead of one of the first query we made.

    Шаг 4. Настройка третьего узла

    1. Append the following lines to the configuration file /etc/mysql/my.cnf on the second node (mysql3.local.vm), so it contains the following configuration:

      [mysqld]

      ... # Path to Galera library
      wsrep_provider=/usr/lib/libgalera_smm.so

      # Cluster connection URL contains the IPs of node#1, node#2 and node#3
      wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120

      # In order for Galera to work correctly binlog format should be ROW
      binlog_format=ROW

      # MyISAM storage engine has only experimental support
      default_storage_engine=InnoDB

      # This InnoDB autoincrement locking mode is a requirement for Galera
      innodb_autoinc_lock_mode=2

      # Node #2 address
      wsrep_node_address=192.168.152.120

      # SST method
      wsrep_sst_method=xtrabackup-v2

      # Cluster name
      wsrep_cluster_name=my_ubuntu_cluster

      # Authentication for SST method
      wsrep_sst_auth="sstuser:PASSW0RD"
    2. Start the third node with the following command:

      :~# /etc/init.d/mysql start
      
    3. After the server has been started, it should receive SST automatically. Cluster status can be checked on all nodes. The following is an example of status from the third node (mysql3.local.vm):

      mysql> show status like 'wsrep%';
      +----------------------------+--------------------------------------+
      | Variable_name              | Value                                |
      +----------------------------+--------------------------------------+
      | wsrep_local_state_uuid     | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |
      ...
      | wsrep_local_state          | 4                                    |
      | wsrep_local_state_comment  | Synced                               |
      ...
      | wsrep_cluster_size         | 3                                    |
      | wsrep_cluster_status       | Primary                              |
      | wsrep_connected            | ON                                   |
      ...
      | wsrep_ready                | ON                                   |
      +----------------------------+--------------------------------------+
      40 rows in set (0.01 sec)
      

      This output confirms that the third node has joined the cluster. Again take a look at wsrep_cluster_size wich now has become 3, instead of 2.

    Если вы столкнулись с некоторыми проблемами, загляните в /var/log/syslog, чтобы убедиться, что все в порядке.

    Oct 4 12:16:13 mysql3 mysql[2767]: Starting MySQL (Percona XtraDB Cluster) database server: mysqld . . .State transfer in progress, setting sleep higher: mysqld . ..
    Oct 4 12:16:13 mysql3 systemd[1]: Started LSB: Start and stop the mysql (Percona XtraDB Cluster) daemon.
    Oct 4 12:17:01 mysql3 CRON[3731]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)

    В этом примере все прошло хорошо, и вы можете видеть, что выполняется Передача состояния, что означает, что данные будут переданы на узел.

    Тестирование репликации

    Чтобы протестировать репликацию, давайте создадим новую базу данных на втором узле, создадим таблицу для этой базы данных на третьем узле и добавим несколько записей в таблицу на первом узле.

    1. Create a new database on the second node:

      mysql@mysql2> CREATE DATABASE percona;
      Query OK, 1 row affected (0.01 sec)
      
    2. Create a table on the third node:

      mysql@mysql3> USE percona;
      Database changed
      
      mysql@pxc3> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
      Query OK, 0 rows affected (0.05 sec)
      
    3. Insert records on the first node:

      mysql@mysql1> INSERT INTO percona.example VALUES (1, 'percona1');
      Query OK, 1 row affected (0.02 sec)
      
    4. Retrieve all the rows from that table on the second node:

      mysql@mysql2> SELECT * FROM percona.example;
      +---------+-----------+
      | node_id | node_name |
      +---------+-----------+
      |       1 | percona1  |
      +---------+-----------+
      1 row in set (0.00 sec)
      

    Чтобы ваше приложение всегда могло получить доступ к кластеру, вы можете добавить балансировщик нагрузки перед тремя узлами.