PXC管理数据库服务器(引擎)
目錄
一.PXC(Percona XtraDB Cluster)概述
二.部署PXC
1.準備示例
2.配置服務
3.啟動服務
4.測試配置
三.存儲引擎
1.存儲引擎的概述
2.查看引擎
3.讀鎖和寫鎖
4.行鎖和表鎖
5.MyISAM
6.InnoDB
7.MEMORY
一.PXC(Percona XtraDB Cluster)概述
PXC介紹
????????- 是基于Galera的MySQL高可用集群解決方案
????????- Galera Cluster是Codership公司開發的一套免費開源的高可用方案
????????- PXC集群主要由兩部分組成:Percona Server with XtraDB和Write Set Replication patches(同步、多主復制插件)
????????- 官網http://galeracluster.com
PXC特點
????????- 數據強一致性、無同步延遲
????????- 沒有主從切換操作,無需使用虛擬IP
????????- 支持InnoDB存儲引擎
????????- 多線程復制
????????- 部署使用簡單
????????- 支持節點自動加入,無需手動拷貝數據
相應端口
????????- 3306:數據庫服務端口
????????- 4444:SST端口
????????- 4567:集群通信端口
????????- 4568:IST端口
????????- SST:State Snapshot Transfer 全量同步
????????- IST:Incremental State Transfer 增量同步
二.部署PXC
1.準備示例
1)服務器角色
????????- 三臺相互獨立的mysql服務器:192.168.1.11、192.168.1.12、192.168.1.13
2)初始環境準備
- 配置服務器的名稱解析
- 準備yum源
[root@zzgrhel8 mysql_soft]# cd pxc [root@zzgrhel8 pxc]# tar xf Percona-XtraDB-Cluster-5.7.25-31.35-r463-el7-x86_64-bundle.tar [root@zzgrhel8 pxc]# cp *.rpm /var/www/html/mysql/ [root@zzgrhel8 pxc]# cd /var/www/html/mysql/ [root@zzgrhel8 mysql]# createrepo -v .- 安裝軟件包
[root@mysql1 ~]# yum clean all [root@mysql1 ~]# yum remove -y mysql-community-* [root@mysql1 ~]# yum install -y qpress-1.1-14.11 Percona-XtraDB-Cluster-*[root@mysql2 ~]# yum clean all [root@mysql2 ~]# yum remove -y mysql-community-* [root@mysql2 ~]# yum install -y qpress-1.1-14.11 Percona-XtraDB-Cluster-*[root@mysql3 ~]# yum clean all [root@mysql3 ~]# yum remove -y mysql-community-* [root@mysql3 ~]# yum install -y qpress-1.1-14.11 Percona-XtraDB-Cluster-*2.配置服務
- 分別修改3臺服務器的mysqld.cnf文件
# 如果服務器之前安裝過mysql,把數據目錄清空
- 分別修改3臺服務器的mysqld_safe.cnf (使用默認配置即可)
[root@mysql1 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf [mysqld_safe] pid-file = /var/run/mysqld/mysqld.pid socket = /var/lib/mysql/mysql.sock nice = 0[root@mysql2 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf [mysqld_safe] pid-file = /var/run/mysqld/mysqld.pid socket = /var/lib/mysql/mysql.sock nice = 0[root@mysql3 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf [mysqld_safe] pid-file = /var/run/mysqld/mysqld.pid socket = /var/lib/mysql/mysql.sock nice = 0- 分別修改3臺服務器的wsrep.cnf
[root@mysql1 ~]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf # 修改以下內容: wsrep_cluster_address=gcomm://192.168.1.11,192.168.1.12,192.168.1.13 # 集群成員 wsrep_node_address=192.168.1.11 # 本節點IP地址 wsrep_cluster_name=pxc-cluster # 集群名 wsrep_node_name=mysql1 # 本節點名 wsrep_sst_auth="sstuser:NSD2021@tedu.cn" # SST數據同步授權用戶及密碼[root@mysql2 ~]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf # 修改以下內容: wsrep_cluster_address=gcomm://192.168.1.11,192.168.1.12,192.168.1.13 # 集群成員 wsrep_node_address=192.168.1.12 # 本節點IP地址 wsrep_cluster_name=pxc-cluster # 集群名 wsrep_node_name=mysql2 # 本節點名 wsrep_sst_auth="sstuser:NSD2021@tedu.cn" # SST數據同步授權用戶及密碼[root@mysql3 ~]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf # 修改以下內容: wsrep_cluster_address=gcomm://192.168.1.11,192.168.1.12,192.168.1.13 # 集群成員 wsrep_node_address=192.168.1.13 # 本節點IP地址 wsrep_cluster_name=pxc-cluster # 集群名 wsrep_node_name=mysql3 # 本節點名 wsrep_sst_auth="sstuser:NSD2021@tedu.cn" # SST數據同步授權用戶及密碼3.啟動服務
- 啟動集群服務
# 首次啟動服務時間比較長 [root@mysql1 ~]# systemctl start mysql@bootstrap.service [root@mysql1 ~]# grep password /var/log/mysqld.log [root@mysql1 ~]# mysql -uroot -p'!Yo.e(qv:0pH' mysql> alter user root@'localhost' identified by 'NSD2021@tedu.cn'; mysql> grant reload, lock tables,replication client,process on *.* to-> sstuser@'localhost' identified by 'NSD2021@tedu.cn'; Query OK, 0 rows affected, 1 warning (0.20 sec)- 啟動其他節點,其他節點將會自動同步第一臺服務器的數據(授權用戶等)
[root@mysql2 ~]# systemctl start mysql [root@mysql2 ~]# netstat -utnlp | grep :3306 tcp6 0 0 :::3306 :::* LISTEN 18875/mysqld [root@mysql2 ~]# netstat -utnlp | grep :4567 tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN 18875/mysqld[root@mysql3 ~]# systemctl start mysql [root@mysql3 ~]# netstat -utnlp | grep :3306 tcp6 0 0 :::3306 :::* LISTEN 18465/mysqld [root@mysql3 ~]# netstat -utnlp | grep :4567 tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN 18465/mysqld4.測試配置
1)查看集群信息
- 在任意數據庫服務器查看信息
[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> show status like "%wsrep%"; # 找到以下信息 | wsrep_incoming_addresses | 192.168.1.11:3306,192.168.1.12:3306,192.168.1.13:3306 | | wsrep_cluster_weight | 3 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_ready | ON |- 訪問集群,在任意數據庫服務器存取數據
mysql> grant all on db1.* to dbuser1@'%' identified by 'NSD2021@tedu.cn'; Query OK, 0 rows affected, 1 warning (0.48 sec)mysql> show grants for dbuser1; +--------------------------------------------------+ | Grants for dbuser1@% | +--------------------------------------------------+ | GRANT USAGE ON *.* TO 'dbuser1'@'%' | | GRANT ALL PRIVILEGES ON `db1`.* TO 'dbuser1'@'%' | +--------------------------------------------------+ 2 rows in set (0.00 sec) - 客戶端連接集群任意數據庫服務器存取數據 [root@node10 ~]# mysql -h192.168.1.11 -udbuser1 -pNSD2021@tedu.cn mysql> create database db1 default charset utf8mb4; Query OK, 1 row affected (0.57 sec)mysql> create table db1.students(id int primary key auto_increment, name varchar(20)); Query OK, 0 rows affected (0.92 sec)mysql> insert into db1.students(name) values ('tom'); Query OK, 1 row affected (0.15 sec)- 客戶端連接各數據庫服務器查看數據
[root@node10 ~]# mysql -h192.168.1.12 -udbuser1 -pNSD2021@tedu.cn mysql> select * from db1.students; +----+------+ | id | name | +----+------+ | 1 | tom | +----+------+ 1 row in set (0.00 sec)[root@node10 ~]# mysql -h192.168.1.13 -udbuser1 -pNSD2021@tedu.cn mysql> select * from db1.students; +----+------+ | id | name | +----+------+ | 1 | tom | +----+------+ 1 row in set (0.00 sec)2)測試故障自動恢復
- 停止3臺服務器的任意一臺主機的數據庫服務都不會影響數據的存取。
- 啟動停止的mysql服務器,數據將會自動同步
[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> select * from db1.students; +----+-------+ | id | name | +----+-------+ | 1 | tom | | 5 | jerry | +----+-------+ 2 rows in set (0.00 sec)?重新啟動全部關閉后的mysql
# 查看所有的mysql服務器,找到具有最高seqno的節點,把safe_to_boostrap的值改為1 [root@mysql3 ~]# cat /var/lib/mysql/grastate.dat # GALERA saved state version: 2.1 uuid: a3b378ea-ce50-11eb-b624-0780367f3ddd seqno: 7 safe_to_bootstrap: 1 [root@mysql3 ~]# systemctl start mysql@bootstrap.service# 啟動其他主機的mysql服務 [root@mysql1 ~]# systemctl start mysql [root@mysql2 ~]# systemctl start mysql三.存儲引擎
1.存儲引擎的概述
????????- 數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)使用數據引擎進行創建、查詢、更新和刪除數據。
????????- 不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎,還可以獲得特定的功能。
????????- 現在許多不同的數據庫管理系統都支持多種不同的數據引擎。
????????- MySQL支持很多存儲引擎,包括MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE等,其中InnoDB和BDB支持事務安全。
2.查看引擎
- 查看數據庫使用的、支持的引擎
mysql> show engines; # DEFAULT表示默認使用的引擎,- 查看當前表使用的存儲引擎
mysql> show create table nsd2021.departments\G *************************** 1. row ***************************Table: departments Create Table: CREATE TABLE `departments` (`dept_id` int(4) NOT NULL AUTO_INCREMENT,`dept_name` varchar(10) DEFAULT NULL,PRIMARY KEY (`dept_id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec)# 或mysql> use nsd2021; mysql> show table status\G *************************** 1. row ***************************Name: departmentsEngine: InnoDBVersion: 10Row_format: DynamicRows: 8Avg_row_length: 2048Data_length: 16384 Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: 9Create_time: 2021-04-19 20:41:46Update_time: 2021-04-19 20:41:46Check_time: NULLCollation: utf8mb4_general_ciChecksum: NULLCreate_options:Comment: *************************** 2. row ***************************Name: employeesEngine: InnoDBVersion: 10Row_format: DynamicRows: 133Avg_row_length: 123Data_length: 16384 Max_data_length: 0Index_length: 16384Data_free: 0Auto_increment: 134Create_time: 2021-04-19 20:41:46Update_time: 2021-04-19 20:41:47Check_time: NULLCollation: utf8mb4_general_ciChecksum: NULLCreate_options:Comment: *************************** 3. row ***************************Name: salaryEngine: InnoDBVersion: 10Row_format: DynamicRows: 8066Avg_row_length: 44Data_length: 360448 Max_data_length: 0Index_length: 163840Data_free: 0Auto_increment: 9577Create_time: 2021-04-19 20:41:47Update_time: 2021-04-19 20:41:49Check_time: NULLCollation: utf8mb4_general_ciChecksum: NULLCreate_options:Comment: 3 rows in set (0.01 sec)- 創建表時指定使用的存儲引擎
mysql> create table nsd2021.students(id int primary key auto_increment, name varchar(20)) engine=myisam; Query OK, 0 rows affected (0.03 sec)mysql> show create table nsd2021.students \G *************************** 1. row ***************************Table: students Create Table: CREATE TABLE `students` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec)3.讀鎖和寫鎖
????????- 無論何時,只要有多個SQL需要同一時刻修改數據,都會產生并發控制的問題。
????????- 解決這類經典問題的方法就是并發控制,即在處理并發讀或者寫時,可以通過實現一個由兩種類型的鎖組成的鎖系統來解決問題。
????????- 這兩種鎖就是共享鎖和排他鎖,也叫讀鎖和寫鎖。
????????- **讀鎖**是**共享**的,即相互不阻塞的,多個客戶在同一時刻可以讀取同一資源,互不干擾。
????????- 寫鎖是排他的,即一個寫鎖會阻塞其它的寫鎖和讀鎖,只有這樣,才能確保給定時間內,只有一個用戶能執行寫入,防止其它用戶讀取正在寫入的同一資源。
????????- 寫鎖優先級高于讀鎖。
4.行鎖和表鎖
????????- 實際數據庫系統中每時每刻都在發生鎖定,鎖也是有粒度的,提高共享資源并發行的方式就是讓鎖更有選擇性,盡量只鎖定需要修改的部分數據,而不是所有的資源,因此要進行精確的鎖定。
????????- 由于加鎖也需要消耗資源,包括獲得鎖、檢查鎖是否解除、釋放鎖等,都會增加系統的開銷
????????- 所謂的鎖策略就是要在鎖的開銷和數據的安全性之間尋求平衡,這種平衡也會影響性能。
????????- 每種MySQL存儲引擎都有自己的鎖策略和鎖粒度,最常用的兩種重要的鎖策略分別是表鎖和行鎖。
????????? - 表鎖是開銷最小的策略,會鎖定整張表,用戶對表做寫操作時,要先獲得寫鎖,這會阻塞其它用戶對該表的所有讀寫操作。沒有寫鎖時,其它讀取的用戶才能獲得讀鎖,讀鎖之間是不相互阻塞的。
????????? - 行鎖可以最大程度支持并發處理,但也帶來了最大的鎖開銷,它只對指定的記錄加鎖,其它進程還是可以對同一表中的其它記錄進行操作。
????????? - 表級鎖速度快,但沖突多,行級鎖沖突少,但速度慢。
5.MyISAM
????????- 它是MySQL5.5之前的默認存儲引擎
????????- 優勢:訪問速度快
????????- 適用場景:對事務的完整性沒有要求,或以select、insert為主的應用基本都可以選用MYISAM。在Web、數據倉庫中應用廣泛。
????????- 特點:
????????????????? - 不支持事務、外鍵
????????????????? - 每個myisam在磁盤上存儲為3個文件,文件名和表名相同,擴展名分別是
? ????????????????? ?? - .frm:存儲表定義
?????????????????????? - .myd:MYData,存儲數據
????????????????? ? ?? - .myi:MYIndex,存儲索引
6.InnoDB
????????- MySQL5.5之后的默認存儲引擎
????????- 應用場景:如果應用對事務的完整性有較高的要求,在并發條件下要求數據的一致性,數據操作中包含讀、插入、刪除、更新,那InnoDB是最好的選擇。在計費系統、財務系統等對數據的準確性要求較高的系統中被廣泛應用。
????????- 優點:提供了具有提交(Commit)、回滾(Rollback)、崩潰恢復能力的事務安全,支持外鍵。
????????- 缺點:相比較于MyISAM,寫的處理效率差一點,并且會占用更多的磁盤空間來存儲數據和索引。
- 特點:
????????? - 自動增長列:innoDB表的自動增長列必須是索引,如果是組合索引,也必須是組合索引的第一列。MyISAM表的自動增長列可以是組合索引的其他列
????????? - 外鍵約束:MySQL的存儲引擎中只有innoDB支持外鍵約束。注意:當某個表被其它表創建了外鍵參照,那么該表對應的索引和主鍵禁止被刪除。
7.MEMORY
????????- MEMORY存儲引擎是用保存在內存中的數據來創建表,每個memory表對應一個磁盤文件。格式是.frm。
????????- 適用場景:內容變化不頻繁的代碼表,作為統計操作的中間結果表,便于利用它速率快的優勢高效的對中間結果進分析。
????????- 特點:由于它的數據是存放在內存中的,并且默認使用HASH索引,所以它的訪問速度特別快,同時也造成了他的缺點,就是數據庫服務一旦關閉,數據就會丟失,另外對表的大小有限制。
總結
以上是生活随笔為你收集整理的PXC管理数据库服务器(引擎)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MHA管理所有数据库服务器
- 下一篇: nginx(No such file o