一、MySQL 5.6介紹
MySQL 5.6引入的GTID(Global Transaction IDs)使得其複制功能的配置、監控及管理變得更加易于實作,且更加健壯。
複制功能的改進:
1、支援多線程複制,指的是針對每個database開啟相應的獨立線程。
2、支援啟用GTID,就是每個mysql伺服器都一個全局的事務ID,GTID,這個是由每個伺服器的UUID(唯一的)和server_id組成的,mysql會保證事務與GTID之間1:1的映射,保證了GTID的全局唯一性。
二、Amoeba介紹
Amoeba是一個SQL請求的路由器,可以為mysql提供負載均衡、讀寫分離、高可用性提供機制,使用者需要結合使用MySQL的Replication等機制來實作副本同步等功能,它主要在應用層通路MySQL的時候充當query 路由功能,專注分布式資料庫 proxy 開發,座落與Client、DB Server(s)之間,對用戶端透明,它是一個虛拟的mysql,對外提供mysql協定,用戶端連接配接amoeba就象連接配接mysql一樣。
Amoeba主要優勢:
1、資料切分後複雜資料源整合;
2、提供資料切分規則并降低資料切分規則給資料庫帶來的影響;
3、降低資料庫與用戶端連接配接;
4、讀寫分離路由。
Amoeba不足:
1、不支援事務;
2、不支援存儲過程;
3、不适合從amoeba導資料的場景或者對大資料量查詢的query并不合适;
4、不支援分庫分表,amoeba隻支援分資料庫執行個體,每個被切分的節點需要保持庫表結構一緻。
三、實驗環境
192.168.30.115 OS:CentOS 6.4 x86_64 amoeba.luojianlong.com
192.168.30.116 OS:CentOS 6.4 x86_64 master.luojianlong.com
192.168.30.117 OS:CentOS 6.4 x86_64 slave.luojianlong.com
MySQL version:mysql-5.6.13-linux-glibc2.5-x86_64
Amoeba version:amoeba-mysql-binary-2.1.0-RC5
拓撲圖如下:
<a href="http://s3.51cto.com/wyfs02/M02/23/D5/wKioL1NE2JGT9Y4ZAACrGx3A53o199.jpg" target="_blank"></a>
首先,分别在master.luojianlong.com和slave.luojianlong.com上安裝mysql 5.6.13,這裡使用通用的二進制包來安裝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<code>[root@master ~]</code><code># useradd -r -u 27 mysql</code>
<code>[root@master ~]</code><code># tar zxvf mysql-5.6.13-linux-glibc2.5-x86_64.tar.gz -C /usr/local/</code>
<code>[root@master ~]</code><code># cd /usr/local/</code>
<code>[root@master </code><code>local</code><code>]</code><code># ln -s mysql-5.6.13-linux-glibc2.5-x86_64 mysql</code>
<code>[root@master </code><code>local</code><code>]</code><code># cd mysql</code>
<code>[root@master mysql]</code><code># mkdir /mydata/data -p</code>
<code>[root@master mysql]</code><code># chown -R root.mysql ./*</code>
<code>[root@master mysql]</code><code># chown -R mysql.mysql /mydata/data/</code>
<code>[root@master mysql]</code><code># ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data</code>
<code>[root@master mysql]</code><code># cp support-files/mysql.server /etc/rc.d/init.d/mysqld</code>
<code>[root@master mysql]</code><code># chkconfig --add mysqld</code>
<code>[root@master mysql]</code><code># chkconfig mysqld on</code>
<code>[root@master mysql]</code><code># chmod +x /etc/rc.d/init.d/mysqld</code>
<code>[root@master ~]</code><code># vi /etc/profile.d/mysql.sh</code>
<code>export</code> <code>PATH=</code><code>/usr/local/mysql/bin</code><code>:$PATH</code>
<code>[root@master ~]</code><code># . /etc/profile.d/mysql.sh</code>
<code># 由于mysql 5.6版本預設的配置檔案配置參數很少,需要自己定制,為了友善,這裡使用mysql 5.5的配置檔案</code>
<code>[root@master mysql]</code><code># cp my-large.cnf /etc/my.cnf</code>
<code>[root@master mysql]</code><code># vi /etc/my.cnf</code>
<code># 在[mysqld]中添加如下</code>
<code>datadir = </code><code>/mydata/data</code>
<code>innodb_file_per_table = 1</code>
<code>binlog-</code><code>format</code><code>=ROW</code>
<code>log-bin=master-bin</code>
<code>log-slave-updates=</code><code>true</code>
<code>gtid-mode=on</code>
<code>enforce-gtid-consistency=</code><code>true</code>
<code>master-info-repository=TABLE</code>
<code>relay-log-info-repository=TABLE</code>
<code>sync</code><code>-master-info=1</code>
<code>slave-parallel-workers=2</code>
<code>binlog-checksum=CRC32</code>
<code>master-verify-checksum=1</code>
<code>slave-sql-verify-checksum=1</code>
<code>binlog-rows-query-log_events=1</code>
<code>server-</code><code>id</code><code>=1</code>
<code>report-port=3306</code>
<code>port=3306</code>
<code>report-host=192.168.30.116</code>
在slave.luojianlong.com中也使用相同的方式安裝mysql 5.6
<code># 安裝完成後,修改配置檔案</code>
<code>[root@slave ~]</code><code># vi /etc/my.cnf</code>
<code># 添加如下</code>
<code>server-</code><code>id</code><code>=11</code>
<code>log-bin=mysql-bin.log</code>
<code>datadir=</code><code>/mydata/data</code>
<code>report-host=192.168.30.117</code>
binlog-format:二進制日志的格式,有row、statement和mixed幾種類型;
需要注意的是:當設定隔離級别為READ-COMMITED必須設定二進制日志格式為ROW,現在MySQL官方認為STATEMENT這個已經不再适合繼續使用;但mixed類型在預設的事務隔離級别下,可能會導緻主從資料不一緻;
log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用于啟動GTID及滿足附屬的其它需求;
master-info-repository和relay-log-info-repository:啟用此兩項,可用于實作在崩潰時保證二進制及從伺服器安全的功能;
sync-master-info:啟用之可確定無資訊丢失;
slave-paralles-workers:設定從伺服器的SQL線程數;0表示關閉多線程複制功能;
binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:啟用複制有關的所有校驗功能;
binlog-rows-query-log-events:啟用之可用于在二進制日志記錄事件相關的資訊,可降低故障排除的複雜度;
log-bin:啟用二進制日志,這是保證複制功能的基本前提;
server-id:同一個複制拓撲中的所有伺服器的id号必須惟一;
分别啟動倆台伺服器的mysql
<code>[root@master ~]</code><code># service mysqld start</code>
<code>Starting MySQL............ SUCCESS!</code>
<code>[root@slave ~]</code><code># service mysqld start</code>
<code>Starting MySQL... SUCCESS!</code>
在master伺服器上建立複制使用者
<code>mysql> grant replication slave on *.* to </code><code>'repluser'</code><code>@</code><code>'192.168.30.%'</code> <code>identified by </code><code>'123456'</code><code>;</code>
<code>Query OK, 0 rows affected (0.06 sec)</code>
<code>mysql> flush privileges;</code>
<code>Query OK, 0 rows affected (0.00 sec)</code>
啟動從節點的複制線程
<code>mysql> change master to master_host=</code><code>'192.168.30.116'</code><code>, master_user=</code><code>'repluser'</code><code>, master_password=</code><code>'123456'</code><code>, master_auto_position=1;</code>
<code>Query OK, 0 rows affected, 2 warnings (0.45 sec)</code>
<code>mysql> start slave;</code>
<code>Query OK, 0 rows affected, 1 warning (0.12 sec)</code>
在slave上檢視線程啟動情況
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<code>mysql> show slave status\G;</code>
<code>*************************** 1. row ***************************</code>
<code> </code><code>Slave_IO_State: Waiting </code><code>for</code> <code>master to send event</code>
<code> </code><code>Master_Host: 192.168.30.116</code>
<code> </code><code>Master_User: repluser</code>
<code> </code><code>Master_Port: 3306</code>
<code> </code><code>Connect_Retry: 60</code>
<code> </code><code>Master_Log_File: master-bin.000002</code>
<code> </code><code>Read_Master_Log_Pos: 539</code>
<code> </code><code>Relay_Log_File: slave-relay-bin.000002</code>
<code> </code><code>Relay_Log_Pos: 751</code>
<code> </code><code>Relay_Master_Log_File: master-bin.000002</code>
<code> </code><code>Slave_IO_Running: Yes</code>
<code> </code><code>Slave_SQL_Running: Yes</code>
<code> </code><code>Replicate_Do_DB:</code>
<code> </code><code>Replicate_Ignore_DB:</code>
<code> </code><code>Replicate_Do_Table:</code>
<code> </code><code>Replicate_Ignore_Table:</code>
<code> </code><code>Replicate_Wild_Do_Table:</code>
<code> </code><code>Replicate_Wild_Ignore_Table:</code>
<code> </code><code>Last_Errno: 0</code>
<code> </code><code>Last_Error:</code>
<code> </code><code>Skip_Counter: 0</code>
<code> </code><code>Exec_Master_Log_Pos: 539</code>
<code> </code><code>Relay_Log_Space: 955</code>
<code> </code><code>Until_Condition: None</code>
<code> </code><code>Until_Log_File:</code>
<code> </code><code>Until_Log_Pos: 0</code>
<code> </code><code>Master_SSL_Allowed: No</code>
<code> </code><code>Master_SSL_CA_File:</code>
<code> </code><code>Master_SSL_CA_Path:</code>
<code> </code><code>Master_SSL_Cert:</code>
<code> </code><code>Master_SSL_Cipher:</code>
<code> </code><code>Master_SSL_Key:</code>
<code> </code><code>Seconds_Behind_Master: 0</code>
<code>Master_SSL_Verify_Server_Cert: No</code>
<code> </code><code>Last_IO_Errno: 0</code>
<code> </code><code>Last_IO_Error:</code>
<code> </code><code>Last_SQL_Errno: 0</code>
<code> </code><code>Last_SQL_Error:</code>
<code> </code><code>Replicate_Ignore_Server_Ids:</code>
<code> </code><code>Master_Server_Id: 1</code>
<code> </code><code>Master_UUID: b05c9b5c-bfac-11e3-a4bc-000c29f3fcba</code>
<code> </code><code>Master_Info_File: mysql.slave_master_info</code>
<code> </code><code>SQL_Delay: 0</code>
<code> </code><code>SQL_Remaining_Delay: NULL</code>
<code> </code><code>Slave_SQL_Running_State: Slave has </code><code>read</code> <code>all relay log; waiting </code><code>for</code> <code>the slave I</code><code>/O</code> <code>thread to update it</code>
<code> </code><code>Master_Retry_Count: 86400</code>
<code> </code><code>Master_Bind:</code>
<code> </code><code>Last_IO_Error_Timestamp:</code>
<code> </code><code>Last_SQL_Error_Timestamp:</code>
<code> </code><code>Master_SSL_Crl:</code>
<code> </code><code>Master_SSL_Crlpath:</code>
<code> </code><code>Retrieved_Gtid_Set: b05c9b5c-bfac-11e3-a4bc-000c29f3fcba:1-2</code>
<code> </code><code>Executed_Gtid_Set: b05c9b5c-bfac-11e3-a4bc-000c29f3fcba:1-2</code>
<code> </code><code>Auto_Position: 1</code>
<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
Connect_Retry:slave伺服器連接配接master伺服器的重試次數;
Exec_Master_Log_Pos:目前slave伺服器最後一次所執行二進制日志的位置;
Relay_Log_Space:relaylog的空間;
Seconds_Behind_Master:slave滞後master的時長(通過目前伺服器的時間戳與二進制日志中的時間戳對比得到的);
Slave_IO_Running:slave伺服器I/O線程的運作情況;
Slave_SQL_Running:slave伺服器SQL線程的運作情況;
發現gtid複制已經啟動成功,并可以檢視主從伺服器的uuid(對于每一個mysql伺服器都是唯一的)
<code>mysql> show global variables like </code><code>'%uuid'</code><code>;</code>
<code>+---------------+--------------------------------------+</code>
<code>| Variable_name | Value |</code>
<code>| server_uuid | b05c9b5c-bfac-11e3-a4bc-000c29f3fcba |</code>
<code>| server_uuid | ba83181a-bfac-11e3-a4bc-000c295b50f9 |</code>
在slave 可以看到啟動的複制線程數
<code>mysql> show processlist;</code>
<code>+-----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+</code>
<code>| Id | User | Host | db | Command | Time | State | Info |</code>
<code>| 3 | system user | | NULL | Connect | 67092 | Waiting </code><code>for</code> <code>master to send event | NULL |</code>
<code>| 4 | system user | | NULL | Connect | 50955 | Slave has </code><code>read</code> <code>all relay log; waiting </code><code>for</code> <code>the slave I</code><code>/O</code> <code>thread to update it | NULL |</code>
<code>| 5 | system user | | NULL | Connect | 65267 | Waiting </code><code>for</code> <code>an event from Coordinator | NULL |</code>
<code>| 6 | system user | | NULL | Connect | 50961 | Waiting </code><code>for</code> <code>an event from Coordinator | NULL |</code>
<code>| 151 | root | localhost | NULL | Query | 0 | init | show processlist |</code>
<code>5 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
在master建立資料庫,看是否同步到slave
<code>mysql> create database student;</code>
<code>Query OK, 1 row affected (0.01 sec)</code>
<code>mysql> show databases;</code>
<code>+--------------------+</code>
<code>| Database |</code>
<code>| information_schema |</code>
<code>| abc |</code>
<code>| mysql |</code>
<code>| performance_schema |</code>
<code>| student |</code>
<code>| </code><code>test</code> <code>|</code>
<code>| testdb |</code>
<code>7 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
發現已經同步到slave
主從伺服器資料不一緻的常見原因:
1、在slave伺服器上直接執行寫操作;
2、基于SQL語句的複制,建議使用基于資料本身的複制;
3、relaylog日志出現故障;
4、資料庫架構複制有問題;
5、在一個資料庫裡面混合使用myisam和innodb引擎;
6、mysql的主從版本不一緻(從伺服器的版本必須高于主伺服器版本);
7、使用myisam存儲引擎時,執行的語句被意外終止;
修複主從伺服器資料不一緻的方案:
1、使用pt-table-checksum工具,能夠監控主從伺服器資料表中的資料是否一緻;
2、使用pt-table-sync工具,能夠實作同步主從伺服器上表的資料;
防止主從複制崩潰後帶來的損失:
1、設定master伺服器的sync_binlog=1,意思是隻要有資料更新就立即同步到磁盤上面,同時要求磁盤本身不具有緩存能力;
2、使用innodb存儲引擎時,當slave伺服器意外關閉後,重新啟動會重新讀取master_info檔案,這個時候master_info資料沒重新整理到磁盤上面,這樣會導緻資料複制出現錯誤,這個時候可以在slave上啟用innodb_overwrite_relay_log_info;可以覆寫relay_log_info裡面的資料,避免造成資料丢失;
3、或者也可以使用工具pt-slave-restart,從節點意外關閉時,用于安全啟動複制程序;
4、當master伺服器二進制日志出現錯誤時,可以在slave伺服器上執行set global sql_slave_skip_counter=1;start slave; 跳過錯誤,或者删除二進制日志重新生成,然後重建立立複制;
下面開始配置amoeba,首先安裝jdk環境
<code>[root@amoeba ~]</code><code># tar zxvf jdk-7u25-linux-x64.gz -C /usr/local/</code>
<code>[root@amoeba ~]</code><code># cd /usr/local/</code>
<code>[root@amoeba </code><code>local</code><code>]</code><code># ln -s jdk1.7.0_25 jdk</code>
<code>[root@amoeba </code><code>local</code><code>]</code><code># vi /etc/profile.d/jdk.sh</code>
<code>export</code> <code>JAVA_HOME=</code><code>/usr/local/jdk</code>
<code>export</code> <code>CLASSPATH=$CLASSPATH:$JAVA_HOME</code><code>/lib</code><code>:$JAVA_HOME</code><code>/jre/lib</code>
<code>export</code> <code>PATH=</code><code>/usr/local/jdk/bin</code><code>:$PATH</code>
<code>[root@amoeba </code><code>local</code><code>]</code><code># . /etc/profile.d/jdk.sh</code>
<code>[root@amoeba </code><code>local</code><code>]</code><code># java -version</code>
<code>java version </code><code>"1.7.0_25"</code>
<code>Java(TM) SE Runtime Environment (build 1.7.0_25-b15)</code>
<code>Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)</code>
下載下傳安裝amoeba
<code>[root@amoeba ~]</code><code># mkdir /usr/local/amoeba</code>
<code>[root@amoeba ~]</code><code># tar zxvf amoeba-mysql-binary-2.1.0-RC5.tar.gz -C /usr/local/amoeba/</code>
<code>[root@amoeba ~]</code><code># vi /etc/profile.d/amoeba.sh</code>
<code>export</code> <code>PATH=</code><code>/usr/local/amoeba/bin</code><code>:$PATH</code>
<code>[root@amoeba ~]</code><code># . /etc/profile.d/amoeba.sh</code>
<code>[root@amoeba ~]</code><code># cp /usr/local/amoeba/conf/amoeba.xml /usr/local/amoeba/conf/amoeba.xml.bak</code>
<code>[root@amoeba ~]</code><code># cp /usr/local/amoeba/conf/dbServers.xml /usr/local/amoeba/conf/dbServers.xml.bak</code>
調整amoeba配置檔案,設定讀寫分離
<code>[root@amoeba ~]</code><code># vi /usr/local/amoeba/conf/amoeba.xml</code>
<code># 在<service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">子标簽中修改如下幾項</code>
<code><property name=</code><code>"port"</code><code>>3306<</code><code>/property</code><code>></code>
<code><property name=</code><code>"ipAddress"</code><code>>0.0.0.0<</code><code>/property</code><code>></code>
<code><property name=</code><code>"password"</code><code>>mypass<</code><code>/property</code><code>></code>
<code># 在<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">子标簽中啟用修改下面幾項</code>
<code><property name=</code><code>"writePool"</code><code>>server1<</code><code>/property</code><code>></code>
<code><property name=</code><code>"readPool"</code><code>>server2<</code><code>/property</code><code>></code>
<code>[root@amoeba ~]</code><code># vi /usr/local/amoeba/conf/dbServers.xml</code>
<code># 啟動并修改 <dbServer name="abstractServer" abstractive="true">子标簽中的</code>
<code># 修改 <dbServer name="server1" parent="abstractServer">子标簽中的</code>
<code><property name=</code><code>"ipAddress"</code><code>>192.168.30.116<</code><code>/property</code><code>></code>
<code># 新添加一個dbServer如下</code>
<code><dbServer name=</code><code>"server2"</code> <code>parent=</code><code>"abstractServer"</code><code>></code>
<code> </code><code><factoryConfig></code>
<code> </code><code><!-- mysql ip --></code>
<code> </code><code><property name=</code><code>"ipAddress"</code><code>>192.168.30.117<</code><code>/property</code><code>></code>
<code> </code><code><</code><code>/factoryConfig</code><code>></code>
<code> </code><code><</code><code>/dbServer</code><code>></code>
在master和slave中分别建立用于amoeba連接配接倆台mysql的使用者
<code># 在master上面建立</code>
<code>mysql> grant all on *.* to </code><code>'root'</code><code>@</code><code>'192.168.30.%'</code> <code>identified by </code><code>'mypass'</code><code>;</code>
<code>#發現已經同步到slave</code>
<code>mysql> show grants </code><code>for</code> <code>'root'</code><code>@</code><code>'192.168.30.%'</code><code>;</code>
<code>+-------------------------------------------------------------------------------------------------------------------------+</code>
<code>| Grants </code><code>for</code> <code>[email protected].% |</code>
<code>| GRANT ALL PRIVILEGES ON *.* TO </code><code>'root'</code><code>@</code><code>'192.168.30.%'</code> <code>IDENTIFIED BY PASSWORD </code><code>'*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4'</code> <code>|</code>
啟動amoeba
<code>[root@amoeba ~]</code><code># vi /usr/local/amoeba/bin/amoeba</code>
<code>DEFAULT_OPTS=</code><code>"-server -Xms256m -Xmx256m -Xss128k"</code>
<code># 修改為</code>
<code>DEFAULT_OPTS=</code><code>"-server -Xms256m -Xmx256m -Xss256k"</code>
<code>[root@amoeba ~]</code><code># amoeba start</code>
<code>log4j:WARN log4j config load completed from </code><code>file</code><code>:</code><code>/usr/local/amoeba/conf/log4j</code><code>.xml</code>
<code>2014-04-09 15:09:15,121 INFO context.MysqlRuntimeContext - Amoeba </code><code>for</code> <code>Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.1.0-RC5</code>
<code>log4j:WARN ip access config load completed from </code><code>file</code><code>:</code><code>/usr/local/amoeba/conf/access_list</code><code>.conf</code>
<code>2014-04-09 15:09:15,482 INFO net.ServerableConnectionManager - Amoeba </code><code>for</code> <code>Mysql listening on </code><code>/0</code><code>.0.0.0:3306.</code>
<code>2014-04-09 15:09:15,489 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on </code><code>/127</code><code>.0.0.1:53201.</code>
<code>[root@amoeba ~]</code><code># netstat -anptl | grep :3306</code>
<code>tcp 0 0 :::3306 :::* LISTEN 19208</code><code>/java</code>
<code>tcp 0 0 ::ffff:192.168.30.115:33408 ::ffff:192.168.30.116:3306 ESTABLISHED 19208</code><code>/java</code>
<code>tcp 0 0 ::ffff:192.168.30.115:59880 ::ffff:192.168.30.117:3306 ESTABLISHED 19208</code><code>/java</code>
<code>[root@amoeba ~]</code><code># mysql -u root -pmypass -h 192.168.30.115 -P 3306</code>
<code>Welcome to the MySQL monitor. Commands end with ; or \g.</code>
<code>Your MySQL connection </code><code>id</code> <code>is 1783342624</code>
<code>Server version: 5.1.45-mysql-amoeba-proxy-2.1.0-RC5 MySQL Community Server (GPL)</code>
<code>Copyright (c) 2000, 2012, Oracle and</code><code>/or</code> <code>its affiliates. All rights reserved.</code>
<code>Oracle is a registered trademark of Oracle Corporation and</code><code>/or</code> <code>its</code>
<code>affiliates. Other names may be trademarks of their respective</code>
<code>owners.</code>
<code>Type </code><code>'help;'</code> <code>or </code><code>'\h'</code> <code>for</code> <code>help. Type </code><code>'\c'</code> <code>to </code><code>clear</code> <code>the current input statement.</code>
<code>4 rows </code><code>in</code> <code>set</code> <code>(0.03 sec)</code>
啟動成功,并通路正常
下面使用tcpdump指令抓包測試讀寫分離效果
58
59
60
61
62
63
<code>[root@master ~]</code><code># tcpdump -i eth0 -s0 -nn -A tcp dst port 3306 and dst host 192.168.30.116</code>
<code>[root@slave ~]</code><code># tcpdump -i eth0 -s0 -nn -A tcp dst port 3306 and dst host 192.168.30.117</code>
<code># amoeba伺服器上登入mysql,并建立資料庫</code>
<code>mysql> create database abc;</code>
<code>Query OK, 1 row affected (0.03 sec)</code>
<code>tcpdump: verbose output suppressed, use -</code><code>v</code> <code>or -vv </code><code>for</code> <code>full protocol decode</code>
<code>listening on eth0, link-</code><code>type</code> <code>EN10MB (Ethernet), capture size 65535 bytes</code>
<code>15:16:42.492828 IP 192.168.30.115.33408 > 192.168.30.116.3306: Flags [P.], </code><code>seq</code> <code>1149949367:1149949391, ack 113323290, win 123, options [nop,nop,TS val 8373727 ecr 10837334], length 24</code>
<code>E..L&"@[email protected]....{4].....</code>
<code>......]V.....create database abc</code>
<code>15:16:42.501837 IP 192.168.30.115.33408 > 192.168.30.116.3306: Flags [.], ack 12, win 123, options [nop,nop,TS val 8373736 ecr 11221763], length 0</code>
<code>E..4&</code><code>#@[email protected]%...{.I.....</code>
<code>......;.</code>
<code>15:16:42.502356 IP 192.168.30.117.38626 > 192.168.30.116.3306: Flags [.], ack 3194819787, win 170, options [nop,nop,TS val 9637577 ecr 11221763], length 0</code>
<code>E..4.0@[email protected].............</code>
<code># 發現在master上面抓到了建立資料庫的包</code>
<code># slave上面沒有抓到任何包</code>
<code># 下面在amoeba上面執行建立表,插入,查詢語句</code>
<code>mysql> use abc</code>
<code>Database changed</code>
<code>mysql> create table </code><code>test</code><code>(</code><code>id</code> <code>int);</code>
<code>Query OK, 0 rows affected (0.41 sec)</code>
<code>mysql> insert into </code><code>test</code> <code>values(1);</code>
<code>Query OK, 1 row affected (0.04 sec)</code>
<code>mysql> </code><code>select</code> <code>* from </code><code>test</code><code>;</code>
<code>+------+</code>
<code>| </code><code>id</code> <code>|</code>
<code>| 1 |</code>
<code>1 row </code><code>in</code> <code>set</code> <code>(0.01 sec)</code>
<code>15:20:42.054548 IP 192.168.30.115.33419 > 192.168.30.116.3306: Flags [P.], </code><code>seq</code> <code>976065559:976065590, ack 2591052457, win 123, options [nop,nop,TS val 8613289 ecr 11418139], length 31</code>
<code>E..S."@[email protected]....:-...pR....{.H.....</code>
<code>..m...:......insert into </code><code>test</code> <code>values(1)</code>
<code>15:20:42.085305 IP 192.168.30.117.38626 > 192.168.30.116.3306: Flags [.], ack 3194820258, win 189, options [nop,nop,TS val 9877161 ecr 11461346], length 0</code>
<code>E..4.2@[email protected].......*.....</code>
<code>........</code>
<code>15:20:42.086686 IP 192.168.30.115.33419 > 192.168.30.116.3306: Flags [.], ack 12, win 123, options [nop,nop,TS val 8613320 ecr 11461347], length 0</code>
<code>E..4.</code><code>#@[email protected]....:-.6.pR....{./.....</code>
<code>..m.....</code>
<code>15:20:52.076327 IP 192.168.30.115.59899 > 192.168.30.117.3306: Flags [P.], </code><code>seq</code> <code>201259223:201259232, ack 2661648116, win 115, options [nop,nop,TS val 8623261 ecr 9819401], length 9</code>
<code>E..=..@[email protected].&.....</code>
<code>....... .....abc.</code>
<code>15:20:52.076821 IP 192.168.30.115.59899 > 192.168.30.117.3306: Flags [.], ack 12, win 115, options [nop,nop,TS val 8623261 ecr 9887103], length 0</code>
<code>E..4..@[email protected]</code><code>#q.....</code>
<code>15:20:52.077609 IP 192.168.30.115.59899 > 192.168.30.117.3306: Flags [P.], </code><code>seq</code> <code>9:32, ack 12, win 115, options [nop,nop,TS val 8623262 ecr 9887103], length 23</code>
<code>E..K..@[email protected].......</code>
<code>.............</code><code>select</code> <code>* from </code><code>test</code>
<code>15:20:52.118046 IP 192.168.30.115.59899 > 192.168.30.117.3306: Flags [.], ack 82, win 115, options [nop,nop,TS val 8623303 ecr 9887105], length 0</code>
<code>E..4..@[email protected]"......</code>
<code>觀察抓包情況,發現所有的更新操作都在master,查詢操作都在slave 上面</code>
登入主從資料庫檢視資料是否一緻
<code># master</code>
<code># slave</code>
<code># 發現資料一緻</code>
四、Amoeba簡單的優化配置:
1、 修改amoeba啟動參數,增加JAVA虛拟機的記憶體,修改amoeba執行程式,查找DEFAULT_OPTS,修改為以下内容:
DEFAULT_OPTS="-server -Xms1024m -Xmx1024m -Xss256k"
2、 amoeba.xml中關于多線程和網絡的優化
<code>[root@amoeba ~]</code><code># vim /usr/local/amoeba/conf/amoeba.xml</code>
<code># 修改如下幾項</code>
<code><property name=</code><code>"readThreadPoolSize"</code><code>>500<</code><code>/property</code><code>></code>
<code><property name=</code><code>"clientSideThreadPoolSize"</code><code>>500<</code><code>/property</code><code>></code>
<code><property name=</code><code>"serverSideThreadPoolSize"</code><code>>500<</code><code>/property</code><code>></code>
<code><property name=</code><code>"sendBufferSize"</code><code>>256<</code><code>/property</code><code>></code>
<code><property name=</code><code>"receiveBufferSize"</code><code>>128<</code><code>/property</code><code>></code>
3、 amoeba.xml中還有一個處理用戶端連接配接和網絡資訊使用CPU核數的配置,不過預設配置是主機擁有的CPU核的數量,一般不用修改,如果你的amoeba負載較高,并且機器上還有其他服務,你就可以降低這個配置,避免系統或者其他服務沒有資源,或者出現資源争搶,進而導緻整理的處理能力下降。
查找amoeba.xml檔案中connectionManagerList關鍵字,修改
<code><!--</code>
<code>default value is avaliable Processors</code>
<code><property name=</code><code>"processors"</code><code>>5<</code><code>/property</code><code>></code>
<code> </code><code>--></code>
<code># 取消注釋,并設定processors數量。</code>
到此,MySQL 5.6基于GTID的複制,以及Amoeba讀寫分離的實作配置完成。
本文轉自ljl_19880709 51CTO部落格,原文連結:http://blog.51cto.com/luojianlong/1392844,如需轉載請自行聯系原作者