MySQL主主配置

1、原理介绍:

  MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。而在实际项目中,两台分布于异地的主机上安装有MySQL数据库,两台服务器互为主备,客户要求当其中一台机器出现变化或故障时,另外一台能够实时接管服务器上的数据,这就需要两台数据库的数据要实时保持一致,在这里使用MySQL的同步功能实现双机的同步复制。

  MySQL同步机制基于master主服务器把所有对数据库的更新操作(更新、删除 等)都记录在二进制日志里,并维护日志文件的一个索引以跟踪日志循环。从服务器在日志中读取最后一次成功更新的位置,并接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新。因此,想要启用同步机制,在master端就必须启用二进制日志。每个slave从服务器接受来自master上在二进制日志中记录的更新操作,因此在slave上执行了这个操作的一个拷贝。应该非常重要地意识到,二进制日志只是从启用二进制日志开始的时刻才记录更新操作的。所以slave必须在启用二进制日志时把master上已经存在的数据拷贝过来(利用快照或备份)。如果运行同步时slave上的数据和master上启用二进制日志时的数据不一致的话,那么slave同步就会失败。

  MySQL同步功能由3个线程(master上1个,slave上2个)来实现。

 作为主服务器Master,  会把自己的每一次改动都记录到 二进制日志 Binarylog 中。

1、执行START SLAVE语句后,slave就创建一个I/O线程。I/O线程连接到master上,并请求master发送二进制日志中的语句,然后读取master的Binlog Dump线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relay logs)中。

2、master创建一个线程来把日志的内容发送到slave上。这个线程在master上执行SHOW PROCESSLIST语句后的结果中的 Binlog Dump 线程便是。

3、第三个是SQL线程,salve用它来读取中继日志,然后执行它们来更新数据。

  如上所述,每个mster/slave上都有3个线程。每个master上有多个线程,它为每个slave连接都创建一个线程,每个slave只有I/O和SQL线程。在MySQL中执行SHOW PROCESSLIST语句就会告诉我们所关心的master和slave上发生的情况。

2、环境说明

本环境采用两台服务器主主来实现的。

操作系统:Centos6.5

MySQL版本:5.5.55

A:192.168.16.131

B:192.168.16.132

3、安装MySQL

3.1、删除现有的MySQL包

查询现有包

rpm -qa|grep -i mysql

mysql-libs-5.1.73-3.el6_5.x86_64

删除现有包

rpm -e mysql-libs-5.1.73-3.el6_5.x86_64

3.2、安装MySQL软件包

rpm -ivh MySQL-server-5.5.55-1.el6.x86_64.rpm 

rpm -ivh MySQL-client-5.5.55-1.el6.x86_64.rpm

4、配置MySQL

4.1、 配置root登陆密码及远程登陆权限(两台同时配置)

service mysql start
mysqladmin -u root -p  password splenday
mysql -uroot -psplenday mysql>grant all privileges on
*.* to 'root'@'%' identified by 'splenday'; mysql>flush privileges;
mysql>exit;

4.2、修改MySQL配置文件

A和B两台配置仅有auto-increment-offset 和server-id配置不一样;一台都为1,另一台都为2

[client]
port        = 3306
socket        = /var/lib/mysql/mysql.sock
default-character-set = utf8
[mysqld]
# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。 
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。 ## 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
slave_skip_errors=1062
binlog
-ignore-db = mysql binlog-ignore-db = performance_schema binlog-ignore-db = test123 auto-increment-increment = 2 auto-increment-offset = 1 #将另外一台MySQL此处修改为2 port = 3306 socket = /var/lib/mysql/mysql.sock character-set-server = utf8 skip-external-locking skip-name-resolve lower_case_table_names=1 table_open_cache = 256 sort_buffer_size = 1M read_buffer_size = 1M read_rnd_buffer_size = 4M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size= 16M thread_concurrency = 8 log-bin=mysql-bin binlog_format=mixed server-id = 1 #将另外一台MySQL此处配置修改为2 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout

 4.3 在A和B上分别添加允许登陆复制日志的用户

#A、B都重启mysql
service mysql restart
#在A服务器上添加用户 mysql> GRANT REPLICATION SLAVE ON
*.* TO 'replication_user'@'192.168.16.132' IDENTIFIED BY 'splenday123';
#在B服务器上添加用户
mysql> GRANT REPLICATION SLAVE ON
*.* TO 'replication_user'@'192.168.16.131' IDENTIFIED BY 'splenday123';

  4.4 分别查看A和B的日志文件和位置信息

#1、在A上执行下面的命令:
mysql> show master status; +------------------+----------+--------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------------------------------+ | mysql-bin.000017 | 107 | | mysql,performance_schema,test123,test345 | +------------------+----------+--------------+------------------------------------------+ 1 row in set (0.02 sec)

#2、在B上执行下面的命令:

 mysql> show master status;
  +------------------+----------+--------------+-------------------------------+
  | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  +------------------+----------+--------------+-------------------------------+
  | mysql-bin.000013 | 107 | | good,performance_schema,mysql |
  +------------------+----------+--------------+-------------------------------+
  1 row in set (0.02 sec)

4.5、在A和B上分别设置为对方的主数据库。

#在A上,把B设置为A的主数据库
mysql> CHANGE MASTER TO MASTER_HOST='192.168.16.132', MASTER_USER='replication_user', MASTER_PASSWORD='splenday123', MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=107;
#开启备日志复制进程
mysql>start slave;
#在B上,把A设置为B的主数据库
mysql> CHANGE MASTER TO MASTER_HOST='192.168.16.131', MASTER_USER='replication_user', MASTER_PASSWORD='splenday123', MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=107;
#开启备日志复制进程
mysql> start slave;

 

 4.6、查看主主数据库同步进程

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.16.131
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000019
          Read_Master_Log_Pos: 107
               Relay_Log_File: c62-relay-bin.000009
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000019
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
。。。。。。。。。。。。。。。。。。。等等

注意:Slave_IO_Running和Slave_SQL_Running进程要都启动才算成功。

----------------END----------------------------------------------------------------------------------------------------------

posted @ 2017-09-28 14:23  splenday  阅读(243)  评论(0)    收藏  举报