标签:TE lin 错误 mit 行数据 ... cal oca filter
主从配置主从配置作用是分担访问压力,但是也存在主服务器并行发日志,从服务器串行写日志,这就回导致如果主服务器很繁忙,从服务器务必落后主服务器的问题。
具体过程:
从服务通过线程读取主主服务器的二进制日志,写到本地中继日志中,进行数据回放。
server-id = 1
log-bin=/www/data/mysql/log-bin/master-bin
sync_binlog = ON #同步二进制日志
innodb_flush_logs_at_trx_commit=ON #innodb数据同步
innodb_support_xa=ON #innodb数据同步
创建一个数据同步账号
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO ‘zander‘@‘192.168.1.%‘ IDENTIFIED BY ‘111111‘;
mysql> FLUSH PRIVILEGES;
查看主节点状态
mysql> show master status ;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000028 | 11395 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
从服务器配置:
server-id = 11
#log-bin=/www/data/mysql/log-bin/master-bin
relay_log=/www/data/mysql/log-bin/relay-bin
read_only=ON
sync_master_info = 1 #同步账号信息
sync_relay_log_info = 1 #同步中继日志
sync_relay_log=1 #同步中继日志
从服务器配置同步的主服务器
mysql> CHANGE MASTER TO MASTER_HOST=‘192.168.1.202‘ ,MASTER_USER=‘zander‘,MASTER_PASSWORD=‘111111‘,MASTER_PORT=3306,MASTER_LOG_FILE=‘master-bin.000028‘,MASTER_LOG_POS=11395;
启动从节点
mysql> start slave;
从节点状态查看
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_Running: Yes 读取二进制线程
Slave_SQL_Running: Yes 数据回放线程
Master_Log_File: master-bin.000028 同步的二进制日志
Read_Master_Log_Pos: 11876 位置
Seconds_Behind_Master: 0 落后多少秒
.......
主主配置最大问题是数据不一致,因为要来回同步,配置上面只要分开主键id就行,或者用程序实现唯一id。优点是无需读写分离,都是主节点。
定义一个节点使用奇数id
auto_increment_offset=1
auto_increment_increment=2
另一个节点使用偶数id
auto_increment_offset=2
auto_increment_increment=2
主节点:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘;
mysql> SHOW GLOBAL VARIABLES LIKE ‘rpl_semi%‘;
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 | 等待超时
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)
mysql> set global rpl_semi_sync_master_enabled=ON;
#需要在配置文件中 rpl_semi_sync_master_enabled=ON 不会自动启动
从节点
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;
mysql> SHOW GLOBAL VARIABLES LIKE ‘rpl_semi%‘;
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.00 sec)
mysql> set global rpl_semi_sync_slave_enabled=ON;
#需要在配置文件中 rpl_semi_sync_slave_enabled=ON 不会自动启动
重启线程
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
主节点状态查看
mysql> SHOW GLOBAL STATUS LIKE ‘rpl%‘;
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 | 当前半同步节点数
| Rpl_semi_sync_master_net_avg_wait_time | 0 | 平均等待时长 ms
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
[root@node1 ~]# wget https://github.com/sysown/proxysql/releases/download/v1.4.9/proxysql-1.4.9-1-centos7.x86_64.rpm
[root@node1 ~]# yum install proxysql-1.4.9-1-centos7.x86_64.rpm
配置文件
添加主机
{
address = "192.168.1.202"
port = 3306
hostgroup = 0 #分组 读为一组 写为一组
status = "ONLINE"
weight = 1
compression = 0
},
默认账户 不写也行
{
username = "marvin"
password = "marvin"
default_hostgroup = 0
active = 1
}
这个必须要 0 是写的组 1是读的组
{
writer_hostgroup=0
reader_hostgroup=1
comment="test repl 1"
}
启动脚本
[root@node1 ~]# /etc/init.d/proxysql start
Starting ProxySQL: DONE!
下载
[root@node4 ~]# wget https://www.percona.com/downloads/percona-toolkit/3.0.10/binary/redhat/7/x86_64/percona-toolkit-3.0.10-1.el7.x86_64.rpm
主节点执行
检查
[root@node3 data]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=hellodb.checksums --databases=hellodb h=localhost,u=root,p=111111,S=/tmp/mysql.sock
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
06-21T14:05:52 0 0 8 0 1 0 0.026 hellodb.classes
06-21T14:05:52 0 0 14 0 1 0 0.024 hellodb.coc
06-21T14:05:53 0 0 7 0 1 0 0.030 hellodb.courses
06-21T14:05:53 0 0 15 0 1 0 0.030 hellodb.scores
06-21T14:05:53 0 1 25 0 1 0 0.030 hellodb.students
06-21T14:05:53 0 0 4 0 1 0 0.028 hellodb.teachers
06-21T14:05:53 0 0 0 0 1 0 0.030 hellodb.toc
结果说明
TS :完成检查的时间
ERRORS :检查时候发生错误和警告的数量
DIFFS :0表示一致,1表示不一致。当指定–no-replicate-check时,会一直为0,当指定–replicate-check-only会显示不同的信息
ROWS :表的行数
CHUNKS :被划分到表中的块的数目
SKIPPED :由于错误或警告或过大,则跳过块的数目
TIME :执行的时间
TABLE :被检查的表名
参数说明
--nocheck-replication-filters:不检查复制过虑,我们用--databases来指定需要检查的数据库
--replicate:把校验的信息写入指定的表中
--no-check-binlog-format:不检查二进制日志文件格式
--replicate-check-only:只显示有不一致数据的信息
--databases:指定校验的数据库,多个用逗号隔开
--tables:指定校验的表,多个用逗号隔开
h:主机,指主服务器IP
u:帐号
p:密码
S: socket
修复预览
[root@node3 data]# pt-table-sync --replicate=hellodb.checksums h=localhost,S=/tmp/mysql.sock,u=root,p=111111 --charset=utf8 --print
REPLACE INTO `hellodb`.`students`(`stuid`, `name`, `age`, `gender`, `classid`, `teacherid`) VALUES (‘14‘, ‘Lu Wushuang‘, ‘17‘, ‘F‘, ‘3‘, NULL) /*percona-toolkit src_db:hellodb src_tbl:students src_dsn:A=utf8,S=/tmp/mysql.sock,h=localhost,p=...,u=root dst_db:hellodb dst_tbl:students dst_dsn:A=utf8,S=/tmp/mysql.sock,h=192.168.1.203,p=...,u=root lock:1 transaction:1 changing_src:hellodb.checksums replicate:hellodb.checksums bidirectional:0 pid:109796 user:root host:node3*/;
REPLACE INTO `hellodb`.`students`(`stuid`, `name`, `age`, `gender`, `classid`, `teacherid`) VALUES (‘25‘, ‘Sun Dasheng‘, ‘100‘, ‘M‘, NULL, NULL) /*percona-toolkit src_db:hellodb src_tbl:students src_dsn:A=utf8,S=/tmp/mysql.sock,h=localhost,p=...,u=root dst_db:hellodb dst_tbl:students dst_dsn:A=utf8,S=/tmp/mysql.sock,h=192.168.1.203,p=...,u=root lock:1 transaction:1 changing_src:hellodb.checksums replicate:hellodb.checksums bidirectional:0 pid:109796 user:root host:node3*/;
参数说明
--replicate= :表示基于pt-table-checksum工具生成的checksums表来修复有问题的数据
--databases=:表示执行同步的数据库,多个用逗号隔开
--tables=: 表示执行同步的数据表,多个用逗号隔开
h= :服务器主机名
u= :帐号
p= :密码
--print:只打印,但不执行命令
--execute:执行命令
修复执行
[root@node3 data]# pt-table-sync --replicate=hellodb.checksums h=localhost,S=/tmp/mysql.sock,u=root,p=111111 --charset=utf8 --execute
标签:TE lin 错误 mit 行数据 ... cal oca filter
原文地址:http://blog.51cto.com/marvin89/2131495