MySQL半同步复制
《MySQL半同步复制》要点: 简介
一、前言
二、mysql根基知识 1.mysql日记类型
注,有博友对mysql日记不怎么了解,可以参考这篇博客http://freeloda.blog.51cto.com/2033581/1253991 2.mysql二进制日记详解 阐明:默认开启,精确的记录了用户对数据库中的数据进行操作的命令和操作的数据对象. 二进制日记文件的作用:
二进制日志默认寄存位置:
二进制日志格局:
二进制日记滚动方式:
二进制日志变乱:
二进制日记的查看与删除方式: mysql>show master status; 查看当前正在使用的二进制日志 mysql>show binlog events in'mysql-bin.000001'; 查看二进制日志记录的变乱[from position] mysql>flush logs; 二进制日志滚动 mysql>show binary logs; 查看所有二进制日志 mysql>purge binary logs to 'mysql-bin.000003'; 删除二进制日志 文件系统中查看二进制日志的命令: mysqlbinlog相关选项,--start-position #开始位置--stop-position #结束位置 --start-datetime 'yyyy-mm-dd hh:mm:ss' ; #开始时间 --stop-datetime ''; #结束时间 配置mysql的主配置文件:sql_log_bin = {ON|OFF} #用于控制二进制日志信息是否记录进日志文件.默认为ON,表示启用记录功能.用户可以在会话级别修改此变量的值,但其必须具有SUPER权限 binlog_cache_size = 32768 #默认值32768 Binlog Cache 用于在打开了二进制日志(binlog)记录功能的环境,是 MySQL 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域.一般来说,如果我们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择.但是如果我们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size.同时,我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了 binlog_stmt_cache_size = 32768 #当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句 log_bin = mysql-bin #指定binlog的位置,默认在数据目录下 binlog- format = {ROW|STATEMENT|MIXED}#指定二进制日志的类型,默认为MIXED.如果设定了二进制日志的格式,却没有启用二进制日志,则MySQL启动时会产生警告日志信息并记录于错误日志中. sync_binlog = 10 #设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次.当autocommit的值为1时,每条语句的执行都会引起二进制日志同步,否则,每个事务的提交会引起二进制日志同步 max_binlog_cache_size = {4096 .. 18446744073709547520} #二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存,其上限由max_binlog_stmt_cache_size决定. max_binlog_stmt_cache_size = {4096 .. 18446744073709547520} #二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存expire_log_days = {0..99} #设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除.默认为0,表示不启用过期自动删除功能.如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时 注:一般建议将binlog日志与数据文件分开存放,不但可以提高mysql性能,还可以增加平安性! 三、Mysql 复制(Replication)1.Mysql 复制造用
2.Mysql 复制若何工作 主要有三步(如下图):
具体阐明: 该过程的第一部分便是master记录二进制日志.在每个事务更新数据完成之前,master在二日志记录这些改变.MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的.在事件写入二进制日志完成后,master通知存储引擎提交事务. 下一步就是slave将master的binary log拷贝到它本身的中继日志.首先,slave开始一个工作线程——I/O线程.I/O线程在master上打开一个普通的连接,然后开始binlog dump process.Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件.I/O线程将这些事件写入中继日志. SQL slave thread处理该过程的最后一步.SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致.只要该线程与I/O线程坚持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小. 此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程.复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作.所以slave上数据一般要慢于master上数据.即master与slave之间的数据在必定时间内会不同步. 四、Mysql 复制(Replication)类型 1.mysql复制类型有以下一些基来源根基则
注,MySQL不支持多主服务器复制(Multimaster Replication)——即一个slave可以有多个master.但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系布局. 2.mysql复制类型 (1).一主多从模式 注,由一个master和一个slave构成复制系统是最简单的情况.Slave之间并不相互通信,只能与master进行通信. MySQL通过复制(Replication)实现存储系统的高可用.今朝,MySQL支持的复制方式有:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | Rpl_semi_sync_master_net_avg_wait_time | 1560 | | Rpl_semi_sync_master_net_wait_time | 10920 | | Rpl_semi_sync_master_net_waits | 7 | | Rpl_semi_sync_master_no_times | 1 | | Rpl_semi_sync_master_no_tx | 1 | | Rpl_semi_sync_master_status | OFF | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 985 | | Rpl_semi_sync_master_tx_wait_time | 985 | | Rpl_semi_sync_master_tx_waits | 1 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 6 | +--------------------------------------------+-------+ 14 rows in set (0.00 sec) mysql> STOP SLAVE IO_THREAD; Query OK,0 rows affected (0.01 sec) mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%' ; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | OFF | +----------------------------+-------+ 1 row in set (0.00 sec)
mysql> STOP SLAVE IO_THREAD; Query OK,0 rows affected (0.01 sec) master: mysql> create table user1 ( id int(10)); Query OK,0 rows affected (1.03 sec)
mysql> UPDATE tbl SET col=col + 1; 在第二个服务器上执行: mysql> UPDATE tbl SET col=col * 2; mysql> create table user ( id int(10)); Query OK,0 rows affected (0.42 sec) mysql> show tables; +----------------+ | Tables_in_mydb | +----------------+ | user | +----------------+ 1 row in set (0.00 sec) mysql> insert user value (1); Query OK,1 row affected (0.34 sec)
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 1 row in set (0.01 sec)
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%' ; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | 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 | +--------------------------------------------+-------+ 14 rows in set (0.00 sec)
[root@node2 ~] # service mysqld restart Shutting down MySQL. SUCCESS! Starting MySQL.. SUCCESS!
[root@node2 ~] # vim /etc/my.cnf [mysqld] rpl_semi_sync_slave_enabled=1 #启用半同步复制
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so' ; Query OK,0 rows affected (0.38 sec) mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; Query OK,0 rows affected (0.00 sec) mysql> STOP SLAVE IO_THREAD; Query OK,0 rows affected (0.00 sec) mysql> START SLAVE IO_THREAD; Query OK,0 rows affected (0.01 sec)
[root@node1 ~] # service mysqld restart Shutting down MySQL... SUCCESS! Starting MySQL.. SUCCESS!
[root@node1 ~] # vim /etc/my.cnf [mysqld] rpl_semi_sync_master_enabled=1 #启用半同步 rpl_semi_sync_master_timeout=1000 #超时时间为1s
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' ; Query OK,0 rows affected (0.39 sec) mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; Query OK,0 rows affected (0.00 sec) mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; Query OK,0 rows affected (0.00 sec)
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.03 sec)
[root@node1 ~] # ntpdate 202.120.2.101 [root@node2 ~] # ntpdate 202.120.2.101 mysql> create database mydb; Query OK,1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)
查看master上二进制日志 mysql> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-bin.000001 | 107 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 衔接master服务器 mysql> change master to master_host= '192.168.1.201' ,master_user= 'repluser' ,master_password= 'replpass' ,master_log_file= 'master-bin.000001' ,master_log_pos=107; Query OK,0 rows affected (0.07 sec) 查看一下slave状态 mysql> show slave statusG *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.1.201 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: relay-log.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 107 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 1 row in set (0.00 sec) 启动复制并查看状态 mysql> start slave; Query OK,0 rows affected (0.00 sec) mysql> show slave statusG *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.201 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 254 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 404 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row inset (0.00 sec)
[root@node2 ~] # service mysqld restart Shutting down MySQL..... SUCCESS! Starting MySQL........... SUCCESS! [root@node1 src] # tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/ [root@node1 src] # cd /usr/local/ [root@node1 local ] # ln -sv /usr/local/mysql-5.5.33-linux2.6-x86_64 mysql "mysql" -> "/usr/local/mysql-5.5.33-linux2.6-x86_64" [root@node1 local ] # cd mysql [root@node1 mysql] # ll 总用量 200 drwxr-xr-x 2 root root 4096 8月 24 17:58 bin -rw-r--r-- 1 7161 wheel 17987 7月 15 20:01 COPYING drwxr-xr-x 3 root root 4096 8月 24 17:58 data drwxr-xr-x 2 root root 4096 8月 24 17:58 docs drwxr-xr-x 3 root root 4096 8月 24 17:58 include -rw-r--r-- 1 7161 wheel 134493 7月 15 20:01 INSTALL-BINARY drwxr-xr-x 3 root root 4096 8月 24 17:58 lib drwxr-xr-x 4 root root 4096 8月 24 17:58 man drwxr-xr-x 10 root root 4096 8月 24 17:58 mysql- test -rw-r--r-- 1 7161 wheel 2496 7月 15 20:01 README drwxr-xr-x 2 root root 4096 8月 24 17:58 scripts drwxr-xr-x 27 root root 4096 8月 24 17:58 share drwxr-xr-x 4 root root 4096 8月 24 17:58 sql-bench drwxr-xr-x 3 root root 4096 8月 24 17:58 support-files 123
[root@node1 mysql] # groupadd -g 3306 mysql [root@node1 mysql] # useradd -u 3306 -g mysql -s /sbin/nologin -M mysql [root@node1 mysql] # id mysql uid=3306(mysql) gid=3306(mysql) 组=3306(mysql) [root@node2 ~] # vim /etc/my.cnf #增加下面几行 [mysqld] relay-log = relay-log relay-log-index = relay-log.index server- id = 10
[root@node1 mysql] # chown -R root.mysql /usr/local/mysql/* [root@node1 mysql] # ll 总用量 200 drwxr-xr-x 2 root mysql 4096 8月 24 17:58 bin -rw-r--r-- 1 root mysql 17987 7月 15 20:01 COPYING drwxr-xr-x 3 root mysql 4096 8月 24 17:58 data drwxr-xr-x 2 root mysql 4096 8月 24 17:58 docs drwxr-xr-x 3 root mysql 4096 8月 24 17:58 include -rw-r--r-- 1 root mysql 134493 7月 15 20:01 INSTALL-BINARY drwxr-xr-x 3 root mysql 4096 8月 24 17:58 lib drwxr-xr-x 4 root mysql 4096 8月 24 17:58 man drwxr-xr-x 10 root mysql 4096 8月 24 17:58 mysql- test -rw-r--r-- 1 root mysql 2496 7月 15 20:01 README drwxr-xr-x 2 root mysql 4096 8月 24 17:58 scripts drwxr-xr-x 27 root mysql 4096 8月 24 17:58 share drwxr-xr-x 4 root mysql 4096 8月 24 17:58 sql-bench drwxr-xr-x 3 root mysql 4096 8月 24 17:58 support-files [root@node1 ~] # service mysqld restart Shutting down MySQL....... SUCCESS! Starting MySQL............. SUCCESS! [root@node1 mysql] # cp support-files/my-large.cnf /etc/my.cnf [root@node1 mysql] # vim /etc/my.cnf [mysqld] #增加一行 datadir = /mydata/data 123
[root@node1 mysql] # cp support-files/mysql.server /etc/init.d/mysqld [root@node1 mysql] # chmod +x /etc/init.d/mysqld mysql> grant replication slave on *.* to 'repluser' @ '192.168.1.%' identified by 'replpass' ; Query OK,0 rows affected (0.61 sec) mysql> flush privileges; Query OK,0 rows affected (0.41 sec)
[root@node1 ~] # mkdir -pv /mydata/data mkdir : 已创建目录 "/mydata" mkdir : 已创建目录 "/mydata/data" [root@node1 ~] # chown -R mysql.mysql /mydata/data/ [root@node1 ~] # /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data/ --basedir=/usr/local/mysql --user=mysql Installing MySQL system tables... /usr/local/mysql/bin/mysqld : error while loading shared libraries: libaio.so.1: cannot open shared object file : No such file or directory Installation of system tables failed! Examine the logs in /mydata/data/ for more information. You can try to start the mysqld daemon with: shell> /usr/local/mysql/bin/mysqld --skip-grant & and use the command line tool /usr/local/mysql/bin/mysql to connect to the mysql database and look at the grant tables: shell> /usr/local/mysql/bin/mysql -u root mysql mysql> show tables Try 'mysqld --help' if you have problems with paths. Using --log gives you a log in /mydata/data/ that may be helpful. Please consult the MySQL manual section 'Problems running mysql_install_db' ,and the manual section that describes problems on your OS. Another information source are the MySQL email archives available at http: //lists .mysql.com/. Please check all of the above before mailing us! And remember, if you do mail us,you MUST use the /usr/local/mysql/scripts/mysqlbug script! [root@node1 ~] # cd /mydata/data/ [root@node1 data] # ll 总用量 8 drwx------ 2 mysql root 4096 8月 24 18:21 mysql drwx------ 2 mysql root 4096 8月 24 18:21 test [root@node1 ~] # vim /etc/my.cnf #增加下面几行 [mysqld] log-bin=master-bin log-bin-index=master-bin.index server- id = 1 innodb_file_per_table = 1 启动报错 [root@node1 data] # service mysqld start Starting MySQL. ERROR! The server quit without updating PID file ( /mydata/data/node1 . test .com.pid). 查看一下差错日志 [root@node1 data] # vim node1.test.com.err 130824 18:21:44 mysqld_safe Starting mysqld daemon with databases from /mydata/data /usr/local/mysql/bin/mysqld : error while loading shared libraries: libaio.so.1: cannot open shared object file : No such file or directory 130824 18:21:44 mysqld_safe mysqld from pid file /mydata/data/node1 . test .com.pid ended 注,从差错日志中我们看到差一个库文件libaio,我们用yum安装一下即可. [root@node1 data] # yum install -y libaio 重新初始化mysql [root@node1 data] # /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data/ --basedir=/usr/local/mysql --user=mysql 启动mysql [root@node1 data] # service mysqld start Starting MySQL... SUCCESS! 环境变量配置 [root@node1 data] # vim /etc/profile.d/mysql.sh export PATH=$PATH: /usr/local/mysql/bin [root@node1 data] # source /etc/profile 测试一下 [root@node1 data] # mysql Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 Server version: 5.5.33-log MySQL Community Server (GPL) Copyright (c) 2000,2013,Oracle and /or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and /or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.03 sec) mysql> 1234567
启动mysql [root@node2 data] # service mysqld start Starting MySQL... SUCCESS! 情况变量配置 [root@node2 data] # vim /etc/profile.d/mysql.sh export PATH=$PATH: /usr/local/mysql/bin [root@node1 data] # source /etc/profile 测试一下 [root@node2 data] # mysql Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 Server version: 5.5.33-log MySQL Community Server (GPL) Copyright (c) 2000,Oracle and /or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and /or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.06 sec) mysql>
[root@node2 ~] # tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/ [root@node2 ~] # cd /usr/local/ [root@node2 local ] # ln -sv /usr/local/mysql-5.5.33-linux2.6-x86_64 mysql "mysql" -> "/usr/local/mysql-5.5.33-linux2.6-x86_64" [root@node2 local] # cd mysql [root@node2 mysql] # ll 总用量 200 drwxr-xr-x 2 root root 4096 8月 24 18:41 bin -rw-r--r-- 1 7161 wheel 17987 7月 15 20:01 COPYING drwxr-xr-x 3 root root 4096 8月 24 18:41 data drwxr-xr-x 2 root root 4096 8月 24 18:41 docs drwxr-xr-x 3 root root 4096 8月 24 18:41 include -rw-r--r-- 1 7161 wheel 134493 7月 15 20:01 INSTALL-BINARY drwxr-xr-x 3 root root 4096 8月 24 18:41 lib drwxr-xr-x 4 root root 4096 8月 24 18:41 man drwxr-xr-x 10 root root 4096 8月 24 18:41 mysql- test -rw-r--r-- 1 7161 wheel 2496 7月 15 20:01 README drwxr-xr-x 2 root root 4096 8月 24 18:41 scripts drwxr-xr-x 27 root root 4096 8月 24 18:41 share drwxr-xr-x 4 root root 4096 8月 24 18:41 sql-bench drwxr-xr-x 3 root root 4096 8月 24 18:41 support-files 先安装libaio库文件 [root@node2 mysql] # yum install -y libaio [root@node2 mysql] # mkdir -pv /mydata/data mkdir : 已创立目录 "/mydata" mkdir : 已创立目录 "/mydata/data" [root@node2 mysql] # cd /mydata/data [root@node2 data] # chown -R mysql.mysql /mydata/data/ [root@node2 data] # /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data/ --basedir=/usr/local/mysql --user=mysql [root@node2 data] # ll 总用量 1084 drwx------ 2 mysql root 4096 8月 24 18:49 mysql -rw-rw---- 1 mysql mysql 27698 8月 24 18:49 mysql-bin.000001 -rw-rw---- 1 mysql mysql 1061358 8月 24 18:49 mysql-bin.000002 -rw-rw---- 1 mysql mysql 38 8月 24 18:49 mysql-bin.index drwx------ 2 mysql mysql 4096 8月 24 18:49 performance_schema drwx------ 2 mysql root 4096 8月 24 18:49 test 1234[root@node2 mysql] # groupadd -g 3306 mysql [root@node2 mysql] # useradd -u 3306 -g mysql -s /sbin/nologin -M mysql [root@node2 mysql] # id mysql uid=3306(mysql) gid=3306(mysql) 组=3306(mysql)
[root@node2 mysql] # chown -R root.mysql /usr/local/mysql/* [root@node2 mysql] # ll 总用量 200 drwxr-xr-x 2 root mysql 4096 8月 24 18:41 bin -rw-r--r-- 1 root mysql 17987 7月 15 20:01 COPYING drwxr-xr-x 3 root mysql 4096 8月 24 18:41 data drwxr-xr-x 2 root mysql 4096 8月 24 18:41 docs drwxr-xr-x 3 root mysql 4096 8月 24 18:41 include -rw-r--r-- 1 root mysql 134493 7月 15 20:01 INSTALL-BINARY drwxr-xr-x 3 root mysql 4096 8月 24 18:41 lib drwxr-xr-x 4 root mysql 4096 8月 24 18:41 man drwxr-xr-x 10 root mysql 4096 8月 24 18:41 mysql- test -rw-r--r-- 1 root mysql 2496 7月 15 20:01 README drwxr-xr-x 2 root mysql 4096 8月 24 18:41 scripts drwxr-xr-x 27 root mysql 4096 8月 24 18:41 share drwxr-xr-x 4 root mysql 4096 8月 24 18:41 sql-bench drwxr-xr-x 3 root mysql 4096 8月 24 18:41 support-files [root@node2 mysql] # cp support-files/mysql.server /etc/init.d/mysqld [root@node2 mysql] # chmod +x /etc/init.d/mysqld
[root@node2 mysql] # cp support-files/my-large.cnf /etc/my.cnf [root@node2 mysql] # vim /etc/my.cnf [mysqld] datadir = /mydata/data
半同步复制的基本流程MySQL半同步复制的实现是建立在MySQL异步复制的基础上的.MySQL支持两种略有分歧的半同步复制: 开启半同步复制时,Master在返回之前会期待Slave的响应或超时.当Slave超时时,半同步复制退化成异步复制.这也是MySQL半同步复制存在的一个问题.本文不讨论Salve超时的情形(不讨论异步复制). 半同步复制AFTER_SYNC模式的根本流程
半同步复制AFTER_COMMIT模式的根本流程 MySQL 5.5和5.6的半同步复制只支撑
AFTER_SYNC和AFTER_COMMIT两种方式的小结
AFTER_SYNC模式下的异常情况阐发
master重启后,直接提交pendinglog,此时,主备数据纷歧致:
异常情况处置 从上面异常情况的简单分析我们得知,半同步复制必要处理master宕机后重启存在pendinglog(slave没有应答的binlog)的特殊情况.
在crash recovery之后,master比及slave的连接和复制,直到至少有一个slave复制了所有已提交的事务的binlog.(
旧master重启后,在crash recovery时,对pendinglog进行回滚.(人工截断master的binlog未复制的部门?) 思虑 为什么master重启之后,crash recovery的过程中,是直接commit pendinglog,而不是重试哀求slave的应答呢? MySQL的异步复制和半同步复制都是由slave触发的,slave主动去衔接master同步binlog.
总结 MySQL半同步复制存在以下问题:
正因为MySQL在主备数据一致性存在着这些问题,影响了互联网业务7*24的高可用服务,因此各大公司纷纷祭出本身的“补丁”:腾讯的TDSQL、微信的PhxSQL、阿里的AliSQL、网易的InnoSQL. MySQL官方曾经在MySQL5.7推出新的复制模式——MySQL Group Replication. 欢迎参与《MySQL半同步复制》讨论,分享您的想法,编程之家PHP学院为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |