Centos6.5基于MariaDB10.x 主从复制高可用简单详解

主从复制目的:

mysql服务器稳定性提升,避免单台mysql服务器宕机后影响整个业务,当出现宕机问题后,可以立即可使从机提升为新的主服务器。从而实现sql高可用冗余性。


一、演示环境

os:centos6.5

sql:mariadb-10.0.12

iptables off

selinux disabled

已装组件:

Development tools

Server Platform Development

主机master:10.19.90.197

从机slave:10.19.90.111


二、(注:sql安装不演示,请参考http://ssc4469.blog.51cto.com/6315913/1627739里的mariadbab安装,另外我这里演示的数据库版本一致的)

master服务器配置:

1、停止服务

# /etc/init.d/mysqld stop

2、修改mysql配置文件,/etc/my.cnf,我这里仅修改了两项参数,如图所示,一个是mysql日志路径,一个是server-id为1

技术分享

3、创建binlog目录,修改属组

# mkdir -pv /mydata/binlogs/
# chown -R mysql:mysql /mydata/binlogs/

4、启动mysql服务,查看启动信息

# /etc/init.d/mysqld start

技术分享5、登录mysql 授权远程用户

MariaDB [(none)]> grant replication slave,replication client on *.* to ‘用户‘@‘10.19.90.111‘ identified by ‘密码‘;    //注:用户密码必须是当前sql已创建的用户及密码

MariaDB [(none)]> flush privileges;   //刷新MySQL的系统权限相关表


slave服务器配置:

1、停止服务

# /etc/init.d/mysqld stop

2、修改mysql配置文件,/etc/my.cnf,我这里仅修改了两项参数,如图所示,一个是启用mysql中继日志路径,一个是server-id为2

技术分享

3、创建binlog目录,修改属组

# mkdir -pv /mydata/binlogs/
# chown -R mysql:mysql /mydata/binlogs/

4、启动mysql服务,查看启动信息

# /etc/init.d/mysqld start

5、连接mysql,查看中继日志状态:

(注:中继日志:它其实跟复制相关的,与二进制日志几乎相同,只不过它不是用于记录事件的,而是作为读取数据的源并且在本地执行的,当然中继日志是在从服务器上)

技术分享

6、查看验证(此时没有文件)

# ls /mydata/relaylogs

7、登录mysql 授权远程用户

MariaDB [(none)]> grant replication slave,replication client on *.* to ‘用户‘@‘10.19.90.197‘ identified by ‘密码‘;    //注:用户密码必须是当前sql已创建的用户及密码

MariaDB [(none)]> flush privileges;   //刷新MySQL的系统权限相关表


三、查看master、slave节点状态及启用slave节点

技术分享

2、maser查看日志状态:

技术分享

3、slave节点查看同步状态(注:配图是已经同步中的状态,实际刚创建完毕,Slave_IO_Running: No,Slave_SQL_Running: No,主要就是看这两项参数

技术分享

注:show slave status 解释  

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.19.90.197
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000002
          Read_Master_Log_Pos: 609
               Relay_Log_File: relay-bin.000006
                Relay_Log_Pos: 818
        Relay_Master_Log_File: master-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
      
SHOW SLAVE STATUS会返回以下字段:
Slave_IO_State
SHOW PROCESSLIST输出的State字段的拷贝。SHOW PROCESSLIST用于从属I/O线程。如果线程正在试图连接到主服务器,正在等待来自主服务器的时间或正在连接到主服务器等,本语句会通知您

Master_User
被用于连接主服务器的当前用户。

Master_Port
当前的主服务器接口。

Connect_Retry
–master-connect-retry选项的当前值

Master_Log_File
I/O线程当前正在读取的主服务器二进制日志文件的名称。

Read_Master_Log_Pos
在当前的主服务器二进制日志中,I/O线程已经读取的位置。

Relay_Log_File
SQL线程当前正在读取和执行的中继日志文件的名称。

Relay_Log_Pos
在当前的中继日志中,SQL线程已读取和执行的位置。

Relay_Master_Log_File
由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称。

Slave_IO_Running
I/O线程是否被启动并成功地连接到主服务器上。

Slave_SQL_Running
SQL线程是否被启动。

Replicate_Do_DB,Replicate_Ignore_DB
使用–replicate-do-db和–replicate-ignore-db选项指定的数据库清单。

Replicate_Do_Table,Replicate_Ignore_Table,Replicate_Wild_Do_Table,Replicate_Wild_Ignore_Table
使用–replicate-do-table,–replicate-ignore-table,–replicate-wild-do-table和–replicate-wild-ignore_table选项指定的表清单。

Last_Errno,Last_Error
被多数最近被执行的查询返回的错误数量和错误消息。错误数量为0并且消息为空字符串意味着“没有错误”。如果Last_Error值不是空值,它也会在从属服务器的错误日志中作为消息显示。

更多相关请参考:http://zhumeng8337797.blog.163.com/blog/static/10076891420115732244591/
或自行google,关键词:“show slave status”

4、启动slave同步连接服务:

MariaDB [(none)]> start slave
    -> ;
Query OK, 0 rows affected, 1 warning (0.00 sec)

5、slave节点验证文件查看:

技术分享

6、slave节点同步状态查看:

技术分享


四、master创建库,测试slave是否同步,这几步操作不在进行演示,大家自己去试试就OK,很简单、

五、我这里讲下,mysql主从同步,如何同步已有的数据。

问题:原本197这台服务器最开始是单项sql服务器,刚才创建的主从同步,不能同步之前的库和数据,下面我给大家讲下这个问题。

解决方法:

主机开两个shell窗口,一个进入mysql,一个是shell

1、master 主机阻断写操作

MariaDB [(none)]>  FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

MariaDB [zentao]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000002 |     2040 |              |                  |
+-------------------+----------+--------------+------------------+

2、另一个shell导出master主机相应的数据库

mysqldump -u root -p --opt -R zentao > /opt/zento-0412.sql

3、解锁刚才的锁定

MariaDB [(none)]>  UNLOCK TABLES;

4、同步导出的数据

scp /opt/zentao-0412.sql [email protected]:/opt/

5、slave主机

停止slave

MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.03 sec)

6、创建mysql库 

create database zentao;

7、导入数据

mysql -uroot -p‘密码‘ zentao < /opt/zentao-0412.sql

8、从启slave

MariaDB [(none)]> reset slave;
Query OK, 0 rows affected (0.00 sec)

六、验证

登录:master数据库连接的web端,后台创建一个新用户,如下:

技术分享


登录master数据库查看 user表 是否有数据写入;

技术分享

登录slave数据库查看对应的表是否有数据同步过来;

我这里已同步了 ,懒得写了,累死我了。。。。。。

特别注意注意:估计有人创建后同步数据库时,比如主库创建一条数据同步没事,但是修改一条数据无法同步,重启slave  在show slave status,会看到Last_SQL_Error:1062  报错 ,这里请修改从库的my.cof配置文件,在里面加上

 slave-skip-errors = 1062 、在查看,数据就同步过来了,去掉配置里的slave-skip-errors = 1062,重启数据库,在更新主库表,在查看从库对应的数据,一切正常。OK,就这样。麻痹累死我了。。。。。。。


ps:高可用脚本过两天写出来放上

本文出自 “阿俊博客” 博客,请务必保留此出处http://ssc4469.blog.51cto.com/6315913/1631627

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。