cvmachine.com - 申博开户网

查找: 您的方位主页 > 网络频道 > 阅览资讯:MySql主从仿制(初学笔记)

MySql主从仿制(初学笔记)

2019-04-19 08:32:35 来历:www.cvmachine.com 【
笔记有部分长辈的经历,如有得罪请联络 servicewy@163.com 会尽快删去。
           如有转载请标明出处

MySQL8 数据库的主从备份

5.5.* 版别 : 单线程
5.7.* 版别: 多线程

大多用的都是基数版别。其间知名的为 5系列的 5.5 版别 和 5.7版别。
MySQL主从仿制
MySQL数据库本身供给的主从仿制功用能够便利的完结数据的多处主动备份,完结数据库的拓宽。多个数据备份不只能够加强数据的安全性,经过完结读写别离还能进一步提高数据库的负载功用。
下图就描绘了一个多个数据库间主从仿制与读写别离的模型:
MySql主从仿制(初学笔记)
在一主多从的数据库系统中,多个从服务器选用异步的办法更新主数据库的改变,业务服务器在履行写或许相关修正数据库的操作是在主服务器上进行的,读操作则是在各从服务器上进行。假如装备了多个从服务器或许多个主服务器又涉及到相应的负载均衡问题,关于负载均衡详细的技术细节还没有研讨过,今日就先简略的完结一主一从的主从仿制功用。
Mysql主从仿制的完结原理图大致如下(来历网络):
MySql主从仿制(初学笔记)
MySQL之间数据仿制的根底是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中一切操作都会以“事情”的办法记载在二进制日志中,其他数据库作为slave经过一个I/O线程与主服务器坚持通讯,并监控master的二进制日志文件的改变,假如发现master二进制日志文件发生改变,则会把改变仿制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事情”履行到自己的数据库中,以此完结从数据库和主数据库的共同性,也就完结了主从仿制。

主从实践:

完结MySQL主从仿制需求进行的装备:
主服务器:
敞开二进制日志
装备仅有的server-id
取得master二进制日志文件名及方位
创立一个用于slave和master通讯的用户账号

从服务器:

装备仅有的server-id
运用master分配的用户账号读取master二进制日志
启用slave服务

详细完结进程如下:

一、准备工作:

主从两数据库版别共同!

*二、主数据库master修正:

1.修正mysql装备
找到主数据库的装备文件my.cnf,在/etc/mysql/my.cnf,在[mysqld]部分刺进如下两行:

[mysqld]
log-bin=binlog #敞开二进制日志
server-id=1 #设置server-id(可随意输入但有必要存在有必要确保仅有)
#service mysqld restart #修正装备文件后 需重启MySQL服务。

2.重启mysql,创立用于同步的用户账号
进入MySQL数据库 mysql -u root -pRedhat123@
创立用户并授权:

用户:tom   暗码:Redhat123@
mysql> CREATE USER 'tom'@'%' IDENTIFIED BY 'Redhat123@';  //创立用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'tom'@'%'; //给予仿制权限(with grant option 给予授权权限 可不写)
mysql>flush privileges;  //改写权限

3.检查master状况,记载二进制文件名(mysql-bin.000003)和方位(73):

mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| binlog.000005  | 115   |       |         |
+------------------+----------+--------------+------------------+

三、从服务器slave修正:

1.修正mysql装备

相同找到my.cnf装备文件,增加server-id

[mysqld]
server-id=2  #设置server-id,有必要仅有不行与master中的server-id相同
#service mysqld restart   //修正装备文件后 需重启MySQL服务

2.重启mysql,进入MySQL中,履行同步SQL句子(需求主服务器主机名,登陆凭证,二进制文件的称号和方位------>称号和方位能够经过在master中履行show master status进行检查):

mysql> CHANGE MASTER TO
  ->   MASTER_HOST='192.168.89.151',
  ->   MASTER_USER='tom',
  ->   MASTER_PASSWORD=‘Redhat123@',
  ->   MASTER_LOG_FILE='binlog.000005',
  ->   MASTER_LOG_POS=115;

3.发动slave同步进程:

mysql>start slave;

4.检查slave状况:

mysql> show slave status \G;
*************************** 1. row ***************************
      Slave_IO_State: Waiting for master to send event
       Master_Host: 192.168.89.151
       Master_User: rep1
       Master_Port: 3306
      Connect_Retry: 60
     Master_Log_File: binlog.000008
   Read_Master_Log_Pos: 671
      Relay_Log_File: slave1-relay-bin.000004
      Relay_Log_Pos: 4
  Relay_Master_Log_File: binlog.000008
     Slave_IO_Running: Yes 
    Slave_SQL_Running: Yes
     Replicate_Do_DB: 
   Replicate_Ignore_DB: 
  ...
 当Slave_IO_Running和Slave_SQL_Running都为YES的时分就表明主从同步设置成功了。进行验证,在主master中增加一个数据库,然后回到slave上,登陆数据库检查数据库,假如能够看到master中新创立的数据库,那么表明根本的主从仿制完结成功。
假如失利能够封闭slave(mysql>stop slave;),然后依据slave的状况来进行修正。

排错:

导致lave_IO_Running 为connecting 的原因主要有以下 几个方面:
网络不通
暗码不对,账号授权不对,找好过错,地址过错
pos不对
Master和Slave两头防火墙
导致lave_IO_Running 为NO 的原因或许是:
在装备Slave同步时(change master to…)由于Slave拜访Master没有权限导致。
Master中的/var/lib/mysql/binlog.xxxxxx误删或许装备文件中bin-log=xxx 参数设置有问题。
导致Slave_SQL_Running:NO
在装备Slave同步时master_log_file=xxxxx与master_log_pos=xxxx两参数与master不同步。
在装备slave同步时,由于slave拜访master没有权限导致。(master端创立用户并授权过程。)
uuid 相同, 删去 /var/lib/mysql/auto.cnf 文件 并重新发动MySQL。
slave 发动失利 可测验 reset slave all (重置slave) 再发动slave
master敞开二进制日志后默许记载一切库一切表的操作,能够经过装备来指定只记载指定的数据库乃至指定的表的操作,详细在mysql装备文件的[mysqld]可增加修正如下选项:

binlog-do-db=*****    // 指定,只向从服务器敞开某数据库的仿制,多个数据库需求一                   
             行一个‘binlog-do-db=’ 进行指定(主服务器参数)

binlog-ignore-db=mysql  // 指定主服务器上的哪个数据库不向从服务器敞开仿制权限,多  
             个数据库时,需求一行一个‘binlog-ignore-db=’进行指定       
                             (主服务器参数)

log-bin=binlog      // 在MySQL8中默许敞开,假如想封闭,需开disable_log_bin

四、异步仿制 全同步仿制 半同步仿制

1.异步仿制(Asynchronous replication)
MySQL默许的仿制便是异步的,主库在履行完客户端提交的业务后会立行将成果返给给客户端,并不关怀从库是否现已接纳并处理,这样就会有一个问题,主假如crash掉了,此刻主上现已提交的业务或许并没有传到从上,假如此刻,强行将从提高为主,或许导致新主上的数据不完整。
2.全同步仿制(Fully synchronous replication)
指当主库履行完一个业务,一切的从库都履行了该业务才回来给客户端。由于需求等候一切从库履行完该业务才干回来,所以全同步仿制的功用必然会收到严峻的影响。

3.半同步仿制(Semisynchronous replication)
介于异步仿制和全同步仿制之间,主库在履行完客户端提交的业务后不是马上回来给客户端,而是等候至少一个从库接纳到并写到relay log中才回来给客户端。相对于异步仿制,半同步仿制提高了数据的安全性,一起它也造成了必定程度的推迟,这个推迟最少是一个TCP/IP往复的时刻。所以,半同步仿制最好在低延时的网络中运用。

半同步仿制
想要运用半同步仿制,异步仿制有必要现已存在。
半同步仿制是一个功用模块,库要能支撑动态加载才干完结半同步仿制!
首要加载插件:
由于需求履行install plugin , set global ,stop slave和start slave等操作,所以用户需求super权限。

Master端:

mysql>install plugin rpl_semi_sync_master soname 'demisync_master.so'; //加载semisync_master 插件
mysql>set global rpl_semi_sync_master_enable=1;   //敞开半同步(默许为封闭)

mysql>select plugin_name,plugin_status from information_schema.plugins    

where plugin_name_like’%semi%’; //检查插件是否加载成功。

+----------------------+---------------+
| PLUGIN_NAME     | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE    |
+----------------------+---------------+
1 row in set (0.00 sec)   

mysql>show plugins; //检查插件是否加载成功

rpl_semi_sync_master | ACTIVE  | REPLICATION semisync_master.so | GPL 

mysql>show status like ‘Rpl_semi_sync_master_status’; //检查半同步是否在运转。

+-----------------------------+-------+
| Variable_name        | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON  |
+-----------------------------+-------+
1 row in set (0.00 sec)

Slave端:

mysql>install plugin  rpl_semi_sync_slave soname 'semisync_slave.so';   //加载semisync_slave插件
mysql>set global rpl_semi_sync_slave_enable=1;   //敞开半同步(默许为封闭)
mysql>stop slave io_thread;
mysql>start slave io_thread;
  假如没有重启,默许仍是异步仿制,重启后,slave会在master上注册为半同步仿制的slave人物。

验证办法:

主error.log(装备文件中:log=/log/mysql/mysql_log)中会打印如下信息:
2016-08-05T10:03:40.104327Z 5 [Note] While initializing dump thread for slave with UUID <ce9aaf22-5af6-11e6-850b-000c2988bad2>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(4).
2016-08-05T10:03:40.111175Z 4 [Note] Stop asynchronous binlog_dump to slave (server_id: 2)
2016-08-05T10:03:40.119037Z 5 [Note] Start binlog_dump to master_thread_id(5) slave_server(2), pos(mysql-bin.000003, 621)

2016-08-05T10:03:40.119099Z 5 [Note] Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000003, 621)

mysql>show status like ‘Rpl_semi_sync_slave_status’; //检查半同步是否在运转

+----------------------------+-------+
| Variable_name       | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON  |
+----------------------------+-------+
1 row in set (0.20 sec)

两个变量常用来监控主从是否运转在半同步仿制形式下。 如悉数发动正常,MySQL半同步仿制根本建立完结。

 
 

本文地址:http://www.cvmachine.com/a/question/100425.html
Tags: mysql 仿制 初学
修改:申博开户网
  • 上一篇:日常运维 (0413使命)
  • 下一篇:没有了
  • 关于咱们 | 联络咱们 | 友情链接 | 网站地图 | Sitemap | App | 回来顶部