1. 程式人生 > 實用技巧 >MySQL-進階

MySQL-進階

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 服務


[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;				# 提交資料