设为首页 收藏本站
查看: 315|回复: 0

[经验分享] mysql主从复制--mysql-5.5异步、半同步配置

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-7-4 09:24:51 | 显示全部楼层 |阅读模式
背景介绍
    mysql5.5之前版本,mysql主从复制比较简单
    mysql5.6:gtid,multi-thread replication

master
1 启用二进制日志
log-bin = master-bin
log-bin-index = master-bin.index


2 选择一个唯一的server id
server-id = [0~2^32]


3 创建具有复制权限的用户
replication slave,复制的从节点
replication client,联系master,获取信息的权限


slave
1 启用二进制日志
relay-log = relay-log
relay-log-index = relay-log.index


2 选择一个唯一的server id,和主不同
server-id = [0~2^32]



3 连接至主服务器复制文件
从哪里开始复制?
1)master是新的,slave从头开始复制
2)master已经运行一段时间,在master执行一次备份,记录二进制日志文件名和事件位置,在slave还原数据,连接至哪一个二进制文件的哪一个位置?


mysql> change master to master_host= ,master_port= ,master_log_file= ,master_log_pos= ,master_user= ,master_password= ;
mysql> start slave;


4 mysql复制线程
master会为每一个slave启动1个dump线程
master:dump
slave:IO_thread,SQL_thread
可单独启动
mysql> start slave IO_thread
mysql> start slave SQL_thread
wKioL1d5GneiMxnOAACG0zBjF84685.jpg



5 半同步复制时应指定同步超时时间,一旦超时,降级为异步复制



mysql主从异步复制
    使用二进制格式安装mysql,并初始化、mtsql服务脚本复制、my.cnf配置文件复制。


导出PATH,方便使用mysql命令
# vim /etc/profile.d/mysql.sh

export PATH=$PATH:/usr/local/mysql/bin



master

1 修改配置文件
# vim /etc/my.cnf

[mysqld]
datadir = /data/mysql

innodb_file_per_table = 1

log-bin=master-bin
log-bin-index=master-bin.index
server-id   = 1



启动mysql
# service mysqld start

2 授权slave复制
mysql> grant replication slave on *.* to 'replicationuser'@'192.168.8.31' identified by 'replicationuser';

mysql> flush privileges;

mysql> flush tables with read lock; # 锁住table为只读

3 查看master二进制日志文件状态,在slave上需要使用
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      355 |              |                  |
+-------------------+----------+--------------+------------------+

mysql> show binlog events in "master-bin.000001";

wKiom1d5GnegxXrDAAArlD-a56g963.jpg




slave
1 修改配置文件

# vim /etc/my.cnf
[mysqld]

datadir = /data/mysql

innodb_file_per_table = 1


relay-log = relay-log
relay-log-index = relay-log.index

server-id   = 10


启动mysql
# service mysqld start


2 配置slave同步设置,并启动slave复制
mysql> change master to master_host='192.168.8.30',master_user='replicationuser',master_password='replicationuser',master_log_file='master-bin.000001',master_log_pos=355;

mysql> start salve;

3 查看slave的状态
mysql> show slave status\G
Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.8.30
                  Master_User: replicationuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 438
               Relay_Log_File: relay-log.000004
                Relay_Log_Pos: 254
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 438



4 在master查看slave
mysql> show slave hosts;



其他设置和说明
1 slave上不允许数据库的写操作,因此在slave上设置为用户只读模式,但此设置对具有super权限的用户无效
# vim /etc/my.cnf
[mysqld]

read-only = on


重启mysql,即生效
# service mysqld restart

重启mysqld,复制线程会自动重启

修改配置后,或者不重启,在数据库中直接修改参数也可以

查看只读模式是否生效
mysql> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | ON    |
+---------------+-------+



2 为了保证master bin-log不在缓冲区缓存,立即同步到磁盘上,减少主从复制的延迟时间,在master设定
[mysqld]
sync-binlog = on


重启mysql,即生效
# service mysqld restart

重启mysqld,复制线程会自动重启

修改配置后,或者不重启,在数据库中直接修改参数也可以


查看立即同步模式是否生效

mysql> show global variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
+---------------+-------+



3 重启mysqld,复制线程会自动重启,存在哪些问题,如何禁止?
    当master执行了一些误操作,由于延迟原因,误操作还未同步slave;此时在slave关闭mysql,备份数据恢复到master上,启动slave的mysql,让IO_thread跳过刚才的误操作,再启动复制功能。若slave启动后,主从复制立即开始,还会同步刚才的误操作。
    不让其随mysql自动启动,防止同步误操作。


连接master 需要这两个文件master.info,relay-log.info,临时移除。slave无法连接master


在数据文件下

master.info 记录了登陆master和相关信息
relay-log.info 记录了relay-log和master-bin的相关信息



4 从服务器的相关日志会记录在slave的错误日志中。


5 若master工作了一定时间,此时做主从的注意事项
5.1 master锁表
mysql> flush tables with read lock;

5.2 master mysql的数据库导出
# mysqldump mydb > mydb.sql
5.3 slave 创建同名数据库,并导入数据库
# mysqldump mydb < mydb.sql

5.4 此时操作和全新的数据库是相同的,注意master_log_file,master_log_pos即可


6 mysql复制过滤
在master上
# vim /etc/my.cnf
[mysqld]
binlog-do-db=db1,db2
binlog-ignore-db=db1,db2


master binlog-ignore-db带来的问题
    不记录部分数据库的二进制日志,二进制日志不完整。当服务器崩溃时,只能恢复记录了二进制日志的数据,未记录的将不能恢复,因此不建议使用此选项。

在slave上
可以进行数据库级别的过滤,也可以进行表级别的过滤
# vim /etc/my.cnf
[mysqld]

数据库级别
replicate-do-db=
replicate-ignore-db=


表级别
replicate-do-table=
replicate-ignore-table=


在表级别使用通配
replicate-wild-do-table=mydb.tb% # 仅复制mydb中以tb开头的所有表
replicate-wild-ignore-table=mydb.tb_ # 仅复制mydb中以tb开头的、后面跟上一个字符的表



slave replicate-ignore-db带来的问题
    使用此选项,虽不记录指定slave数据库的二进制日志,但是中继日志是完整的,因此会占有slave的带宽资源。


    综上,如果必须对表进行过滤,建议在slave上进行。


半同步主从复制

1 master 添加模块
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

mysql> set global rpl_semi_sync_master_enabled = 1;

mysql> show variables like 'rpl%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_recovery_rank                  | 0     |
| rpl_semi_sync_master_enabled       | ON   |
| rpl_semi_sync_master_timeout       | 10000 | # 异步复制超时时间,单位ms
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    | # 是否必须等待slave上线
+------------------------------------+-------+


2 slave 添加模块
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

mysql> set global rpl_semi_sync_slave_enabled = 1;

mysql> show variables like 'rpl%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_recovery_rank               | 0     |
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+


3 若此时主从同步是开启的,设置不会立即生效,需重启slave io_thread
3.1 master状态查看
mysql> show global status like 'rpl%';
+--------------------------------------------+-------------+
| Variable_name                              | Value       |
+--------------------------------------------+-------------+
| Rpl_semi_sync_master_clients               | 0           |
| Rpl_semi_sync_master_net_avg_wait_time     | 0           |
| 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           |
| Rpl_status                                 | AUTH_MASTER |
+--------------------------------------------+-------------+


3.2 slave状态查看
mysql> show global status like 'rpl%';
+----------------------------+-------------+
| Variable_name              | Value       |
+----------------------------+-------------+
| Rpl_semi_sync_slave_status | OFF         |
| Rpl_status                 | AUTH_MASTER |
+----------------------------+-------------+


4 只重启io_thread即可
mysql> stop slave io_thread;

mysql> start slave io_thread;


4.1 master状态查看
mysql> show global status like 'rpl%';
+--------------------------------------------+-------------+
| Variable_name                              | Value       |
+--------------------------------------------+-------------+
| Rpl_semi_sync_master_clients               | 1           |

+--------------------------------------------+-------------+

4.2 slave状态查看
mysql> show global status like 'rpl%';
+----------------------------+-------------+
| Variable_name              | Value       |
+----------------------------+-------------+
| Rpl_semi_sync_slave_status | ON          |
| Rpl_status                 | AUTH_MASTER |
+----------------------------+-------------+


5 测试
    当半同步超时后(10000ms)一次后,会降级为异步复制。
在slave停止io_thread
mysql> stop slave io_thread;

    在master进行写操作时,会卡住100000ms,之后降级为异步复制,恢复速度;

6 为了使参数永久生效,在Master和Slave的my.cnf中编辑:
# On Master  
[mysqld]  
rpl_semi_sync_master_enabled=1  
rpl_semi_sync_master_timeout=1000 # 1 second  

# On Slave  
[mysqld]  
rpl_semi_sync_slave_enabled=1  


7 mysql主从机制比较脆弱,若需重启master,需先要停止slave复制,即stop slave。


监控和监控主从复制工具
percona-toolkit(mattkit-tools)
https://www.percona.com/downloads/percona-toolkit/
# yum localinstall -y percona-toolkit-2.2.18-1.noarch.rpm --nogpgcheck


安装之后会出现一大堆pt命令
pt-slave-delay:使slave比master慢一些时间
pt-table-checksum:通过单向加密比较主从的数据是否一致

rhel使用的是光盘中的rpm库,无法解决percona的依赖
yum localinstall时出现如下提示
You could try using --skip-broken to work around the problem
You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest
The program package-cleanup is found in the yum-utils package




mysql ssl 简要说明
授权时,增加ssl选项,强制使用ssl;若无此选项,不受限制,即使启用了ssl功能,复制时使用和不使用ssl都可以
mysql> grant replication slave on *.* to 'replicationuser'@'192.168.8.31' identified by 'replicationuser' require ssl;


ssl需要的内容
mysql> show global variables like '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_key       |          |
+---------------+----------+





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-239043-1-1.html 上篇帖子: mysql主从复制--mysql-5.6基于GTID及多线程复制 下篇帖子: MySQL主从复制故障案例二 mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表