码迷,mamicode.com
首页 > 数据库 > 详细

mysql主从配置

时间:2018-06-21 21:12:16      阅读:218      评论:0      收藏:0      [点我收藏+]

标签: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)

读写分离proxysql

[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

mysql主从配置

标签:TE   lin   错误   mit   行数据   ...   cal   oca   filter   

原文地址:http://blog.51cto.com/marvin89/2131495

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!