这篇文章是我的笔记,所以没有太多测试的图片供大家参考。而且测试环境也是新搭建的两台虚拟机,并不会受到其他因素的干扰,才一路顺风的搭建下来;

先说测试环境吧,【两台虚拟机】;

          【一个是redhat7,另一个是centos7】-redhat7 :  192.168.111.55  ; 

                                                                       -centos7 :  192.168.111.66  ;

          【新搭建的mariadb数据库(使用yum安装的)】;

保障:1. 两段服务器都可以互相ping通;

2.selinux和防火墙关掉;(后面会说因为防火墙没关而出现的问题);

3.两边的数据要开启允许远程连接,我是直接开启允许root远程连接的;(也可以另建新账户)

配置文件: /etc/my.conf ;

在 192.168.111.55 的/etc/my.conf中添加或者修改为:

           server_id=10                        //可以理解成指定的唯一的id
           log-bin=master_01              //开启二进制日志,作用是另一个服务器可以通过该日志来确定执行操作
           binlog-do-db=test                //同步的库;两边的库名字要一样;

在 192.168.111.66 的/etc/my.conf中添加或者修改为:

           server_id=20
           log-bin=master_02             
           binlog-do-db=test       

添加之后执行命令  systemctl restart mysqld.service  重启数据库使修改生效。

上述参数解析:
    server_ id 为当前 mysql 服务的识别 ID,必须唯一。
    log - bin 开启二进制日志,每次数据操作都会将操作日志记录在里面,以便从服务可以通过日志确定执行了什么操作。
    bin - do - db 需要同步的数据库,如果有多个数据库需要同步,写多行。 binlog - do - db = db1,db2,db3... 这种写法是错误    的,不会达到预期效果;

分别在两台服务器上进入 mysql,输入    show master status;   命令查看当前主机的状态;记录下此时的 file 名以及 position;如我的是:
mysql数据库主从同步/双机互备_第1张图片

看完、确认好之后再执行命令:!!!!!

   若 slave 开启状态无法执行下面的命令,
    首先执行 stop slave 关闭 slave,
    再执行下面的命令,
    执行后再开启 start slave ;

在 192.168.111.55 数据库中执行:
    CHANGE MASTER TO
    MASTER_HOST='192.168.111.66',               //所要同步的服务器ip
    MASTER_USER='root',                 //同步服务器的mysql用户名
    MASTER_PASSWORD='123456',                 //同步服务器的mysql密码
    MASTER_PORT=3306,                           //数据库端口
    MASTER_LOG_FILE='master_02.000002',      //对应 12.168.111.66 的file名
    MASTER_LOG_POS=1771,                      //对应10.168.0.126的position
    MASTER_CONNECT_RETRY=20;                //192.168.111.66的server-id

在 192.168.111.66 数据库中执行:
    CHANGE MASTER TO
    MASTER_HOST='10.168.1.44',
    MASTER_USER='root',
    MASTER_PASSWORD='123456',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='master_01.000008',     //对应192.168.111.55的file名
    MASTER_LOG_POS=154,                        //对应192.168.111.55的position
    MASTER_CONNECT_RETRY=10;                //192.168.111.55的server-id

上述命令执行完后,查看两个服务状态:执行命令:
    show slave status\G;
mysql数据库主从同步/双机互备_第2张图片
参数解释:
Slave_IO_Running: 指的就是从服务器上负责读取主服务器的线程工作状态。 
    从服务器用这个专门的线程链接到主服务器上,并把日志拷贝回来。
Slave_SQL_Running:指的就是专门执行 sql 的线程。
    它负责把复制回来的 Relaylog 执行到自己的数据库中。
    这两个参数必须都为Yes 才表明复制在正常工作。

只有两个进程参数都为 yes
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

才是配置成功的;我的其中的一个值为 connecting 是就是因为有个服务器的防火墙忘关了,io数据通不了导致的;关闭防火墙后就都为yes了;

到这里,mysql 同步配置已完成,接下来就可以测试是否能正常实时同步。在两边的数据库内随意的创建表,增删改查,你会发现就会实时同步的;可以使用一个叫  navicat  的数据库连接软件测试,比较方便;

可能出现的问题
1.查看 slave 状态时,会发现 Slave_IO_Running: Connecting
出现该问题主要有三个原因:
A.网络不通(互相 ping下试试看能否ping通)
B.密码不对:查看在配置 slave 时执行的命令中的密码是否正确
C.Position 不正确:配置 slave 时对应 position 未填为正确的position

2.查看 slave 状态时,会发现 Slave_SQL_Running: No
出现这个现象的原因主要就是两边数据库数据存在不同之处,也就是同步时没有相同的初态,
可以通过查看 mysql 日志定位具体哪块数据出现异常。

3.使用  show master status;  命令查看状态时,给出的值不是固定的,重启一下数据库就会导致file名和position的变动;所以配置的时候一定要确认好了;

4.在数据库中配置时的 MASTER_CONNECT_RETRY=20; 值都是对方的server-id值,所以两边的数据库是相互同步的;
如果改动了其中一个,比如说将192.168.111.55的MASTER_CONNECT_RETRY=20;改为MASTER_CONNECT_RETRY=10;

重启数据库后,就成了一主一从了,192.168.111.55是主,192.168.111.66是从;因为66会向55同步数据,但是55不会向66同步;

个人笔记,不喜勿喷;