MySQL 双主 Master to Master 架构部署方法

为了演示部署过程,我通过 VMware 创建了两台主机,分别为 TestServer1(192.168.0.1) 和 TestServer2(192.168.0.2)。两台主机均安装了 CentOS 6.9。

MySQL 通过源码进行编译,我选择的是 mysql-5.6.41.tar.gz 这个版本的源码包。

编译安装过程如下:

创建 MySQL 的用户组和用户

# groupadd mysql
# useradd -g mysql mysql

创建 MySQL 目录和数据文件存储目录

# mkdir -p /usr/local/mysql
# mkdir -p /data/mysqldb
# chown -R mysql:mysql /data/mysqldb

 

通过 YUM 安装 MySQL 所需的依赖包

# yum install -y gcc* make automake ncurses-devel cmake

 

编译安装 MySQL

# tar zxvf mysql-5.6.41.tar.gz
# cd mysql-5.6.41
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1
# make
# make install

 

将 MySQL 启停脚本加入到系统服务

# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod +x /etc/rc.d/init.d/mysqld
# chkconfig –add mysqld
# chkconfig –level 35 mysqld on

 

初始化 MySQL

# /usr/local/mysql/scripts/mysql_install_db –user=mysql –defaults-file=/etc/my.cnf –basedir=/usr/local/mysql –datadir=/data/mysqldb –collation-server=utf8_general_ci

 

分别在 TestServer1 和 TestServer2 上执行上述操作,将 MySQL 在两台主机上编译安装。

接下来开始进行 MySQL 的双主配置

编辑 TestServer1(192.168.0.1)的 MySQL 配置文件(/etc/my.cnf),内容如下:

[mysqld]
server-id=1 #唯一标示,不可重复
log-bin=mysql-master-bin
binlog_format=row
binlog-ignore-db=mysql #日志忽略 mysql 库
replicate-ignore-db=mysql #同步忽略 mysql 库
relay_log_recovery=1
log_slave_updates=1
slave-skip-errors=all
auto-increment-offset=1 #自增偏移值(或称步长值)
auto-increment-increment=2 #自增值
gtid-mode=on
enforce-gtid-consistency=true
datadir=/data/mysqldb #数据文件存储目录
socket=/tmp/mysql.sock
user=mysql
symbolic-links=0

编辑 TestServer2(192.168.0.2)的 MySQL 配置文件(/etc/my.cnf),内容如下:

[mysqld]
server-id=2 #TestServer2 的 server-id 设置为 2,不能和 TestServer1 重复
log-bin=mysql-master-bin
binlog_format=row
binlog-ignore-db=mysql
replicate-ignore-db=mysql
relay_log_recovery=1
log_slave_updates=1
slave-skip-errors=all
auto-increment-offset=2 #TestServer2的偏移值设置为2,以保证两台主机上同一个表的自增字段不会产生重复的值
auto-increment-increment=2
gtid-mode=on
enforce-gtid-consistency=true
datadir=/data/mysqldb
socket=/tmp/mysql.sock
user=mysql
symbolic-links=0

分别在两台主机上启动 MySQL

# service mysqld start

 

将 TestServer1 设为 TestServer2 的主服务器

在 TestServer1 上执行:

MySQL> grant replication slave on *.* to ‘slave’@’%’ identified by ‘123456’;
Query OK, 0 rows affected (0.00 sec)

MySQL> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MySQL> show master status;
+————————-+———-+————–+——————+————————————————————————————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+————————-+———-+————–+——————+————————————————————————————-+
| mysql-master-bin.000004 | 581 | | mysql | b6fa933e-a030-11e8-b218-000c29e13e8a:1-12,
cad0d95c-a030-11e8-b219-000c292665ea:4-8 |
+————————-+———-+————–+——————+————————————————————————————-+
1 row in set (0.05 sec)

 

记住 TestServer1 上的 File 和 Position 两个数据,然后登录到 TestServer2,执行如下命令:

MySQL> change master to master_host=’192.168.0.1′,master_user=’slave’,master_password=’123456′,master_log_file=’MySQL-bin.000004′,master_log_pos=581;
Query OK, 0 rows affected (0.05 sec)

MySQL> start slave;
Query OK, 0 rows affected (0.00 sec)

 

将 TestServer2 设置 TestServer1 的主服务器

在 TestServer2 上执行

MySQL> grant replication slave on *.* to ‘slave’@’%’ identified by ‘123456’;
Query OK, 0 rows affected (0.00 sec)

MySQL> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MySQL> show master status;
+————————-+———-+————–+——————+————————————————————————————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+————————-+———-+————–+——————+————————————————————————————-+
| mysql-master-bin.000004 | 673 | | mysql | b6fa933e-a030-11e8-b218-000c29e13e8a:4-12,
cad0d95c-a030-11e8-b219-000c292665ea:1-8 |
+————————-+———-+————–+——————+————————————————————————————-+
1 row in set (0.04 sec)

 

然后在 TestServer1 上执行如下命令:

MySQL> change master to master_host=’192.168.0.2′,master_user=’slave’,master_password=’123456′,master_log_file=’MySQL-bin.000004′,master_log_pos=673;
Query OK, 0 rows affected (0.05 sec)

MySQL> start slave;
Query OK, 0 rows affected (0.00 sec)

 

至此,MySQL的双主就设置好了,为了验证工作是否正常,可以分别在两台主机上执行下面的命令:

MySQL> show slave status\G

 

在输出的信息中,Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 这两项如果都是 YES,则工作正常,其中某个为 NO,则工作不正常。

下面做个测试

在 TestServer1 上的 test 库 新建一个 test 表

CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

创建完成后,这个数据表应该会自动出现在 TestServer2 的 test 库里。

然后我们在 TestServer1 上插入三条记录

INSERT INTO `test` (`name`) VALUES (‘a’),(‘b’),(‘c’)

 

这时,在 TestServer1 和 TestServer2 两台主机的 test 表中,会看到三条记录的id分别为1、3和5。

然后,再在 TestServer2 上插入三条记录

INSERT INTO `test` (`name`) VALUES (‘d’),(‘e’),(‘f’)

 

此刻,在两台主机的 test 表中,可以看到如下的记录:
id name
1 a
3 b
5 c
6 d
8 e
10 f

两台主机上的自增字段按照各自的偏移值递增,从而保证双主架构下,两台主机分别并发写入时,主键不会冲突。

至此,MySQL 的双主架构部署就全部完成了,欢迎联络我交流技术心得,我的邮箱是:jason_wei@163.com

阳光部落原创,更多内容请访问http://www.sunbloger.com/

相关内容:

发表评论