MySQL想必大家都不陌生,之前文章也有介绍同步复制与半同步复制,今天先来了解下什么是GTID。
GTID(global transaction ID)全局事务ID,是由服务器的UUID+一段随机数事务ID。
特性:从服务器从主服务器复制过来的事务,GTID不变,也就是说一个事务在全局复制架构中的ID不变。
有什么用:
在MySQL集群中,当Master故障时,需要从Slave中挑选一个提升为Master可以基于GTID对比其他Slave来保证数据的一致性。
MySQL主从同步如何配置数据过滤
主服务器配置:
Binlog-do-db //指定要记录二进制日志的数据库
Binlog-ignore-db //指定要忽略记录二进制日志的数据库
从服务器配置:
Replicate-do-table= //指定要记录二进制日志的表
Replicate-ignore-table= //指定要忽略记录二进制日志的表
Replicate-do-db= //指定要记录二进制日志的数据库
Replicate-ignore-db= //指定要忽略记录二进制日志的数据库
Replicate-wild-do-table= //指定要记录二进制日志的表(支持通配符)
Replicate-wild-ignore-table= //指定要忽略记录二进制日志的表(支持通配符)
实验一、配置一个基于GTID的MySQL主从复制架构。
实验环境:RHEL6.4+MySQL5.6
Master:192.168.18.201 admin1.tuchao.com
Slave: 192.168.18.202 admin2.tuchao.com
安装和启动MySQL过程和之前都一样(略)
Master配置:
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 2
datadir=/mydata
log-bin=mysql-bin
innodb_file_per_table = 1
binlog-format=ROW //设置二进制日志格式
log-slave-updates=true //是否记录从服务器同步数据动作
gtid-mode=on //启用Gtid模式
enforce-gtid-consistency=true //是否强制GTID的一致性
master-info-repository=TABLE //master信息的记录位置
relay-log-info-repository=TABLE //中继日志信息的记录位置
sync-master-info=1
slave-parallel-workers=2 //设置从服务器复制线程数
binlog-checksum=CRC32 //设置binlog校验算法(循环冗余校验码)
master-verify-checksum=1 //设置主服务器是否校验
slave-sql-verify-checksum=1 //设置从服务器是否校验
binlog-rows-query-log_events=1
server-id = 10
report-port=3306
report-host=admin1.tuchao.com //设置报告给哪台服务器,一般设置为本机的主机名。
Slave配置:
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 2
datadir=/data
log-bin=mysql-bin
innodb_file_per_table = 1
binlog-format=ROW
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=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 = 20
report-port=3306
report-host=admin2.tuchao.com
其实master和slave配置几乎相同, 只需要修改几个参数我在上面用红色字体做了标记,如server-id ,report-host等。
在Master上授权复制权限的用户
grant replication slave,replication client on *.* to 'repluser'@'192.168.18.202' identified by '123456';
启动slave复制线程
change master to master_host='admin1.tuchao.com',master_user='repluser',master_password='123456',master_auto_position=1;
start slave;
查看警告信息
Show warnings
查看Slave状态
show slave status\G
这时我们在Master上创建一个tuchao数据库
来到Slave查看
同步成功!
实验二、使用amoeba构建MySQL集群实现负载均衡,读写分离。
我们在192.168.18.199这台主机部署amoeba由于是java程序,要先安装jdk,然后定义JAVA_HOME环境变量,导出PATH环境变量。(略)
amoeba-mysql2.2 官网下载地址:
http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.2.x/
创建需要的目录,创建链接,解压程序到目录。
mkdir /usr/local/amoeba-mysql-2.2
cd /usr/local
ln -sv amoeba-mysql-2.2 amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba-mysql-2.2/
导出PATH环境变量
vim /etc/profile.d/amoeba.sh
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$AMOEBA_HOME/bin:$PATH
编辑 /usr/local/amoeba/conf/dbServers.xml
编辑vim /usr/local/amoeba/conf/amoeba.xml
配置完成后保存,启动amoeba。
amoeba start
连接amoeba
创建数据库,创建表,然后用tcpdump在两个节点抓包,你会发现写操作都会转发到Master。
执行select等语句凡是读操作,会发两个请求给Slave,一个给Master。
tcpdump 命令简单介绍
-i 指定网卡
-s 指定报文的长度,s0表示抓整个包。
-nn 不要解析主机名和端口名。
-XX 显示报文内容十六进制码,ASCII,以太网头部。
-vv 显示详细信息。
-A 显示数据包里的ASCII
-w 把内容导出到指定的文件中
例子:
tcpdump -i eth0 -s0 -nn -A tcp dst port 3306 and dst host 192.168.18.202
tcpdump -i eth1 -s0 -nn -vv -A ip src 210.32.92.217 and tcp dst port 443
还可以用src 指定源地址。
这篇就写到这里了,大家自行抓包测试。