翻译&转载来源:https://www.howtoforge.com/tutorial/how-to-install-percona-xtradb-cluster-for-mysql/
在本文中,我将向您展示如何在多主复制中配置具有三个节点的MySQL数据库集群。多主复制允许在每个节点中写入记录,因此如果一个节点失败,我们可以在另一个节点上工作,好像什么也没发生。
Percona的官方文档可以在官方网站https://www.percona.com/上找到。
首先,为什么我们选择三个节点而不仅仅是两个节点?在任何集群中,节点数应该是奇数,因此在断开节点的情况下,我们假设最高服务器组具有新数据,并且应该复制到下行节点以避免数据丢失。这仅与解决数据复制中的冲突有关,我们不会将只写入断开的节点的数据丢失。
这用于避免称为裂脑的情况,其中我们无法自动选择哪个节点具有正确的数据。例如,考虑两个节点彼此断开连接的2节点集群,并将相同的记录写入两个节点:当他们重新联机时谁赢了?我们不知道,所以裂脑发生了,我们必须手动决定哪个记录是正确的。
确定集群中哪些部分具有正确数据所需的节点数称为QUORUM,在我们的示例中,仲裁将为2.因此我们需要2台服务器始终相互连接。如果所有三个节点都会关闭,我们就会分裂大脑,我们必须决定服务器应该手动进入自举模式,这是确定将从分裂脑中恢复的主要服务器的过程。
本教程描述了如何在Debian 8服务器上安装和配置三个Percona XtraDB Cluster节点,我们将使用Percona存储库中的软件包。
在每台主机上,按如下所示修改文件/ 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
本教程中描述的过程需要以下最小的服务器设置:
在所有节点上,以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将自动启动。使用/etc/init.d/mysql stop在所有三个节点上停止mysqld。
应将单个节点配置为能够引导群集。有关引导群集的更多信息,请参阅引导群集。
确保添加这些行到配置文件/etc/mysql/my.cnf在的[mysqld]部分的端部的第一个节点(mysql1.local.vm):
[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"
在我的案例“PASSW0RD”中注意您设置的密码。
使用以下命令启动第一个节点:
root@mysql1:~# /etc/init.d/mysql bootstrap-pxc
此命令将启动第一个节点并引导群集,如果一切正常,您将看到类似的内容:
root@mysql1:~# /etc/init.d/mysql bootstrap-pxc
[ ok ] Bootstrapping Percona XtraDB Cluster database server: mysqld ..
root@mysql1:~#
在第一个节点启动后,使用经典的mysql -p命令连接到mysql,然后可以检查集群状态,执行查询显示状态,如'wsrep%';如下例所示:
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)
此输出显示群集已成功引导。
要使用XtraBackup执行状态快照传输,请设置具有适当权限的新用户:
mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'PASSW0RD'; mysql> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost'; mysql> FLUSH PRIVILEGES;
MySQL root帐户也可用于执行SST,但使用其他(非root)用户更安全。
追加以下几行到配置文件/etc/mysql/my.cnf第二节点(mysql2.local.vm)上,以便它包含以下数据:
[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"
使用以下命令启动第二个节点(此时请注意,因为您可以看到不处于boostrap模式!!):
root@mysql2:~# /etc/init.d/mysql start
服务器启动后,它应自动接收SST。现在可以在两个节点上检查群集状态。以下是第二个节点(mysql2.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 | 2 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | ... | wsrep_ready | ON | +----------------------------+--------------------------------------+ 40 rows in set (0.01 sec) 此输出显示新节点已成功添加到群集。注意变量wsrep_cluster_size已经变为2,而不是我们做的第一个查询之一。
追加以下几行到配置文件/etc/mysql/my.cnf第二节点(mysql3.local.vm)上,所以它包含以下配置:
[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"
使用以下命令启动第三个节点:
root@mysql3:~# /etc/init.d/mysql start
服务器启动后,它应自动接收SST。可以在所有节点上检查群集状态。以下是第三个节点(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)
此输出确认第三个节点已加入群集。再看看wsrep_cluster_size,它现在变成3而不是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)
在这个问题中,一切顺利,你可以看到状态转移正在进行中,这意味着数据将被转移到节点。
要测试复制,我们在第二个节点上创建一个新数据库,在第三个节点上为该数据库创建一个表,并在第一个节点上向表中添加一些记录。
在第二个节点上创建一个新数据库:
mysql@mysql2> CREATE DATABASE percona; Query OK, 1 row affected (0.01 sec)
在第三个节点上创建一个表:
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)
在第一个节点上插入记录:
mysql@mysql1> INSERT INTO percona.example VALUES (1, 'percona1'); Query OK, 1 row affected (0.02 sec)
从第二个节点上的该表中检索所有行:
mysql@mysql2> SELECT * FROM percona.example; +---------+-----------+ | node_id | node_name | +---------+-----------+ | 1 | percona1 | +---------+-----------+ 1 row in set (0.00 sec)
要确保应用程序始终可以访问群集,可以在三个节点前添加负载均衡器。