MySQL-進階
阿新 • • 發佈:2020-12-30
DBA進階
一、MySQL主從同步
1、概述
1.1、主從同步
- 實現資料自動同步的服務結構
- 主伺服器:接受客戶端訪問連線
- 從伺服器:自動同步主伺服器資料
1.2、原理
-
Master
- 啟用binlog日誌
- 授權使用者給從伺服器
-
Slave
- Slave_IO:複製master 的 binlog 日誌檔案裡的SQL命令到本機的 relay-log 中繼日誌裡。
- Slave_SQL:執行本機的 relay-log 中繼日誌檔案裡的SQL語句,實現與Master資料一致。
-
原理圖
2、構建基本主從
2.1、主 master
- 啟用binlog
- 授權使用者
]# vim /etc/my.cnf //開啟binlog日誌 [mysqld] ... ... log_bin server_id=51 # 授權使用者: mysql> grant replication slave on *.* to repluser@"%" identified by "123456";
2.2、從 slave
- 設定server_id,不能與主伺服器相同
- 確保與主伺服器資料一致。即同步資料前,需要做一個完全備份
- 指定主庫資訊
- 啟動 slave 程度
- 檢視狀態資訊
'第1步:設定server_id' ]# vim /etc/my.cnf [mysqld] server_id=52 '第2步:同步前,確保從與主資料一致。' master ]# mysqldump -uroot -p123456 --master-data 庫名 > /allbak.sql ]# scp /allbak.sql [email protected]:/root/ slave ]# mysql -uroot -p123456 [庫名] < /root/allbak.sql '第3步:指定主庫資訊' mysql> change master to -> master_host="192.168.4.51", -> master_user="repluser", -> master_password="123456", -> master_log_file="master51.000001", -> master_log_pos=441; '第4步:啟動slave服務' mysql> start slave; '第5步:檢視狀態資訊' mysql> show slave status\G; # 主要就看以下3個引數: Master_Host: 192.168.4.51 Slave_IO_Running: Yes Slave_SQL_Running: Yes
]# ls /var/lib/mysql/
master.info # 自動生成的主伺服器資訊檔案
relay-log.info # 中繼日誌資訊檔案
host52-relay-bin.000001 # 中繼日誌會自動生成2個。
host52-relay-bin.000002
'如果需要取消從伺服器。就可把以上檔案刪除,再重啟服務即可。'
3、主從同步的擴充套件
3.1、一主多從
- 主 master
]# vim /etc/my.cnf [mysqld] server_id=51 log_bin=master51 mysql> grant replication slave on *.* to repluser@"%" identified by "123456"; mysql> show master status; +-----------------+----------+ | File | Position | +-----------------+----------+ | master51.000001 | 441 | +-----------------+----------+ ]# mysqldump -uroot -p123456 庫名 > /fullbak.sql ]# scp /fullbak.sql [email protected]:/root ]# scp /fullbak.sql [email protected]:/root
- 從 slave
]# vim /etc/my.cnf
[mysqld]
server_id=52
]# mysql -uroot -p123456 [庫名] < /root/allbak.sql
mysql> change master to
-> master_host="192.168.4.51",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="master51.000001",
-> master_log_pos=154;
mysql> start slave;
mysql> show slave status\G
- 從 slave
]# vim /etc/my.cnf
[mysqld]
server_id=53
]# mysql -uroot -p123456 [庫名] < /root/allbak.sql
mysql> change master to
-> master_host="192.168.4.51",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="master51.000001",
-> master_log_pos=441;
mysql> start slave;
mysql> show slave status\G
3.2、主 - 從(主) - 從
假設所有伺服器在設定前資料均一致。這步不再設定。
- 主 master
]# vim /etc/my.cnf
[mysqld]
server_id=53
log_bin=master51
mysql> grant replication slave on *.* to repluser@"%" identified by "123456";
mysql> show master status;
+-----------------+----------+
| File | Position |
+-----------------+----------+
| master53.000001 | 154 |
+-----------------+----------+
- 從(主)
'既作為53的從伺服器,又作為55的主伺服器'
]# vim /etc/my.cnf
[mysqld]
server_id=54
log_bin=master54
log_slave_updates # 允許級聯複製。(重點)
... ...
mysql> grant replication slave on *.* to repluser@"%" identified by "123456";
mysql> change master to
-> master_host="192.168.4.53",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="master53.000001",
-> master_log_pos=154;
mysql> start slave;
mysql> show slave status\G
mysql> show master status;
+-----------------+----------+
| File | Position |
+-----------------+----------+
| master54.000001 | 441 |
+-----------------+----------+
- 從
]# vim /etc/my.cnf
[mysqld]
server_id=55
... ...
mysql> change master to
-> master_host="192.168.4.54",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="master54.000001",
-> master_log_pos=441;
mysql> start slave;
mysql> show slave status\G
3.3、主主結構
- 配置要點:2臺伺服器之間,既是主,也是從。
- 都要開啟binlog日誌。
- 都需要指定對方為主伺服器。
3.4、修改複製模式
-
非同步複製(預設模式)
- 主庫執行完一次事務後,立即將結果返回給客戶端,並不關心從庫是否已經接收並處理。
-
全同步複製
- 當主庫執行完一次事務,且所有從庫都執行了該事務後才將結果返回給客戶端。
-
半同步複製(實際生產常用型別)
- 介於非同步複製和全同步複製之間。
- 主庫在執行完一次事務後,等待至少一個從庫接到並寫到 relay-log 中才將結果返回客戶端。
-
修改模式:即載入相應的模組。
- 主伺服器載入master模組,從伺服器載入slave模組。
- 如果既是主,又是從。則主從模組都需要載入。
# 1、檢視是否支援動態載入模組:
mysql> show variables like "have_dynamic_loading";
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
# 2、載入模組:
mysql> install plugin rpl_semi_sync_master
-> soname "semisync_master.so";
mysql> install plugin rpl_semi_sync_slave
-> soname "semisync_slave.so";
# 3、檢視是否載入成功:
mysql> select plugin_name,plugin_status
-> from information_schema.plugins
-> where plugin_name like "%semi%";
+----------------------+---------------+
| plugin_name | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
| rpl_semi_sync_slave | ACTIVE |
+----------------------+---------------+
# 4、啟用模組:
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> show variables like "rpl_semi_sync_%_enabled";
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_slave_enabled | ON |
+------------------------------+-------+
# 5、修改配置檔案使其永久生效:
[root@host ~]# vim /etc/my.cnf
plugin-load = "rpl_semi_sync_master=semisync_master.so"
rpl_semi_sync_master_enabled=1
plugin-load = "rpl_semi_sync_master=semisync_slave.so"
rpl_semi_sync_slave_enabled=1
如果主從都需要載入,可合併為一條寫:
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so;"
二、讀寫分離
1、原理
- 由MySQL代理面向客戶端提供服務
- 收到SQL的寫請求時,交給master伺服器處理
- 收到SQL的讀請求時,交給slave伺服器處理
2、MaxScale 服務
-
MaxScale :是一款代理軟體
- 由MySQL 的兄弟公司 MariaDB 開發
- 下載地址:https://downloads.mariadb.com/files/MaxScale
-
配置
[root@host57 ~]# vim /etc/maxscale.cnf
... ...
[maxscale]
threads=auto # 執行緒個數設定為自動:根據CPU執行緒自動生成相應的執行緒數。
[server1] # 定義資料庫伺服器
type=server
address=192.168.4.51 # master主機IP
port=3306
protocol=MySQLBackend
[server2] # 定義資料庫伺服器
type=server
address=192.168.4.52 # slave主機IP
port=3306
protocol=MySQLBackend
[MySQL Monitor] # 定義要監視的資料庫節點
type=monitor
module=mysqlmon
servers=server1, server2 # 指定監控的伺服器
user=maxscalemon # 監控使用者。
passwd=123456
monitor_interval=10000
[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2
user=maxscalerouter # 以此使用者名稱連線後臺資料庫,用來查詢驗證客戶端提供的使用者名稱密碼是否正確。
passwd=123456
max_slave_connections=100%
[MaxAdmin Service] # 定義maxscale管理服務
type=service
router=cli
[Read-Write Listener] # 定義讀寫分離服務的埠號。
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006
[MaxAdmin Listener] # 定義maxscale管理服務埠號
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
port=4016 # 此行是預設沒有的。如無指定,則預設會有一個埠號。
- 在主/從伺服器建立授權使用者(在主伺服器上建立即可,會同步的)
mysql> grant replication slave,replcation client
-> on *.* to maxscalemon@"%" identified by "123456";
replication client:這個許可權就是監視資料庫伺服器是否執行正常。
replication slave:監控主/從狀態,判斷誰是主,誰是從。
-------------------------------------------------------------------------
mysql> grant select on mysql.* to maxscaleroute@"%" identified by "123456";
# 授權"路由使用者"時,只需要給其'mysql授權庫'的查詢許可權即可。因其只是用來驗證客戶端來連線時提供的使用者名稱密碼是否存在。
3、測試
- 啟服務、查狀態
]# maxscale -f /etc/maxscale.cnf # 啟服務。
]# netstat -atunp | grep maxscale # 檢視狀態。
]# kill -9 PID號 # 停止服務。殺死程序。
]# yum -y install mariadb //安裝提供mysql命令的軟體包
]# maxadmin -uadmin -pmariadb -P4016 //檢視監控資訊(在maxscale本機自己訪問自己)
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server | Address | Port | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1 | 192.168.4.51 | 3306 | 0 | Master, Running
server2 | 192.168.4.52 | 3306 | 0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------
- 客戶端連線
]# mysql -h192.168.4.57 -P4006 -uyaya66 -p123qqq...A
三、MySQL多例項
多例項:在一臺物理主機上執行多個數據庫伺服器。即:虛擬資料庫服務。
- 可以節約運維成本,提高硬體利用率。
1、裝包
- 注意MySQL版本,一般低版本不支援多例項。
]# yum -y install libaio // 依賴包
]# useradd mysql // 稍後已編譯的直接解包的軟體不會自動建立mysql使用者。
]# tar -xvf mysql-5.7.20-linux-x86_64.tar.gz
]# mv mysql-5.7.20-linux-x86_64 /usr/local/mysql //解包後直接移動到此目錄
------------------------------------------------------------------
mysql 的命令全部在:/usr/local/mysql/bin/
]# PATH=/usr/local/mysql/bin:$PATH //為後續使用方便。
'寫成開機自動執行的全域性變數。以下2種方法都可以:'
]# vim /etc/bashrc
export PATH=/usr/local/mysql/bin:$PATH
]# vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH
2、配置
- 主配置檔案:/etc/my.cnf
- 每個例項要有獨立的:資料庫目錄、埠、socket 檔案、pid 檔案、錯誤日誌檔案。
- socket 檔案:一般是本機訪問本機資料庫時,用來傳遞資料的。可理解為程式介面檔案。
]# vim /etc/my.cnf //自己建立。
[mysql_multi] # 啟用多例項功能
mysqld=/usr/local/mysql/bin/mysqld_safe # 指定程序檔案路徑
mysqladmin=/usr/local/mysql/bin/mysqladmin # 指定管理命令的路徑
user=root # 指定程序使用者(即用作業系統root啟用此服務)
[mysqldX] # 定義例項。X表示編號,如:mysql1
port=3307 # 定義埠號
datadir=/dir # 資料庫目錄。無需手動建立。(以下均無需要手動建立,可自定義)
socket=/dir1/mysql1.sock
pid-file=/dir1/mysqld1.pid
log-error=/dir1/mysqld1.err
[mysqldX] # 定義例項。X表示編號,如:mysql2
port=3308 # 定義埠號
datadir=/dir # 資料庫目錄。無需手動建立。(以下均無需要手動建立,可自定義)
socket=/dir2/mysql2.sock
pid-file=/dir2/mysqld2.pid
log-error=/dir2/mysqld2.err
3、啟服務
]# mysqld_multi start 例項編號 //啟服務
]# mysqld_multi --user=root --password=123456 stop 例項編號 //停止服務
4、客戶端連線
]# mysql -uroot -p'初始密碼' -S sock檔案 //初始密碼在啟服務時會出現。
mysql> alter user root@"localhost" identified by "新密碼";
四、資料分片
1、概述
資料分片:即將資料分割後進行儲存。
- 將存放在一臺資料庫伺服器中的資料,按照特定方式進行拆分,分散存放到多臺資料庫伺服器中,以達到分散單臺伺服器負載的效果。
分片方式:
- 水平分割(橫向切分)
- 按照表中指定欄位的分片規則,將表記錄按行切分,分散儲存到多個數據庫中。
- 垂直分割(縱向切分)
- 將單個數據庫的多個表按業務型別分類,分散儲存到不同的資料庫。
2、MyCAT
2.1、軟體介紹
-
mycat 是基於JAVA的分散式資料庫系統的中介軟體,為高併發環境的分散式儲存提供解決方案。
- 適合資料大量寫入的儲存需求
- 支援MySQL、Oracle、SQLserver、Mongodb 等
- 可提供資料讀寫分離服務
- 提供資料分片服務
- 基於阿里巴巴 Cobar 進行研發的開源軟體
-
分片規則(10種)
- 列舉法:sharding-by-infile
- 固定分片:rule1
- 範圍約定:auto-sharding-long
- 求模法:mod-long
- 日期列分割槽法:sharding-by-date
- 通配取模:sharding-by-pattern
- ASCII 碼求模通配:sharding-by-prefixpattern
- 程式設計指定:sharding-by-substring
- 字串拆分HASH解析:sharding-by-stringhash
- 一致性HASH:sharding-bymurmur
2.2、工作過程
- 當 mycat 收到一個SQL命令時。
- 解析SQL命令涉及到的表
- 然後看對錶的配置,如果有分片規則,則獲取SQL命令裡分片欄位的值,並匹配分片函式,獲得分片列表
- 再將SQL命令發往對應的分片伺服器去執行
- 最後收集和處理所有分片結果資料,並返回到客戶端。
3、裝包
yum -y install java-1.8.0-openjdk
tar -xvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv mycat /usr/local/ # 免安裝,直接放入local下
ls /usr/local/mycat/ # 檢視目錄結構
# 目錄結構:
bin # mycat命令
catlet # 擴充套件功能
conf # 配置檔案
lib # mycat使用的jar包
logs # mycat啟動日誌和執行日誌
wrapper.log # mycat服務啟動日誌
cat.log # 記錄SQL指令碼執行後的報錯內容
在conf目錄下:
server.xml # 設定連線賬號及邏輯庫
schema.xml # 配置資料分片
rule.xml # 分片規則
其它檔案 # 分片規則的函式呼叫檔案
4、配置
- 定義客戶端連線 mycat 服務的使用者
]# vim /usr/local/mycat/conf/server.xml
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
- 定義分片的表
<schema ... ... </schema> # 定義分片資訊。庫資訊等。
<table ... ... </table> # 定義表。
name= # 標明邏輯庫名,表名。
dataNode= # 指定分片儲存的資料庫。
rule= # 指定:分片規則
type=global # 不分片儲存。
--------------------------------------------------------------------------
]# vim /usr/local/mycat/conf/schema.xml
... ...
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
......
</table>
</schema>
- 定義資料節點
<dataNode name= dataHost= database= /> # 定義指定分片的資料庫的資訊。
name= # 資料節點名
dataHost= # 資料庫伺服器主機名。(自定義)
database= # 指定真實儲存的庫名。
-------------------------------------------------------------------------
[]# vim /usr/local/mycat/conf/schema.xml
... ...
<dataNode name="dn1" dataHost="mysql53" database="db1" />
<dataNode name="dn2" dataHost="mysql54" database="db2" />
<dataNode name="dn3" dataHost="mysql55" database="db3" />
- 定義資料庫伺服器 IP 地址及埠
<datahost ... ... ... > </datahost> # 定義伺服器資訊。
name= # 主機名(與前面datahost對應的主機名)
host= # 主機名(與IP地址對應的主機名)
url= # 資料庫伺服器IP地址及埠號。
user= # 資料庫伺服器授權使用者
password= # 授權使用者密碼
--------------------------------------------------------------------------
<dataHost name="mysql53" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.4.53:3306" user="admin" password="123456">
</writeHost>
</dataHost>
- 資料庫伺服器需要建立對應的庫及授權使用者。
mysql> create table db1;
mysql> create table db2;
mysql> create table db3;
mysql> grant all on *.* to admin@"%" identified by "123456";
'注意:此授權使用者為mycat排程主機訪問資料庫伺服器使用的。不是給客戶端使用的。'
5、啟服務
]# cd /usr/local/mycat/bin/
]# ./mycat --help //可檢視相應命令。
Usage: /usr//local/mycat/bin/mycat { console | start | stop | restart | status | dump }
]# /usr/local/mycat/bin/mycat start
]# /usr/local/mycat/bin/mycat stop
]# netstat -atunpl | grep 8066 //埠號是8066
6、客戶端連線
]# mysql -h分片管理主機IP -P埠號 -u
mysql -h192.168.4.56 -P8066 -uroot -p123456
五、MHA叢集
1、概述
1.1、MHA(Master High Availability)
- 由日本 DeNA 公司youshimaton開發
- 是一套優秀的實現MySQL高可用的解決方案
- 資料庫的自動故障切換操作能做到在0~30秒之間完成
- MHA能確保在故障切換過程中最大限度保證資料的一致性,以達到真正意義上的高可用
- MHA可以同時管理多個叢集。
1.2、MHA 的組成
- MHA Manager(管理節點)
- 管理所有資料庫伺服器
- 可以單獨部署在一臺獨立的機器上
- 也可以部署在某臺數據庫伺服器上
- MHA Node(資料節點)
- 儲存資料的MySQL伺服器
- 執行在每臺MySQL伺服器上
1.3、MHA 的工作過程
- 由 Manager 定時探測叢集中的 master 節點
- 當監控服務發現主伺服器宕機,監控服務會停止,然後觸發故障切換指令碼。
- 當 master 故障時,Manager 自動將擁有最新資料的 slave 提升為新的 master
2、準備
2.1、安裝依賴包
'所有主機上都需要安裝系統自帶的 perl 軟體包。因 MHA 是由 perl 編寫的。'
]# yum -y install perl-*
]# yum -y install mha-soft-student/perl-* //共享檔案中也有perl包需要安裝。
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.art.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
2.2、配置ssh金鑰
'所有資料庫伺服器之間彼此ssh 要免密登入。管理主機,即MHA排程器要對所有MYSQL伺服器ssh免密'
]# ssh-keygen
]# for i in 57 51 52 53
> do
> ssh-copy-id [email protected].$i
> done
2.3、配置一主多從
'主MySQL'
]# vim /etc/my.cnf
[mysqld]
server_id=51
log_bin=master51
mysql> grant replication slave on *.* to repluser@"%" identified by "123456";
mysql> show master status;
'MySQL從1'
]# vim /etc/my.cnf
[mysqld]
server_id=52
mysql> change master to
-> master_host="192.168.4.51",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="master51.0000001",
-> master_log_pos=441;
mysql> start slave;
mysql> show slave status\G
'MySQL從2(設定參考從庫1)'
... ...
3、裝包
- 安裝提供 MHA 程式的軟體包
]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
]# tar -xvf mha4mysql-manager-0.56.tar.gz
]# cd mha4mysql-manager-0.56
]# perl makefile.pl // 原始碼包安裝
]# make && make install
- MHA 管理叢集的命令。
masterha_check_ssh # 檢查MHA的SSH配置狀態
masterha_check_repl # 檢查MySQL主從狀態
masterha_manager # 啟動MHA
masterha_check_status # 檢測MHA執行狀態
masterha_stop # 停止MHA
4、配置
4.1、建立主配置檔案
]# mkdir /etc/mha
]# mkdir /et/mha/app1.cnf //app1是管理的叢集名稱,可自定義。
[server default] # 管理服務預設配置
manager_workdir=/etc/mha # 工作目錄
manager_log=/etc/mha/manager.log # 日誌檔案
master_ip_failover_script=/etc/mha/master_ip_failover # 故障切換指令碼
ssh_user=root # 訪問ssh服務使用者
ssh_port=22 # ssh服務埠
repl_user=repluser # 主伺服器資料同步授權使用者
repl_password=123456
user=root # 監控使用者
password=123456
[server1] # 指定第2臺MySQL資料庫伺服器
hostname=192.168.4.51
port=3306
candidate_master=1 # 開啟競選主伺服器
[server2]
hostname=192.168.4.52
port=3306
candidate_master=1
[server3]
hostname=192.168.4.53
port=3306
candidate_master=1
4.2、設定故障切換指令碼
'此指令碼是用perl編寫的。一般在原始碼包中有模板。需要手機新增以下4行:'
]# chmod +x /etc/mha/master_ip_failover //新增執行許可權。
]# vim /etc/mha/master_ip_failover
... ...
my $vip = '192.168.4.100/24'; # Virtual IP
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
4.3、部署VIP地址
'注意:VIP是部署在MySQL主伺服器上'
]# ifconfig eth0:1 192.168.4.100 // 必須要配置臨時的。
]# ifconfig eth0:1
4.4、配置資料節點
'在所有MySQL伺服器上安裝 mha-node 包'
]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
'在所有MySQL伺服器上做授權使用者'
mysql> grant all on *.* to root@"%" identified by "123456"; # 監控使用者
mysql> grant replication slave on *.* to repluser@"%" identified by "123456";
# 資料同步使用者。必須在所有資料庫伺服器上都做。
4.5、設定半同步複製模式,並啟用從伺服器的biglog
'主MySQL'
]# vim /etc/my.cnf
[mysqld]
... ...
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so;"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0 # 禁止自動刪除中繼日誌檔案。
'中繼日誌檔案預設只保留最新的2個。為了保持資料,需要設定取消預設'
'從MySQL'
]# vim /etc/my.cnf
[mysqld]
... ...
log_bin=master52 # 2臺從伺服器都要操作。
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so;"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0 # 禁止自動刪除中繼日誌檔案。
5、測試、啟動
- 在管理節點上測試:SSH、主從
]# masterha_check_ssh --conf=/etc/mha/app1.cnf
]# masterha_check_repl --conf=/etc/mha/app1.cnf
- 啟動管理服務
--remove_dead_master_conf # 刪除宕機主庫的配置
--ignore_last_failover # 忽略xxx.health檔案
]# masterha_manager --conf=/etc/mha/app1.cnf \
--remove_dead_master_conf --ignore_last_failover
]# master_check_status --conf=/etc/mha/app1.cnf
]# masterha_stop --conf=/etc/mha/app1.cnf
6、客戶端連線
- MySQL主伺服器新增授權使用者
mysql> grant select,insert on db9.* to yaya@"%" identified by "123456";
- 客戶端連線VIP使用
]# mysql - h192.168.4.100 -uyaya -p123456
7、修復
7.1、對修復好的伺服器進行配置
- 啟動mysql服務,重新配置主從。
- 同步MYSQL主伺服器資料(主從必要配置)
- 即:備份同步。參考之前的備份技術:mysqldump、innobackupex
- 配置為從伺服器,指定主伺服器資訊。
- 啟動 slave 程序
- 檢視狀態,確保成功。
7.2、配置管理伺服器
- 修改主配置檔案/etc/mha/app1.cnf:新增[server],指定新增的伺服器
- 測試叢集環境:masterha_check_repl
- 重啟管理服務
六、PXC叢集
1、概述
1.1、介紹
- Percona XtraDB ClusterI(PXC)
- 是基於 Galera 的 MySQL 高可用叢集解決方案
- Galera Cluster 是 Codership 公司開發的一套免費開源的高可用方案
- PXC叢集主要由兩部分組成
- Percona Server with XtraDB
- Write Set Replication patches(同步、多主複製外掛)
- 官網:http://galeracluster.com
1.2、特點
- 資料強一致性、無同步延遲
- 沒有主從切換操作,無需使用VIP
- 支援INNODB儲存引擎
- 多執行緒複製
- 部署使用簡單
- 支援節點自動加入、無需手動拷貝資料
1.3、相應埠
埠 | 說明 |
---|---|
3306 | 資料庫服務埠 |
4444 | SST 埠 |
4567 | 叢集通訊埠 |
4568 | IST 埠 |
SST | State Snapshot Transfer 全量同步 |
IST | Incremental State Transfer 增量同步 |
2、裝包
2.1、主機名IP宣告
]# vim /etc/hosts
192.168.4.71 pxcnode71
192.168.4.72 pxcnode72
192.168.4.73 pxcnode73
2.2、安裝軟體
percona-xtrabackup.rpm # 線上熱備程式
qpress-1.1-14.11.x86_64.rpm # 遞迴壓縮程式
Percona-XtraDB-Cluster-server.rpm # 叢集服務程式
libev-4.15-1.el6.rf.x86_64.rpm # 依賴軟體
3、配置
- 共3個配置檔案
- 所在目錄為:/etc/percona-xtradb-cluster.conf.d/
- mysql.cnf :資料庫服務執行引數配置檔案
- mysql_safe.cnf:Percona Server 5.7的配置檔案
- wsrep.cnf:PXC叢集配置檔案
]# vim mysql.cnf
[mysqld]
server-id=1 # ID不允許重複
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 # 日誌檔案保留天數
]# vim mysqld_safe.cnf
[mysqld_safe]
pid-file=/var/run/msqld/mysqld.pid
socket=/var/lib/mysql/mysql.sock
]# vim wsrep.cnf
wsrep_cluster_address=gcomm://192.168.4.71,192.168.4.72,192.168.4.73
wsrep_node_address=192.168.4.71 # 本機IP地址
wsrep_cluster_name=pxc-cluster # 叢集名稱,全部必須相同
wsrep_node_name=pxcnode71 # 本機主機名。注意,要與/etc/hosts中一致
wsrep_sst_auth="sstuser:123456" # SST資料同步授權使用者:sstuser。密碼123456
3、啟服務
- 在叢集的其中一臺伺服器上執行即可
]# systemctl start [email protected] # 啟動叢集服務
]# grep password /var/log/mysqld.log # 檢視初始密碼
mysql> grant reload,lock tables,replication client,process
-> on *.* to sstuser@"localhost" identified by "123456";
- 啟動另外的叢集伺服器
]# systemctl start mysql //注意,沒有d。
]# ss -atunp | grep 3306
]# ss -atunp | grep 4567
4、測試
- 客戶端使用授權使用者連線任意資料庫伺服器都可以儲存資料,且可以檢視到相同的資料
- 建表時,必須有主鍵欄位。
- 任何一臺資料庫伺服器宕機都不影響使用者存取資料
- 伺服器執行後,自動同步宕機期間的資料
七、儲存引擎
1、概述
- 作為可插撥式的元件提供
- MySQL服務軟體自帶的功能程式,處理表的處理器
- 不同的儲存引擎有不同的功能和資料儲存方式
- MySQL 5.1/5.1 ------> MyISAM
- MySQL 5.5/5.6 ------> InnoDB
'檢視'
mysql> show engines;
mysql> show create table 庫名.表名; # 檢視已有表的引擎。
'修改'
mysql> alter table 表名 engine=儲存引擎名;
'在建表時指定'
mysql> create table 表名 (欄位列表) engine=引擎名;
'修改預設儲存引擎'
]# vim /etc/my.cnf
[mysqld]
... ...
default-storage-engine=引擎名
2、儲存引擎特點
MyISAM 引擎
- 主要特點
- 支援表級鎖
- 不支援事務、事務回滾、外來鍵
- 表文件
- 表名.frm // 表結構
- 表名.MYI // 索引
- 表名.MYD // 資料
Innodb 引擎
- 主要特點
- 支援行級鎖定
- 支援事務、事務回滾、外來鍵
- 表文件
- 表名.frm
- 表名.ibd
- 事務日誌檔案
- ibdata1
- ib_logfile0
- ib_logfile1
3、鎖機制
- 鎖粒度
- 表級鎖:對整張表加鎖
- 行級鎖:僅對被訪問的行分別加鎖
- 鎖型別
- 讀鎖(共享鎖):支援併發讀取資料
- 寫鎖(互斥鎖、排它鎖):是獨佔鎖,上鎖期間其他執行緒不能讀表或寫表。
'檢視當前鎖狀態'
mysql> show status like "table_lock%";
4、事務特性
- Atomic:原子性
- 事務的整個操作是一個整體,不可分割,要麼全部成功,要麼全部失敗。
- Consisency:一致性
- 事務操作的前後,表中的記錄沒有變化。
- Isolation:隔離性
- 事務的操作是相互隔離不受影響的。
- Durability:永續性
- 資料一旦提交,不可改變,永久改變表資料。
- 相關命令
mysql> show variables like "autocommit"; # 檢視提交狀態
mysql> set autocommit=off|on; # 關閉|開通 自動提交
mysql> rollback # 資料回滾
mysql> commit; # 提交資料