mysql版本:5.6.24;
操作系统内核版本:Linux-3.13-0-32
主数据库IP:192.168.10.3;
主数据库名:db351353;
备用数据库IP:192.168.10.4;
备用数据库名:db351353。
#服务器唯一ID,一般取IP最后一段
server_id = 3
#启用二进制日志
log_bin=mysql_bin
#需要备份的数据库名 多个库以逗号分隔
Binlog_do_db =db351353
#若涉及及同步函数或者存储过程需要配置,否则主备会产生异常不能同步
log_bin_trust_function_creators=TRUE
# service myql.server restart
mysql> flush tables with read lock;
用navicat for mysql将主数据库数据同步到备数据库
mysql>stop slave;
#服务器唯一ID,一般取IP最后一段
server_id = 4
mysql>show master status;
mysql> change master to
master_host=’192.168.10.3′,
master_user=’iom’,–该用户要有Repl_slave_priv权限,没有可用grant replication slave on *.* to ‘iom’@’%’ identified by ‘xf4851213’授权
master_password=’123’,
master_log_file=’mysql_bin.000005’, –根据主服务器show master status出来的File结果填写
master_log_pos=1192; –根据主服务器show master status出来的Position结果填写
mysql>start slave;
mysql> unlock tables;
在备份数据库上执行
mysql>show slave status;
slave_IO_running和slave_SQL_running 为yes。
主数据库新建一个表,往表里插入几条数据,备份数据库可以同步过来表和表中的数据。
2 配置MYSQL主主同步mysql版本:5.6.24;
操作系统内核版本:Linux-3.13-0-32
数据库A IP:192.168.10.3;
数据库B IP:192.168.10.4;
要同步的数据库名:db351353;db352354
# vi my.cnf
#服务器唯一ID,一般取IP最后一段
server_id = 3
#启用二进制日志
log_bin=mysql_bin
#需要备份的数据库名
binlog_do_db =db351353
binlog_do_db =db352354
binlog_ignore_db=mysql
#若涉及同步函数或者存储过程需要配置,否则主备会产生异常不能同步
log_bin_trust_function_creators=TRUE
#同步参数:
#保证slave挂在任何一台master上都会接收到另一个master的写入信息
log_slave_updates
sync_binlog=1
# auto_increment_offset表示自增长字段从哪个数开始,两主机应一个奇数一个偶数。
auto_increment_offset=1
#auto_increment_increment表示自增长字段每次增长几位数,两主机应该一模一样
auto_increment_increment=2
#过滤掉一些没啥大问题的错误
slave_skip_errors=all
#需要进行同步的数据库.如果有多个数据库可使用多个replicate_do_db选项
replicate_do_db = db351353
replicate_do_db = db352354
#不需要同步的数据库.如果有多个数据库可使用多个replicate_ignore_db选项
replicate_ignore_db = mysql
replicate_ignore_db = information_schema
# vi my.cnf
server_id = 4
log_bin=mysql_bin
binlog_do_db = db351353
binlog_do_db = db352354
binlog_ignore_db=mysql
replicate_do_db = db351353
replicate_do_db = db352354
log_bin_trust_function_creators=TRUE
replicate_ignore_db = mysql
replicate_ignore_db = information_schema
log_slave_updates
sync_binlog=1
auto_increment_offset=2 –此处与另一台机子不同
auto_increment_increment=2
slave_skip_errors=all
mysql>service mysql.server restart
创建帐户并赋权
A机执行:
mysql> grant replication slave on *.* to ‘iomsync’@’192.168.10.4’ identified by ‘123’;
B机执行:
mysql> grant replication slave on *.* to ‘iomsync’@’192.168.10.3’ identified by ‘123’;
分别在A,B上执行:
mysql>flush tables with read lock;#防止进入新的数据
mysql>show master status;#查看主机服务状态
使用navicat的数据传输功能同步数据,把源和目标两属性填写正确,左下角的数据库对象选择全选,点开始。
注意:同步时目标mysql必须先建好要同步的数据库。
master_log_file和master_log_pos 两个参数根据2.4.2的show master status命令结果填写,master_log_file对应File,master_log_pos对应Position。
A上执行:
mysql>change master to master_host=’192.168.10.4’,master_user=’iomsync’,master_password=’123’, master_log_file=’mysql_bin.000024’,master_log_pos=3946;–填B机上的show master status结果
B上执行:
mysql>change master to
master_host=’192.168.10.3’,master_user=’ iomsync’,master_password=’123’, master_log_file=’mysql_bin.000008′,master_log_pos=8538;– 填A机上的show master status结果
在A,B上分别执行
mysql> unlock tables;
在A,B上分别执行
mysql> start slave;
如果启动报错:Slave failed to initialize relay log info structure from the repository,可以先执行mysql> reset slave;指令,然后再执行2.4.3指令。
在A,B上分别执行
mysql> show slave status;
结果集中Slave_IO_Running: Yes ,Slave_SQL_Running: Yes,就标识从服务启动成功。
一般情况下,不论是mysql进程突然终止还是正常关闭,双主机部署可以在重启mysql后正常同步关机期间另一台主机上执行的写操作。但某些情况例外,比如Linux主机非正常关闭。例如A,B两台服务器主主同步,A服务器因掉电直接停机,A修复故障开机后,A机能正常同步B机的数据,但B机无法正常同步A机数据(B无法同步A对实际生产不会造成任何影响,因为此时客户端写操作都是在B上执行),A机上也没有Binlog Dump线程(见2.6.1),此时在B机上重新执行slave指令即可。
mysql>stop slave;
mysql>start slave;
2,重启后的机子有Binlog Dump线程,不需做任何操作。
在A,B上分别执行
mysql> show processlist;
这两个是slave服务器与master服务器同步数据的线程,一个负责读取master的 Binlog Dump 线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relay logs)中,另一个负责读取中继日志,然后执行它们来更新数据。time字段显示最近的一次跟新离语句执行时的间隔时间,默认单位是秒。
这个线程是master服务器的Binlog Dump线程,负责给slave服务器发送更新日志。
如果A机数据比B机新,要想让B机完全同步A机,可按如下操作:
在A机上执行:
mysql> flush tables with read lock;
mysql> show master status
记录下show语句输出中的复制坐标的值。
在 B机上执行:(参数使用上一步获得的值)
mysql> select master_pos_wait(‘log_name’, log_pos)
这个select语句会保持运行,直到slave根据指定的日志文件和位置完成和master的同步,然后该select语句返回。
在master执行:(解除更新限制)
mysql> unlock tables;
mysql在5.6版本后,加入了gtid同步功能,使用gtid同步,可以在执行change master to指令时不用手工指定master_log_file和master_log_pos,方便日常维护。
锁定表,A,B两机上执行(首次执行)
mysql>flush tables with read lock ;
A,B两机上编辑my.cnf文件,在原有主主配置基础上增加
gtid_mode=ON
enforce_gtid_cOnsistency=ON
指定主库
A机:
mysql>change master to master_host=’192.168.10.4′,master_port=3306,master_user=’iomsync’,master_password=’123′,master_auto_position=1;
— master_port参数不能加单引号,否则会报语法错误。
B机:
mysql>change master to master_host=’192.168.10.3′,master_port=3306,master_user=’iomsync’,master_password=’123′,master_auto_position=1;
开启slave服务,A,B都执行
mysql>start slave;
查看同步状态
mysql>show slave status;
如果Auto_Position字段值为1,则已开启gtid复制。
不能使用下列语句:
mysql> create table test as select * from so where 1=1;
1786 – CREATE TABLE … SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_COnSISTENCY= 1;.
事务内部不能执行创建删除临时表语句,但可以在事务外执行,且必须设置set autocommit = 1;
在同一事务中更新事务表与非事务表将导致多个GTID分配给同一事务;
这就决定我们在配置mycat时需将客户端的写请求分发到同一个数据库实例。
3 MYCAT安装与配置解压mycat压缩包
#tar –xzvf Mycat-server-XXX-linux.tar.gz /usr/local/mycat
重点介绍rule.xml schema.xml router.xml server.xml log4j.xml
分片规则配置文件,mycat支持的所有分片规则都在这个文件里。定义一个规则需要两个节点,一个是tableRule,一个是function。
以一致性哈希分片为例,function节点定义了分片规则的实现类与初始化参数和分片规则的算法名称。
属性name为规则算法名称
class为规则实现类
property子节点为初始化规则的参数,使用seed count virtualBucketTimes就可初始化一致性哈希规则
tableRule节点定义了分片规则名(注意此处是规则名,前面的function节点的name属性是算法名)rule子节点指定用来分片的数据库表字段和分片算法名,也就是前面的function节点的name属性。
murmur
任何自定义的分片规则也可以这样配置
此文件用来配置mycat全局参数
另外还有一个9066端口没有出现在配置文件中,用来接收mycat监控命令、查询mycat运行状况、重新加载配置文件等。更多信息请参考Mycat in action。
name属性指定mycat用户名
可以有多个user节点。
其中checkSQLschema表明是否检查并过滤SQL中包含schema的情况,如逻辑库为 TESTDB,则可能写为select * from TESTDB.aaa,此时会自动过滤TESTDB,SQL变为select * from aaa,若不会出现上述写法,则可以关闭属性为false
writeType=”0″ dbType=”mysql” dbDriver=”native”> password=”123″> –> password=”123″/>
writeType=”0″ dbType=”mysql” dbDriver=”native”> password=”xf4851213″> –> password=”123″/>
红色字体为注释,实际文件里没有。
–
– Licensed under the Apache License, Version 2.0 (the “License”);
– you may not use this file except in compliance with the License.
– You may obtain a copy of the License at
–
– http://www.apache.org/licenses/LICENSE-2.0
–
– Unless required by applicable law or agreed to in writing, software
– distributed under the License is distributed on an “AS IS” BASIS,
– WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
– See the License for the specific language governing permissions and
– limitations under the License.
–>
func1
节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 –>
用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 –>
红色字体为注释,实际文件里没有。
351=0 –分配到dn1节点
352=1 –分配到dn2节点
353=0
354=1
客户机navicat打开mycat1连接,能看到一个数据库TESTDB,数据库中能查到db351353和db352354两个数据库的所有数据。mycat2连接亦同。
测试目的:由4.4.1.1可知,dn1连接的主数据库是mysql1的db351353,从数据库是mysql2的db351353,balance值为1,此模式下从数据库也为读数据库。mycat增删改操作应通过mysql1的db351353进行,读操作应通过mysql2的db351353进行。
测试方法:客户机通过navicat的mysql2连接更改db351353的so表记录,这样db351353在mysql1和mysql2上有两份不同的数据,在客户机navicat的mycat1连接上查看so表本地网为351的数据是否与mysql2相同,如相同则测试通过。测试过后要恢复mysql2上db351353的数据,以免影响剩余的测试。
测试目的:由4.4.1.1可知,dn1连接的主数据库是mysql1的db351353,从数据库是mysql2的db351353,如果mysql1服务挂掉,dn1节点的增删改操作应自动切换到mysql2的db351353。
测试方法:在mysql1主机上执行 #service mysql.server stop; 在客户机navicat的mycat1连接上看是否能正常查询so表数据,如果查询正常,修改so表本地网为351的数据,在客户机navicat的mysql2连接上查看db351353的so表数据是否和修改的一样,如果一样则测试通过。
注意:如果mysql1服务重新启动,则mysql1的db351353为从数据库,不会重新变为主数据库。
测试目的:mycat1和mycat2单个节点宕掉,不影响客户机使用数据库。
测试方法:客户机navicat使用keepalived连接,能正常查询和增删改数据。在mycat1上执行#mycat stop;客户机keepalived连接仍能正常使用。mycat1上执行#mycat console,mycat2上执行#mycat stop,客户机keepalived连接能正常使用。mycat2上执行#mycat console,客户机keepalived连接能正常使用,且数据请求路由和keepalived所配lb_algo策略相同。
LVS+MYCAT读写分离+MYSQL同步部署手册(第三版)