手记

[译]在CentOS上配置Percona XtraDB集群(Percona XtraDB Cluster)

英文原作者:Percona官网 翻译&转载来源:https://www.percona.com/doc/percona-xtradb-cluster/LATEST/howtos/centos_howto.html


在CentOS上配置Percona XtraDB集群(Percona XtraDB Cluster)


本教程介绍如何使用Percona存储库中的软件包在CentOS 6.8服务器上安装和配置三个Percona XtraDB Cluster节点。(请保证进行搭建的环境为CentOS6.8或者CentOS7)

  • 节点1

    • 主机名: percona1

    • IP地址: 192.168.70.71

  • 节点2

    • 主机名: percona2

    • IP地址: 192.168.70.72

  • 节点3

    • 主机名: percona3

    • IP地址: 192.168.70.73


先决条件

本教程中描述的过程需要以下内容:

  • 所有三个节点都安装了CentOS 6.8 (使用CentOS7/Fedora/RedHat都应该没有问题)。

  • 所有节点上的防火墙都配置为允许连接到端口3306,4444,4567和4568。

  • 所有节点上的SELinux都被禁用。


步骤1.安装PXC

在所有三个节点上安装Percona XtraDB集群,如在Red Hat Enterprise Linux和CentOS上安装Percona XtraDB集群中所述。

强调:您需要在要安装Percona XtraDB Cluster的节点上具有root访问权限(以具有root权限的用户身份登录或能够运行命令sudo), 另外,如果您不想配置防火墙的权限,直接systemctl stop firewalld关闭即可,selinux也直接关闭即可,然后跳到从Percona存储库安装这里开始阅读

确保以下端口未被防火墙阻止或被其他软件使用。Percona XtraDB Cluster需要它们进行通信。

  • 3306

  • 4444

  • 4567

  • 4568

systemctl start firewalld

然后我们允许mysql服务。Pecona是mysql发行版,所以它使用与mysql相同的端口。

firewall-cmd --zone=public --add-service=mysql --permanent

接下来我们添加其他所需端口:

firewall-cmd --zone=public --add-port=3306/tcp --permanent

firewall-cmd --zone=public --add-port=4567/tcp --permanent

firewall-cmd --zone=public --add-port=4568/tcp --permanent

firewall-cmd --zone=public --add-port=4444/tcp --permanent

firewall-cmd --zone=public --add-port=4567/udp --permanent

firewall-cmd --zone=public --add-port=9200/tcp --permanent

并重新加载防火墙

 firewall-cmd --reload

SELinux的安全模块可以限制访问,为的Percona XtraDB Cluster数据。最好解决方案是从改变模式enforcing 以permissive通过运行下面的命令:

setenforce  0


这只会在运行时更改模式。要在重新引导后以允许模式运行SELinux,请在/etc/selinux/config 配置文件中进行设置:

SELINUX=permissive

从Percona存储库安装

按照Percona Software Repositories Documentation中的说明配置Percona存储 

# 安装源,percona版本的存储库
$ yum install https://www.percona.com/redir/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm


安装Percona XtraDB Cluster软件包:

$ sudo yum install Percona-XtraDB-Cluster-57

或者,您可以安装Percona-XtraDB-Cluster-full-57元软件包

$ sudo yum install Percona-XtraDB-Cluster-full-57.x86_64


Percona-XtraDB-Cluster-full-57.x86_64 其中包含以下附加软件包: 

  • Percona-XtraDB-Cluster-devel-57

  • Percona-XtraDB-Cluster-test-57

  • Percona-XtraDB-Cluster-debuginfo-57

  • Percona-XtraDB-Cluster-galera-3-debuginfo

  • Percona-XtraDB-Cluster-shared-57

启动Percona XtraDB群集服务器:

$ sudo service mysql start


复制超级用户帐户的自动生成的临时密码:

$ sudo grep 'temporary password' /var/log/mysqld.log


使用此密码登录为root

$ mysql -u root -p


更改超级用户帐户的密码并注销。例如:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootPass';
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye


停止mysql服务:

$ sudo service mysql stop



步骤2.配置第一个节点

应将单个节点配置为能够引导群集。有关引导群集的更多信息,请参阅引导第一个节点

配置所有PXC节点后,通过自举的第一个节点初始化集群。初始节点应该是包含所有数据的节点,您希望将其复制到其他节点。

Bootstrapping意味着在没有任何已知集群地址的情况下启动节点。如果wsrep_cluster_address变量为空,Percona XtraDB Cluster假定这是第一个节点并初始化集群。

不使用更改配置,而是使用以下命令启动第一个节点:

[root@pxc1 ~]# /etc/init.d/mysql bootstrap-pxc


注意:在RHEL或CentOS 7上,使用以下bootstrap命令

[root@pxc1 ~]# systemctl start mysql@bootstrap.service


使用上一个命令启动节点时,它以bootstrap模式运行wsrep_cluster_address=gcomm://。这告诉节点初始化wsrep_cluster_conf_id集合设置为1。在您添加其他节点的集群,可以再重新启动该节点为正常,这将再次使用的标准配置。

要确保已初始化群集,请运行以下命令:

mysql@pxc1> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | c2883338-834d-11e2-0800-03c9c68e41ec |
| ...                        | ...                                  |
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
| ...                        | ...                                  |
| wsrep_cluster_size         | 1                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
| ...                        | ...                                  |
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)


前面的输出显示群集大小为1个节点,它是主要组件,节点处于Synced状态,它已完全连接并准备进行写入集复制。

将其他节点添加到新群集之前,请为SST创建用户并为其提供必要的权限。凭据必须与配置写入集复制节点时指定的凭据相匹配。

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


有关更多信息,请参阅Percona XtraBackup的权限


确保/etc/my.cnf 第一个节点(percona1)上的配置文件包含以下内容:

[mysqld]

datadir=/var/lib/mysql
user=mysql

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

# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.70.71,192.168.70.72,192.168.70.73

# 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.70.71

# SST method
wsrep_sst_method=xtrabackup-v2

# Cluster name
wsrep_cluster_name=my_centos_cluster

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


使用以下命令启动第一个节点:


[root@percona1 ~]# /etc/init.d/mysql bootstrap-pxc


如果您正在运行CentOS 7,则应使用引导服务:

[ root@percona1 ~] #systemctl start mysql@bootstrap.service


上一个命令将启动集群,并将初始wsrep_cluster_address变量设置为gcomm://。如果稍后重新启动节点或MySQL,则无需更改配置文件。

启动第一个节点后,可以使用以下命令检查集群状态:

show status like 'wsrep%';


mysql >  show status like 'wsrep%';
+ ---------------------------- + -------------------- ------------------ + 
|  Variable_name               |  价值                                | 
+ ---------------------------- + -------------------- ------------------ + 
|  wsrep_local_state_uuid      |  c2883338 - 834 d - 11 e2 - 0800 - 03 c9c68e41ec  | 
...... 
|  wsrep_local_state           |  4                                     | 
|  wsrep_local_state_comment   |  Synced                              | 
...
|  wsrep_cluster_size          |  1                                     | 
|  wsrep_cluster_status        |  Primary                             | 
|  wsrep_connected             |  ON                                    | 
...... 
|  wsrep_ready                 |  ON                                    | 
+ ---------------------------- + -------------------- ------------------ + 
40  行 中 集合 (0 。01  秒)


此输出显示群集已成功引导。


建议不要为root帐户留下空密码。密码可以更改如下:

mysql@percona1> UPDATE mysql.user SET password=PASSWORD("Passw0rd") where user='root';
mysql@percona1> FLUSH PRIVILEGES;


要使用XtraBackup执行状态快照传输,请设置具有适当权限的新用户:

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


MySQL root帐户也可以用于执行SST,但为此使用不同的(非root用户)更安全。


步骤3.配置第二个节点

确保/etc/my.cnf 第二个节点(percona2)上的配置文件包含以下内容:

[mysqld]

datadir=/var/lib/mysql
user=mysql

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

# Cluster connection URL contains IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.70.71,192.168.70.72,192.168.70.73

# 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.70.72

# Cluster name
wsrep_cluster_name=my_centos_cluster

# SST method
wsrep_sst_method=xtrabackup-v2

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


使用以下命令启动第二个节点:

# 如果是RedHat6/CentOS6
[root@percona2 ~]# /etc/init.d/mysql start


# 如果是CentOS7/RedHat7/Fedora29
$ sudo systemctl start mysql.service


服务器启动后,它应自动接收SST。这意味着第二个节点将不再具有空的root密码。为了连接到群集并检查状态,应使用第一个节点的root密码。可以在两个节点上检查群集状态。以下是第二个节点(percona2)的状态示例:

mysql> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | c2883338-834d-11e2-0800-03c9c68e41ec |
...
| 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)


此输出显示新节点已成功添加到群集。


步骤4.配置第三个节点

确保/etc/my.cnf 第三个节点(percona3)上的MySQL配置文件包含以下内容:

[mysqld]

datadir=/var/lib/mysql
user=mysql

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

# Cluster connection URL contains IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.70.71,192.168.70.72,192.168.70.73

# 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 #3 address
wsrep_node_address=192.168.70.73

# Cluster name
wsrep_cluster_name=my_centos_cluster

# SST method
wsrep_sst_method=xtrabackup-v2

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


使用以下命令启动第三个节点:

# centos6 使用下面命令
[root@percona3 ~]# /etc/init.d/mysql start

# RedHat/Fedora/CentOS7 使用下面命令:
[root@percona3 ~]# systemctl start mysql.service


服务器启动后,它应自动接收SST。可以在所有三个节点上检查群集状态。以下是第三个节点(percona3)的状态示例:

mysql >  show status like 'wsrep%' ; 
+ ---------------------------- + -------------------- ------------------ + 
|  Variable_name               |  价值                                | 
+ ---------------------------- + -------------------- ------------------ + 
|  wsrep_local_state_uuid      |  c2883338 - 834 d - 11 e2 - 0800 - 03 c9c68e41ec  | 
...... 
|  wsrep_local_state           |  4                                     | 
|  wsrep_local_state_comment   |  同步                               | 
...
|  wsrep_cluster_size          |  3                                     | 
|  wsrep_cluster_status        |  小学                              | 
|  wsrep_connected             |  ON                                    | 
...... 
|  wsrep_ready                 |  ON                                    | 
+ ---------------------------- + -------------------- ------------------ + 
40  行 中 集合 (0 。01  秒)


此输出确认第三个节点已加入群集。


测试复制

要测试复制,我们在第二个节点上创建一个新数据库,在第三个节点上为该数据库创建一个表,并在第一个节点上向表中添加一些记录。

  1. 在第二个节点上创建一个新数据库:

    mysql @ percona2 >  CREATE  DATABASE  demopercona ; 
    查询 行, 1  行 的影响 (0 。01  秒)


  2. 在第三个节点上创建一个表:

    mysql@percona3 >  USE  demopercona ; 
    数据库已 更改
    
    mysql@percona3 >  CREATE  TABLE  demotable (node_id  INT  PRIMARY  KEY , node_name  VARCHAR (30 )); 
    查询 OK , 0  行 影响 (0 。05  秒)


  3. 在第一个节点上插入记录:

    mysql@percona1 >  INSERT  INTO  demopercona.demotable VALUES  (1 , 'percona1' ); 
    查询 行, 1  行 的影响 (0 。02  秒)


  4. 从第二个节点上的该表中检索所有行:

    mysql@percona2 >  SELECT  *  FROM  demopercona.demotable; 
    + --------- + ----------- + 
    |  node_id  |  node_name  | 
    + --------- + ----------- + 
    |        1  |  percona1   | 
    + --------- + ----------- + 
    1  行 中 集合 (0 。00  秒)


此简单过程应确保群集中的所有节点都已同步并按预期工作,到此为止Percona的集群配置完毕。下面部分是提高篇,如果您已经通过上述配置成功实现了集群,也就是您测试,如果在一个数据库中增删改查会同步到其他服务器,那么集群就部署成功,本图文教程您已经成功完成,接下来可以再接再厉,完成Haproxy的负载均衡。下面是利用Haproxy配置则三台集群服务器的负载均衡。


HAproxy设置

首先,我们需要在所有群集节点上安装clustercheck,以便群集可以通过HAproxy进行维护。让我们用wget获取脚本

wget https://raw.githubusercontent.com/olafz/percona-clustercheck/master/clustercheck

脚本需要可执行并移动到您的$ PATH目录之一。

chmod +x clustercheck

mv clustercheck /usr/bin/

现在我们还需要包含在xinetd包中的mysqlchk:

yum install xinetd

接下来,我们在数据库上移动create clustercheck user。我们只能在第一个节点上输入

mysql -u root -p

mysql> GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';

exit;

接下来,我们可以测试clustercheck是否按预期工作:

[root@centos-percona01 ~]# clustercheck
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: close
Content-Length: 40

Percona XtraDB Cluster Node is synced.

接下来我们转到xinetd的配置,需要将xinetd添加到服务列表中。

nano /etc/services

我们使用CTRL-W查找端口9200的部分,然后我们推荐使用该端口的服务,而不是添加新行。它需要看起来像这样:

mysqlchk 9200/tcp # mysqlchk
#wap-wsp 9200/tcp # WAP connectionless session service
#wap-wsp 9200/udp # WAP connectionless session service

我们完成后,我们保存。请注意,除HAproxy之外的所有群集节点都需要完成此操作。

现在是时候登录我们的HAporoxy服务器了。首先,我们需要备份haproxy配置。

mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bk

然后我们将从干净的配置文件上设置新的配置

nano /etc/haproxy/haproxy.cfg

我们可以从这里复制HAproxy配置,除了这三行需要更改,请修改为对应的IP和端口:

server centos-percona01 10.132.84.186:3306 check port 9200 inter 12000 rise 3 fall 3
server centos-percona02 10.132.84.141:3306 check port 9200 inter 12000 rise 3 fall 3
server centos-percona03 10.132.84.67:3306 check port 9200 inter 12000 rise 3 fall 3

需要使用您的主机名和地址更改突出显示的部分。接下来我们需要在haproxy服务器上启动firewalld并允许我们需要使用的端口

systemctl start firewalld
firewall-cmd --permanent --add-port=9000/tcp
firewall-cmd --permanent --add-port=3030/tcp

之后我们需要重新加载防火墙

firewall-cmd --reload

最后,开始haproxy

systemctl start haproxy

我们现在需要测试设置。


测试HAproxy

让我们将浏览器指向端口9000上HAproxy服务器的公共IP地址:


所有节点都在线。接下来让我们在haproxy服务器上安装percona客户端,这样我们就可以尝试从那里查询集群。

yum install https://www.percona.com/redir/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm

yum install Percona-XtraDB-Cluster-client-56

让我们试着看看我们是否可以从这个haproxy服务器获得一个查询:

mysql -u root -p -h 10.132.83.13 -P 3306 -e "select Host, User, Password from mysql.user"


结论

我们已经设置了由HAproxy负载均衡的Percona XtraDB 3节点集群。


PS:docker上快速搭建PXC集群



# Create network 

 docker network create pxc-network 


# Init First node:

 docker run -d \

  -e MYSQL_ROOT_PASSWORD=root \

  -e CLUSTER_NAME=cluster1 \

  -p 3315:3306 \

  --name=node1 \

  --net=pxc-network \

  percona/percona-xtradb-cluster:5.7



#  Join the second node:

 docker run -d \

  -e MYSQL_ROOT_PASSWORD=root \

  -e CLUSTER_NAME=cluster1 \

  -e CLUSTER_JOIN=node1 \

  -p 3316:3306  \

  --name=node2 \

  --net=pxc-network \

  percona/percona-xtradb-cluster:5.7


#  Join the third node:

 docker run -d \

  -e MYSQL_ROOT_PASSWORD=root \

  -e CLUSTER_NAME=cluster1 \

  -e CLUSTER_JOIN=node1 \

  -p 3317:3306  \

  --name=node3 \

  --net=pxc-network \

  percona/percona-xtradb-cluster:5.7

# 通过docker命令,进入节点1(node1)的mysql命令行
$ sudo docker exec -it node1 /usr/bin/mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.19-17-57-log

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql@node1>

# 查看节点的wsrep状态

mysql@node1> show status like 'wsrep%';

| 625318e2-9e1c-11e7-9d07-aee70d98d8ac            |
| Synced                                          |
| 172.18.0.2:3306,172.18.0.3:3306,172.18.0.4:3306
| wsrep_local_state_uuid...
| wsrep_local_state_comment...
| wsrep_incoming_addresses...
| wsrep_cluster_conf_id| wsrep_cluster_size| wsrep_cluster_state_uuid| wsrep_cluster_status| wsrep_connected...
| wsrep_ready+------------------------------+----

通过Docker创建的三个PXC节点非常快速,默认是配置好了的。
您只需要通过127.0.0.1:3315,127.0.0.1:3316,127.0.0.1:3317,这个三个URL都可以任意访问。
在一个节点上的操作,会自动同步到其他节点上,下面是演示截图:

怎么样,使用Docker配置PerconaXtraDBCluster是否非常简单。





2人推荐
随时随地看视频
慕课网APP