天天看點

CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄

背景

  • 最近在進行

    MySQL

    PXC

    叢集搭建使用和研究

    前期已完成了一篇記錄文章 : 【CentOS7 下 MySQL 之 PXC 叢集部署【Docker+多機多節點】】

    但是,畢竟不是所有人都熟悉

    docker

    而作為開發人員,還是習慣于原生狀态的安裝流程

    是以,在此整理官方指導的

    PXC 叢集

    配置步驟

    歡迎指摘 …

【注】:Percona XtraDB Cluster(簡稱 PXC 叢集)

—— 業界主流的

MySQL

叢集方案
  • 環境
CentOS 版本:	CentOS Linux release 7.9.2009 (Core)
PXC 版本:		Percona XtraDB Cluster 5.7
           
官網指導 ——

【在 CentOS上 配置 Percona XtraDB 叢集】

前期準備

【注】:

PXC

叢集部署,會自行安裝

MySQL

服務,建議操作前解除安裝原來的

MySQL

1). 三台

Vmware

虛拟機

  • PXC

    叢集節點越多,資料同步的速度就越慢(建議不要太多!)
    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
在此,我以三台建立運作的

CentOS7

作為主控端,進行配置操作示範
虛拟機 ip 端口 角色
192.168.80.221 3306

第一個

節點
192.168.80.222 3306

第二個

節點
192.168.80.223 3306

第三個

節點
  • 注意各節點硬體配置盡量相同

    因為短闆效應,

    PXC

    叢集資料同步的速度取決配置最低的節點

PXC

叢集隻支援

InnoDB

引擎

2). 解除安裝

mariadb-libs

因為

CentOS7

預設捆綁安裝了

mariadb-libs

,為了不影響

PXC

的使用,需要先解除安裝!
yum -y remove mari*
           

3). 開啟四個

PXC

環境所涉及的端口

3306:	# mysql 執行個體端口
4567:	# PXC cluster 互相通訊的端口
4444:	# 用于 SST(State Snapshot Transfer): 全量傳輸
4568:	# 用于 IST(Incremental state Transfer): 增量傳輸傳送
           
  • 以鄙人使用寶塔面闆操作為例,注意以上端口的開啟:
    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄

4). 部署前建議關閉

SELINUX

、将

MySQL

資料庫服務停止

安全增強型

Linux(Security-Enhanced Linux)SELinux

主要由美國國家安全局開發
  • "SELINUX"

    屬性值設定成

    disabled

    ,然後

    reboot

    重新開機
vi /etc/selinux/config
           

5). 配置 ntp 服務,確定時間同步

  • 這一步,多數經驗沒有提及,我是操作 docker 時發現需要配置的哦!
[[email protected] ~]# yum -y install ntp ntpdate
 [[email protected] ~]# ntpdate 0.asia.pool.ntp.org
 [[email protected] ~]# hwclock --systohc
 [[email protected] ~]# date
 2021年 01月 08日 星期五 09:54:23 CST
           

搭建 PXC 叢集

官方指導 ——

【在 Red Hat Enterprise Linux 和 CentOS 上安裝 Percona XtraDB 叢集】

1). 下載下傳解壓縮工具

qpress

PXC

安裝包

  • 為友善後期對

    PXC

    叢集操作的使用,需要下載下傳

    "qpress"

    >>> 下載下傳位址
    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
  • 然後就是

    PXC

    安裝包的下載下傳了

    一般指導都是支援線上安裝的,但我發現,虛拟機裡無法安裝

    本身下載下傳速度慢,而且最新版本資源比較大

    此處,我以下載下傳

    【Percona XtraDB 群集 5.7】

    為例
    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
  • 此時我進行安裝發現,依賴關系提示:

    "需要:percona-xtrabackup-24 >= 2.4.21"

    是以,繼續下載下傳了 【Percona-XtraBackup-2.4】

【提示】

1

本人發現:不論在官網使用浏覽器下載下傳,還是使用 wget 指令下載下傳都提示檔案缺失,解壓異常,最後選擇迅雷下載下傳

2 有需要這些資源的,在此提供【百度雲連結,提取碼:fd0g 】

3 如果是寶塔系統,已安裝了

mysql

會有沖突,是以要卸掉原來的

mysql

資料庫
  • 将解壓得到的所有

    ".rpm"

    檔案,上傳到

    Linux

    系統,此處我選擇的是

    "/www/server/download"

    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄

2). 執行安裝

PXC

指令

在三個虛拟機上分别安裝

PXC

程式
  • 在上一步存放

    ".rpm"

    檔案的目錄中,執行指令:
yum localinstall *.rpm
           
CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
注意,如果提示還有其他需要使用的依賴包,進行下載下傳後再操作一遍指令 !

3). 修改

"mysqld.cnf"

檔案

  • 上一步指令執行完畢後,如果成功

    可以注意到

    "etc/my.cnf"

    檔案中出現如下資訊
    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
其實,我們操作的配置檔案,隻是

"/etc/percona-xtradb-cluster.conf.d/"

目錄中的三個!

mysql 的常用配置資訊都在 "mysqld.cnf" 檔案, pxc 叢集的配置資訊都在 "wsrep.cnf" 檔案

  • "mysqld.cnf"

    中配置資訊對比參考如下(注意,我添加了三個參數)

    并且,對參數

    "server-id"

    ,指派唯一的ID (三台伺服器都要配置)
# Template my.cnf for PXC
# Edit to your requirements.
[client]
socket=/var/lib/mysql/mysql.sock

[mysqld]
#PXC叢集中MySQL執行個體的唯一ID,不能重複,必須是數字
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin
log_slave_updates
expire_logs_days=7

#資料庫字元集
character_set_server = utf8
#運作遠端通路的IP位址
bind-address = 0.0.0.0
#跳過DNS解析
skip-name-resolve
#skip-grant-tables


# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

           

4). 建立傳送使用者

  • 首先,檢視預設的

    mysql

    登入密碼

    cat /var/log/mysqld.log | grep "A temporary password"

    以下面的列印資訊為例,預設賬号

    root

    ,密碼為:

    BJuk-xlad8XS

[[email protected] download]# cat /var/log/mysqld.log | grep "A temporary password"
2021-01-25T08:33:57.335210Z 1 [Note] A temporary password is generated for [email protected]: BJuk-xlad8XS
           
初始化,建議參考

【附錄 - 如何重置 root 密碼】

,感覺出錯少,更加友善
  • 賬号

    [adminPXC]

    及密碼

    [201107070]

    自定義即可

    用于

    PXC

    叢集中的資料傳輸

    依次執行下面三條

    SQL

    語句:
CREATE USER 'adminPXC'@'localhost' IDENTIFIED BY '201107070';
GRANT all privileges ON *.* TO 'adminPXC'@'localhost';
FLUSH PRIVILEGES;
           

【提示一】

使用者名密碼,要與配置檔案

"wsrep.cnf"

中的

wsrep_sst_auth="adminPXC:201107070"

對應

【提示二】

三台伺服器都要配置,

mysql

的重新開機指令:

systemctl restart mysql.service

【提示三】

在 節點啟動前,最好 關閉

mysql

服務:

systemctl stop mysql.service

5). 第一個節點【PXC1】

本次示範,我選擇

[192.168.80.221]

,作為第一個節點主機

▶ 修改

"wsrep.cnf"

PXC

配置資訊

  • 基本重要的配置參數,都做了解釋

    下面展示一下第一個節點的配置資訊:

[mysqld]
# Path to Galera library
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

# Cluster connection URL contains IPs of nodes
#If no IP is found, this implies that a new cluster needs to be created,
#in order to do that you need to bootstrap this node
#PXC叢集節點的IP
wsrep_cluster_address=gcomm://192.168.80.221,192.168.80.222,192.168.80.223

# In order for Galera to work correctly binlog format should be ROW
#基于ROW複制(安全可靠)
binlog_format=ROW

# MyISAM storage engine has only experimental support 預設引擎
default_storage_engine=InnoDB

# Slave thread to use
wsrep_slave_threads= 8

wsrep_log_conflicts

# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
#主鍵自增長不鎖表
innodb_autoinc_lock_mode=2

# Node IP address
#目前節點的IP位址
#wsrep_node_address=192.168.80.221
# Cluster name PXC 叢集的名稱
wsrep_cluster_name=pxc-moTzxx

#If wsrep_node_name is not specified,  then system hostname will be used
#目前節點的名稱
wsrep_node_name=pxc1

#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
#同步嚴厲模式
pxc_strict_mode=ENFORCING

# SST method 同步方法
wsrep_sst_method=xtrabackup-v2

#Authentication for SST method 同步使用的賬戶
wsrep_sst_auth="adminPXC:201107070"
           
每個主機的

server-id

wsrep_node_addres

wsrep_node_name

保持不同即可

▶ 第一個節點啟動

  • 第一個節點啟動的指令為:
systemctl start [email protected]
           
  • 檢視狀态,可以通過指令
systemctl status [email protected]
           
CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
此處,附上對第一個節點的操作指令
  • systemctl start [email protected]ap.service

  • systemctl stop [email protected]

  • systemctl restart [email protected]

  • systemctl status [email protected]

  • 為了操作友善,建議可以使用

    "Navicat"

    等工具進行連接配接

    執行

    SQL

    語句:

    show status like 'wsrep_cluster%';

    顯示效果如下:
    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄

【提示】:

一定要等第一個節點啟動,可以連接配接後,再考慮第二個、第三個節點的啟動!

6). 第二個節點【PXC2】

本次示範,我選擇

[192.168.80.222]

,作為第二個節點主機
  • 注意:

    非主節點的管理指令(非第一個啟動的 PXC 節點)
service mysql start
service mysql stop
service mysql restart
service mysql status
           
  • 為了對比參考,此處展示第二個節點的配置資訊(其他的就沒必要了)
[mysqld]
# Path to Galera library
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

# Cluster connection URL contains IPs of nodes
#If no IP is found, this implies that a new cluster needs to be created,
#in order to do that you need to bootstrap this node
#PXC叢集節點的IP
wsrep_cluster_address=gcomm://192.168.80.221,192.168.80.222,192.168.80.223

# In order for Galera to work correctly binlog format should be ROW
#基于ROW複制(安全可靠)
binlog_format=ROW

# MyISAM storage engine has only experimental support 預設引擎
default_storage_engine=InnoDB

# Slave thread to use
wsrep_slave_threads= 8

wsrep_log_conflicts

# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
#主鍵自增長不鎖表
innodb_autoinc_lock_mode=2

# Node IP address
#目前節點的IP位址
#wsrep_node_address=192.168.80.222
# Cluster name PXC 叢集的名稱
wsrep_cluster_name=pxc-moTzxx

#If wsrep_node_name is not specified,  then system hostname will be used
#目前節點的名稱
wsrep_node_name=pxc2

#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
#同步嚴厲模式
pxc_strict_mode=ENFORCING

# SST method 同步方法
wsrep_sst_method=xtrabackup-v2

#Authentication for SST method 同步使用的賬戶
wsrep_sst_auth="adminPXC:201107070"

           
  • 啟動後,列印資訊如下:
    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
第三個節點

【PXC3】

基本操作一樣,隻是配置檔案的參數稍有不同

7). 測試 PXC 叢集部署效果

在此,我将三個成功啟動的

mysql

服務,通過

"Navicat"

連接配接
  • 在第一個節點上,建立一個資料庫

    "test_pxc"

    進而, 建立了一個資料表

    "pxc_users"

    然後,随意,在資料表中添加了幾條記錄
  • 打開第二個節點、第三個節點

    重新整理,會發現也會有同樣的資料庫,資料表

  • 繼而修改任意一個節點的資料,

    會發現,其他節點也會同步更新

    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄

PXC 節點重新開機問題

【官方 - 重新啟動叢集節點】

不同于

Replication

叢集的重新開機操作,

PXC

叢集需要分好幾種情況

▶ 強行關機之後,PXC 叢集無法啟動

這種情況常見于測試練習時,虛拟機關機的情況
  • 以我的操作經曆為例:

    昨天直接關閉所有的虛拟機,

    今天想着繼續

    PXC

    叢集的測試

    發現,都無法啟動了

    提示資訊如下:

    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
  • 部分網上經驗,是:

    檢視一下各個虛拟機中的

    "/var/lib/mysql/grastate.dat"

    檔案

    然後,将

    "safe_to_bootstrap: 1"

    的主機作為第一個節點進行啟動

    但是,我發現所有的主機參數都為

    "0"

  • 此時我的解決方案為:

    選中其中一個主機,将

    "safe_to_bootstrap"

    參數手動改為

    "1"

    然後将其作為第一個節點啟動
vim /var/lib/mysql/grastate.dat
systemctl start [email protected]
           
  • 其他節點,依次啟動即可,指令:
service mysql start
           
測試同步狀況,我這裡是完全沒有問題的 …

▶ 最後關閉的 PXC 節點是安全退出時

這種情況,一般就是停服檢測、資料維護才會全部退出 …
  • 此時,可以檢視

    "grastate.dat"

    檔案(預設會在

    "/var/lib/mysql/"

    目錄中)

    其中

    safe_to_bootstrap: 1

    再次啟動叢集時,則先啟動該節點

cat /var/lib/mysql/grastate.dat
systemctl start [email protected]
           

▶ 節點正常退出後,重新加入進群

這種情況,多發生在資料庫冷備份時,選取其中一台主機,正常退出

service mysql stop

  • 此處,不用厘清目前主機是第幾個節點

    畢竟在兩個節點以後,就沒有主從之分了

    等其他操作完成後

    直接以非第一個節點操作啟動即可

service mysql start
           

注意:

這種情況的前提 —— 存在正常工作狀态中的

PXC

節點

PXC 叢集實際應用探讨

ThinkPHP5

上的使用

以鄙人常用的

ThinkPHP5

架構使用為例
  • 那麼,在

    "config/database.php"

    中的配置參考如下:
    //------------- PXC 叢集配置參考----------------------------------
      'hostname'        => ['192.168.80.221','192.168.80.222','192.168.80.223'],
      'database'        => 'test_pxc',
      'username'        => 'root',
      'password'        => 'mT123456',
      'hostport'       =>  '3306',
      'deploy'          => 1,
    //-------------------------------------------------------------
               

MyCat

部署讀寫分離

【提示】:

  • 在成熟的項目配置中,應該是考慮其他中間件來進行資料庫分布式部署操作的

    比如,阿裡開源的

    MyCat

    感興趣的可以閱讀下整理的文章

    ——

    【CentOS7 下使用 MyCat 實作 MySQL 讀寫分離/主從切換】

  • 我在

    【192.168.80.221】

    主機上安裝了

    mycat

    服務

    在此,附一張配置截圖以作參考:

    CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
  • 如此一來

    上面項目配置中,就隻會顯示

    mycat

    連接配接資訊(減少負載均衡配置中的代碼備援)
    //------------- MyCat 主從分離配置參考----------------------------------
      'hostname'        => '192.168.80.221',
      'database'        => 'mycat_tp5_pro',
      'username'        => 'root_mycat',
      'password'        => 'mycat_007',
      'prefix'          => 'tp5_',//字首而已,不要太在意
      'hostport'        => '8066',
    //-------------------------------------------------------------
               

☞ 對比

“Replication”

叢集部署

通常來講,對于資料庫叢集部署,

"PXC"

都會拿來與

"Replication"

進行對比!
CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄

Replication

部署方案】:

CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄

PXC

部署方案】:

CentOS7 下 MySQL 資料庫 PXC 叢集部署操作指導背景前期準備搭建 PXC 叢集PXC 節點重新開機問題PXC 叢集實際應用探讨附錄
注意,兩種方案不是對立的,一個大型項目中,完全可以根據自己的業務 :

結合使用、取長補短

可對比參考文章 —— 【CentOS7 下 MySQL5.7.32 主從複制+同步配置操作 (一主多從+多主多從)】

附錄

☞ 關閉

mysql

的開啟自啟動

  • 很多系統,預設了

    mysql

    會開啟自啟動,感覺很友善

    但是,對于部署了

    PXC

    叢集的資料庫,會因為節點啟動方式的不同有影響
建議關閉開機啟動

☞ 提示:寶塔

mysql

版本與依賴包安裝沖突

  • 提示資訊如下:

    file /usr/include/mysql/mysql/plugin.h from install of Percona-XtraDB-Cluster-devel-57-5.7.32-31.47.1.el7.x86_64 conflicts with file from package bt-mysql57-5.7.32-1.el7.x86_64

  • 此時,我參考網友的建議:直接解除安裝掉原來的

    mysql

yum -y remove  bt-mysql57-5.7.32-1.el7.x86_64
           

☞ 如何重置 root 密碼

  • 首先,在

    "mysqld.cnf"

    檔案中

    配置參數 :

    skip-grant-tables

  • 然後,重新開機

    mysql

    服務
systemctl restart mysql.service
           
  • 此時,進入 mysql

    使用指令:

    mysql -uroot -p

    ,回車後無需密碼
  • 然後, 執行

    SQL

    語句:
flush privileges; #重新整理權限
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼'; #重置新密碼
exit; #修改完畢,退出 mysql
           
  • 接下來,将第一步開啟的參數關閉,重新開機

    mysql

    服務即可
systemctl restart mysql.service
           

☞ 推薦文章

  • 【PXC 原理分析】