以下所有理解純屬個人理解,如若有誤歡迎指出,不勝感激……o(∩_∩)o
兩臺服務器配置MYSQL主從複製實現數據高可用,這時讀與寫操作都有由master服務器來完成的,而從服務器只是複製了mster服務器的數據,這時可以利用一臺服務器配置Amoeba實現mysql讀寫分離, master負責寫,slave負責讀取,當然 也可以有多個salve…… 從而減輕master服務器的壓力,實現負載分攤;
拓撲圖:
Mysql主從複製原理:
兩臺mysql服務器一個作爲master一個爲slave;master上開啓二進制日誌,將自己所有使數據庫發生改變的操作語句記錄到而二進制日誌中,slave端會開啓一個IO線程向master請求masert二進制日誌中的事件,master通過binlogdump線程將二進制日誌事件發送給slave,slave將接收到的二進制日誌時間保存在中繼日誌(relaylog)中,然後使用sql 線程之行中繼日誌;從而保證數據與master相同;
aomeba原理:
aomeba是使用java開發的,所以要首先配置jdk;mysql端配置主從複製,master上的數據複製到slave上,slave主要負責讀;aomeba作爲一個sql路由調度器,client發來的sql如果是write則分發到write dbserver上,如果是read ,則分發到read dbserver;
ip分配:
amoeba:192.168.1.49
master:192.168.1.39
slave:192.168.1.40
client:192.168.1.51
一:配置mysql主從複製
1.1:在主上創建測試數據庫
1.2:在主上創建複製用戶
1.3:配置主my.cnf
1.4:配置從my.cnf
1.5:鎖表拷貝主服務器數據到從服務器
1.6:配置從mysql,開啓複製
1.7:測試主從複製
二:配置Amoeba
2.1:在master、slave上創建用於amoeba連接數據庫的用戶
2.2:配置jdk
2.3:配置amoeba
2.4:啓動amoeba
三:測試讀寫分離
1.1:在主上創建測試數據庫
mysql> CREATE DATABASE `zrer90` CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
1.2:在主上創建複製用戶
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.1.40' IDENTIFIED by 'zrer90';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; #刷新權限
Query OK, 0 rows affected (0.00 sec)
1.3:配置主my.cnf
server-id = 1
log-bin = /var/log/mysql/mysql-bin.log #二進制日誌存放的位置,注意:mysql用戶應對這個目錄有寫入權限;
expire_logs_days = 10 #二進制日誌存放多少天之後刪除;
max_binlog_size = 100M #二進制日誌達到多大之後進行切割,生成新的日誌;
重啓mysql……
Mysql下查看master status:
mysql> show master status ;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 443 | zrer90 | mysql,test |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
1.4:配置從my.cnf
server-id = 2 #從服務器要與主服務器不同
#不需要開啓binarylog
master-host = 192.168.1.39 #主服務器ip
master-user = slave #用於同步複製的用戶名(master上創建)
master-password = zrer90 #密碼
replicate-do-db=zrer90 # 同步的數據庫的名稱
replicate-ignore-db=mysql # 不復制mysql庫
master-connect-retry=60 # 斷點重新連接時間,60s
1.5:鎖表拷貝主服務器數據到從服務器
Master mysql> flush tables with read lock ; #鎖表
Query OK, 0 rows affected (0.00 sec)
[root@master ~]# mysqldump -B -u root -p zrer90 > zrer90_db.sql #備份zrer90數據庫
Enter password:
[root@master ~]#
[root@master ~]# scp zrer90_db.sql [email protected]:/root/ #將導出的sql文件上傳到從服務器
[email protected]'s password:
Master mysql> show master status ; #記住binlog文件名與Position
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
Master mysql> unlock tables ; #解鎖
Query OK, 0 rows affected (0.00 sec)
#到從服務導入數據
[root@slave ~]# mysql -uroot -p <zrer90_db.sql
Slave mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| zrer90 |
+--------------------+
4 rows in set (0.00 sec)
1.6:配置從mysql,開啓複製
Slave mysql> change master to master_log_file='mysql-bin.000002', master_log_pos=106;
Slave mysql> slave start ;
Query OK, 0 rows affected (0.00 sec)
Slave mysql> show slave status \G #查看slave狀態
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.39
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: zrer90
Replicate_Ignore_DB: mysql,test
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 407
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
1.7:測試主從複製
在主zrer90 庫中創建一張表table1,並錄入數據;
Master mysql> use zrer90;
Database changed
Master mysql> CREATE TABLE `table1` (`id` tinyint NOT NULL ,`name` varchar(255) NULL ,PRIMARY KEY (`id`));
Query OK, 0 rows affected (0.07 sec)
Master mysql> INSERT INTO `table1` (`id`, `name`) VALUES ('1', 'zhangsan');
Query OK, 1 row affected (0.00 sec)
查看從庫,數據已同步:
Slave mysql> use zrer90;
Database changed
Slave mysql> show tables;
+------------------+
| Tables_in_zrer90 |
+------------------+
| table1 |
+------------------+
1 row in set (0.00 sec)
Slave > select * from table1;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
+----+----------+
1 row in set (0.00 sec)
查看主master logs已更新位置;
Master mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 389 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
#也可以使用mysqlbinlog 命令去查看主上面的binlog和從上的relaylog進行對比;
配置Amoeba服務器
2.1:在master、slave上創建用於amoeba連接數據庫的用戶
mysql> grant all privileges on *.* to 'amoeba_connect'@'192.168.1.49' identified by 'zrer90';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
2.2:配置jdk
[root@amoeba tmp]# tar -zxvf jdk-8u5-linux-x64.gz
[root@amoeba tmp]# mv jdk1.8.0_05/ /usr/local/jdk/
[root@amoeba tmp]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk
AMOEBA_HOME=/usr/local/amoeba
export PATH=$AMOEBA_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
[root@amoeba tmp]# source /etc/profile
[root@amoeba tmp]# java -version #測試java配置顯示正常則成功
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)
2.3:配置amoeba
[root@amoeba tmp]# mkdir /usr/local/amoeba
[root@amoeba tmp]# tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
[root@amoeba ~]# vim /usr/local/amoeba/conf/dbServers.xml
調整dbServer.xml部分參數:
#默認連接到的庫
<property name="schema">zrer90</property>
#amoeba連接數據庫的帳號及密碼
<property name="user">amoeba_connect</property>
<property name="password">zrer90</property>
#配置兩個db服務器,分別是masert和slave
<dbServer name="master" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.1.39</property>
</factoryConfig>
</dbServer>
<dbServer name="slave" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.1.40</property>
</factoryConfig>
</dbServer>
#配置dbserver組:ReadPool,指定組成員爲slave
<dbServer name="ReadPool" virtual="true">
<poolConfig
class="com.meidusa.amoeba.server.MultipleServerPool">
# loadbalance:負載方式1:輪詢2:加權重3:HA
<property name="loadbalance">1</property>
#組成員爲slave
<property name="poolNames">slave</property>
</poolConfig>
</dbServer>
[root@amoeba ~]# vim /usr/local/amoeba/conf/amoeba.xml
調整amoeba.xml部分參數:
#amoeba監聽端口3306,客戶端請求時使用
<property name="port">3306</property>
<property name="authenticator">
<beanclass="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
#指定客戶端連接amoeba的賬戶與密碼
<property name="user">amoeba</property>
<property name="password">zrer90</property>
<property name="filter">
#指定默認池
<property name="defaultPool">master</property>
#指定寫dbserver
<property name="writePool">master</property>
#指定讀dbserver
<property name="readPool">ReadPool</property>
[root@amoeba ~]# vim /usr/local/amoeba/bin/amoeba
調整DEFAULT_OPTS變量參數:第58行
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
更改後:
DEFAULT_OPTS="-server -Xms256m -Xmx256m –Xss256k"
2.4:啓動amoeba
[root@amoeba amoeba]# amoeba start & #不想看提示信息的話將上&>/dev/null
[root@amoeba ~]# netstat -anpt |grep java
tcp 0 0 ::ffff:127.0.0.1:21740 :::* LISTEN 2476/java
tcp 0 0 :::3306 :::* LISTEN 2476/java
tcp 0 0 ::ffff:192.168.1.49:57069 ::ffff:192.168.1.39:3306 ESTABLISHED 2476/java
tcp 0 0 ::ffff:192.168.1.49:37374 ::ffff:192.168.1.40:3306 ESTABLISHED 2476/java
本地監聽3306端口接受客戶端請求,amoeba服務器本地與master192.168.1.39:3306,slave192.168.1.40:3306建立連接;
停止amoeba:
[root@amoeba amoeba]# amoeba stop