系统:centos6.4
master:192.168.248.200
slave:192.168.248.201
amoeba:192.168.248.202
master:
为了方便选用的mysql为通用二进制:mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz
tar xf mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
ln -s mysql-5.6.30-linux-glibc2.5-x86_64 /usr/local/mysql
useradd -r mysql
mkdir /mydata/data -pv
chown -R root:mysql /usr/local/mysql
chown -R mysql:mysql /mydata/data
cd /uar/local/mysql
scripts/mysql_install_db --user=mysql --datadir=/mydata/data
vi /etc/profile.d/mysqld.sh
export PATH=$PATH:/usr/local/mysql/bin
. /etc/profile.d/mysqld.sh
cp support-files/mysql.server /etc/init.d/mysqld
vi my.cnf
###################启用新特性GTID#############################
datadir = /mydata/data:数据目录
binlog-format = row:二进制格式
log-slave-updates = true:从服务器日志更新
gtid-mode = on:启用GTID特性
enforce-gtid-consistency = true:是否强制GTID一致性
master-info-repository = TABLE:master.info用表的格式保存
relay-log-info-repository = TABLE:relay-log.info用表的格式保存
sync-master-info = 1:确保无信息丢失
slave-parallel-workers = 2:设置从服务器sql线程个数
binlog-checksum = CRC32:启用二进制日志校验功能
master-verify-checksum = 1
slave-sql-verify-checksum = 1
binlog-rows-query-log_events = 1:记录二进制日志的额外信息(并非强制)
server-id = 200
report-port = 3306
port = 3306
datadir = /mydata/data
socket = /tmp/mysql.sock
report-host = master
log-bin = mysql-bin
innodb_file_per_table = 1
确保无误后,可以开始启动mysql服务器了
service mysqld start
如有错误,记得一定得看数据目录下的错误日志,如master.err
slave:
tar xf mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
ln -s mysql-5.6.30-linux-glibc2.5-x86_64 /usr/local/mysql
useradd -r mysql
mkdir /mydata/data -pv
chown -R root:mysql /usr/local/mysql
chown -R mysql:mysql /mydata/data
cd /uar/local/mysql
scripts/mysql_install_db --user=mysql --datadir=/mydata/data
vi /etc/profile.d/mysqld.sh
export PATH=$PATH:/usr/local/mysql/bin
. /etc/profile.d/mysqld.sh
cp support-files/mysql.server /etc/init.d/mysqld
vi my.cnf
###################启用新特性GTID#############################
datadir = /mydata/data:数据目录
relay-log = relay-mysql
binlog-format = row:二进制格式
log-slave-updates = true:从服务器日志更新
gtid-mode = on:启用GTID特性
enforce-gtid-consistency = true:是否强制GTID一致性
master-info-repository = TABLE:master.info用表的格式保存
relay-log-info-repository = TABLE:relay-log.info用表的格式保存
sync-master-info = 1:确保无信息丢失
slave-parallel-workers = 2:设置从服务器sql线程个数
binlog-checksum = CRC32:启用二进制日志校验功能
master-verify-checksum = 1
slave-sql-verify-checksum = 1
binlog-rows-query-log_events = 1:记录二进制日志的额外信息(并非强制)
server-id = 201
report-port = 3306
port = 3306
datadir = /mydata/data
socket = /tmp/mysql.sock
report-host = slave
log-bin = mysql-bin
innodb_file_per_table = 1
于是开始创建复制的账号密码:
master:
grant replication slave on *.* to 'rep'@'192.168.248.%' identified by 'redhat';
flush privileges;
注意:主从服务器的防火墙和selinux关闭掉:
service iptables stop
setenforce 0
sed -i 's#SELINUX=enforce#SELINUX=permissive#g' /etc/selinux/config
开始主从复制步骤:
slave:
mysql>change master to master_host='192.168.248.200',master_user='rep',master_password='redhat',master_auto_position=1;
mysql>start slave;
mysql>show slave status\G
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.248.200
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1091
Relay_Log_File: relay-bin.000003
Relay_Log_Pos: 986
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
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: 1091
Relay_Log_Space: 1796
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: 200
Master_UUID: c5b08767-1124-11e6-82a6-000c293d8d1b
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: c5b08767-1124-11e6-82a6-000c293d8d1b:1-5
Executed_Gtid_Set: 8812b0d5-1126-11e6-82b2-000c29b7e7fb:1-3,
c5b08767-1124-11e6-82a6-000c293d8d1b:1-5
Auto_Position: 1
1 row in set (0.00 sec)
两个yes,说明了主从复制基于GTID已经成功了
于是开始搭建amoeba代理服务器
192.168.248.202:
由于amoeba是基于java开发的于是必须要支持jdk:
jdk-6u45-linux-x64.bin
cd /root
./jdk-6u45-linux-x64.bin
vi /etc/profile.d/java.sh
export JAVA_HOME=/root/jdk1.6.0_45/
export PATH=$PATH:$JAVA_HOME
. /etc/profile.d/java.sh
java -versiom
[root@RS1 ~]# java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
安装下载好的amoeba:
amoeba-mysql-3.0.4-BETA-distribution.zip
unzip amoeba-mysql-3.0.4-BETA-distribution.zip /usr/local
mv amoeba-mysql-3.0.4-BETA-distribution/* /usr/local/amoeba
cd /usr/local/amoeba
cd conf
vi amoeba.xml
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
<proxy>
<service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
<property name="port">3306</property>:代理服务器的端口
<!-- bind ipAddress -->
<property name="ipAddress">192.168.248.202</property>:amoeba服务器ip
<property name="connectionFactory">
<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
<property name="sendBufferSize">128</property>
<property name="receiveBufferSize">64</property>
</bean>
</property>
<property name="authenticateProvider">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<property name="user">root</property>:设定amoeba服务器的登录用户
<property name="password">redhat</property>:设置amoeba服务器的登录密码
<property name="filter">
<bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
</bean>
</property>
</bean>
</property>
</service>
<runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">
<!-- proxy server client process thread size -->
<property name="executeThreadSize">128</property>
<!-- per connection cache prepared statement size -->
<property name="statementCacheSize">500</property>
<!-- query timeout( default: 60 second , TimeUnit:second) -->
<property name="queryTimeout">60</property>
</runtime>
</proxy>
<!--
Each ConnectionManager will start as thread
manager responsible for the Connection IO read , Death Detection
-->
<connectionManagerList>
<connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>
</connectionManager>
</connectionManagerList>
<!-- default using file loader -->
<dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
<property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
</dbServerLoader>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">server1</property>:默认池,一般为master也就是server1
<!--
<property name="writePool">server1</property>:写池:master
<property name="readPool">multiPool</property>:读池:slave也就是server2
-->
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>
#############################################################################
vi 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,
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">amoeba</property>:amoeba所起用的后端用户名
<property name="password">redhat</property>amoeba所起用的后端用户名密码
</factoryConfig>
<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
<property name="maxActive">500</property>
<property name="maxIdle">500</property>
<property name="minIdle">1</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.248.200</property>
</factoryConfig>
</dbServer>
<dbServer name="server2" parent="abstractServer">:定义从库节点
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.248.201</property>
</factoryConfig>
</dbServer>
<dbServer name="multiPool" virtual="true">:定义multi池
<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">server2</property>:从服务器,有多个时,用逗号隔开
</poolConfig>
</dbServer>
</amoeba:dbServers>
定义完之后,启动amoeba
/usr/local/amoeba/bin/launcher &:放置在后端执行
[root@RS1 conf]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1082/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1158/master
tcp 0 0 :::80 :::* LISTEN 2288/httpd
tcp 0 0 :::22 :::* LISTEN 1082/sshd
tcp 0 0 ::1:25 :::* LISTEN 1158/master
tcp 0 0 ::ffff:192.168.248.202:3306 :::* LISTEN 4219/java
可以看见java程序进程已经启动了,即amoeba已经启动了
用一个可以登录的mysql客户端登录amoeba服务器:
[root@master ~]# mysql -uroot -p -h192.168.248.202
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 567038057
Server version: 5.1.45-mysql-amoeba-proxy-3.0.4-BETA MySQL Community Server (GPL):可以看出已经成功登陆
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
断开从服务器的复制:
stop slave;
主从服务器各为amoeba创建一个默认数据库为test的用户,与配置文件一致:
master:
grant all privileges on *.* to 'amoeba'@'192.168.248.%' identified by 'redhat';
slave:
grant all privileges on *.* to 'amoeba'@'192.168.248.%' identified by 'redhat';
创建完之后再开启复制功能:
start slave;
回到amoeba服务器:
[root@master ~]# mysql -uroot -p -h192.168.248.202
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 567038057
Server version: 5.1.45-mysql-amoeba-proxy-3.0.4-BETA MySQL Community Server (GPL):可以看出已经成功登陆
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
执行读写操作的sql语句,主从服务器各自用tcpdump进行抓包:
master:
[root@master mysql]# tcpdump -i eth0 -s0 -nn -A tcp dst port 3306 and dst host 192.168.248.200
slave:
[root@slave mysql]# tcpdump -i eth0 -s0 -nn -A tcp dst port 3306 and dst host 192.168.248.201
记录:
不知道为啥主从抓包的时候,读写操作的sql语句都在主服务器上可以抓到,而从服务器一直都抓不到
改变了amoeba的配置文件依然还是完全的实现都写操作,这里记录一下结果