Amoeba實現Mysql讀寫分離部署文檔

以下所有理解純屬個人理解,如若有誤歡迎指出,不勝感激……o(∩_∩)o

兩臺服務器配置MYSQL主從複製實現數據高可用,這時讀與寫操作都有由master服務器來完成的,而從服務器只是複製了mster服務器的數據,這時可以利用一臺服務器配置Amoeba實現mysql讀寫分離, master負責寫,slave負責讀取,當然 也可以有多個salve…… 從而減輕master服務器的壓力,實現負載分攤;

 

拓撲圖:

   

wKiom1O59tWgJu0UAACBSDKOHE0192.jpg

Mysql主從複製原理:

    兩臺mysql服務器一個作爲master一個爲slave;master上開啓二進制日誌,將自己所有使數據庫發生改變的操作語句記錄到而二進制日誌中,slave端會開啓一個IO線程向master請求masert二進制日誌中的事件,master通過binlogdump線程將二進制日誌事件發送給slave,slave將接收到的二進制日誌時間保存在中繼日誌(relaylog)中,然後使用sql 線程之行中繼日誌;從而保證數據與master相同;

wKiom1O59uaAnAg2AAEQJcXvib4042.jpg

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章