英文原作者: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 秒)
此输出确认第三个节点已加入群集。
测试复制
要测试复制,我们在第二个节点上创建一个新数据库,在第三个节点上为该数据库创建一个表,并在第一个节点上向表中添加一些记录。
在第二个节点上创建一个新数据库:
mysql @ percona2 > CREATE DATABASE demopercona ; 查询 行, 1 行 的影响 (0 。01 秒)
在第三个节点上创建一个表:
mysql@percona3 > USE demopercona ; 数据库已 更改 mysql@percona3 > CREATE TABLE demotable (node_id INT PRIMARY KEY , node_name VARCHAR (30 )); 查询 OK , 0 行 影响 (0 。05 秒)
在第一个节点上插入记录:
mysql@percona1 > INSERT INTO demopercona.demotable VALUES (1 , 'percona1' ); 查询 行, 1 行 的影响 (0 。02 秒)
从第二个节点上的该表中检索所有行:
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: 40Percona 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是否非常简单。