1. 程式人生 > >MySQL主從同步與讀寫分離

MySQL主從同步與讀寫分離

修改配置 monit 相關 流量 修改配置文件 l數據庫 cli 授權 san

MySQL主從同步
MySQL AB復制
1.對指定庫的異地同步。
2.MySQL主-->從復制架構的實現。
3.MySQL服務器的只讀控制。

主從:
單向復制時,建議將從庫設置為只讀。

主從復制的原理:
Master,記錄數據更改操作。
-啟動binlog日誌
-設置binlog日誌格式
-設置server_id

Slave,運行2個線程。
-Slave_IO:復制master主機binlog日誌文件裏的SQL到本機的relay-log文件裏。
-Slave_SQL:執行本機relay-log文件裏的SQL語句,重現Master的數據操作。

構建主從同步
1.確保數據相同
-從庫必須要有主庫上的數據。

2.配置主服務器

-啟用binlog日誌及設置格式,設置server_id,授權用戶。

3.配置從服務器
-設置server_id,配置為從數據庫服務器。

4.測試同步效果
-客戶端連接主庫,寫入的數據,在訪問從庫的時候也能夠看到。

確保數據相同
Master服務器:
-應包括希望同步的所有庫
-對采用MyISAM的庫,可離線備份
mysql>reset master; //重置binlog日誌
...
#mysqldump -u root -p 123456 -B mysql test > /root/mytest.sql

Slave服務器:
-離線導入有Master提供的備份
-清空同名庫(如果存在)
mysql>drop database test; //先清理目標庫

#scp master:/root/mytest.sql ./ //直接scp遠程拷貝
#mysql -u root -p 123456 < /root/mytest.sql //確保與master的數據相同

配置主服務器
1.啟用binlog及允許同步:
vim /etc/my.cnf
[mysqld]
log_bin=master-bin //啟用binlog日誌
server_id = 10 //指定服務器ID號
binlog_format=mixed //指定日誌格式
sync-binlog=1 //允許日誌同步
....

#systemctl start mysqld //啟動服務

2.授權備份用戶:
-允許lisi從192.168.4.0/24網段訪問
-對所有庫(默認不允許對單個庫)有同步權限
mysql>grant replication slave on . to "lisi"@"192.168.4.%" identified by "123456";

3.查看Master狀態:
-記住當前的日誌文件名、偏移量位置
mysql>show master status\G;
......
File: master-bin.000002 //日誌文件名
Position: 334 //偏移量
.....

配置從服務器
1.啟用binlog及允許同步,啟用只讀模式。
vim /etc/my.cnf
[mysqld]
log_bin=slave-bin //啟用binlog日誌
server_id = 20 //指定服務器ID號
sync-binlog=1 //允許日誌同步
read_only=1 //只讀模式,同步及SUPER權限用戶例外

#systemctl start mysqld //啟動服務

2.指定Master相關參數
mysql>change master to master_host="192.168.4.10",
->master_user="lisi",
->master_password="123456",
->master_log_file="master-bin.000002", //日誌文件
->master_log_pos=334; //偏移量

mysql>start slave; //啟動復制

Master信息會自動保存到/var/lib/mysql/master.info文件,若要更改Master信息時,應先stop slave;

3.查看Slave狀態
-確認IO線程、SQL線程都已運行
mysql>show slave status\G
.....
Slave_IO_Running:Yes //IO線程已運行
Slave_SQL_Running:Yes //SQL線程已運行

從數據庫目錄下多出文件:
/var/lib/mysql/master.info //連接主服務器信息
/var/lib/mysql/relay-log.info //中繼日誌信息
/var/lib/mysql/主機名-relay-bin.xxxxxx //中繼日誌文件
/var/lib/mysql/bogon-relay-bin.index //中繼日誌索引文件

測試主從同步配置:
1 在主庫服務器上添加訪問數據的用戶
2 在客戶端使用授權用戶連接主庫,產生的數據在從庫本機也能夠查看的到。

Master服務器常用選項:
binlog_do_db= //只允許復制的庫 binlog_do_db=庫名1,庫名2,庫名n
binlog_ignore_db= //不允許復制的庫 binlog_ignore_db=庫名1,庫名2,庫名n

Slave服務器常用選項:
relay_log=Slave-relay-bin //指定中繼日誌文件名
log_slave_updates //記錄從庫更新,允許鏈式復制(級聯復制)
replicate_do_db=庫名1,庫名2,庫名n //僅復制指定庫,其他庫將被忽略(省略時復制所有庫)
replicate_ignore_db=庫名1,庫名2,庫名n //不復制哪些庫,其他庫將被忽略

註:replicate_do_db和replicate_ignore_db只需選用其中一種

主從復制的結構
單向瀆職:主-->從
鏈式復制:主-->從-->從
雙向復制:主<-->從
放射式復制:從<--主-->從

        MySQL讀寫分離

讀寫分離:把客戶端訪問數據時的查詢請求select 和寫insert 給不同的數據庫服務器處理。
讀寫分離的原理:
1.多臺MySQL服務器
-分別提供讀、寫服務,均衡流量
-通過主從復制保持一致性
2.由MySQL代理面向客戶端
-收到SQL寫請求時,交給服務器A處理
-收到SQL讀請求時,交給服務器B處理
-具體區分策略由服務設置

構建MySQL讀寫分離
1.搭建好MySQL主從復制
-Slave為只讀

2.添加一臺MySQL代理服務器
-部署/啟用 maxscale

3.客戶端通過代理主機訪問MySQL數據庫

部署MySQL代理
安裝maxscale:
rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
rpm -qc maxscale
/etc/maxscale.cnf //主配置文件
....

修改配置文件:
vim /etc/maxscale.cnf
[server1] //定義數據庫服務器
type=server
address=192.168.4.10 //master主機ip地址
port=3306
protocol=MySQLBackend

[server2] //定義數據庫服務器
type=server
address=192.168.4.20 //slave主機ip地址
port=3306
protocol=MySQLBackend

[MySQL Monitor]
type=monitor
module=mysqlmon
server=server1,server2 //定義的主、從數據庫服務器列表
user=lisi //用戶名
passwd=123456 //密碼
monitor_interval=10000

[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2 //定義的主、從數據庫服務器列表
user=zhangsan //用戶名
passwd=123456 //密碼
max_slave_connections=100%

在主、從數據庫服務器上創建授權用戶
mysql>grant replication slave,replication client on . to lisi@‘%‘ identified by "123456" ; //創建監控用戶
mysql>grant select on mysql. to zhangsan@‘%‘ identified by "123456"; //創建路由用戶
mysql>grant all on
.* to admin@‘%‘ identified by "123456"; //創建訪問用戶

啟動maxscale
主要命令:
-啟動服務
-查看端口
-停止服務
maxscale --config=/etc/maxscale.cnf //啟動服務
或 maxscale -f /etc/maxscale.cnf
netstat -alntpu |grep maxscale
pkill -9 maxscale //停止服務

讀寫分離服務使用的端口、管理服務使用的端口
4006 4009

客戶端測試
登錄MySQL代理:
-mysql -h 代理的ip地址 -p 端口 -u 用戶名 -p 密碼

測試SQL查詢、更新操作
-可成功查詢表記錄
-可成功寫入數據

登錄MySQL代理:
mysql -h192.168.4.100 -p4006 -uadmin -p123456
mysql>select @@hostname; //查看當前訪問的主機名

MySQL主從同步與讀寫分離