zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

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

mysql方法架构部署 to Master 双主
2023-06-13 09:16:10 时间

为了演示部署过程,我通过 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 的双主架构部署就全部完成了

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