openstack如何使用ceph磁盘 (openstack安装内存需要多大)

本文描述OpenStack高可用安装过程中的PXC数据库安装

1. 关于Galera Cluster和PXC

Gelera 有两种封装产品:(1)MariaDB上实现的MariaDB cluster,也可以使用MySQL; (2)Percona实现的percona xtradb cluster,简称PXC。

本文基于Percona的PXC集群部署。

2. 环境准备

  • 软件操作系统:CentOS Linux release 8.2.2004 (Core)软件:Percona XtraDB Cluster 5.7
  • 服务器
10.28.108.7  node01.sysit.cn node01
10.28.108.8  node02.sysit.cn node02
10.28.108.9  node03.sysit.cn node03
  • 操作通初始化

见本站CentOS8初始化

  • 时间同步

3. 安装配置过程

3.1 软件准备

因为安装的时候,yum仓库比较慢,因此直接*载下**rpm包安装:(1)PXC软件: https://www.percona.com/downloads/Percona-XtraDB-Cluster-57/LATEST/ (2)qpress和percona-xtrabackup-24:*载下**地址: https://repo.percona.com/release/8/RPMS/x86_64/

PXC的安装需要依赖于qpress和percona-xtrabackup-24,完整的软件列表如下:

[root@node01 pxc]# ls
percona-xtrabackup-24-2.4.21-1.el8.x86_64.rpm
Percona-XtraDB-Cluster-server-57-5.7.31-31.45.3.el8.x86_64.rpm
Percona-XtraDB-Cluster-57-5.7.31-31.45.3.el8.x86_64.rpm
Percona-XtraDB-Cluster-shared-57-5.7.31-31.45.3.el8.x86_64.rpm
Percona-XtraDB-Cluster-client-57-5.7.31-31.45.3.el8.x86_64.rpm  
qpress-11-1.el8.x86_64.rpm

3.2 安装

[root@node01 pxc]# dnf localinstall *.rpm

3.3 配置

PXC的配置文件在 /etc/percona-xtradb-cluster.conf.d 下,主要是 wsrep.cnf mysqld.cnf 两个文件, mysqld.cnf 主要是数据库相关配置, wsrep.cnf 主要是pxc集群的相关配置。

  • mysqld.cnf配置文件
# PXC集群中MySQL实例的唯一ID,不能重复,且必须是数字
[root@node01 pxc]# vi mysqld.cnf 
[mysqld]
 ...
server-id=1
bind-address=10.28.108.7
skip-name-resolve
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
  • wsrep.cnf配置文件
[root@node01 pxc]# egrep -v "^#|^#34; /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://10.28.108.7,10.28.108.8,10.28.108.9
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.28.108.7
wsrep_cluster_name=lab-pxc-cluster
wsrep_node_name=node01.sysit.cn
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:GH8RZnK8GBcd2SkDz1IP"
  • 配置说明:
# Galera库文件的路径,保持默认
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
# 集群中所有节点的ip,一个都不能落下
wsrep_cluster_address=gcomm://10.28.108.7,10.28.108.8,10.28.108.9
# 基于ROW复制(安全可靠)
binlog_format=ROW
# 默认引擎
default_storage_engine=InnoDB
# 并发复制线程数
wsrep_slave_threads= 8
# 记录群集中发生冲突的MDL以及InnoDB锁的详细信息,会影响性能
wsrep_log_conflicts
# 主键自增长不锁表
innodb_autoinc_lock_mode=2
# 当前节点的IP
wsrep_node_address=10.28.108.7
# PXC集群的名称
wsrep_cluster_name=lab-pxc-cluster
当前节点的名称
wsrep_node_name=node01.sysit.cn
# 采用严格的同步模式
pxc_strict_mode=ENFORCING
# 同步方法(mysqldump、 rsync、 xtrabackup)
wsrep_sst_method=xtrabackup-v2
# 同步时使用的帐户密码
wsrep_sst_auth="sstuser:GH8RZnK8GBcd2SkDz1IP"

特别注意: mysqld.conf 中的server-id的值不能重复,且必须是数字,后续一般也不要更改。

3.4 启动并在第一个节点上操作

上面步骤已经完成了3个节点额软件安装、配置更改,当所有的节点准备完成后,就可以启动第一台服务器,这台服务器在此时被称为首节点。

下面我们采用node01.sysit.cn作为首节点:

  • 启动
[root@node01 pxc]# systemctl start mysql@bootstrap.service
  • 安全配置
# 在mysql的日志文件中找到初始的默认密码
[root@node01 pxc]# grep "temporary password " /var/log/mysqld.log          
2020-11-25T01:56:47.222803Z 1 [Note] A temporary password is generated for root@localhost: <;,2=sdktvZ>
  # 使用mysql_secure_installation命令修改root账户的密码
[root@node01 pxc]# mysql_secure_installation 
  • 创建sst用户

为了安全起见, root 账户一般是不允许远程登录的,所以我们需要单独创建一个用于远程访问的数据库账户。这个账户也是用于 PXC 集群同步数据的账户,与 wsrep.cnf 文件中的 wsrep_sst_auth 配置项所对应:

[root@node01 pxc]# mysql -uroot -p
Enter password: 

mysql> create user 'sstuser'@'%' identified by 'GH8RZnK8GBcd2SkDz1IP';
mysql> grant all privileges on *.* to 'sstuser'@'%';
mysql> flush privileges;

3.5 启动其他节点

其他节点只需要正常启动MySQL服务即可,启动之后会根据wsrep.cnf文件中的配置自动加入集群中:

[root@node02 pxc]# systemctl start mysqld

PXC集群会自动同步首节点修改的root账户密码和创建的sstuser账户。

3.6 检查集群状态

mysql> show status like 'wsrep_cluster%';
+--------------------------+--------------------------------------+
 | Variable_name            | Value                                |
 +--------------------------+--------------------------------------+
 | wsrep_cluster_weight     | 3                                    |
 | wsrep_cluster_conf_id    | 5                                    |
 | wsrep_cluster_size       | 3                                    |
 | wsrep_cluster_state_uuid | 7e31fb03-2ec1-11eb-9336-32b2ba900041 |
 | wsrep_cluster_status     | Primary                              |
 +--------------------------+--------------------------------------+
 5 rows in set (0.00 sec)

变量说明:

wsrep_cluster_weight:该节点在集群中的权重值
wsrep_cluster_conf_id:集群节点关系改变的次数(每次增加/删除都会+1)
wsrep_cluster_size:集群中的节点个数
wsrep_cluster_state_uuid:集群当前状态的UUID,这是集群当前状态及其所经历的更改序列的唯一标识符。也用于比较两个或多个节点是否处于同一集群,若两个节点的该变量值一致就代表处于一个集群,如果该值不一致则表示不处于同一集群
wsrep_cluster_status:集群的目前状态

wsrep_cluster_size 的值等于服务器节点的个数,则说明集群创建成功。

3.7 重启首节点

不能忘了要将首节点重启,重启的方法是停止 mysql@bootstrap ,然后启动 mysqld

# 在首节点上停止服务
[root@node01 pxc]# systemctl stop mysql@bootstrap.service
# 登录node02查看集群状态,这个时候只能看到2个节点了。
[root@node02 pxc]# mysql -uroot -p
Enter password: 
mysql> show status like 'wsrep_cluster%';
+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| wsrep_cluster_weight     | 2                                    |
| wsrep_cluster_conf_id    | 6                                    |
| wsrep_cluster_size       | 2                                    |
| wsrep_cluster_state_uuid | 7e31fb03-2ec1-11eb-9336-32b2ba900041 |
| wsrep_cluster_status     | Primary                              |
+--------------------------+--------------------------------------+
5 rows in set (0.00 sec)
# 在首节点上正常启动mysqld
[root@node01 pxc]# systemctl restart mysqld

# 再次查看集群状态
mysql> show status like 'wsrep_cluster%';
+--------------------------+--------------------------------------+
 | Variable_name            | Value                                |
 +--------------------------+--------------------------------------+
 | wsrep_cluster_weight     | 3                                    |
 | wsrep_cluster_conf_id    | 7                                    |
 | wsrep_cluster_size       | 3                                    |
 | wsrep_cluster_state_uuid | 7e31fb03-2ec1-11eb-9336-32b2ba900041 |
 | wsrep_cluster_status     | Primary                              |
 +--------------------------+--------------------------------------+

4. 集群的状态参数说明

此处内容来源于:https://www.jianshu.com/p/586a63f235d5

  • 队列相关
wsrep_local_send_queue:发送队列的长度
wsrep_local_send_queue_max:发送队列的最大长度
wsrep_local_send_queue_min:发送队列的最小长度
wsrep_local_send_queue_avg:发送队列的平均长度
wsrep_local_recv_queue:接收队列的长度
wsrep_local_recv_queue_max:接收队列的最大长度
wsrep_local_recv_queue_min:接收队列的最小长度
wsrep_local_recv_queue_avg:接收队列的平均长度
  • 复制相关
wsrep_replicated:同步数据到其他节点的次数
wsrep_replicated_bytes:同步到其他节点的数据总量,单位字节
wsrep_received:接收到其他节点同步请求的次数
wsrep_received_bytes:接收到其他节点的同步数据总量,单位字节
wsrep_last_applied:同步应用次数wsrep_last_committed:事务提交次数
  • 流控相关
wsrep_flow_control_paused_ns:流控暂停状态下花费的总时间(纳秒)
wsrep_flow_control_paused:流控暂停时间的占比(0 ~ 1)
wsrep_flow_control_sent:发送的流控暂停事件的数量,即当前节点触发流控的次数
wsrep_flow_control_recv:接收的流控暂停事件的数量
wsrep_flow_control_interval:流控的下限和上限。上限是队列中允许的最大请求数。如果队列达到上限,则拒绝新的请求,即触发流控。当处理现有请求时,队列会减少,一旦到达下限,将再次允许新的请求,即解除流控
wsrep_flow_control_status:流控的开关状态(开启:ON,关闭:OFF)
  • 事务相关
wsrep_cert_deps_distance:事务执行的并发数
wsrep_apply_oooe:接收队列中事务的占比
wsrep_apply_oool:接收队列中事务乱序执行的频率
wsrep_apply_window:接收队列中事务的平均数量
wsrep_commit_oooe:发送队列中事务的占比
wsrep_commit_oool:无任何意义(不存在本地乱序提交)
wsrep_commit_window:发送队列中事务的平均数量
  • 状态相关
wsrep_local_state_comment:节点的当前状态
wsrep_cluster_status:集群的当前状态
wsrep_connected:节点是否连接到集群
wsrep_ready:集群是否正常工作
wsrep_cluster_size:集群中的节点个数
wsrep_desync_count:延时节点的数量
wsrep_incoming_addresses:集群中所有节点的IP地址
  • 关于节点状态wsrep_local_state_comment
# 查看
mysql> show status like 'wsrep_local_state_comment'; 
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
# 参数说明
Open:节点启动成功,尝试连接到集群
Primary: 节点已处于集群中,在新节点加入时,选取donor进行数据库同步时会产生的状态
Joiner: 节点处于等待接收或正在接收同步文件的状态
Joined: 节点完成数据同步,但还有部分数据不是最新的,在追赶与集群数据一致的状态
Synced: 节点正常提供服务的状态,表示当前节点数据状态与集群数据状态是一致的Donor: 表示该节点被选为Donor节点,正在为新加进来的节点进行全量数据同步,此时该节点对客户端不提供服务
  • 关于集群状态
# 查看
mysql> show status like 'wsrep_cluster_status';
+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+
# 参数说明
PRIMARY:正常状态
NON_PRIMARY:集群发生脑裂
DISCONNECTED:集群处于无法连接状态

5. 集群节点宕机操作

5.1 正常上下线

  • 首节点
# 启动
systemctl start mysql@bootstrap.service
# 关闭
systemctl stop mysql@bootstrap.service
  • 普通节点
# 启动
systemctl start mysqld
# 关闭
systemctl stop mysqld

5.2 集群中还有至少一个节点运行的情况

如果集群中还有至少1个节点在运行,则其他下线的节点按照普通节点启动即可。

systemctl start mysqld

5.3 集群都安全下线的情况

如果所有PXC节点都是安全下线的,那么在启动集群时,就需要先启动最后下线的节点。

注意:集群初次启动可以将任意节点作为首节点,但是如果是一个已经启动的节点,就需要找到最后下线的节点作为首节点。

  • 查看safe_to_bootstrap的值
[root@node03 pxc]# cat /var/lib/mysql/grastate.dat 
# GALERA saved stateversion: 2.1
uuid:    7e31fb03-2ec1-11eb-9336-32b2ba900041
seqno:   6
safe_to_bootstrap: 1

safe_to_bootstrap 的值为 0 时表示不能作为首节点启动,为 1 时表示可以作为首节点启动。

PXC 集群中最后一个下线的节点就会将 safe_to_bootstrap 的值改为 1 ,下次启动集群时就需要将该节点作为首节点启动。这是因为最后一个下线的节点数据是最新的。

将其作为首节点启动,然后让其他节点与该节点进行数据同步,这样才能保证集群中的数据是最新的。否则,可能会导致集群中的数据是某个时间点之前的旧数据。

  • 启动
[root@node03 pxc]# systemctl start mysql@bootstrap.service
[root@node02 pxc]# systemctl start mysqld
[root@node01 pxc]# systemctl start mysqld

5.4 PXC节点都是意外退出的情况

宕机、挂起、关机、重启、断电、断网等等,反正就是没有使用相应的停止命令安全下线节点都属于意外下线。

(1)不是同时意外退出的情况

只要不是同时意外退出,那么当集群还剩一个节点时,该节点就会自动将grastate.dat文件中的 safe_to_bootstrap 值改为 1 。所以在重启集群时,也是先启动最后一个退出的节点。

(2)同时意外退出的情况

如果是同时意外退出,则修改 grastate.dat 文件,当集群中所有节点都是在同一时间因意外情况而退出,那么此时所有节点的 safe_to_bootstrap 都为 0 ,因为没有一个节点来得及去修改 safe_to_bootstrap 的值。当所有节点的 safe_to_bootstrap 均为0时,PXC集群是无法启动的。

在这种情况下我们就只能手动选择一个节点,将 safe_to_bootstrap 修改为 1 ,然后将该节点作为首节点进行启动