共计 6313 个字符,预计需要花费 16 分钟才能阅读完成。
说明:本配置基于 CentOS 6.4_x86,两台 MySQL 服务器均为源码编译(5.6.24 版本),amoeba 代理为 2.2.0 版本
server | use | ip |
---|---|---|
master | mysql 主 | 192.168.0.172 |
slave | mysql 从 | 192.168.0.173 |
amoeba | 将用户请求代理至 mysqlserver | 192.168.0.176 |
Linux 下 MySQL 主从复制(Master-Slave)与读写分离(Amoeba)实践 http://www.linuxidc.com/Linux/2016-05/130905.htm
使用 Amoeba 实现 MySQL DB 读写分离 http://www.linuxidc.com/Linux/2015-02/113542.htm
用 Amoeba 实现 MySQL 的读写分离 http://www.linuxidc.com/Linux/2013-12/94235.htm
CentOS 系统 Amoeba+MySL 主从读写分离配置教程 http://www.linuxidc.com/Linux/2015-10/124115.htm
一、mysql 服务器基于 GTID 主从复制的实现
1、配置主从节点的服务配置文件
master 节点:
[root@master ~]# cat /etc/my.cnf |grep "^\s*[^#\t]*s" | |
[mysqld] | |
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES | |
basedir = /usr/local/mysql | |
log-bin=master-bin | |
log-slave-updates=true | |
master-info-repository=TABLE | |
relay-log-info-repository=TABLE | |
sync-master-info=1 | |
slave-parallel-workers=2 | |
binlog-checksum=CRC32 | |
master-verify-checksum=1 | |
slave-sql-verify-checksum=1 | |
binlog-rows-query-log_events=1 | |
server-id=1 | |
socket=/tmp/mysql.sock |
slave 节点:
[root@slave data]# cat /etc/my.cnf |grep "^\s*[^#\t]*s" | |
[mysqld] | |
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES | |
basedir = /usr/local/mysql | |
log-slave-updates=true | |
master-info-repository=TABLE | |
relay-log-info-repository=TABLE | |
sync-master-info=1 | |
slave-parallel-workers=2 | |
binlog-checksum=CRC32 | |
master-verify-checksum=1 | |
slave-sql-verify-checksum=1 | |
binlog-rows-query-log_events=1 | |
server-id=11 | |
log-bin=mysql-bin.log | |
socket=/tmp/mysql.sock |
2、master 创建复制用户
mysql> grant replication slave on *.* to dbsync@192.168.0.173 identified by 'syncpass'; | |
mysql> show global variables like '%uuid%'\G | |
*************************** 1. row *************************** | |
Variable_name: server_uuid | |
Value: 9652c294-25d4-11e6-898b-000c2919c9d0 | |
mysql> show master status\G | |
*************************** 1. row *************************** | |
File: master-bin.000001 | |
Position: 151 | |
Binlog_Do_DB: | |
Binlog_Ignore_DB: | |
Executed_Gtid_Set: | |
1 row in set (0.00 sec) |
3、slave 启动复制线程
mysql> change master to master_host='192.168.0.172',master_user='dbsync',master_password='syncpass',master_auto_position=1; | |
mysql> show global variables like '%uuid%'\G | |
*************************** 1. row *************************** | |
Variable_name: server_uuid | |
Value: 997046fa-5b8e-11e6-a7e2-000c2919c9d0 | |
mysql> start slave; | |
mysql> show slave status\G | |
*************************** 1. row *************************** | |
Slave_IO_State: Waiting for master to send event | |
Master_Host: 192.168.0.172 | |
Master_User: dbsync | |
Master_Port: 3306 | |
Connect_Retry: 60 | |
Master_Log_File: master-bin.000001 | |
Read_Master_Log_Pos: 151 | |
Relay_Log_File: slave-relay-bin.000002 | |
Relay_Log_Pos: 363 | |
Relay_Master_Log_File: master-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: 151 | |
Relay_Log_Space: 567 | |
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 | |
Master_UUID: 9652c294-25d4-11e6-898b-000c2919c9d0 | |
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: | |
Executed_Gtid_Set: | |
Auto_Position: 1 |
3、创建一个测试书库库查看 MySQLmaster 进程,显示已经发送二进制日志给 salve
mysql> create database reliacatedb; | |
mysql> show processlist\G | |
*************************** 1. row *************************** | |
Id: 1 | |
User: root | |
Host: localhost | |
db: NULL | |
Command: Query | |
Time: 0 | |
State: init | |
Info: show processlist | |
*************************** 2. row *************************** | |
Id: 3 | |
User: dbsync | |
Host: slave:33608 | |
db: NULL | |
Command: Binlog Dump GTID | |
Time: 259 | |
State: Master has sent all binlog to slave; waiting for binlog to be updated | |
Info: NULL |
二、amoeba 节点安装配置
1、配置 Java 环境
# yum install -y java-1.6.0-openjdk | |
# vim /etc/profile.d/jdk.sh | |
export JAVA_HOME=/usr/ | |
export PATH=$PATH:$JAVA_HOME/bin | |
# source /etc/profile.d/jdk.sh |
2、安装 ameoba
https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/
# wget https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.2.x/amoeba-mysql-binary-2.2.0.tar.gz/download | |
# mkdir !$ | |
mkdir /usr/local/amoeba-2.2.0 | |
# tar xvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba-2.2.0 |
3、修改 ameoba 配置文件
amoeba 前端访问配置
# vim /usr/local/amoeba-2.2.0/conf/amoeba.xml | |
<property name="port">3306</property> # 将默认端口 8066 改为 3306,便于实现前端程序连接数据库的透明性 | |
<property name="ipAddress">0.0.0.0</property> # 有多块网卡时可按此设置,表示绑定任意地址,即 amoeba 对外访问的 IP 地址 | |
<property name="user">root</property> # 客户端连接 amoeba 的代理使用的用户 | |
<property name="password">mypass</property> # 客户端连接 amoeba 的代理使用的密码 | |
<property name="defaultPool">master</property> # 默认访问节点 | |
<property name="writePool">master</property> | |
<property name="readPool">slave</property> | |
# 读写分离配置,读池和写池和 dbServer.xml 中配置的节点相关 |
4、amoeba 后端代理配置
# vim /usr/local/amoeba-2.2.0/conf/dbServers.xml | |
<property name="user">root</property> # 默认连接 mysql server 的用户 | |
<property name="password">pass</property> # 默认连接 mysql server 的密码,以上两项如不在下文中的 dbserver 中单独定义,则直接继承此处定义 | |
<dbServer name="master" parent="abstractServer"> | |
<factoryConfig> | |
<property name="ipAddress">192.168.0.172</property> | |
</factoryConfig> | |
</dbServer> | |
<dbServer name="slave" parent="abstractServer"> | |
<factoryConfig> | |
<property name="ipAddress">192.168.0.173</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">master,slave,slave,slave</property> | |
</poolConfig> | |
</dbServer> |
5、环境变量配置
# vim /etc/profile.d/amoeba.sh | |
export AMOEBA_HOME=/usr/local/amoeba-2.2.0/ | |
export PATH=$AMOEBA_HOME/bin/:$PATH | |
source /etc/profile.d/amoeba.sh |
6、启动 amoeba
The stack size specified is too small, Specify at least 160k | |
Could not create the Java virtual machine. | |
如果报以上错误,需编辑二进制脚本 | |
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k" | |
修改为如下 | |
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k" |
7、通过 amoeba 连接 mysql
执行一些读写操作,在两台 mysql 服务器上使用 tcpdump 抓包
[root@master ~]# tcpdump -i eth0 -s0 -nn -A tcp dst port 3306 and dst host 192.168.0.172 | |
[root@slave ~]# tcpdump -i eth0 -s0 -nn -A tcp dst port 3306 and dst host 192.168.0.173 |
master 上实现写操作
slave 上实现读操作
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-08/134008.htm
