设为首页 收藏本站
查看: 459|回复: 0

[经验分享] MariaDB的复制

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-10-20 10:56:29 | 显示全部楼层 |阅读模式
实验环境:
系统:CentOS 6.5
MariaDB版本:5.5.36
服务器:两台MariaDB的服务器


注意事项:
两个节点一定要同步
双方的版本要一致,如果不一致,从节点的版本要高于主节点
从0开始复制:适用于主从均为新建立的服务器
主服务器已经运行一段时间,且数据量很大,我们可以先完全备份主服务器的数据,并将数据恢复至从服务器,从服务器从备份时主服务器二进制所在位置开始复制
主从节点的server id要求是不相同的


配置过程:两个节点都是从0开始
在两个节点上安装MariaDB数据
创建系统用户,让MariaDB运行在普通用户下
1
2
[iyunv@node1 local]# groupadd -g 360 -r mysql
[iyunv@node1 local]# useradd -u 360 -g 360 -r mysql



解压缩,创建链接
1
2
3
[iyunv@node1 ~]# tar xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/
[iyunv@node1 ~]# cd /usr/local/
[iyunv@node1 local]# ln -sv mariadb-5.5.36-linux-x86_64/ mysql



创建目录,做好是其他硬盘挂载,作为数据的存放目录
1
2
[iyunv@node1 local]# mkdir -p /mydata/data
[iyunv@node1 local]# chown -R mysql:mysql /mydata/data/



可以提供启动脚本,配置文件等操作
1
2
3
4
5
6
7
[iyunv@node1 local]# chown -R root:mysql mysql/*
[iyunv@node1 local]# cp mysql/support-files/my-large.cnf /etc/mysql/my.cnf
[iyunv@node1 local]# vim /etc/mysql/my.cnf
datadir = /mydata/data
[iyunv@node1 local]# cp mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
[iyunv@node1 local]# chmod +x /etc/rc.d/init.d/mysqld
[iyunv@node1 local]# chkconfig –add mysqld



主节点上另外再挂载一个磁盘,作为MariaDB的二进制日志存放位置(挂载部分不做介绍)
1
2
[iyunv@node1 mysql]# mkdir /mydata/binlogs     #从节点不需要binlog
[iyunv@node1 mysql]# chown -R mysql:mysql /mydata/binlogs/     #修改属主属组



对于从节点的操作,也是挂载一块磁盘,作为中继日志的存放
1
2
[iyunv@node2 mysql]# mkdir /mydata/relaylogs
[iyunv@node2 mysql]# chown -R mysql:mysql /mydata/relaylogs/



在主节点上修改配置文件,指定二进制日志存放位置
1
log-bin=/mydata/binlogs/mysql-bin     #修改,指定路径



在从节点上,修改server id和定义中继日志信息
1
2
3
4
#log-bin=mysql-bin     #将二进制日志注释掉,从服务器不用定义二进制日志
#binlog_format=mixed
server-id       = 2     #修改server id,要与主节点不一致
relay-log       = /mydata/relaylogs/relay-log     #定义中继日志的存放位置



进行初始化
1
2
[iyunv@node1 local]# cd mysql/     #一定要进到此目录,要不然,初始化会失败,它读取不到mysql目录下的其他文件
[iyunv@node1 mysql]# ./scripts/mysql_install_db –user=mysql –datadir=/mydata/data/



启动MariaDB服务
1
[iyunv@node1 mysql]# service mysqld start



到此步,关于主从上的MariaDB服务器已经安装完毕,下面是对数据库的操作

在主服务器上创建一个具有复制权限的账号
1
2
3
MariaDB [(none)]> grant replication slave,replication client on *.* to cpuser@'192.168.77.12' identified by 'cp@master';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show binary logs;     #查看二进制所在的位置



m_cp_1.gif
按照上面操作,赋予权限时,最好指定到固定的地址

在从节点上,将其主节点改为上面的node1上的MariaDB服务
1
2
MariaDB [(none)]> change master to
master_host='192.168.77.11',master_user='cpuser',master_password='cp@master',master_log_file='mysql-bin.000001',master_log_pos=496;



选项解析:
MASTER_HOST = 'string'     #指明要连接的主节点,值类型为字串
MASTER_USER = 'string'     #具有复制权限的账号,值类型为字串
MASTER_PASSWORD = 'string'     #上诉用户的密码,值类型为字串
MASTER_LOG_FILE = 'mater_log_name'     #复制起点,主节点上二进制日志,值类型为字串
MASTER_LOG_POS = master_log_pos     #复制起点,主节点二进制日志中起始事件的位置,值类型为数字

此时,在从节点下的中继日志指定的目录中已经有中继日志生成
1
2
[iyunv@node2 ~]# ls /mydata/relaylogs/
relay-log.000001  relay-log.index



查看从节点的状态信息
1
MariaDB [(none)]> show slave statusG



m_cp_2.gif

启动复制线程:
1
2
MariaDB [(none)]> start slave io_thread;     #启动IO线程
MariaDB [(none)]> start slave sql_thread;     #启动sql线程



或是:start slave

检测,从服务器是否可以正常到主服务器上复制数据
首先,我们在主服务器上插入一些数据
1
MariaDB [(none)]> create database cshang;



在从服务器上进行查看
m_cp_3.gif
如果想停止从节点的功能,执行下面语句
MariaDB [(none)]> stop slave;
这时,在主节点创建表数据时,从节点是不会复制的,一旦我们再次开启复制线程,在主节点上的操作会立即复制到从节点上来,而且,我们使用show slave statusG可以发现,中继日志位置发生了改变

复制中要注意的问题:
1 、限制从服务器只读
我们可以更改slave的全局服务器变量read_only,注意:对拥有supper权限的用户无效
使用show global variables like '%read_only%'查看

在主节点上创建一个用户
1
2
MariaDB [cshang]> grant create,update,insert,delete,alter on *.* to tuser@'192.168.77.%' identified by '12345';
MariaDB [cshang]> flush privileges;



此时,从节点也有这个用户了,注意:这个用户不能在从节点添加

在从节点上更改全局变量,使从服务器只有读权限
1
MariaDB [cshang]> set global read_only=1;



然后,我们在windows客户端上连接从服务器,尝试插入数据
m_cp_4.gif
如果,向永久的更改从服务器只有读权限,要写在配置文件中,在mysqld段中定义
1
2
[mysqld]
read_only = 1



如果,想禁止所有的用户都只能读,不具有写权限
1
MariaDB [cshang]> flush tables with read lock;



在从节点打开一个会话,且,将所有的表都以读锁锁定,这样,其他用户就无法写了,但是,这有个缺陷,就是,这会话要一直维持着,不能退出

2、保证主从复制时事务的安全
前提:MariaDB对二进制日志事件数据会有缓冲,先写到内存中,过一段时间再写到二进制日志文件中

在主节点上启用设置如下参数:
sync_binlog = 1     #事务每当提交,二进制日志事件都会从内存同步到二进制日志文件中去

在主节点设置
1
MariaDB [cshang]> set global sync_binlog=1;




3、实现主从复制的半同步
主从复制是一个异步的过程

半同步:master节点要等待一个从节点要把数据完整的复制过去
默认是以插件的形式存在,是没有启用的,是google供需的补丁,存放的位置:/usr/local/mysql/lib/plugin (安装目录下)
在这个目录下,有两个插件:
semisync_slave.so     #从节点要启用的插件
semisync_master.so     #主节点要启用的插件

只有当主从都安装这个插件后,才能基于半同步的形式工作

主机点
安装插件:
1
MariaDB [cshang]> install plugin rpl_semi_sync_master soname 'semisync_master.so';



会引入新的系统变量
m_cp_5.gif
1
2
MariaDB [cshang]> set global rpl_semi_sync_master_enabled=1;     #开启半同步
MariaDB [cshang]> set global rpl_semi_sync_master_timeout=1000;     #设定超时时间为1s



从节点:
安装插件:
1
MariaDB [cshang]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';



查看新的服务器变量
m_cp_6.gif
启用半复制功能
1
MariaDB [cshang]> set global rpl_semi_sync_slave_enabled=1;



这些操作都不会永久有效,要写进配置文件
注意:此前是启动状态,只需要关闭并启动IO_THREAD即可
如果主节点在它定义的超时时间内,还没有联系上从节点,半同步复制自动降级为异步复制
查看是否处于半同步的模式:
m_cp_7.gif
如果,想要将半同步模式降级,可以在从节点上,使用iptables,过滤3306端口的数据包,当主节点在超时时间没有收到从节点的响应后,就会自动降级为一般的复制模式

4、主从复制,实现复制的过滤
让从服务器,仅复制有限的几个数据库,甚至于仅复制某数据库内有限的几张表的机制

     有两种方案:
          1、在主节点上过滤
               在向二进制日志记录事件时,仅记录指定数据库的相关操作
                    binlog_do_db =     #数据库白名单
                  binlog_ignore_db =     #数据库黑名单

          2、在从节点上过滤
               仅从中继日志中读取指定的数据库或表的相关事件并应用与本地
                    replicate_do_db =
                  replicate_ignore_db =

                    replicate_db_table = DB_NAME.TB_NAME
                  replicate_ignore_table =

        使用通配符
           replicate_wild_do_table = testdb.tb%     #testdb库中,所有的tb开头的表
          replicate_wild_ignore_table =

5、假设,我们的主服务器已经运行很长一段时间了,此时,我们的从服务器如何复制

在将从服务器复制线程停止,关闭服务器,删除数据,重新进行初始化操作
1
2
3
4
5
6
MariaDB [(none)]> stop slave;
[iyunv@node2 mysql]# service mysqld stop
[iyunv@node2 mysql]# rm -rf /mydata/data/*
[iyunv@node2 mysql]# rm -rf /mydata/relaylogs/*
[iyunv@node2 mysql]# ./scripts/mysql_install_db –user=mysql –datadir=/mydata/data
[iyunv@node2 mysql]# service mysqld start



此时,我们在主节点上导入hellodb这个数据库
1
[iyunv@node1 ~]# /usr/local/mysql/bin/mysql < hellodb.sql



查看主服务器的状态
m_cp_8.gif
可以对主服务器做备份:
1
[iyunv@node1 ~]# /usr/local/mysql/bin/mysqldump –all-databases –lock-all-tables –master-data=2 > master.bak



并且,查看此时,主服务器的状态信息
m_cp_9.gif
将备份的文件传到从节点上去
1
[iyunv@node1 ~]# scp master.bak node2:/root/



将从主节点拷贝来的数据库文件导入到从节点的数据库中
1
[iyunv@node2 ~]# /usr/local/mysql/bin/mysql < master.bak



登录MariaDB服务器,指定复制的主节点为node1
1
2
MariaDB [(none)]> change master to
master_host='192.168.77.11',master_user='cpuser',master_password='cp@master',master_log_file='mysql-bin.000001',master_log_pos=8860;



再打开复制线程
1
MariaDB [(none)]> start slave;



可以查看一下,从节点的状态信息
m_cp_10.gif
此时,在主节点更改数据库时,对应,在从节点上,数据也都复制过来了

双主架构的原理图
m_cp_11.gif
节点的工作流程
该节点上的io线程到另一个节点的dump线程上去请求二进制日志事件,然后,记录到本地的中继日志中
然后,本地的sql线程到中继日志中取的二进制事件,在本机执行,记录到本地的二进制日志文件中,和本地数据库中

注意:对于多节点的内存等资源达到80%时,就应该加节点了,如果没有解决就是雪崩的效果

双主模型搭建的注意事项:
     1、双方节点都要有创建具有复制权限的用户
     2、节点都要启用二进制日志和中继日志
     3、为保证具有自动增长的字段能生成ID,需要配置两个节点分别为奇数或偶数ID号
     4、都要把对方配置为自己的主节点

在上面的主从上进行扩展,停掉主从复制的线程,停止MariaDB服务,删除所有数据,重新初始化
1
2
3
4
5
6
7
MariaDB [(none)]> stop slave;     #从服务器上停止复制线程
[iyunv@node2 ~]# service mysqld stop     #主从都要停止
[iyunv@node2 ~]# rm -rf /mydata/data/*     #删除数据
[iyunv@node2 ~]# rm -rf /mydata/relaylogs/*          #删除中继日志
[iyunv@node1 ~]# service mysqld stop
[iyunv@node1 ~]# rm -rf /mydata/data/*     #删除数据
[iyunv@node1 ~]# rm -rf /mydata/binlogs/*     #删除二进制日志文件



删除两个节点的/mydata下的所有目录,重新创建
1
2
3
[iyunv@node1 mysql]# rm -rf /mydata/*
[iyunv@node1 mysql]# mkdir -p /mydata/{binlogs,relaylogs,data}
[iyunv@node1 mysql]# chown -R mysql:mysql /mydata/*



修改node1上主配置文件
1
2
3
4
5
6
log-bin=/mydata/binlogs/mysql-bin
binlog_format=mixed
server-id       = 1
relay-log       = /mydata/relaylogs/relay-log
auto-increment-offset = 1     #从1开始
auto-increment-increment = 2     #每次偏移2



为node2的MariaDB提供配置文件
1
2
3
4
[iyunv@node1 mysql]# scp /etc/mysql/my.cnf node2:/etc/mysql/my.cnf
稍作修改
server-id       = 2     #server id 与node1不同
auto-increment-offset = 2     #从2开始



对两个节点分别都要重新初始化
1
2
[iyunv@node1 ~]# cd /usr/local/mysql/
[iyunv@node1 mysql]# ./scripts/mysql_install_db –user=mysql –datadir=/mydata/data/



启动两个节点的MariaDB服务
1
[iyunv@node2 mysql]# service mysqld start



连上MariaDB,创建具有复制权限的账号,我们使两个节点的账号密码一致
创建用户,并授权,注意细节改变
node1上:
1
2
3
[iyunv@node1 mysql]# /usr/local/mysql/bin/mysql
MariaDB [(none)]> grant replication slave,replication client on *.* to cpuser@'192.168.77.12' identified by 'cp@master';
MariaDB [(none)]> flush privileges;



node2上:
1
2
3
[iyunv@node2 mysql]# /usr/local/mysql/bin/mysql
MariaDB [(none)]> grant replication slave,replication client on *.* to cpuser@'192.168.77.11' identified by 'cp@master';
MariaDB [(none)]> flush privileges;



然后,再查看两个节点的服务器状态
1
MariaDB [(none)]> show master status;



根据二进制日志事件的位置,我们先将node2的主服务指向node1
1
2
MariaDB [(none)]> change master to
master_host='192.168.77.11',master_user='cpuser',master_password='cp@master',master_log_file='mysql-bin.000004',master_log_pos=506;



根据二进制日志事件的位置,我们先将node1的主服务指向node2,恰好,我这里两个节点的二进制日志位置相同
1
2
MariaDB [(none)]> change master to
master_host='192.168.77.12',master_user='cpuser',master_password='cp@master',master_log_file='mysql-bin.000004',master_log_pos=506;



在两个节点上,都启动复制线程
1
MariaDB [(none)]> start slave;



再使用show slave  statusG查看是否启动了复制线程

此时,我们进行操作监测,是否能够相互进行复制
node1上新建一个库
1
MariaDB [(none)]> create database wsy;



node2上,查看是否有上面的库生成,如果有,则创建新的表
m_cp_12.gif
1
2
MariaDB [(none)]> use wsy;
MariaDB [wsy]> create table sch(id int);



回到node1上,查看是否生成了表,如果有,则插入数据
m_cp_13.gif
此时,新建的表在node1上生成了
1
MariaDB [wsy]> insert into sch values (1),(11),(111);



node2上查看,是否已经插入了数据
m_cp_14.gif
到此,我们的双主实验就结束了,无论在哪个节点插入数据,在对方节点上都能查询,而且,也能作写操作


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-26252-1-1.html 上篇帖子: MySQL优化篇之慢查询 下篇帖子: MySQL基础入门及MariaDB源代码编译
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表