这段时间 一直在Cloudera Manager集群上配置高可用的Mariadb服务。今天花一点记录一下自己的配置过程 希望后续的读者看到后 在遇到相同业务需求时具有参考价值。
以往我们在配置MySQL卓仓复制时,一般而言 在配置到一主 一从 能够实现MySQL的读写分离 就差不多了,因为导师的要求 这里要配置一个互为主从的MySQL服务,也就是我们常说的双主模式。
A B之间互相同步数据,A写入的数据在B上能够读取 更新,B上写入的数据在A上也鞥实现相同的操作。
因为在网上看到的大多数资料 都是配置的一主一从,这里 我就这段时间的配置过程 做一个大概的文档总结。
我们在这里选取主机ip尾号为145 147的两台CentOS 7.1的主机来实现Mariadb的双主模式。
yum install mariadb-embedded mariadb-libs mariadb-bench mariadb mariadb-server
1.在两台机器上分别添加一个用于从机访问的帐号, 赋予REPLICATION SLAVE权限.
GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’ IDENTIFIED BY ‘000000’;
2.第一台服务器(IP: 172.19.2.147)运行:
GRANT REPLICATION SLAVE ON . TO ‘slave’@‘172.19.2.145’ IDENTIFIED BY ‘000000’;
3.第二台服务器(IP: 172.19.2.145)运行:
GRANT REPLICATION SLAVE ON . TO ‘slave’@‘172.19.2.147’ IDENTIFIED BY ‘000000’;
4 修改配置文件,配置服务器编号, 开启bin-log
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=145 ##或者147不同主机的id唯一标识
log_bin =mysql-bin
#binlog_ignore_table=scm.CM_VERSION
relay-log = relay-mysql #开启二进制日志
relay-log-index =relay-mysql.index #开启中继日志
log_slave_updates=on
auto-increment-increment = 2
auto-increment-offset = 1 #从1开始 或者2开始 为避免id冲突 两台主机的起步要不同
打开这两行的注释, 注意这里的server-id是服务器编号, 所以, 两台服务器上的值要设置的不一样. 比如1和2,最好用IP地址最后一段标识。
如下图所示:
5.重启MySQL服务
Systemctl restart mariadb //重启
Systemctl status mariadb //查看进程
6.这里可以清空两台主机的master和slave日志(若之前有开启过同步的,需要先停止同步:stop slave;)
在mysql命令行中输入:
reset master;
reset slave;
7.在mysql命令模式执行
SHOW MASTER STATUS; ##前面已经查看过了。
分别给145 147数据库加读锁,防止配置同步时有数据写入: flush tables with read lock;
8.此时请保证执行这两条命令的mysql控制台不要退出,【非常重要】.
然后进mysql控制台,分别产看相关信息
在21服务器上:
show master status;
在25服务器上:
show master status;
分别重新打开一个mysql控台台(重要)
分别在新打开的两个mysql>中执行如下:
change master to master_host='172.19.2.147',master_user='slave',master_password='000000',master_log_file='mysql-bin.000002',master_log_pos=586748096;
change master to master_host='172.19.2.145',master_user='slave',master_password='000000',master_log_file='mysql-bin.000002',master_log_pos=429515657;
参数说明:
CHANGE MASTER TO
MASTER_HOST = ‘host’, #另一台机器的地址
MASTER_PORT = 3306, #另一台机器的端口
MASTER_USER = ‘slave’,#另一台机器上第一步分配的用户名
MASTER_PASSWORD = ‘000000’, #另一台机器上第一步分配的密码
MASTER_LOG_FILE = ‘mysql-bin.000001’,#另一台机器上执行SHOW MASTER STATUS得到的文件名(File)
MASTER_LOG_POS = 237; #另一台机器上执行SHOW MASTER STATUS得到的偏移量(Position)
9.START SLAVE;
10.SHOW SLAVE STATUS \G;
注意看 这里配置的是145 147的互为主从模式,所以一定是两个节点上的slave status上的Slave_IO_Running和Slave_SQL_Running都是Yes状态,这样才实现了 双主模式。
11. 解锁: unlock tables;
启动两个节点的slave 之后,我们队两个进行锁解除,然后写数据进行双主模式的测试。
一般而言,企业里面的数据库 数据表较大,数据属性多,这也是为什么 现在越来越多的商业应用中开始选用主从模式 甚至是双主模式来开发,归根结底 南国认为 很重要的一个原因 担心大量的读写操作 使得服务宕机。
所以在测试时,南国建议开发者可以在某个数据库中自己创建的少数属性的数据表,并在不同节点进行数据增删查改 我们还可以继续在MySQL命令行 查看两个节点的slave状态 是否还是双Yes。
如果一直是双Yes,而且数据可以实现互相读写同步,那么恭喜你 MySQL的双主模式你已经成功搭建好。
注意:
在配置MySQL互为主从模式(双主模式)时经常出现的坑是 两个节点只能实现一边主从,某一个节点上的slave status会显示错误,错误一般是1032 某个数据库中的信息不能更新,这是一般采用的方法是 将主库中的数据备份 然后加载到从库中,方可以得到解决。
也可以在从库中: stop slave; set global sql_slave_skip_counter=1;#执行跳过错误操作,但这个治标不治本,下次 主库更新数据 还会报错 start slave;
还有一些常见的错误例如1032 1062的错误及参考的解决办法,可以参考http://xstarcd.github.io/wiki/MySQL/online_mysqlrepl_error.html
小结:
南国配置MySQL双主模式 主要是因为最近部署CLoudera Manager HA模式所使用,在搭建的过程中 也是遇到了不少坑,好在最后还是成功了。 其实双主模式 最重要的考虑是 避免单一节点宕机 造成数据丢失,而没有将负载放在首要地位考虑。因为 现有的节点资源 足够大了,数据量远没有超过其负荷。
当然 不同应用场景 有不同考虑,更多认识 未完待续~