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----------------------------------------------------------------------------------------------------------

浙公网安备 33010602011771号