實驗需求:
1.配置2臺MySQL服務器(192.168.100.2,192.168.100.3)+1臺代理服務器(192.168.100.1),實現MySQL代理的讀寫分離。
2.用戶只需要訪問MySQL代理服務器,實際的SQL查詢、寫入操作交給後臺的2臺MySQL服務器來完成。
3.2臺MySQL服務器實現主從同步,其中Master服務器允許SQL查詢、寫入,Slave服務器只允許SQL查詢。
一 .MASTER數據庫服務器(192.168.100.2)的配置
1.安裝軟件包(本實驗採用MySQL5.6版本)
# rpm -qa | grep -i mysql
MySQL-shared-5.6.15-1.el6.x86_64
MySQL-devel-5.6.15-1.el6.x86_64
MySQL-embedded-5.6.15-1.el6.x86_64
MySQL-test-5.6.15-1.el6.x86_64
MySQL-server-5.6.15-1.el6.x86_64
MySQL-client-5.6.15-1.el6.x86_64
MySQL-shared-compat-5.6.15-1.el6.x86_64
2.啓動服務並登錄數據庫本機對代理服務器做用戶授權
# service mysql start && chkconfig mysql on
mysql> grant all on *.* to proxyuser@"192.168.100.1" identified by "123456";
3.創建測試數據庫和表
mysql> create database proxydb;
mysql> create table proxydb.proxytab(id int);
mysql> insert into proxydb.proxytab values (2);
二 .SLAVE數據庫服務器(192.168.100.3)的配置
1.安裝軟件包
2.啓動服務並登錄數據庫本機對代理服務器做用戶授權
# service mysql start && chkconfig mysql on
mysql> grant all on *.* to proxyuser@"192.168.100.1" identified by "123456"; //與MASTER數據庫服務器做一樣的授權
3.創建測試數據庫和表
mysql> create database proxydb; //創建一樣的庫和表
mysql> create table proxydb.proxytab(id int);
mysql> insert into proxydb.proxytab values (3); //爲了能測試區分2臺不同數據庫服務器,先插入不同數據
三.MySQL代理服務器配置
1.在做代理服務器上測試授權用戶能否登錄2臺數據庫服務器
# mysql -h192.168.100.2 -uproxyuser -p123456 //登錄MASTER服務器
mysql> select * from proxydb.proxytab;
+------+
| id |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
# mysql -h192.168.100.3 -uproxyuser -p123456 //登錄SLAVE服務器
mysql> select * from proxydb.proxytab;
+------+
| id |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
2.釋放3306端口
# service mysqld stop
# chkconfig mysqld off
# netstat -tulnp | grep :3306
3.安裝提供代理服務器的軟件包
# tar zxvf mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz
# mv mysql-proxy-0.8.3-linux-rhel5-x86-64bit /usr/local/mysql-proxy //此包爲綠色免安裝
# yum -y install lua //此軟件使用LUA腳本語言,因此需要安裝好lua軟件包
代理服務啓動時 會設置 負責寫的數據庫 負責讀數據庫服務器
調用腳本來區分用戶的訪問類型
指定自己監聽的端口
4.啓動代理服務
cd /usr/local/mproxy/bin/
使用bin目錄下的mysql-proxy腳本來啓動代理服務
# ./mysql-proxy -P 192.168.100.1:3306 -r 192.168.100.3:3306 -b 192.168.100.2:3306 -s /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua &
主要命令選項:
-P:指定代理監聽的IP地址、端口
-r:指定讀服務器的IP地址、端口
-b:指定寫服務器的IP地址、端口
-s:指定lua腳本文件
--keepalive:如果服務進程崩潰,嘗試重啓此進程
5.查看代理進程是否運行
# jobs
# netstat -tulnp | grep :3306
tcp 0 0 192.168.100.1:3306 0.0.0.0:* LISTEN 3314/mysql-proxy
//代理進程必須處於運行狀態,客戶端才能通過代理服務訪問到後端的數據庫服務器。
6.查看讀寫分離腳本
# vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
……
40 min_idle_connections = 4, //默認併發請求大於4才實行讀寫分離
41 max_idle_connections = 8,
四.客戶端通過代理訪問數據庫服務器上的數據。
# mysql -h192.168.100.1 -uproxyuser -p123456 //測試客戶端第一個連接
mysql> select * from proxydb.proxytab; //測試訪問到的是哪臺數據庫服務器
+------+
| id |
+------+
| 2 |
+------+ //分配給了寫的那臺數據庫服務器
1 row in set (0.00 sec)
# mysql -h192.168.100.1 -uproxyuser -p123456 //測試客戶端第二到第N個連接
mysql> select * from proxydb.proxytab;
測試結果:
併發訪問量大於默認的最小併發連接輸4時才區分讀寫請求
併發訪問量小於併發連接數時請求會發給寫的那臺服務器
併發訪問量縮減到小於閥值後依然區分讀寫請求
四.將2臺MySQL數據庫服務器配置主從同步架構
1.MASTER數據庫服務器(192.168.100.2)配置
1.1 實現MySQL主從同步必須保證從數據庫服務器上有主數據庫服務器上的庫和表,且表結構也要一致。通過備份主服務器上現有的庫,然後導入到從服務器上。
當現有庫、表都採用MyISAM引擎時,可執行離線備份、恢復,這樣更有效率;否則,可通過mysqldump等工具來實現庫的導出、導入。
# mysqldump -uroot -p123456 --all-databases > /root/all.sql
# scp /root/all.sql 192.168.100.3:/root/all.sql //通過scp傳給SLAVE服務器
1.2 修改/etc/my.cnf配置,重新啓動MySQL服務程序
# vim /etc/my.cnf
[mysqld]
log_bin //主服務器一定要啓用binlog日誌
server_id =2 //指定服務器ID號
innodb_flush_log_at_trx_commit=1 //優化設置
sync-binlog=1 //允許日誌同步
# service mysql restart
1.3 管理員登錄數據庫授予SLAVE服務器複製權限
mysql> grant replication slave on *.* to slave@"192.168.100.3" identified by "123456";
1.4 檢查Master服務器的同步狀態
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| localhost-bin.000004 | 766 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2.MASTER數據庫服務器(192.168.100.3)配置
2.1 SLAVE服務器上導入備份的庫
# mysql -uroot -p123456 < /root/all.sql
2.2 修改/etc/my.cnf配置,重新啓動MySQL服務程序
# vim /etc/my.cnf
[mysqld]
log_bin //啓用binlog日誌,從服務器也可不開啓
server_id =3 //指定服務器ID號,不能和主相同
innodb_flush_log_at_trx_commit=1 //優化設置
sync-binlog=1 //允許日誌同步
log_slave_updates=1 //記錄從庫更新,便於實現“主-從-從”鏈式複製
# service mysql restart
2.3 管理員登入本機數據庫服務,發起同步操作
mysql> change master to
-> master_host="192.168.100.2", //對應Master的IP地址
-> master_user="slaveuser", //同步時用戶名
-> master_password="123456", //同步時密碼
-> master_log_file="localhost-bin.000004", //對應Master的日誌文件
-> master_log_pos=766; //對應Master的日誌偏移位置
Query OK, 0 rows affected, 2 warnings (0.10 sec)
mysql> start slave; //一旦啓用SLAVE複製,當需要修改MASTER信息時,應先執行stop slave;停止複製,然後重新修改、啓動複製。
2.4 查看從數據庫服務器的狀態
mysql> show slave status\G;
……
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
//若START SLAVE直接報錯失敗,請檢查CHANGE MASTER相關設置是否有誤,糾正後再重試;若IO線程或SQL線程有一個爲“No”,則應檢查服務器的錯誤日誌,分析並排除故障後重啓主從複製。
2.5 與從數據庫服務器相關的文件及作用
# ls /var/lib/mysql/
master.info //保存自己連接的主數據庫服務器的信息
localhost-relay-bin.000001 //relaybinlog日誌
localhost-relay-bin.index //保存已有的relaybinlog日誌文件名
relay-log.info //relaybinlog日誌信息
五.驗證從數據庫服務器是否能同步從數據庫服務器上的數據
在MASTER服務器上寫入數據,在SLAVE服務器上查看
mysql -uroot -p123456 //在MASTER服務器上登錄
mysql> create database testdb;
mysql> create table a (id int);
insert into testdb.a values(100);
insert into testdb.a values(200);
insert into testdb.a values(300);
mysql -uroot -p123456 //在SLAVE服務器上登錄
mysql> select * from testdb.a; //能夠看到表裏的3條記錄則同步成功。