为了演示部署过程,我通过 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 statusG
在输出的信息中,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/