关于PXC实验 有一点我忘给你们总结了,少了这一点,基本上不会成功: 理一下顺序和思路:第一台先启动[email protected] 直接启动就行 不用打别的命令 之后第一台进入数据库 改数据库密码、授权 之后再去直接启动后两台的mysql—>systemctl start mysql 然后验证 这样就OK了 把顺序理一下 你们做的时候应该就更顺了
Percona XtraDB Cluster(简称PXC)是很多企业基于MySQL实现集群方案的不二选择。PXC它支持服务高可用,数据同步复制(并发复制),几乎无延迟;多个可同时读写节点,可实现写扩展等等。
Percona XtraDB Cluster is based on Percona Server running with the XtraDB storage engine. It uses the Galera library, which is an implementation of the write set replication (wsrep) API developed by Codership Oy. The default and recommended data transfer method is via Percona XtraBackup.
这里涉及一个概念叫做wsrep 也就是 write set replication 写集合复制 或者叫平行复制
节点之间数据传输通过xtrabackup
如果数据刚好在节点宕机的时候数据发生改变,当宕机节点再次加入集群的时候有两种处理方法。第一种方式是State Snapshot Transfer (SST) ,第二种方法是Incremental State Transfer (IST)。
SST的方式是指把节点所有数据复制到另一个节点,这种操作有三种方法:mysqldump/rsync/xtrabackup,mysqldump和rsync的缺点是当数据复制的时候,数据是只读状态(读锁),SST用xtrabackup,在整个数据同步的过程中,都不存在读锁的情况
IST的方式是指只是将改变的数据从一个节点复制到另一个节点,在数据同步过程中也没有读锁。SST可能会影响你对服务的正常操作,而IST则不会。如果一个节点宕机一小会儿,IST方式可以找出宕机时间里数据发生的变化。IST的方式,节点有缓存机制。每个节点都在ring-buffer(无锁环形缓冲)中记录之前的N步修改,并且节点可以将数据缓存转为对数据的修改操作
综上, 当数据的改变量小于N的时候才可以用IST,大于N的时候只能用SST方式
所有的查询操作都是在本地进行的,但是提交操作有点特殊。提交动作通过所有节点的核验才能执行,如果没有通过核验,本次提交你会收到一个error,在这之后,此提交动作仅适用于本机节点。
提交动作的响应时间包括:请求在节点之间传输的时间、核验的时间、在本地应用提交的时间,但是提交操作在远程主机生效并不影响提交动作的响应时间,因为是发生在核验完成之后的。
这种框架设计,有两个重要的影响
1)可以实现真正的并行复制。从机可以使用wsrep_slave_threads变量配置多个并行线程
2)由于master写入数据比从库快,这个微小的时间差可能会导致从从库读取数据的时候,
数据还没有进行更新
然而,通过设置变量`wsrep_causal_reads=ON`可以解决这个问题,设置之后,从从库
读取数据的操作会等到从库同步完数据之后再进行。由于主库和从库之间的时间差,
这种同步操作被称为虚拟的同步复制,而非完全同步复制。
上述提交动作还有其他重要含义,如果对两个不同的节点进行写操作,集群将会使用
乐观锁。这意味着在单个查询操作的时间里,事物不会检查可能发生的锁冲突,因此
可能在事物提交阶段报错。
从读取数据时是否锁定读取行的数据来划分,mysql的锁分为乐观锁和悲观锁:
一般在悲观锁的等待时间过长而不能接受时我们才会选择乐观锁
其他锁的概念:
读锁(共享锁)是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。
写缩(排他锁)当用户写入数据时加上排他锁
死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
锁的颗粒度取决于存储引擎 innodb引擎实现了行级锁、页级锁、表级锁
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@localhost ~]# vim /etc/hosts
192.168.1.145 node1
192.168.1.143 node2
192.168.1.167 node3
[root@localhost ~]# vim /etc/selinux/config
SELINUX=disabled
[root@localhost ~]# scp /etc/hosts node2:/etc/hosts
[root@localhost ~]# scp /etc/hosts node3:/etc/hosts
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# firewall-cmd --add-port=3306/tcp --permanent
[root@localhost ~]# firewall-cmd --add-port=4567/tcp --permanent
[root@localhost ~]# firewall-cmd --add-port=4568/tcp --permanent
[root@localhost ~]# firewall-cmd --add-port=4444/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# ntpdate ntp3.aliyun.com
[root@localhost ~]# crontab -e
*/10 * * * * ntpdate ntp3.aliyun.com
[root@localhost ~]# reboot
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum -y install Percona-XtraDB-Cluster-57
[root@node1 ~]# yum -y install epel-release
[root@node1 ~]# yum -y install libev
[root@node1 ~]# wget https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-5.7.24-31.33/binary/redhat/7/x86_64/Percona-XtraDB-Cluster-5.7.24-31.33-r443-el7-x86_64-bundle.tar
[root@node1 ~]# mkdir percona
[root@node1 ~]# tar -xf Percona-XtraDB-Cluster-5.7.24-31.33-r443-el7-x86_64-bundle.tar -C percona/
[root@node1 ~]# cd percona/
[root@node1 percona]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
# 这是个yum源,用于下边安装percona本地包的时候提供依赖关系的解决
[root@node1 percona]# yum -y localinstall Percona-XtraDB-Cluster-*.rpm
主要包括mysqld.cnf,mysqld_safe.cnf,wsrep.cnf
在当前的这个版本中,my.cnf为主配置文件,其余的配置文件放在/etc/percona-xtradb-cluster.conf.d目录
[root@node1 percona]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
server-id=1
character_set_server = utf8
[root@node1 percona]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://192.168.1.145,192.168.1.143,192.168.1.167 #补全即可
wsrep_node_address=192.168.1.145 #取消注释并修改
wsrep_node_name=node1
wsrep_sst_auth="sstuser:sstuser" #取消注释并修改 数据同步时使用的账号和密码
[root@node2 percona]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
server-id=2
character_set_server = utf8
[root@node2 percona]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://192.168.1.145,192.168.1.143,192.168.1.167
wsrep_node_address=192.168.1.143
wsrep_node_name=node2
wsrep_sst_auth="sstuser:sstuser"
[root@node3 percona]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
server-id=3
character_set_server = utf8
[root@node3 percona]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://192.168.1.145,192.168.1.143,192.168.1.167
wsrep_node_address=192.168.1.167
wsrep_node_name=node3
wsrep_sst_auth="sstuser:sstuser" #数据同步使用的账户和密码
[root@node1 ~]# systemctl start [email protected]
[root@node1 ~]# grep "temporary password" /var/log/mysqld.log
2019-02-28T08:14:14.938652Z 1 [Note] A temporary password is generated for root@localhost: <1nC2g#:In#3
[root@node1 ~]# mysql -uroot -p'<1nC2g#:In#3'
mysql> alter user 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.03 sec)
mysql> create user 'sstuser'@'localhost' identified by 'sstuser';
#由于pxc的特点,在一个上创建,三台都有
Query OK, 0 rows affected (0.01 sec)
mysql> grant reload, lock tables, replication client, process on *.* to 'sstuser'@'localhost';
Query OK, 0 rows affected (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
[root@node2 percona]# systemctl start mysql
[root@node3 percona]# systemctl start mysql
如果你使用的是CentOS7.2.1511,会发现mysql可以正常启动,但是未加入集群的情况
需要升级openssl,建议全部升级后再启动集群,这问题在CentOS 7.4.1708不存在即openssl版本较新
[root@node2 percona]# mysql -uroot -p123456
mysql> show variables like 'version';
+---------------+------------------+
| Variable_name | Value |
+---------------+------------------+
| version | 5.7.24-26-57-log |
+---------------+------------------+
1 row in set (0.01 sec)
mysql> create database pxcdb;
Query OK, 1 row affected (0.06 sec)
mysql> use pxcdb
Database changed
mysql> create table t1(
-> id int not null,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t1 values(1,'tiechui');
ERROR 1105 (HY000): Percona-XtraDB-Cluster prohibits use of DML command on a table (pxcdb.t1) without an explicit primary key with pxc_strict_mode = ENFORCING or MASTER
#这里验证了pxc的特性,每个表都要有主键
mysql> alter table t1 add primary key (id);
Query OK, 0 rows affected (0.20 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into t1 values(1,'tiechui');
Query OK, 1 row affected (0.01 sec)
[root@node3 percona]# mysql -uroot -p123456
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 167 |
+---------------+-------+
1 row in set (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| pxcdb |
| sys |
+--------------------+
5 rows in set (0.13 sec)
mysql> use pxcdb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> use pxcdb -A
Database changed
mysql> select * from t1;
+----+---------+
| id | name |
+----+---------+
| 1 | tiechui |
+----+---------+
1 row in set (0.00 sec)
mysql> show status like '%wsrep_clust%';
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| wsrep_cluster_weight | 3 |
| wsrep_cluster_conf_id | 4 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 1c209041-3c04-11e9-ac7b-b70d041a0189 |
| wsrep_cluster_status | Primary |
+--------------------------+--------------------------------------+
5 rows in set (0.07 sec)
mysql> show status like 'wsrep_connected';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| wsrep_connected | ON |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> select * from pxcdb.t1;
+----+---------+
| id | name |
+----+---------+
| 1 | tiechui |
+----+---------+
1 row in set (0.01 sec)
mysql> SHOW STATUS LIKE 'wsrep_local_state_comment';
+---------------------------+--------+
| Variable_name | Value |
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
1 row in set (0.01 sec)
You can monitor the current state of a node using the following command:
SHOW STATUS LIKE ‘wsrep_local_state_comment’;
When a node is in Synced (6) state, it is part of the cluster and ready to handle traffic.
官方文档是这样说的:如果这一项是synced,则表明此节点是集群的一部分,并且已经准备好处理流量
如果三塔都是synced,恭喜,xtradb cluster搭建完成