搭建Mysql-proxy實現主從同步讀寫分離
主服務器 Wg62 192.168.0.142 (負責寫入數據)
從服務器 Wg63 192.168.0.156 (負責只讀數據)
實驗思路:
- 下載Mysql-proxy,在代理服務器Wg61上安裝lua語言
- Wg61安裝proxy,添加/etc/profile的環境變量參數
- 修改proxy配置文件參數,測試讀寫分離
- 搭建主從服務器,創建測試數據庫表並授權用戶訪問權限
- 啟動Mysql-proxy測試讀寫分離
- 測試從服務器掛掉,主服務器掛掉如何
步驟如下:
1、 Wg61服務器上安裝lua語言,Mysql-proxy需要lua語言調用
2、 下載Mysql-proxy安裝包到Wg61並解壓到/usr/local/下
[root@Wg61 ~]# wget http://dev.mysql.com/get/Downloads/MySQL-Proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz--no-check-certificate
[root@Wg61 ~]# tar-xf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
[root@Wg61 ~]# cd/usr/local/
bin games lib libexec sbin src
etc include lib64 mysql-proxy-0.8.5-linux-el6-x86-64bit share
[root@Wg61 local]#mv mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy
3、 修改環境變量參數
[root@Wg61 local]#vim /etc/profile
最後添加exportPATH=/usr/local/mysql-proxy/bin/:/usr/local/mysql/bin:$PATH
source /etc/profile 對命令生效
4、 修改Mysql-proxy配置文件參數,測試讀寫分離
[root@Wg61 local]#vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
40 min_idle_connections = 1, 在41行和42行將最小鏈接數改成1
41 max_idle_connections = 1,
5、 Wg62主服務器上創建測試文件,並授權用戶user1訪問權限
mysql>show databases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|mysql |
|test |
+--------------------+
3rows in set (0.00 sec)
mysql>create database HK;
QueryOK, 1 row affected (0.00 sec)
mysql>use HK;
Databasechanged
mysql>create table city(id int);
QueryOK, 0 rows affected (0.02 sec)
mysql>insert into city values(123);
QueryOK, 1 row affected (0.00 sec)
mysql>select * from city ;
+------+
|id |
+------+
| 123 |
+------+
1row in set (0.00 sec)
mysql>grant all on HK.* to user1@‘%‘ identified by ‘123456‘;
6、 Wg63從服務器上創建測試文件,並授權用戶user1訪問權限
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> create database HK;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| HK |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> create table city(id int);
ERROR 1046 (3D000): No database selected
mysql> use HK;
Database changed
mysql> create table city(id int);
Query OK, 0 rows affected (0.06 sec)
mysql> insert into city values(456);
Query OK, 1 row affected (0.00 sec)
mysql> select * from city;
+------+
| id |
+------+
| 456 |
+------+
1 row in set (0.00 sec)
mysql> grant allon HK.* to user1@‘%‘ identified by‘123456‘;
7、 Wg1服務器上啟動Mysql-proxy服務
[root@Wg61 local]#mysql-proxy
--proxy-read-only-backend-addresses=192.168.0.156:3306
--proxy-backend-addresses=192.168.0.142:3306
--proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua&
[1] 2044
[root@Wg61 local]#2018-01-04 05:25:31: (critical) plugin proxy 0.8.5 started
另開一個窗口查看服務是否啟動成功:
[root@Wg61 ~]# lsof -i :4040
COMMAND PIDUSER FD TYPE DEVICE SIZE/OFF NODE NAME
mysql-pro 2044root 9u IPv4 12940 0t0 TCP *:yo-main (LISTEN)
參數說明:
--proxy-read-only-backend-addresses=192.168.0.111:3306 # 定義後端只讀服務器
--proxy-backend-addresses=192.168.0.112:3306 #定義後端mysql主服務器地址,指定mysql寫主服務器的端口
--proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua& #指定lua腳本,在這裏,使用的是rw-splitting腳本,用於讀寫分離
當有多個只讀服務器時,可以寫多個以下參數:
--proxy-read-only-backend-addresses=192.168.0.111:3306 # 定義後端只讀服務器
--proxy-read-only-backend-addresses=192.168.0.112:3306 # 定義後端只讀服務器
#--proxy-address=192.168.0.110:3307指定mysql proxy的監聽端口,默認為:4040
8、 測試讀寫功能
(1) 測試寫操作:可以查看到Wg62數據信息,也可寫入數據,看不到Wg63數據
mysql>select user();
+---------------------+
|user() |
+---------------------+
|[email protected] |
+---------------------+
1row in set (0.00 sec)
mysql>show databases;
+--------------------+
|Database |
+--------------------+
| information_schema|
|HK |
|test |
+--------------------+
3rows in set (0.00 sec)
mysql>use HK;
Readingtable information for completion of table and column names
Youcan turn off this feature to get a quicker startup with -A
Databasechanged
mysql>use HK;
Databasechanged
mysql>show tables;
+--------------+
|Tables_in_HK |
+--------------+
|city |
+--------------+
1row in set (0.00 sec)
mysql>select * from city;
+------+
|id |
+------+
| 123 |
+------+
1row in set (0.00 sec)
mysql>insert into city values(1313);
QueryOK, 1 row affected (0.00 sec)
mysql>select * from city;
+------+
|id |
+------+
| 123 |
| 1313 |
+------+
2rows in set (0.00 sec)
(2) 測試讀數據
從Wg2模擬客戶端登入顯示未從服務器數據,可查看到對應數據信息
[root@Wg62 ~]# mysql-uuser1 -p123456 -P4040 -h192.168.0.180
[root@Wg62 ~]# mysql -uuser1 -p123456 -P4040-h192.168.0.180
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or itsaffiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporationand/or its
affiliates. Other names may be trademarks of theirrespective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear thecurrent input statement.
mysql> select * from HK.city;
+------+
| id |
+------+
| 456 |
+------+
1 row in set (0.00 sec)
mysql> Ctrl-C -- exit!
Aborted
[root@Wg62 ~]# mysql -uuser1 -p123456 -P4040-h192.168.0.180
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or itsaffiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporationand/or its
affiliates. Other names may be trademarks of theirrespective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear thecurrent input statement.
mysql> select * from HK.city;
+------+
| id |
+------+
| 456 |
+------+
1 row in set (0.01 sec)
mysql> select user();
+---------------------+
| user() |
+---------------------+
| [email protected] |
+---------------------+
1 row in set (0.00sec)
插入數據顯示成功,但是查詢發現沒有插入數據
mysql> insert into HK.city values(4545);
Query OK, 1 row affected (0.01 sec)
mysql> select * from HK.city;
+------+
| id |
+------+
| 456 |
+------+
1 row in set (0.00 sec)
mysql> insert into HK.city values(232323);
Query OK, 1 row affected (0.00 sec)
mysql> select from HK.city;
+------+
| id |
+------+
| 456 |
+------+
1 row in set (0.00sec)
9、 配置MYsql主從並實現讀寫分離
(1) 同步Wg2和Wg3兩臺服務器數據信息
[root@Wg62 ~]#mysqldump -uroot -p -A > all.sql
[root@Wg62 ~]# scpall.sql 192.168.0.156:/root/
[root@Wg63 ~]# mysql-uroot -p123456
mysql> source/root/all.sql
(2) Wg2主服務器配置為MASTER,並授權user2用戶作為同步用戶
[root@Wg62 ~]# vim/etc/my.cnf
log-bin=mysql-binlog
binlog-do-db=HK
binlog_format=row
server-id=1
mysql> grant all on .*to user2@‘%‘ identified by ‘123456‘;
重啟數據庫
(3) Wg3從服務器配置為SLAVE
方法一:[root@Wg63 ~]#vim /etc/my.cnf
master_host=‘192.168.0.142‘
master_user=‘user2‘
master_password=‘123456‘
方法二:登入數據庫
MySQL>changemaster to master_host=‘192.168.0.142‘,master_user=‘user2‘,master_password=‘123456‘;
重啟數據庫
10、測試通過Mysql-proxy是否實現主從同步讀寫分離
(1) 查看主從是否同步
mysql> select user();
+---------------------+
| user() |
+---------------------+
| [email protected] |
+---------------------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| HK |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> use HK;
Reading table information for completion of table andcolumn names
You can turn off this feature to get a quicker startupwith -A
Database changed
mysql> use HK;
Database changed
mysql> select * from city;
+--------+
| id |
+--------+
| 123 |
| 1313 |
| 4545 |
| 232323 |
+--------+
4 rows in set (0.00 sec)
mysql> insert into city values(789);
Query OK, 1 row affected (0.00 sec)
mysql> select * from city;
+--------+
| id |
+--------+
| 123 |
| 1313 |
| 4545 |
| 232323 |
| 789 |
+--------+
5 rows in set (0.00 sec)
登入主服務器查看,顯示插入成功
登入從服務器查看,顯示同步成功
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql> select * from HK.city;
+--------+
| id |
+--------+
| 123 |
| 1313 |
| 4545 |
| 232323 |
| 789 |
+--------+
5 rows in set (0.00sec)
(2) 測試從服務器宕機(可寫入查看數據)
mysql> insert into HK.city values(888);
Query OK, 1 row affected (0.01 sec)
mysql> select * from HK.city;
+--------+
| id |
+--------+
| 123 |
| 1313 |
| 4545 |
| 232323 |
| 789 |
| 0 |
| 888 |
+--------+
7 rows in set (0.00sec)
總結:1.當停止掉 slave 數據庫,proxy 的查詢就會轉移到 master 上,當把 slave 啟動後,proxy 依然在讀 master,當有新的鏈接進來的時候才會重新去讀取 slave 的數據。有時可能需要重啟下 mysql-proxy
- 從服務器恢復後,再次同步剛剛所插入的數據
(3) 測試主服務器宕機
mysql> select * from HK.city
-> ;
+--------+
| id |
+--------+
| 123 |
| 1313 |
| 4545 |
| 232323 |
| 789 |
| 0 |
| 888 |
+--------+
7 rows in set (0.00 sec)
mysql> use HK;
ERROR 2013 (HY000): Lost connection to MySQL serverduring query
mysql> insert into HK.city values(999);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 6
Current database: NONE
ERROR 2013 (HY000):Lost connection to MySQL server during query
顯示只能讀取數據不能寫入數據
搭建Mysql-proxy實現主從同步讀寫分離