1. 程式人生 > >MySQL主從復制技術與讀寫分離技術amoeba應用

MySQL主從復制技術與讀寫分離技術amoeba應用

buffer chan lns -a query rep 下載 高可用性 tab

MySQL主從復制技術與讀寫分離技術amoeba應用

前言:眼下在搭建一個人才站點,估計流量會非常大,須要用到分布式數據庫技術,MySQL的主從復制+讀寫分離技術。讀寫分離技術有官方的MySQL-proxy,阿裏巴巴的Amoeba。Amoeba能在阿裏巴巴這麽大流量的平臺投入使用並且執行穩定,Amoeba的性能是非常優越的。相信眼前事實,所以選擇了Amoeba。

一、名詞解析

1. 主從復制。

將主server上的數據拷貝到從server上,保護數據免受意外的損失。

技術分享

2.Amoeba

Amoeba(變形蟲)項目,專註分布式數據庫 proxy 開發。座落與Client、DB Server(s)之間。

對client透明。具有負載均衡、高可用性、sql過濾、讀寫分離、可路由相關的query到目標數據庫、可並發請求多臺數據庫合並結果。

二、環境資料

如果amoeba的前提條件:

1. 實驗環境:

System: CentOS release 6.5

JDK: jdk-6u35-linux-x64.bin

Mysql版本號: 5.5.38

Amoeba版本號: amoeba-mysql-3.0.5-RC-distribution

2. 架構圖:

技術分享


主服務器,用於寫數據庫, Master server 192.168.1.106

從服務器,用於讀數據庫。Slave server 192.168.1.100

讀寫分離的代理服務器, Amoeba server: 192.168.1.105

三、架設MySQL的主從復制server

1. 主服務器Master server數據庫配置:

我的mysql 安裝在/usr/local/mysql

#vi /etc/my.cnf

設置 server-id = 1 ,此值不能和從數據庫的一樣

在my.cnf末尾加入例如以下語句,表示哪些庫不同步:

binlog-ignore-db=mysql #每一個不同步的庫寫一行

#service mysqld restart

接著分配一個數據庫賬號給Slave Server 和 Amoeba Server:

#mysql -uroot -p123456

mysql> grant replication slave on *.* to idc719comslave@192.168.1.100 identified by 123456

mysql> grant all on *.* to proxyuser@192.168.1.105 identified by 123456

mysql> flush privileges;

mysql> show master status;

mysql> show master status;

+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000028 | 107 | | mysql |

+------------------+----------+--------------+------------------+

1 row in set (0.01 sec)

記錄File的mysql-bin.000028 與 Position的107 ,等會要用到。

2. 從服務器Slave server數據庫配置:

#vi /etc/my.cnf

replicate-do-db=test

replicate-ignore-db=mysql

replicate-ignore-db=persondb

#service mysqld restart

#mysql -uroot -p123456

mysql> grant all on *.* to proxyuser@192.168.1.105 identified by 123456;

mysql> CHANGE MASTER TO

-> Master_Host=192.168.1.106,

-> Master_User=idc719comslave,

-> Master_Password=123456,

-> Master_Port=3306,

-> Master_Log_File=mysql-bin.000028,

-> Master_Log_File=107;

mysql> start slave;

mysql> show slave status\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.1.106

Master_User: idc719comslave

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000028

Read_Master_Log_Pos: 107

Relay_Log_File: slaveserver1-relay-bin.000016

Relay_Log_Pos: 253

Relay_Master_Log_File: mysql-bin.000028

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB: test

Replicate_Ignore_DB: mysql

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: 107

Relay_Log_Space: 416

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:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

1 row in set (0.00 sec)

看到Slave_IO_State: Waiting for master to send event 表示成功了!

假設不成功, 比方

Last_IO_Errno: 2003

、Last_IO_Error: error connecting to master [email protected]:3306‘ - retry-time: 60 retries: 86400

是主server開了防火墻,或者用戶password錯誤!

三、架設 Amoeba server

1. 安裝JDK

Amoeba是java編寫的,執行須要JDK環境,能夠通過#echo $JAVA_HOME看是否安裝配置了JDK,假設沒有。參考例如以下方法:

下載軟件包

uname -r 檢查系統內核信息

mkdir -p /tmp/src && cd /tmp/src

x86_64 請下載

wget http://docs.minunix.com/web/jdk-6u35-linux-x64.bin

i386系列 請下載

wget http://docs.minunix.com/web/jdk-6u35-linux-i586.bin

註:作者系統為X86_64 ,所以以x86_64 演示,步驟都一樣的!

安裝必備組件信息:

yum -y install glibc*

下載完畢之後,改動文件屬性,賦予可運行權限,然後運行程序予以安裝:

chmod +x jdk-6u35-linux-x64.bin

./jdk-6u35-linux-x64.bin

註:此處可能會出現下面問題:

/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

此問題是由於您沒有安裝glibc-* ,僅僅須要安裝glibc 就可以解決,

yum -y install glibc*

安裝完畢之後,運行下列命令:

#cp -rf jdk1.6.0_35 /usr/local/jdk

#vim /etc/profile.d/java.sh \\\輸入下列內容

JAVA_HOME="/usr/local/jdk"

CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib"

PATH=".:$PATH:$JAVA_HOME/bin"

export JAVA_HOME

###保存退出,並運行以下的命令使配置生效

#source /etc/profile.d/java.sh

#java -version \\\檢查java版本號

2.安裝Amoeba

下載頁面:http://sourceforge.net/projects/amoeba/?

source=directory

下載後。解壓 #unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/

#cd /usr/local

#mv amoeba-mysql-3.0.5-RC-distribution amoeba

#cd amoeba

#ls

benchmark bin conf jvm.properties lib logs

#cd conf

#vim amoeba.xml

查找例如以下字段並改動紅色的部分,各自是port、amoeba主機的ip。用戶password,和讀寫server的別名,其余字段默認就能夠

<property name="port">8066</property>

<property name="ipAddress">192.168.1.105</property>

<property name="user">root</property>

<property name="password">123456</property>

<property name="writePool">server1</property>

<property name="readPool">server2</property>

#vim dbServers.xml

紅色部分為改動的地方

<?

xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">

<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">

<!--

Each dbServer needs to be configured into a Pool,

If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:

add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig

such as ‘multiPool‘ dbServer

-->

<dbServer name="abstractServer" abstractive="true">

<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="connectionManager">${defaultManager}</property>

<property name="sendBufferSize">64</property>

<property name="receiveBufferSize">128</property>

<!-- mysql port -->

<property name="port">3306</property>

<!-- mysql schema -->

<property name="schema">test</property>

<!-- mysql user -->

<property name="user">proxyuser</property>

<property name="password">123456</property>

</factoryConfig>

<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">

<property name="maxActive">500</property>

<property name="maxIdle">500</property>

<property name="minIdle">10</property>

<property name="minEvictableIdleTimeMillis">600000</property>

<property name="timeBetweenEvictionRunsMillis">600000</property>

<property name="testOnBorrow">true</property>

<property name="testOnReturn">true</property>

<property name="testWhileIdle">true</property>

</poolConfig>

</dbServer>

<dbServer name="server1" parent="abstractServer">

<factoryConfig>

<!-- mysql ip -->

<property name="ipAddress">192.168.1.106</property>

</factoryConfig>

</dbServer>

<dbServer name="server2" parent="abstractServer">

<factoryConfig>

<!-- mysql ip -->

<property name="ipAddress">192.168.1.100</property>

</factoryConfig>

</dbServer>

<dbServer name="multiPool" virtual="true">

<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

<property name="loadbalance">1</property>

<!-- Separated by commas,such as: server1,server2,server1 -->

<property name="poolNames">server1</property>

</poolConfig>

</dbServer>

</amoeba:dbServers>

文字出自:http://blog.csdn.net/ljuncong


MySQL主從復制技術與讀寫分離技術amoeba應用